From 5f9cc86689d569e32532c729e36616001c06c1ca Mon Sep 17 00:00:00 2001 From: Steins7 Date: Sun, 6 Sep 2020 20:10:58 +0200 Subject: [PATCH] Upgraded to gfx_hal 0.6.0 + added swapchain recreation mechanism + sorted minor issues ! some framebuffer error present ! may crash during swapchain recreation --- Cargo.lock | 242 ++++++++++++++----------- Cargo.toml | 16 +- doc/architecture | 2 +- src/lib.rs | 14 +- src/renderer.rs | 121 +++++++++---- src/renderer/gpu.rs | 2 +- src/renderer/swap_system.rs | 291 ++++++++++++++++-------------- src/renderer/swap_system/frame.rs | 154 +++------------- 8 files changed, 420 insertions(+), 422 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ee21473..bb14223 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -37,9 +37,9 @@ checksum = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" [[package]] name = "ash" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69daec0742947f33a85931fa3cb0ce5f07929159dcbd1f0cbb5b2912e2978509" +checksum = "c69a8137596e84c22d57f3da1b5de1d4230b1742a710091c85f4d7ce50f00f38" dependencies = [ "libloading", ] @@ -52,14 +52,14 @@ checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ "hermit-abi", "libc", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] name = "autocfg" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] name = "bitflags" @@ -92,9 +92,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.50" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd" +checksum = "66120af515773fb005778dc07c261bd201ec8ce50bd6e7144c927753fe013381" [[package]] name = "cfg-if" @@ -104,9 +104,9 @@ checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" [[package]] name = "chrono" -version = "0.4.11" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2" +checksum = "942f72db697d8767c22d46a598e01f2d3b475501ea43d0db4f16d90259182d0b" dependencies = [ "num-integer", "num-traits", @@ -124,13 +124,13 @@ dependencies = [ [[package]] name = "cocoa" -version = "0.20.1" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f7b6f3f7f4f0b3ec5c5039aaa9e8c3cef97a7a480a400fd62944841314f293d" +checksum = "0c49e86fc36d5704151f5996b7b3795385f50ce09e3be0f47a0cfde869681cf8" dependencies = [ "bitflags", "block", - "core-foundation", + "core-foundation 0.7.0", "core-graphics", "foreign-types", "libc", @@ -145,7 +145,7 @@ checksum = "f4ffc801dacf156c5854b9df4f425a626539c3a6ef7893cc0c5084a23f0b6c59" dependencies = [ "atty", "lazy_static", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -154,7 +154,17 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" dependencies = [ - "core-foundation-sys", + "core-foundation-sys 0.7.0", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b5ed8e7e76c45974e15e41bfa8d5b0483cd90191639e01d8f5f1e606299d3fb" +dependencies = [ + "core-foundation-sys 0.8.0", "libc", ] @@ -165,13 +175,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" [[package]] -name = "core-graphics" -version = "0.19.0" +name = "core-foundation-sys" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59e78b2e0aaf43f08e7ae0d6bc96895ef72ff0921c7d4ff4762201b2dba376dd" +checksum = "9a21fa21941700a3cd8fcb4091f361a6a712fac632f85d9f487cc892045d55c6" + +[[package]] +name = "core-graphics" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3889374e6ea6ab25dba90bb5d96202f61108058361f6dc72e8b03e6f8bbe923" dependencies = [ "bitflags", - "core-foundation", + "core-foundation 0.7.0", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e92f5d519093a4178296707dbaa3880eae85a5ef5386675f361a1cf25376e93c" +dependencies = [ + "bitflags", + "core-foundation 0.9.0", "foreign-types", "libc", ] @@ -183,7 +211,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34ecad23610ad9757664d644e369246edde1803fcb43ed72876565098a5d3828" dependencies = [ "cfg-if", - "core-foundation-sys", + "core-foundation-sys 0.7.0", "core-graphics", "libc", "objc", @@ -195,7 +223,7 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb582b60359da160a9477ee80f15c8d784c477e69c217ef2cdd4169c24ea380f" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.20", "quote 1.0.7", "syn", ] @@ -208,18 +236,18 @@ checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" [[package]] name = "dlib" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77e51249a9d823a4cb79e3eca6dcd756153e8ed0157b6c04775d04bf1b13b76a" +checksum = "b11f15d1e3268f140f68d390637d5e76d849782d971ae7063e0da69fe9709a76" dependencies = [ "libloading", ] [[package]] name = "downcast-rs" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ba6eb47c2131e784a38b726eb54c1e1484904f013e576a25354d0124161af6" +checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" [[package]] name = "fern" @@ -264,29 +292,30 @@ checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" [[package]] name = "gfx-backend-vulkan" -version = "0.5.2" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebd1dee09bd8d8f1ba52c5ba22d1f70c7ffa990c5eb245eb3ef2d0206f631673" +checksum = "a84bda4200a82e1912d575801e2bb76ae19c6256359afbc0adfbbaec02fcadc6" dependencies = [ "arrayvec", "ash", "byteorder", - "core-graphics", + "core-graphics-types", "gfx-hal", + "inplace_it", "lazy_static", "log", "objc", "raw-window-handle", "smallvec", - "winapi 0.3.8", + "winapi 0.3.9", "x11", ] [[package]] name = "gfx-hal" -version = "0.5.3" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18534b23d4c262916231511309bc1f307c74cda8dcb68b93a10ca213a22814b" +checksum = "18d0754f5b7a43915fd7466883b2d1bb0800d7cc4609178d0b27bf143b9e5123" dependencies = [ "bitflags", "raw-window-handle", @@ -294,18 +323,24 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9586eedd4ce6b3c498bc3b4dd92fc9f11166aa908a914071953768066c67909" +checksum = "3deed196b6e7f9e44a2ae8d94225d80302d81208b1bb673fd21fe634645c85a9" dependencies = [ "libc", ] [[package]] -name = "instant" -version = "0.1.2" +name = "inplace_it" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c346c299e3fe8ef94dc10c2c0253d858a69aac1245157a3bf4125915d528caf" +checksum = "dd01a2a73f2f399df96b22dc88ea687ef4d76226284e7531ae3c7ee1dc5cb534" + +[[package]] +name = "instant" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b141fdc7836c525d4d594027d318c84161ca17aaf8113ab1f81ab93ae897485" [[package]] name = "iovec" @@ -354,24 +389,24 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "lazycell" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.68" +version = "0.2.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dea0c0405123bba743ee3f91f49b1c7cfb684eef0da0a50110f758ccf24cdff0" +checksum = "755456fae044e6fa1ebbbd1b3e902ae19e73097ed4ed87bb79934a867c007bc3" [[package]] name = "libloading" -version = "0.5.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" +checksum = "2443d8f0478b16759158b2f66d525991a05491138bc05814ef52a250148ef4f9" dependencies = [ - "cc", - "winapi 0.3.8", + "cfg-if", + "winapi 0.3.9", ] [[package]] @@ -385,18 +420,18 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79b2de95ecb4691949fea4716ca53cdbcfccb2c612e19644a8bad05edcf9f47b" +checksum = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75" dependencies = [ "scopeguard", ] [[package]] name = "log" -version = "0.4.8" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" +checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b" dependencies = [ "cfg-if", ] @@ -423,14 +458,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" dependencies = [ "libc", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] name = "mio" -version = "0.6.21" +version = "0.6.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "302dec22bcf6bae6dfb69c647187f4b4d0fb6f535521f7bc022430ce8e12008f" +checksum = "fce347092656428bc8eaf6201042cb551b8d67855af7374542a92a0fbfcac430" dependencies = [ "cfg-if", "fuchsia-zircon", @@ -502,13 +537,13 @@ checksum = "2b2820aca934aba5ed91c79acc72b6a44048ceacc5d36c035ed4e051f12d887d" [[package]] name = "net2" -version = "0.2.33" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" +checksum = "2ba7c918ac76704fb42afcbbb43891e72731f3dcca3bef2a19786297baf14af7" dependencies = [ "cfg-if", "libc", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -526,9 +561,9 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.42" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" +checksum = "8d59457e662d541ba17869cf51cf177c0b5f0cbf476c66bdc90bf1edac4f875b" dependencies = [ "autocfg", "num-traits", @@ -560,7 +595,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffa5a33ddddfee04c0283a7653987d634e880347e96b5b2ed64de07efb59db9d" dependencies = [ "proc-macro-crate", - "proc-macro2 1.0.18", + "proc-macro2 1.0.20", "quote 1.0.7", "syn", ] @@ -576,18 +611,18 @@ dependencies = [ [[package]] name = "ordered-float" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18869315e81473c951eb56ad5558bbc56978562d3ecfb87abb7a1e944cea4518" +checksum = "3741934be594d77de1c8461ebcbbe866f585ea616a9753aa78f2bdc69f0e4579" dependencies = [ "num-traits", ] [[package]] name = "parking_lot" -version = "0.10.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e98c49ab0b7ce5b222f2cc9193fc4efe11c6d0bd4f648e374684a6857b1cfc" +checksum = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e" dependencies = [ "lock_api", "parking_lot_core", @@ -595,16 +630,16 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.7.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7582838484df45743c8434fbff785e8edf260c28748353d44bc0da32e0ceabf1" +checksum = "d58c7c768d4ba344e3e8d72518ac13e259d7c7ade24167003b8488e10b6740a3" dependencies = [ "cfg-if", "cloudabi", "libc", "redox_syscall", "smallvec", - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -615,15 +650,15 @@ checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" [[package]] name = "pkg-config" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" +checksum = "d36492546b6af1463394d46f0c834346f31548646f6ba10849802c9c9a27ac33" [[package]] name = "proc-macro-crate" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" dependencies = [ "toml", ] @@ -639,11 +674,11 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beae6331a816b1f65d04c45b078fd8e6c93e8071771f41b8163255bbd8d7c8fa" +checksum = "175c513d55719db99da20232b06cda8bab6b83ec2d04e3283edf0213c37c1a29" dependencies = [ - "unicode-xid 0.2.0", + "unicode-xid 0.2.1", ] [[package]] @@ -661,7 +696,7 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.20", ] [[package]] @@ -675,9 +710,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.1.56" +version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" [[package]] name = "rusttype" @@ -685,17 +720,16 @@ version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "310942406a39981bed7e12b09182a221a29e0990f3e7e0c971f131922ed135d5" dependencies = [ - "rusttype 0.8.2", + "rusttype 0.8.3", ] [[package]] name = "rusttype" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14a911032fb5791ccbeec9f28fdcb9bf0983b81f227bafdfd227c658d0731c8a" +checksum = "9f61411055101f7b60ecf1041d87fb74205fb20b0c7a723f07ef39174cf6b4c0" dependencies = [ "approx", - "arrayvec", "ordered-float", "stb_truetype", ] @@ -717,9 +751,9 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "serde" -version = "1.0.112" +version = "1.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "736aac72d1eafe8e5962d1d1c3d99b0df526015ba40915cb3c49d042e92ec243" +checksum = "e54c9a88f2da7238af84b5101443f0c0d0a3bbdc455e34a5c9497b1903ed55d5" [[package]] name = "slab" @@ -729,9 +763,9 @@ checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" [[package]] name = "smallvec" -version = "1.2.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c2fb2ec9bcd216a5b0d0ccf31ab17b5ed1d627960edff65bbe95d3ce221cefc" +checksum = "fbee7696b84bbf3d89a1c2eccff0850e3047ed46bfcd2e92c29a2d074d57e252" [[package]] name = "smithay-client-toolkit" @@ -760,24 +794,24 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.31" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5304cfdf27365b7585c25d4af91b35016ed21ef88f17ced89c7093b43dba8b6" +checksum = "963f7d3cc59b59b9325165add223142bbf1df27655d07789f109896d353d8350" dependencies = [ - "proc-macro2 1.0.18", + "proc-macro2 1.0.20", "quote 1.0.7", - "unicode-xid 0.2.0", + "unicode-xid 0.2.1", ] [[package]] name = "time" -version = "0.1.42" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" dependencies = [ "libc", - "redox_syscall", - "winapi 0.3.8", + "wasi", + "winapi 0.3.9", ] [[package]] @@ -797,9 +831,9 @@ checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" [[package]] name = "unicode-xid" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" [[package]] name = "void" @@ -814,10 +848,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d" dependencies = [ "same-file", - "winapi 0.3.8", + "winapi 0.3.9", "winapi-util", ] +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + [[package]] name = "wayland-client" version = "0.23.6" @@ -886,9 +926,9 @@ checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" [[package]] name = "winapi" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ "winapi-i686-pc-windows-gnu", "winapi-x86_64-pc-windows-gnu", @@ -908,11 +948,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa515c5163a99cc82bab70fd3bfdd36d827be85de63737b40fcef2ce084a436e" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" dependencies = [ - "winapi 0.3.8", + "winapi 0.3.9", ] [[package]] @@ -929,7 +969,7 @@ checksum = "1e4ccbf7ddb6627828eace16cacde80fc6bf4dbb3469f88487262a02cf8e7862" dependencies = [ "bitflags", "cocoa", - "core-foundation", + "core-foundation 0.7.0", "core-graphics", "core-video-sys", "dispatch", @@ -948,7 +988,7 @@ dependencies = [ "raw-window-handle", "smithay-client-toolkit", "wayland-client", - "winapi 0.3.8", + "winapi 0.3.9", "x11-dl", ] @@ -992,6 +1032,6 @@ checksum = "d089681aa106a86fade1b0128fb5daf07d5867a509ab036d99988dec80429a57" [[package]] name = "xml-rs" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb76e5c421bbbeb8924c60c030331b345555024d56261dae8f3e786ed817c23" +checksum = "b07db065a5cf61a7e4ba64f29e67db906fb1787316516c4e6e5ff0fea1efcd8a" diff --git a/Cargo.toml b/Cargo.toml index f0bbe15..cd009fc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,16 +7,16 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -log = "0.4.8" -chrono = "0.4.11" -fern = { version = "0.6.0", features = ["colored"] } -gfx-hal = "0.5.3" -winit = "0.22.0" -raw-window-handle = "0.3.3" -num-traits = "0.2.12" +log = "^0.4.8" +chrono = "^0.4.11" +fern = { version = "^0.6.0", features = ["colored"] } +gfx-hal = "^0.6.0" +winit = "^0.22.0" +raw-window-handle = "^0.3.3" +num-traits = "^0.2.12" [dependencies.gfx-backend-vulkan] -version = "0.5" +version = "^0.6.1" features = ["x11"] [lib] diff --git a/doc/architecture b/doc/architecture index 68d9f08..242354c 100644 --- a/doc/architecture +++ b/doc/architecture @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 0c2d6fc..3dbb978 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -59,7 +59,7 @@ pub fn run() -> Result<(), &'static str> { let mut windows = vec![ WinitWindow::new("IV", Rect {w: 1280, h: 720})?, - WinitWindow::new("IV 2", Rect {w: 720, h: 480})?, + // WinitWindow::new("IV 2", Rect {w: 720, h: 480})?, ]; let mut renderer: Renderer = Renderer::new(&mut windows)?; @@ -67,18 +67,14 @@ pub fn run() -> Result<(), &'static str> { let color = [0.5, 0.0, 0.0, 1.0]; - for window in &mut windows { - let _ = renderer.draw_clear_frame(window, color); - } - loop { for window in &mut windows { - match renderer.draw_frame(window) { + match renderer.draw_clear_frame(window, color) { Err(err) => println!("{}", err), _ => (), - } - } - } + }}} + +// Ok(()) } // let (input_tx, input_rx) = mpsc::channel(); diff --git a/src/renderer.rs b/src/renderer.rs index 86b2f48..dff28a5 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -3,6 +3,7 @@ use log::{debug, error, info, trace, warn}; use std::{ mem::ManuallyDrop, + iter, }; mod gpu; @@ -31,7 +32,10 @@ where B: gfx_hal::Backend, { fn drop(&mut self) { - use gfx_hal::device::Device; + use gfx_hal::{ + Instance, + device::Device, + }; debug!("Waiting for device to idle..."); let _ = self.gpu @@ -39,13 +43,14 @@ where .wait_idle(); info!("Dropping Renderer..."); - for mut swap_system in self.swap_systems.drain(..) { - swap_system.drop(&mut self.gpu, &self.instance); - } + // for mut pipeline in self.pipelines.drain(..) { -// // } +// unsafe { + for mut swap_system in self.swap_systems.drain(..) { + self.instance.destroy_surface(swap_system.drop(&mut self.gpu)); + } ManuallyDrop::drop(&mut self.gpu); ManuallyDrop::drop(&mut self.instance); } @@ -86,42 +91,88 @@ where }) } - pub fn draw_frame(&mut self, output: &mut O) - -> Result<(), &'static str> - where - T: raw_window_handle::HasRawWindowHandle, - O: Output - { - use gfx_hal::window::AcquireError; - - let swap_index = output.get_id(); - let (frame, image_id) = match self.swap_systems[swap_index].acquire_frame() { - Ok((frame, image_id)) => (frame, image_id), - Err(err) => match err { - AcquireError::NotReady => { - return Err("Frame acquisition failed because all Frames are in use"); - }, - _ => Err("Could not acquire Frame from SwapSystem")?, - }}; - - let _ = frame.sync_gpu(&self.gpu)?; - - let queue = &mut self.gpu.queue_mut(); - frame.submit(queue); - - let _ = self.swap_systems[swap_index].present_frame(frame, image_id, queue)?; - - Ok(()) - } - pub fn draw_clear_frame(&mut self, output: &mut O, color: [f32; 4]) -> Result<(), &'static str> where T: raw_window_handle::HasRawWindowHandle, O: Output { - self.swap_systems[output.get_id()].configure_render_pass(color)?; - self.draw_frame(output) + use gfx_hal::{ + window::AcquireError, + device::Device, + queue::Submission, + }; + + let swap_system = &mut self.swap_systems[output.get_id()]; + + let mut frame = match swap_system.acquire_frame(&self.gpu) { + Ok(frame) => frame, + Err(err) => match err { + AcquireError::NotReady => { + return Err("Frame acquisition failed because all Frames are in use"); + }, + AcquireError::OutOfDate => { + swap_system.recreate(&mut self.gpu)?; + debug!("SwapSystem : {:#?}", swap_system); + return Ok(()); + }, + _ => Err("Could not acquire Frame from SwapSystem")?, + }}; + + trace!("Waiting for Frame..."); + unsafe { + let _ = self.gpu.device() + .wait_for_fence(&frame.fences[0], !0) + .map_err(|_| "Failed to wait for Fence")?; + let _ = self.gpu.device() + .reset_fence(&frame.fences[0]) + .map_err(|_| "Failed to reset fence")?; + } + + trace!("Recording CommandBuffer..."); + unsafe { + use gfx_hal::command::{ + CommandBufferFlags, + SubpassContents, + ClearValue, + ClearColor, + CommandBuffer, + }; + + frame.command_buffer.begin_primary(CommandBufferFlags::ONE_TIME_SUBMIT); + + let clear_value = ClearValue {color: ClearColor{float32: color}}; + + frame.command_buffer.begin_render_pass( + &swap_system.render_pass, + &frame.framebuffer.as_ref().unwrap(), + swap_system.render_area, + iter::once(clear_value), + SubpassContents::Inline, + ); + frame.command_buffer.end_render_pass(); + frame.command_buffer.finish(); + } + + trace!("Submiting to queue..."); + let submission = Submission { + command_buffers: iter::once(&*frame.command_buffer), + wait_semaphores: None, + signal_semaphores: iter::once(&frame.signal_semaphores[0]), + }; + + unsafe { + use gfx_hal::queue::CommandQueue; + + self.gpu.queue_mut().submit(submission, Some(&frame.fences[0])); + } + + let result = swap_system.present_frame(frame, &mut self.gpu); + if result.is_err() { + swap_system.recreate(&mut self.gpu).unwrap(); + } + + Ok(()) } } diff --git a/src/renderer/gpu.rs b/src/renderer/gpu.rs index ef4ee26..e88b197 100644 --- a/src/renderer/gpu.rs +++ b/src/renderer/gpu.rs @@ -162,7 +162,7 @@ where trace!("Creating CommandPool..."); device .create_command_pool(queue_group.family, - CommandPoolCreateFlags::empty()) + CommandPoolCreateFlags::RESET_INDIVIDUAL) .map_err(|_| "Could not create CommandPool")? }; diff --git a/src/renderer/swap_system.rs b/src/renderer/swap_system.rs index 81056c9..8a251d2 100644 --- a/src/renderer/swap_system.rs +++ b/src/renderer/swap_system.rs @@ -4,11 +4,11 @@ use log::{debug, error, info, trace, warn}; use std::{ mem::ManuallyDrop, ptr::read, - collections::HashMap, + collections::VecDeque, }; use gfx_hal::{ - window::{Extent2D, AcquireError}, + window::{Extent2D, AcquireError, PresentationSurface, SurfaceCapabilities, SwapchainConfig}, pso::Rect as GfxRect, format::Format, }; @@ -24,11 +24,9 @@ pub struct SwapSystem { surface: ManuallyDrop, format: Format, extent: Extent2D, - render_area: GfxRect, //TODO may not be needed (duplicate of extent) - swapchain: ManuallyDrop, - spare_semaphore: ManuallyDrop, - render_pass: ManuallyDrop, - frames: HashMap>, + pub render_area: GfxRect, //TODO may not be needed (duplicate of extent) + pub render_pass: ManuallyDrop, + frames: VecDeque>, frame_nb: usize, } @@ -36,36 +34,26 @@ impl SwapSystem where B: gfx_hal::Backend, { - pub fn drop(&mut self, gpu: &mut Gpu, instance: &B::Instance) { - use gfx_hal::{ - device::Device, - Instance, - }; + pub fn drop(&mut self, gpu: &mut Gpu) -> B::Surface { + use gfx_hal::device::Device; debug!("Dropping SwapSystem..."); - for (_, mut frame) in self.frames.drain() { + for mut frame in self.frames.drain(..) { frame.drop(gpu); } unsafe { gpu.device().destroy_render_pass( ManuallyDrop::into_inner(read(&mut self.render_pass))); - gpu.device().destroy_semaphore( - ManuallyDrop::into_inner(read(&mut self.spare_semaphore))); - gpu.device().destroy_swapchain( - ManuallyDrop::into_inner(read(&mut self.swapchain))); //render_area extent and format can be dropped automatically - instance.destroy_surface( - ManuallyDrop::into_inner(read(&mut self.surface))); + self.surface.unconfigure_swapchain(gpu.device()); + trace!("SwapSystem dropped !"); + ManuallyDrop::take(&mut self.surface) } - trace!("SwapSystem dropped !"); } - pub fn new(gpu: &mut Gpu, mut surface: B::Surface) + pub fn new(gpu: &mut Gpu, mut surface: B::Surface) -> Result, &'static str> { - use gfx_hal::{ - window::SwapchainConfig, - }; debug!("Creating SwapSystem..."); trace!("Obtaining surface capabilities..."); @@ -99,92 +87,17 @@ where let render_area = GfxRect{x: 0, y: 0, w: extent.width as i16, h: extent.height as i16}; trace!("Generating Swapchain configuration..."); - let (swapchain_config, frame_nb) = { - - let present_mode = { - use gfx_hal::window::PresentMode; - - [PresentMode::MAILBOX, PresentMode::FIFO, PresentMode::RELAXED, - PresentMode::IMMEDIATE] - .iter() - .cloned() - .find(|pm| capabilities.present_modes.contains(*pm)) - .ok_or("No PresentMode values specified!")? - }; - - let composite_alpha_mode = { - use gfx_hal::window::CompositeAlphaMode; - - [CompositeAlphaMode::OPAQUE, CompositeAlphaMode::INHERIT, - CompositeAlphaMode::PREMULTIPLIED, CompositeAlphaMode::POSTMULTIPLIED] - .iter() - .cloned() - .find(|ca| capabilities.composite_alpha_modes.contains(*ca)) - .ok_or("No CompositeAlpha values specified!")? - }; - - let image_count = { - use std::cmp::{min, max}; - use gfx_hal::window::PresentMode; - - let count = match present_mode { - PresentMode::MAILBOX => 3, - _ => 2, //TODO to be checked - }; - max(capabilities.image_count.start().clone(), - min(capabilities.image_count.end().clone(), count)) - }; - - warn!("Hard-coding number of layers per image !"); - let image_layers = 1; - - let image_usage = { - use gfx_hal::image::Usage; - - if capabilities.usage.contains(Usage::COLOR_ATTACHMENT) { - Usage::COLOR_ATTACHMENT - } else { - Err("The Surface isn't capable of supporting color!")? - }}; - - ( - SwapchainConfig { - present_mode, - composite_alpha_mode, - format: format.clone(), - extent: extent.clone(), - image_count: image_count.clone(), - image_layers, - image_usage, - }, - image_count as usize - ) - }; - // //TODO improve swapchain configuration - // let swapchain_config = SwapchainConfig::from_caps(&capabilities, format, extent); - // let swapchain_config = swapchain_config.with_image_count(3); + let (swapchain_config, frame_nb) = + generate_swapchain_config(capabilities, &format, &extent)?; debug!("Swapchain configuration : {:#?}", swapchain_config); - trace!("Creating Swapchain..."); - let (swapchain, backbuffer) = unsafe { - use gfx_hal::device::Device; - - gpu.device() - .create_swapchain(&mut surface, swapchain_config, None) + trace!("Configuring Swapchain..."); + let _ = unsafe { + surface + .configure_swapchain(gpu.device(), swapchain_config) .map_err(|_| "Failed to create swapchain and backbuffer")? }; - - - trace!("Creating spare Semaphore..."); - let spare_semaphore = { - use gfx_hal::device::Device; - - gpu.device() - .create_semaphore() - .map_err(|_| "Could not create sempahore")? - }; - trace!("Creating RenderPass..."); let render_pass = { use gfx_hal::{ @@ -219,11 +132,11 @@ where }; warn!("Generating hard-coded number of frames !"); - let mut frames = HashMap::with_capacity(frame_nb); - for i in 0..frame_nb { - let frame = Frame::new(gpu, &backbuffer[i], &format, &render_pass, &extent) + let mut frames = VecDeque::with_capacity(frame_nb); + for _ in 0..frame_nb { + let frame = Frame::new(gpu) .map_err(|_| "Could not create frame")?; - frames.insert(i, frame); + frames.push_back(frame); }; let frame_nb = frames.len(); @@ -234,67 +147,167 @@ where format, extent, render_area, - swapchain: ManuallyDrop::new(swapchain), - spare_semaphore: ManuallyDrop::new(spare_semaphore), render_pass: ManuallyDrop::new(render_pass), frames, frame_nb, }) } - pub fn configure_render_pass(&mut self, color: [f32; 4]) -> Result<(), &'static str> { - - if self.frames.len() != self.frame_nb { - return Err("Tried to configure RenderPass with frames acquired"); - } + pub fn recreate(&mut self, gpu: &mut Gpu) -> Result<(), &'static str> { - debug!("Configuring Color RenderPass..."); - for (_, frame) in &mut self.frames { - frame.record_command_buffer(&self.render_pass, self.render_area.clone(), color); - } + trace!("Obtaining surface capabilities..."); + let capabilities = { + use gfx_hal::window::Surface; + + self.surface.capabilities(&gpu.adapter().physical_device) + }; + debug!("Surface capabitlities : {:#?}", capabilities); + + trace!("Getting surface's render area size..."); + self.extent = capabilities.current_extent + .unwrap_or(*capabilities.extents.end()) + .clone(); + self.render_area = + GfxRect{x: 0, y: 0, w: self.extent.width as i16, h: self.extent.height as i16}; + + trace!("Generating Swapchain configuration..."); + let (swapchain_config, _frame_nb) = //TODO check frame nb change + generate_swapchain_config(capabilities, &self.format, &self.extent)?; + debug!("Swapchain configuration : {:#?}", swapchain_config); + + trace!("Configuring Swapchain..."); + let _ = unsafe { + self.surface + .configure_swapchain(gpu.device(), swapchain_config) + .map_err(|_| "Failed to create swapchain and backbuffer")? + }; Ok(()) } - pub fn acquire_frame(&mut self) -> Result<(Frame, u32), AcquireError> { - use gfx_hal::window::Swapchain; + pub fn acquire_frame(&mut self, gpu: &Gpu) -> Result, AcquireError> { trace!("Acquiring Frame..."); - let image_id = unsafe { - match self.swapchain.acquire_image(core::u64::MAX, Some(&self.spare_semaphore), None) { - Ok((image_id, suboptimal)) => { + let image = unsafe { + match self.surface.acquire_image(core::u64::MAX) { + Ok((image, suboptimal)) => { match suboptimal { Some(_) => return Err(AcquireError::OutOfDate), - None => image_id, + None => image, }}, Err(err) => return Err(err), }}; + let mut frame = self.frames.pop_back().unwrap(); - //TODO give back image to swaphain - //debug!("image id : {}", image_id); - let mut frame = match self.frames.remove(&(image_id as usize)) { - Some(frame) => frame, - None => return Err(AcquireError::NotReady), + trace!("Creating Framebuffer..."); + let framebuffer = unsafe { + use gfx_hal::device::Device; + use std::borrow::Borrow; + + gpu.device() + .create_framebuffer(&self.render_pass, + vec![image.borrow()], + self.extent.clone().to_extent()) + .unwrap() //TODO improve that }; - frame.swap_semaphore(&mut self.spare_semaphore); + + frame.link_swapchain_image(image, framebuffer); - Ok((frame, image_id)) + Ok(frame) } - pub fn present_frame(&mut self, frame: Frame, image_id: u32, queue: &mut B::CommandQueue) + pub fn present_frame(&mut self, mut frame: Frame, gpu: &mut Gpu) -> Result<(), &'static str> { - use gfx_hal::window::Swapchain; + use gfx_hal::{ + queue::CommandQueue, + device::Device, + }; + + let (image, framebuffer) = frame + .unlink_swapchain_image() + .unwrap(); //TODO improve that trace!("Presenting Frame..."); - let _result = unsafe { - self.swapchain - .present(queue, image_id, Some(frame.get_present_semaphore())) + let _ = unsafe { + gpu.queue_mut() + .present(&mut self.surface, image, Some(&frame.signal_semaphores[0])) .map_err(|_| "Failed to present into the swapchain")?; }; - self.frames.insert(image_id as usize, frame); + self.frames.push_front(frame); + + trace!("Destroying Framebuffer..."); + unsafe { + gpu.device().destroy_framebuffer(framebuffer); + } Ok(()) } } +fn generate_swapchain_config(capabilities: SurfaceCapabilities, + format: &Format, + extent: &Extent2D) + -> Result<(SwapchainConfig, usize), &'static str> { + + trace!("Generating Swapchain configuration..."); + let present_mode = { + use gfx_hal::window::PresentMode; + + [PresentMode::MAILBOX, PresentMode::FIFO, PresentMode::RELAXED, + PresentMode::IMMEDIATE] + .iter() + .cloned() + .find(|pm| capabilities.present_modes.contains(*pm)) + .ok_or("No PresentMode values specified!")? + }; + + let composite_alpha_mode = { + use gfx_hal::window::CompositeAlphaMode; + + [CompositeAlphaMode::OPAQUE, CompositeAlphaMode::INHERIT, + CompositeAlphaMode::PREMULTIPLIED, CompositeAlphaMode::POSTMULTIPLIED] + .iter() + .cloned() + .find(|ca| capabilities.composite_alpha_modes.contains(*ca)) + .ok_or("No CompositeAlpha values specified!")? + }; + + let image_count = { + use std::cmp::{min, max}; + use gfx_hal::window::PresentMode; + + let count = match present_mode { + PresentMode::MAILBOX => 3, + _ => 2, //TODO to be checked + }; + max(capabilities.image_count.start().clone(), + min(capabilities.image_count.end().clone(), count)) + }; + + warn!("Hard-coding number of layers per image !"); + let image_layers = 1; + + let image_usage = { + use gfx_hal::image::Usage; + + if capabilities.usage.contains(Usage::COLOR_ATTACHMENT) { + Usage::COLOR_ATTACHMENT + } else { + Err("The Surface isn't capable of supporting color!")? + }}; + + Ok (( + SwapchainConfig { + present_mode, + composite_alpha_mode, + format: format.clone(), + extent: extent.clone(), + image_count: image_count.clone(), + image_layers, + image_usage, + }, + image_count as usize + )) +} + diff --git a/src/renderer/swap_system/frame.rs b/src/renderer/swap_system/frame.rs index 723c96f..24ad72d 100644 --- a/src/renderer/swap_system/frame.rs +++ b/src/renderer/swap_system/frame.rs @@ -7,24 +7,19 @@ use std::{ iter, }; -use gfx_hal::{ - window::Extent2D, - format::Format, - queue::Submission, - pso::Rect as GfxRect, -}; +use gfx_hal::window::{PresentationSurface}; use super::super::gpu::Gpu; //--Frame implementation---------------------------------------------------------------------------- #[derive(Debug)] pub struct Frame { - wait_semaphores: Vec, - signal_semaphores: Vec, - fences: Vec, - image_view: ManuallyDrop, - framebuffer: ManuallyDrop, - command_buffer: ManuallyDrop, + pub wait_semaphores: Vec, + pub signal_semaphores: Vec, + pub fences: Vec, + pub command_buffer: ManuallyDrop, + image_view: Option<>::SwapchainImage>, + pub framebuffer: Option, } impl Frame @@ -39,12 +34,11 @@ where trace!("Dropping Frame..."); unsafe { + if self.image_view.is_some() { + warn!("Dropping non-presented frame !"); + } gpu.command_pool_mut().free( iter::once(ManuallyDrop::into_inner(read(&mut self.command_buffer)))); - gpu.device().destroy_framebuffer( - ManuallyDrop::into_inner(read(&mut self.framebuffer))); - gpu.device().destroy_image_view( - ManuallyDrop::into_inner(read(&mut self.image_view))); for fence in self.fences.drain(..) { gpu.device().destroy_fence(fence); } @@ -58,12 +52,7 @@ where } } - pub fn new(gpu: &mut Gpu, - image: &B::Image, - format: &Format, - render_pass: &B::RenderPass, - extent: &Extent2D) - -> Result, &'static str> + pub fn new(gpu: &mut Gpu) -> Result, &'static str> { debug!("Creating Frame..."); @@ -86,41 +75,7 @@ where (wait_semaphores, signal_semaphores, fences) }; - - trace!("Creating ImageView..."); - let image_view = unsafe { - use gfx_hal::{ - image::{ViewKind, SubresourceRange}, - format::{Swizzle, Aspects}, - device::Device, - }; - - gpu.device() - .create_image_view( - image, - ViewKind::D2, - format.clone(), - Swizzle::NO, - SubresourceRange { - aspects : Aspects::COLOR, - levels : 0..1, - layers : 0..1, - }, - ) - .map_err(|_| "Could not create ImageView")? - }; - trace!("Creating Framebuffer..."); - let framebuffer = unsafe { - use gfx_hal::device::Device; - - gpu.device() - .create_framebuffer(render_pass, - vec![&image_view], - extent.clone().to_extent()) - .map_err(|_| "Could not create FrameBuffer")? - }; - trace!("Allocating CommandBuffer..."); let command_buffer = unsafe { use gfx_hal::{ @@ -136,86 +91,29 @@ where wait_semaphores, signal_semaphores, fences, - image_view: ManuallyDrop::new(image_view), - framebuffer: ManuallyDrop::new(framebuffer), command_buffer: ManuallyDrop::new(command_buffer), + image_view: None, + framebuffer: None, }) } - pub fn sync_gpu(&self, gpu: &Gpu) -> Result<(), &'static str>{ - use gfx_hal::device::Device; - - trace!("Waiting for Frame..."); - unsafe { - let _ = gpu.device() - .wait_for_fence(&self.fences[0], !0) - .map_err(|_| "Failed to wait for Fence")?; - let _ = gpu.device() - .reset_fence(&self.fences[0]) - .map_err(|_| "Failed to reset fence")?; - } + pub fn link_swapchain_image(&mut self, + image: >::SwapchainImage, + framebuffer: B::Framebuffer) { - Ok(()) + self.image_view = Some(image); + self.framebuffer = Some(framebuffer); } - pub fn record_command_buffer(&mut self, - render_pass: &B::RenderPass, - render_area: GfxRect, - color: [f32; 4]) { + pub fn unlink_swapchain_image(&mut self) + -> Result<(>::SwapchainImage, + B::Framebuffer), &'static str> { - trace!("Recording CommandBuffer..."); - - unsafe { - use gfx_hal::command::{ - CommandBufferFlags, - SubpassContents, - ClearValue, - ClearColor, - CommandBuffer, - }; - - self.command_buffer.begin_primary(CommandBufferFlags::EMPTY); - - let clear_value = ClearValue {color: ClearColor{float32: color}}; - - self.command_buffer.begin_render_pass( - render_pass, - &self.framebuffer, - render_area, - iter::once(clear_value), - SubpassContents::Inline, - ); - self.command_buffer.end_render_pass(); - self.command_buffer.finish(); - } - } - - pub fn submit(&self, queue: &mut B::CommandQueue) { - use gfx_hal::pso::PipelineStage; - - trace!("Submiting to queue..."); - let submission = Submission { - command_buffers: iter::once(&*self.command_buffer), - wait_semaphores: iter::once((&self.wait_semaphores[0], - PipelineStage::COLOR_ATTACHMENT_OUTPUT)), - signal_semaphores: iter::once(&self.signal_semaphores[0]), - }; - - unsafe { - use gfx_hal::queue::CommandQueue; - - queue.submit(submission, Some(&self.fences[0])); - } - } - - pub fn swap_semaphore(&mut self, semaphore: &mut B::Semaphore) { - - std::mem::swap(&mut self.wait_semaphores[0], semaphore); - } - - pub fn get_present_semaphore(&self) -> &B::Semaphore { - - &self.signal_semaphores[0] + match (self.image_view.take(), self.framebuffer.take()) { + (Some(image_view), Some(framebuffer)) => Some((image_view, framebuffer)), + _ => None, + } + .ok_or("Can not unlink non-linked Frame !") } }