From 57f0cd184fbab5a258f898ad0849064ffaa11e4f Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Thu, 31 Jan 2019 17:59:37 -0500 Subject: [PATCH] native: basic support for pipeine stages in barriers --- Cargo.lock | 110 +++++++++++++++++++++++++++ examples/Cargo.toml | 1 + examples/hello_triangle_rust/main.rs | 5 +- wgpu-bindings/wgpu.h | 7 +- wgpu-native/src/command/mod.rs | 12 ++- wgpu-native/src/conv.rs | 2 +- wgpu-native/src/device.rs | 30 +++++++- wgpu-native/src/resource.rs | 2 +- wgpu-native/src/swap_chain.rs | 9 ++- 9 files changed, 163 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 41edf6a13..9b808d023 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,3 +1,11 @@ +[[package]] +name = "aho-corasick" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "andrew" version = "0.1.6" @@ -220,10 +228,23 @@ name = "downcast-rs" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "env_logger" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "examples" version = "0.1.0" dependencies = [ + "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", "wgpu 0.1.0", "wgpu-native 0.1.0", ] @@ -380,6 +401,14 @@ dependencies = [ "fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "humantime" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "itoa" version = "0.4.3" @@ -442,6 +471,15 @@ dependencies = [ "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "memchr" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "memmap" version = "0.7.0" @@ -609,6 +647,11 @@ dependencies = [ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "quick-error" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "quote" version = "0.5.2" @@ -748,6 +791,26 @@ dependencies = [ "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "regex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "regex-syntax" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "remove_dir_all" version = "0.5.1" @@ -951,6 +1014,14 @@ dependencies = [ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "termcolor" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "termion" version = "1.5.1" @@ -969,6 +1040,14 @@ dependencies = [ "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "thread_local" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "toml" version = "0.4.10" @@ -977,6 +1056,11 @@ dependencies = [ "serde 1.0.85 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ucd-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "unicode-width" version = "0.1.5" @@ -995,6 +1079,11 @@ dependencies = [ "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "utf8-ranges" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "vec_map" version = "0.8.1" @@ -1128,6 +1217,15 @@ name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "wincolor" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "winit" version = "0.18.1" @@ -1197,6 +1295,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] +"checksum aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9a933f4e58658d7b12defcf96dc5c720f20832deebe3e0a19efd3b6aaeeb9e" "checksum andrew 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "142e9e6a99ad0d63a4cf6ce58a4c979f472c5815cbf7e5ca4e47b26a10dc728e" "checksum android_glue 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "000444226fcff248f2bc4c7625be32c63caccfecc2723a2b9f78a7487a49c407" "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" @@ -1223,6 +1322,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum derivative 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6073e9676dbebdddeabaeb63e3b7cefd23c86f5c41d381ee1237cc77b1079898" "checksum dlib 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "77e51249a9d823a4cb79e3eca6dcd756153e8ed0157b6c04775d04bf1b13b76a" "checksum downcast-rs 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "18df8ce4470c189d18aa926022da57544f31e154631eb4cfe796aea97051fe6c" +"checksum env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)" = "15b0a4d2e39f8420210be8b27eeda28029729e2fd4291019455016c348240c38" "checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2" "checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1" "checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" @@ -1237,6 +1337,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum gfx-backend-metal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "68fa011e32280f7566bddbb736734291b685c812087c99bc848d6ac7ae3e0b7f" "checksum gfx-backend-vulkan 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "982c618fd9ddeea7e68b2d872b9b6cf13024fc7d4033ba90f0e54ac0d33c798f" "checksum gfx-hal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "84c470bce77fcaaea6854858682a99026ff796b880b0ca30511593a6b2bc77c0" +"checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114" "checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" "checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" "checksum lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1" @@ -1246,6 +1347,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" "checksum malloc_buf 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +"checksum memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e1dd4eaac298c32ce07eb6ed9242eda7d82955b9170b7d6db59b2e02cc63fcb8" "checksum memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" "checksum metal 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7de9c2b83c946ab01c9942928388f911d93486b97636d9927541345905fea65d" "checksum nix 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "921f61dc817b379d0834e45d5ec45beaacfae97082090a49c2cf30dcbc30206f" @@ -1265,6 +1367,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c" "checksum proc-macro2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1b06e2f335f48d24442b35a19df506a835fb3547bc3c06ef27340da9acf5cae7" "checksum proc-macro2 0.4.26 (registry+https://github.com/rust-lang/crates.io-index)" = "38fddd23d98b2144d197c0eca5705632d4fe2667d14a6be5df8934f8d74f1978" +"checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" "checksum quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9949cfe66888ffe1d53e6ec9d9f3b70714083854be20fd5e271b232a017401e8" "checksum quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)" = "cdd8e04bd9c52e0342b406469d494fcb033be4bdbe5c606016defbb1681411e1" "checksum rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e464cd887e869cddcae8792a4ee31d23c7edd516700695608f5b98c67ee0131c" @@ -1281,6 +1384,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" "checksum redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)" = "423e376fffca3dfa06c9e9790a9ccd282fafb3cc6e6397d01dbf64f9bacc6b85" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" +"checksum regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "37e7cbbd370869ce2e8dff25c7018702d10b21a20ef7135316f8daecd6c25b7f" +"checksum regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8c2f35eedad5295fdf00a63d7d4b238135723f92b434ec06774dad15c7ab0861" "checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" "checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" @@ -1305,12 +1410,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)" = "f92e629aa1d9c827b2bb8297046c1ccffc57c99b947a680d3ccff1f136a3bee9" "checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" "checksum tempfile 3.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "7e91405c14320e5c79b3d148e1c86f40749a36e490642202a31689cb1a3452b2" +"checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f" "checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" "checksum textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6" +"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" "checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" +"checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" "checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +"checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" "checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" "checksum walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9d9d7ed3431229a144296213105a390676cc49c9b6a72bd19f3176c98e129fa1" @@ -1323,6 +1432,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "afc5508759c5bf4285e61feb862b6083c8480aec864fa17a81fdec6f69b461ab" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +"checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba" "checksum winit 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c57c15bd4c0ef18dff33e263e452abe32d00e2e05771cacaa410a14cc1c0776" "checksum wio 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8a31e8a268d6941ffb7f8d7989fc93e4692bd3e75a27d400a72b4be1dadb213" "checksum x11 2.18.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39697e3123f715483d311b5826e254b6f3cfebdd83cf7ef3358f579c3d68e235" diff --git a/examples/Cargo.toml b/examples/Cargo.toml index a180fb5f2..a0a858040 100644 --- a/examples/Cargo.toml +++ b/examples/Cargo.toml @@ -23,3 +23,4 @@ vulkan = ["wgpu-native/gfx-backend-vulkan"] [dependencies] wgpu-native = { path = "../wgpu-native" } wgpu = { path = "../wgpu-rs" } +env_logger = "0.5" diff --git a/examples/hello_triangle_rust/main.rs b/examples/hello_triangle_rust/main.rs index 30890d92b..ba6ed735c 100644 --- a/examples/hello_triangle_rust/main.rs +++ b/examples/hello_triangle_rust/main.rs @@ -1,7 +1,10 @@ +extern crate env_logger; extern crate wgpu; extern crate wgpu_native; fn main() { + env_logger::init(); + let instance = wgpu::Instance::new(); let adapter = instance.get_adapter(&wgpu::AdapterDescriptor { power_preference: wgpu::PowerPreference::LowPower, @@ -66,7 +69,7 @@ fn main() { let surface = instance.create_surface(&window); let swap_chain = device.create_swap_chain(&surface, &wgpu::SwapChainDescriptor { - usage: wgpu::TextureUsageFlags::OUTPUT_ATTACHMENT | wgpu::TextureUsageFlags::PRESENT, + usage: wgpu::TextureUsageFlags::OUTPUT_ATTACHMENT, format: wgpu::TextureFormat::B8g8r8a8Unorm, width: size.width as u32, height: size.height as u32, diff --git a/wgpu-bindings/wgpu.h b/wgpu-bindings/wgpu.h index 15b1a4604..8435b4c84 100644 --- a/wgpu-bindings/wgpu.h +++ b/wgpu-bindings/wgpu.h @@ -436,8 +436,6 @@ typedef struct { #define WGPUTextureUsageFlags_OUTPUT_ATTACHMENT 16 -#define WGPUTextureUsageFlags_PRESENT 32 - #define WGPUTextureUsageFlags_SAMPLED 4 #define WGPUTextureUsageFlags_STORAGE 8 @@ -455,6 +453,11 @@ WGPUDeviceId wgpu_adapter_create_device(WGPUAdapterId adapter_id, void wgpu_buffer_destroy(WGPUBufferId buffer_id); +void wgpu_buffer_set_sub_data(WGPUBufferId buffer_id, + uint32_t start, + uint32_t count, + const uint8_t *data); + WGPUComputePassId wgpu_command_buffer_begin_compute_pass(WGPUCommandBufferId command_buffer_id); WGPURenderPassId wgpu_command_buffer_begin_render_pass(WGPUCommandBufferId command_buffer_id, diff --git a/wgpu-native/src/command/mod.rs b/wgpu-native/src/command/mod.rs index cff0871e9..61e36b71c 100644 --- a/wgpu-native/src/command/mod.rs +++ b/wgpu-native/src/command/mod.rs @@ -7,7 +7,10 @@ pub(crate) use self::allocator::CommandAllocator; pub use self::compute::*; pub use self::render::*; -use crate::device::{FramebufferKey, RenderPassKey}; +use crate::device::{ + FramebufferKey, RenderPassKey, + all_buffer_stages, all_image_stages, +}; use crate::registry::{Items, HUB}; use crate::swap_chain::{SwapChainLink, SwapImageEpoch}; use crate::track::{BufferTracker, TextureTracker}; @@ -21,7 +24,7 @@ use crate::{ }; use hal::command::RawCommandBuffer; -use hal::Device; +use hal::{Device as _Device}; use log::trace; use std::collections::hash_map::Entry; @@ -109,6 +112,7 @@ impl CommandBuffer { Gb: Items>, Gt: Items>, { + let buffer_barriers = buffer_iter.map(|(id, transit)| { let b = buffer_guard.get(id); trace!("transit {:?} {:?}", id, transit); @@ -134,9 +138,11 @@ impl CommandBuffer { families: None, } }); + + let stages = all_buffer_stages() | all_image_stages(); unsafe { raw.pipeline_barrier( - hal::pso::PipelineStage::TOP_OF_PIPE..hal::pso::PipelineStage::BOTTOM_OF_PIPE, + stages .. stages, hal::memory::Dependencies::empty(), buffer_barriers.chain(texture_barriers), ); diff --git a/wgpu-native/src/conv.rs b/wgpu-native/src/conv.rs index 0838f3a75..4e9c02e87 100644 --- a/wgpu-native/src/conv.rs +++ b/wgpu-native/src/conv.rs @@ -356,7 +356,7 @@ pub fn map_texture_state( let is_color = aspects.contains(hal::format::Aspects::COLOR); let layout = match usage { - W::WRITE_ALL => return (A::empty(), L::Undefined), // special value + W::UNINITIALIZED => return (A::empty(), L::Undefined), W::TRANSFER_SRC => L::TransferSrcOptimal, W::TRANSFER_DST => L::TransferDstOptimal, W::SAMPLED => L::ShaderReadOnlyOptimal, diff --git a/wgpu-native/src/device.rs b/wgpu-native/src/device.rs index 9565af3e5..e187c3356 100644 --- a/wgpu-native/src/device.rs +++ b/wgpu-native/src/device.rs @@ -26,6 +26,27 @@ use std::collections::hash_map::{Entry, HashMap}; use std::sync::atomic::Ordering; +pub fn all_buffer_stages() -> hal::pso::PipelineStage { + use hal::pso::PipelineStage as Ps; + Ps::DRAW_INDIRECT | + Ps::VERTEX_INPUT | + Ps::VERTEX_SHADER | + Ps::FRAGMENT_SHADER | + Ps::COMPUTE_SHADER | + Ps::TRANSFER | + Ps::HOST +} +pub fn all_image_stages() -> hal::pso::PipelineStage { + use hal::pso::PipelineStage as Ps; + Ps::EARLY_FRAGMENT_TESTS | + Ps::LATE_FRAGMENT_TESTS | + Ps::COLOR_ATTACHMENT_OUTPUT | + Ps::VERTEX_SHADER | + Ps::FRAGMENT_SHADER | + Ps::COMPUTE_SHADER | + Ps::TRANSFER +} + #[derive(Hash, PartialEq)] pub(crate) struct RenderPassKey { pub attachments: Vec, @@ -236,6 +257,7 @@ impl Device { } } + pub(crate) struct ShaderModule { pub raw: B::ShaderModule, } @@ -297,7 +319,7 @@ pub extern "C" fn wgpu_device_create_buffer( .lock() .query( &Stored { value: id, ref_count }, - resource::BufferUsageFlags::WRITE_ALL, + resource::BufferUsageFlags::empty(), ); assert!(query.initialized); @@ -394,7 +416,7 @@ pub extern "C" fn wgpu_device_create_texture( .lock() .query( &Stored { value: id, ref_count }, - resource::TextureUsageFlags::WRITE_ALL, + resource::TextureUsageFlags::UNINITIALIZED, ); assert!(query.initialized); @@ -1173,7 +1195,7 @@ pub extern "C" fn wgpu_device_create_swap_chain( }; device.texture_tracker .lock() - .query(&texture_id, resource::TextureUsageFlags::WRITE_ALL); + .query(&texture_id, resource::TextureUsageFlags::UNINITIALIZED); let view = resource::TextureView { raw: view_raw, @@ -1241,7 +1263,7 @@ pub extern "C" fn wgpu_buffer_set_sub_data( hal::command::CommandBufferInheritanceInfo::default(), ); raw.pipeline_barrier( - hal::pso::PipelineStage::TOP_OF_PIPE .. hal::pso::PipelineStage::TRANSFER, + all_buffer_stages() .. hal::pso::PipelineStage::TRANSFER, hal::memory::Dependencies::empty(), barrier, ); diff --git a/wgpu-native/src/resource.rs b/wgpu-native/src/resource.rs index 0bc835e8a..aa5e30254 100644 --- a/wgpu-native/src/resource.rs +++ b/wgpu-native/src/resource.rs @@ -72,9 +72,9 @@ bitflags! { const SAMPLED = 4; const STORAGE = 8; const OUTPUT_ATTACHMENT = 16; - const PRESENT = 32; const NONE = 0; const WRITE_ALL = 2 + 8 + 16; + const UNINITIALIZED = 0xFFFF; } } diff --git a/wgpu-native/src/swap_chain.rs b/wgpu-native/src/swap_chain.rs index bb692cbc9..e9cabeb94 100644 --- a/wgpu-native/src/swap_chain.rs +++ b/wgpu-native/src/swap_chain.rs @@ -2,6 +2,7 @@ use crate::{Stored, WeaklyStored, DeviceId, SwapChainId, TextureId, TextureViewId, }; use crate::{conv, resource}; +use crate::device::all_image_stages; use crate::registry::{HUB, Items}; use crate::track::{TrackPermit}; @@ -115,20 +116,22 @@ pub extern "C" fn wgpu_swap_chain_present( None => unreachable!(), } + //TODO: support for swapchain being sampled or read by the shader? + trace!("transit {:?} to present", frame.texture_id.value); let barrier = device.texture_tracker .lock() .transit( frame.texture_id.value, &texture.life_guard.ref_count, - resource::TextureUsageFlags::PRESENT, + resource::TextureUsageFlags::UNINITIALIZED, TrackPermit::REPLACE, ) .unwrap() .into_source() .map(|old| hal::memory::Barrier::Image { states: conv::map_texture_state(old, hal::format::Aspects::COLOR) .. - (hal::image::Access::empty(), hal::image::Layout::Present), + (hal::image::Access::COLOR_ATTACHMENT_WRITE, hal::image::Layout::Present), target: &texture.raw, families: None, range: texture.full_range.clone(), @@ -137,7 +140,7 @@ pub extern "C" fn wgpu_swap_chain_present( unsafe { frame.comb.begin(false); frame.comb.pipeline_barrier( - hal::pso::PipelineStage::TOP_OF_PIPE .. hal::pso::PipelineStage::BOTTOM_OF_PIPE, + all_image_stages() .. hal::pso::PipelineStage::COLOR_ATTACHMENT_OUTPUT, hal::memory::Dependencies::empty(), barrier, );