diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 33ea7ac..30cf84b 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -12,17 +12,17 @@ - - + + - - - - - + - + + + + + - { + "keyToString": { + "Cargo.Build `Test back::wgsl::test::test_into`.executor": "Run", + "Cargo.Build `Test reflect::cross::test::test_into`.executor": "Run", + "Cargo.Test back::wgsl::test::test_into.executor": "Run", + "Cargo.Test front::naga::test::naga_playground (1).executor": "Run", + "Cargo.Test front::naga::test::naga_playground.executor": "Run", + "Cargo.Test reflect::cross::test::test_into.executor": "Run", + "Cargo.Test triangle_wgpu.executor": "Run", + "RunOnceActivity.OpenProjectViewOnStart": "true", + "RunOnceActivity.RadMigrateCodeStyle": "true", + "RunOnceActivity.ShowReadmeOnStart": "true", + "RunOnceActivity.cidr.known.project.marker": "true", + "RunOnceActivity.readMode.enableVisualFormatting": "true", + "cf.first.check.clang-format": "false", + "cidr.known.project.marker": "true", + "git-widget-placeholder": "feat-wgpu-runtime", + "ignore.virus.scanning.warn.message": "true", + "last_opened_file_path": "D:/Runtime/Rust/rustup", + "node.js.detected.package.eslint": "true", + "node.js.detected.package.tslint": "true", + "node.js.selected.package.eslint": "(autodetect)", + "node.js.selected.package.tslint": "(autodetect)", + "nodejs_package_manager_path": "npm", + "org.rust.cargo.project.model.PROJECT_DISCOVERY": "true", + "settings.editor.selected.configurable": "language.rust", + "vue.rearranger.settings.migration": "true" } -}]]> +} @@ -273,7 +273,11 @@ - + + + + + - @@ -355,7 +391,10 @@ - diff --git a/Cargo.lock b/Cargo.lock index 695f9c0..1b2c8d9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -74,12 +74,12 @@ checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" [[package]] name = "android-activity" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39b801912a977c3fd52d80511fe1c0c8480c6f957f21ae2ce1b92ffe970cf4b9" +checksum = "ee91c0c2905bae44f84bfa4e044536541df26b7703fd0888deeb9060fcc44289" dependencies = [ "android-properties", - "bitflags 2.4.1", + "bitflags 2.4.2", "cc", "cesu8", "jni", @@ -110,9 +110,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.7" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd2405b3ac1faab2990b74d728624cd9fd115651fcecc7c2d8daf01376275ba" +checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" dependencies = [ "anstyle", "anstyle-parse", @@ -124,9 +124,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "2faccea4cc4ab4a667ce676a30e8ec13922a692c99bb8f5b11f1502c72e04220" [[package]] name = "anstyle-parse" @@ -321,9 +321,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" [[package]] name = "bitvec" @@ -404,9 +404,9 @@ checksum = "e1e5f035d16fc623ae5f74981db80a439803888314e3a555fd6f04acd51a3205" [[package]] name = "bytemuck" -version = "1.14.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +checksum = "ed2490600f404f2b94c167e31d3ed1d5f3c225a0f3b80230053b3e0b7b962bd9" dependencies = [ "bytemuck_derive", ] @@ -454,7 +454,7 @@ version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fba7adb4dd5aa98e5553510223000e7148f621165ec5f9acd7113f6ca4995298" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "log", "polling", "rustix", @@ -471,7 +471,7 @@ dependencies = [ "calloop 0.12.4", "rustix", "wayland-backend", - "wayland-client 0.31.1", + "wayland-client 0.31.2", ] [[package]] @@ -538,9 +538,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.17" +version = "4.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80932e03c33999b9235edb8655bc9df3204adc9887c2f95b50cb1deb9fd54253" +checksum = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c" dependencies = [ "clap_builder", "clap_derive", @@ -548,9 +548,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.17" +version = "4.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6c0db58c659eef1c73e444d298c27322a1b52f6927d2ad470c0c0f96fa7b8fa" +checksum = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7" dependencies = [ "anstream", "anstyle", @@ -902,7 +902,7 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e3d747f100290a1ca24b752186f61f6637e1deffe3bf6320de6fcb29510a307" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "libloading 0.8.1", "winapi", ] @@ -1031,9 +1031,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95b3f3e67048839cb0d0781f445682a35113da7121f7c949db0e2be96a4fbece" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" dependencies = [ "humantime", "is-terminal", @@ -1104,9 +1104,9 @@ checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "fdeflate" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "209098dd6dfc4445aa6111f0e98653ac323eaa4dfd212c9ca3931bf9955c31bd" +checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" dependencies = [ "simd-adler32", ] @@ -1356,7 +1356,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "gpu-alloc-types", ] @@ -1366,7 +1366,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", ] [[package]] @@ -1391,7 +1391,7 @@ dependencies = [ "presser", "thiserror", "winapi", - "windows 0.51.1", + "windows 0.52.0", ] [[package]] @@ -1400,7 +1400,7 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "gpu-descriptor-types", "hashbrown 0.14.3", ] @@ -1411,7 +1411,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6bf0b36e6f090b7e1d8a4b49c0cb81c1f8376f72198c65dd3ad9ff3556b8b78c" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", ] [[package]] @@ -1457,7 +1457,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "com", "libc", "libloading 0.8.1", @@ -1483,9 +1483,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" [[package]] name = "hexf-parse" @@ -1546,9 +1546,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.1.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "433de089bd45971eecf4668ee0ee8f4cec17db4f8bd8f7bc3197a6ce37aa7d9b" dependencies = [ "equivalent", "hashbrown 0.14.3", @@ -1572,7 +1572,7 @@ version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" dependencies = [ - "hermit-abi 0.3.3", + "hermit-abi 0.3.4", "rustix", "windows-sys 0.52.0", ] @@ -1721,7 +1721,7 @@ name = "librashader-build-script" version = "0.1.0" dependencies = [ "cbindgen", - "clap 4.4.17", + "clap 4.4.18", ] [[package]] @@ -1819,7 +1819,7 @@ version = "0.2.0-beta.2" dependencies = [ "bitflags 1.3.2", "bytemuck", - "indexmap 2.1.0", + "indexmap 2.2.1", "librashader-common 0.2.0-beta.2", "librashader-preprocess", "librashader-presets 0.2.0-beta.2", @@ -1981,7 +1981,7 @@ version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "libc", "redox_syscall 0.4.1", ] @@ -1992,7 +1992,7 @@ version = "0.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "libc", "redox_syscall 0.4.1", ] @@ -2016,9 +2016,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "lock_api" @@ -2068,9 +2068,9 @@ dependencies = [ [[package]] name = "memmap2" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45fd3a57831bf88bc63f8cebc0cf956116276e97fef3966103e96416209f7c92" +checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" dependencies = [ "libc", ] @@ -2084,22 +2084,13 @@ dependencies = [ "autocfg", ] -[[package]] -name = "memoffset" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" -dependencies = [ - "autocfg", -] - [[package]] name = "metal" version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "block", "core-graphics-types", "foreign-types 0.5.0", @@ -2143,10 +2134,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8878eb410fc90853da3908aebfe61d73d26d4437ef850b70050461f939509899" dependencies = [ "bit-set", - "bitflags 2.4.1", + "bitflags 2.4.2", "codespan-reporting", "hexf-parse", - "indexmap 2.1.0", + "indexmap 2.2.1", "log", "num-traits", "petgraph", @@ -2177,7 +2168,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "jni-sys", "log", "ndk-sys 0.5.0+25.2.9519653", @@ -2215,7 +2206,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0df7ac00c4672f9d5aece54ee3347520b7e20f158656c7db2e6de01902eb7a6c" dependencies = [ "darling", - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", "syn 1.0.109", @@ -2248,7 +2239,7 @@ dependencies = [ "bitflags 1.3.2", "cfg-if", "libc", - "memoffset 0.6.5", + "memoffset", ] [[package]] @@ -2261,19 +2252,7 @@ dependencies = [ "bitflags 1.3.2", "cfg-if", "libc", - "memoffset 0.6.5", -] - -[[package]] -name = "nix" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "libc", - "memoffset 0.7.1", + "memoffset", ] [[package]] @@ -2397,7 +2376,7 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", "syn 1.0.109", @@ -2409,7 +2388,7 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 3.1.0", "proc-macro2", "quote", "syn 2.0.48", @@ -2598,7 +2577,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 2.1.0", + "indexmap 2.2.1", ] [[package]] @@ -2609,9 +2588,9 @@ checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pkg-config" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a" +checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" [[package]] name = "platform-dirs" @@ -2668,23 +2647,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ "once_cell", - "toml_edit", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit 0.21.0", ] [[package]] name = "proc-macro2" -version = "1.0.76" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] [[package]] name = "profiling" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d135ede8821cf6376eb7a64148901e1690b788c11ae94dc297ae917dbc91dc0e" +checksum = "0f0f7f43585c34e4fdd7497d746bc32e14458cf11c69341cc0587b1d825dde42" [[package]] name = "qoi" @@ -2697,9 +2685,9 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" +checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" dependencies = [ "memchr", ] @@ -2760,9 +2748,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" dependencies = [ "either", "rayon-core", @@ -2770,9 +2758,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -2809,9 +2797,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.2" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", @@ -2821,9 +2809,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" dependencies = [ "aho-corasick", "memchr", @@ -2914,7 +2902,7 @@ version = "0.38.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "322394588aaf33c24007e8bb3238ee3e4c5c09c084ab32bc73890b99ff326bca" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "errno", "libc", "linux-raw-sys", @@ -2977,25 +2965,25 @@ checksum = "82b2eaf3a5b264a521b988b2e73042e742df700c4f962cde845d1541adb46550" dependencies = [ "ab_glyph", "log", - "memmap2 0.9.3", + "memmap2 0.9.4", "smithay-client-toolkit 0.18.0", "tiny-skia 0.11.3", ] [[package]] name = "serde" -version = "1.0.195" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" +checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.195" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" +checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" dependencies = [ "proc-macro2", "quote", @@ -3004,9 +2992,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.111" +version = "1.0.113" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" +checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" dependencies = [ "itoa", "ryu", @@ -3092,9 +3080,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.12.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2593d31f82ead8df961d8bd23a64c2ccf2eb5dd34b0a34bfb4dd54011c72009e" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "smithay-client-toolkit" @@ -3121,22 +3109,22 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60e3d9941fa3bacf7c2bf4b065304faa14164151254cd16ce1b1bc8fc381600f" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "calloop 0.12.4", "calloop-wayland-source", "cursor-icon", "libc", "log", - "memmap2 0.9.3", + "memmap2 0.9.4", "rustix", "thiserror", "wayland-backend", - "wayland-client 0.31.1", + "wayland-client 0.31.2", "wayland-csd-frame", - "wayland-cursor 0.31.0", - "wayland-protocols 0.31.0", + "wayland-cursor 0.31.1", + "wayland-protocols 0.31.2", "wayland-protocols-wlr", - "wayland-scanner 0.31.0", + "wayland-scanner 0.31.1", "xkeysym", ] @@ -3164,7 +3152,7 @@ version = "0.3.0+sdk-1.3.268.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", ] [[package]] @@ -3365,7 +3353,18 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.1", + "toml_datetime", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" +dependencies = [ + "indexmap 2.2.1", "toml_datetime", "winnow", ] @@ -3542,13 +3541,13 @@ checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" [[package]] name = "wayland-backend" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19152ddd73f45f024ed4534d9ca2594e0ef252c1847695255dae47f34df9fbe4" +checksum = "9d50fa61ce90d76474c87f5fc002828d81b32677340112b4ef08079a9d459a40" dependencies = [ "cc", "downcast-rs", - "nix 0.26.4", + "rustix", "scoped-tls", "smallvec", "wayland-sys 0.31.1", @@ -3572,14 +3571,14 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.1" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ca7d52347346f5473bf2f56705f360e8440873052e575e55890c4fa57843ed3" +checksum = "82fb96ee935c2cea6668ccb470fb7771f6215d1691746c2d896b447a00ad3f1f" dependencies = [ - "bitflags 2.4.1", - "nix 0.26.4", + "bitflags 2.4.2", + "rustix", "wayland-backend", - "wayland-scanner 0.31.0", + "wayland-scanner 0.31.1", ] [[package]] @@ -3600,7 +3599,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "cursor-icon", "wayland-backend", ] @@ -3618,12 +3617,12 @@ dependencies = [ [[package]] name = "wayland-cursor" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44aa20ae986659d6c77d64d808a046996a932aa763913864dc40c359ef7ad5b" +checksum = "71ce5fa868dd13d11a0d04c5e2e65726d0897be8de247c0c5a65886e283231ba" dependencies = [ - "nix 0.26.4", - "wayland-client 0.31.1", + "rustix", + "wayland-client 0.31.2", "xcursor", ] @@ -3641,14 +3640,14 @@ dependencies = [ [[package]] name = "wayland-protocols" -version = "0.31.0" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e253d7107ba913923dc253967f35e8561a3c65f914543e46843c88ddd729e21c" +checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "wayland-backend", - "wayland-client 0.31.1", - "wayland-scanner 0.31.0", + "wayland-client 0.31.2", + "wayland-scanner 0.31.1", ] [[package]] @@ -3657,11 +3656,11 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23803551115ff9ea9bce586860c5c5a971e360825a0309264102a9495a5ff479" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "wayland-backend", - "wayland-client 0.31.1", - "wayland-protocols 0.31.0", - "wayland-scanner 0.31.0", + "wayland-client 0.31.2", + "wayland-protocols 0.31.2", + "wayland-scanner 0.31.1", ] [[package]] @@ -3670,11 +3669,11 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "wayland-backend", - "wayland-client 0.31.1", - "wayland-protocols 0.31.0", - "wayland-scanner 0.31.0", + "wayland-client 0.31.2", + "wayland-protocols 0.31.2", + "wayland-scanner 0.31.1", ] [[package]] @@ -3690,9 +3689,9 @@ dependencies = [ [[package]] name = "wayland-scanner" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb8e28403665c9f9513202b7e1ed71ec56fde5c107816843fb14057910b2c09c" +checksum = "63b3a62929287001986fb58c789dce9b67604a397c15c611ad9f747300b6c283" dependencies = [ "proc-macro2", "quick-xml", @@ -3744,15 +3743,15 @@ dependencies = [ [[package]] name = "weezl" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" [[package]] name = "wgpu" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0b71d2ded29e2161db50ab731d6cb42c037bd7ab94864a98fa66ff36b4721a8" +checksum = "0bfe9a310dcf2e6b85f00c46059aaeaf4184caa8e29a1ecd4b7a704c3482332d" dependencies = [ "arrayvec 0.7.4", "cfg-if", @@ -3781,10 +3780,10 @@ checksum = "6b15e451d4060ada0d99a64df44e4d590213496da7c4f245572d51071e8e30ed" dependencies = [ "arrayvec 0.7.4", "bit-vec", - "bitflags 2.4.1", + "bitflags 2.4.2", "cfg_aliases", "codespan-reporting", - "indexmap 2.1.0", + "indexmap 2.2.1", "log", "naga", "once_cell", @@ -3801,15 +3800,15 @@ dependencies = [ [[package]] name = "wgpu-hal" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11f259ceb56727fb097da108d92f8a5cbdb5b74a77f9e396bd43626f67299d61" +checksum = "e3bb47856236bfafc0bc591a925eb036ac19cd987624a447ff353e7a7e7e6f72" dependencies = [ "android_system_properties", "arrayvec 0.7.4", "ash", "bit-set", - "bitflags 2.4.1", + "bitflags 2.4.2", "block", "cfg_aliases", "core-graphics-types", @@ -3849,7 +3848,7 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "895fcbeb772bfb049eb80b2d6e47f6c9af235284e9703c96fc0218a42ffd5af2" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "js-sys", "web-sys", ] @@ -3902,21 +3901,21 @@ dependencies = [ [[package]] name = "windows" -version = "0.51.1" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" dependencies = [ "windows-core", - "windows-targets 0.48.5", + "windows-targets 0.52.0", ] [[package]] name = "windows-core" -version = "0.51.1" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.48.5", + "windows-targets 0.52.0", ] [[package]] @@ -4202,7 +4201,7 @@ dependencies = [ "ahash 0.8.7", "android-activity", "atomic-waker", - "bitflags 2.4.1", + "bitflags 2.4.2", "bytemuck", "calloop 0.12.4", "cfg_aliases", @@ -4213,7 +4212,7 @@ dependencies = [ "js-sys", "libc", "log", - "memmap2 0.9.3", + "memmap2 0.9.4", "ndk 0.8.0", "ndk-sys 0.5.0+25.2.9519653", "objc2", @@ -4230,8 +4229,8 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "wayland-backend", - "wayland-client 0.31.1", - "wayland-protocols 0.31.0", + "wayland-client 0.31.2", + "wayland-protocols 0.31.2", "wayland-protocols-plasma", "web-sys", "web-time", @@ -4243,9 +4242,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.5.34" +version = "0.5.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7cf47b659b318dccbd69cc4797a39ae128f533dce7902a1096044d1967b9c16" +checksum = "1931d78a9c73861da0134f453bb1f790ce49b2e30eba8410b4b79bac72b46a2d" dependencies = [ "memchr", ] @@ -4312,7 +4311,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6924668544c48c0133152e7eec86d644a056ca3d09275eb8d5cdb9855f9d8699" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "dlib", "log", "once_cell", diff --git a/librashader-common/src/wgpu.rs b/librashader-common/src/wgpu.rs index 30443a6..a9c9637 100644 --- a/librashader-common/src/wgpu.rs +++ b/librashader-common/src/wgpu.rs @@ -85,17 +85,6 @@ impl From> for ImageFormat { } } -// -impl From> for wgpu_types::Extent3d { - fn from(value: Size) -> Self { - wgpu_types::Extent3d { - width: value.width, - height: value.height, - depth: 1, - } - } -} - impl From for Size { fn from(value: wgpu_types::Extent3d) -> Self { Size { diff --git a/librashader-runtime-wgpu/src/buffer.rs b/librashader-runtime-wgpu/src/buffer.rs new file mode 100644 index 0000000..f67979f --- /dev/null +++ b/librashader-runtime-wgpu/src/buffer.rs @@ -0,0 +1,54 @@ +use std::ops::{Deref, DerefMut}; +use std::sync::Arc; + +pub struct WgpuMappedBuffer { + buffer: wgpu::Buffer, + backing: Box<[u8]>, + device: Arc +} + +impl WgpuMappedBuffer { + pub fn new( + device: &Arc, + usage: wgpu::BufferUsages, + size: wgpu::BufferAddress, + label: wgpu::Label<'static> + ) -> WgpuMappedBuffer { + let buffer = device.create_buffer(&wgpu::BufferDescriptor { + label, + size, + usage, + mapped_at_creation: true, + }); + + WgpuMappedBuffer { + buffer, + backing: vec![0u8; size as usize].into_boxed_slice(), + device: Arc::clone(&device) + } + } + + pub fn buffer(&self) -> &wgpu::Buffer { + &self.buffer + } + + /// Write the contents of the backing buffer to the device buffer. + pub fn flush(&self) { + self.buffer.slice(..) + .get_mapped_range_mut().copy_from_slice(&self.backing) + } +} + +impl Deref for WgpuMappedBuffer { + type Target = [u8]; + + fn deref(&self) -> &Self::Target { + self.backing.deref() + } +} + +impl DerefMut for WgpuMappedBuffer { + fn deref_mut(&mut self) -> &mut Self::Target { + self.backing.deref_mut() + } +} \ No newline at end of file diff --git a/librashader-runtime-wgpu/src/filter_chain.rs b/librashader-runtime-wgpu/src/filter_chain.rs index 460b40a..f4a07ae 100644 --- a/librashader-runtime-wgpu/src/filter_chain.rs +++ b/librashader-runtime-wgpu/src/filter_chain.rs @@ -23,6 +23,7 @@ use librashader_runtime::render_target::RenderTarget; use librashader_runtime::scaling::ScaleFramebuffer; use rayon::prelude::*; use wgpu::{BindGroupEntry, CommandBuffer, CommandEncoder, Device, Queue, TextureAspect, TextureFormat}; +use crate::buffer::WgpuMappedBuffer; use crate::draw_quad::DrawQuad; use crate::error; @@ -30,8 +31,9 @@ use crate::error::FilterChainError; use crate::filter_pass::FilterPass; use crate::graphics_pipeline::WgpuGraphicsPipeline; use crate::luts::LutTexture; +use crate::options::FrameOptionsWGPU; use crate::samplers::SamplerSet; -use crate::texture::{InputImage, OwnedImage}; +use crate::texture::{Handle, InputImage, OwnedImage}; type ShaderPassMeta = ShaderPassArtifact + Send>; @@ -185,17 +187,19 @@ impl FilterChainWGPU { })?; let ubo_size = reflection.ubo.as_ref().map_or(0, |ubo| ubo.size as usize); + let push_size = reflection + .push_constant + .as_ref() + .map_or(0, |push| push.size as wgpu::BufferAddress); - let uniform_storage = UniformStorage::new( - ubo_size, - reflection - .push_constant - .as_ref() - .map_or(0, |push| push.size as usize), + + let uniform_storage = UniformStorage::new_with_storage( + WgpuMappedBuffer::new(&device, wgpu::BufferUsages::UNIFORM, ubo_size as wgpu::BufferAddress, Some("ubo")), + WgpuMappedBuffer::new(&device, wgpu::BufferUsages::UNIFORM, push_size as wgpu::BufferAddress, Some("push")) ); let uniform_bindings = reflection.meta.create_binding_map(|param| param.offset()); - // + let render_pass_format: Option = if let Some(format) = config.get_format_override() { format.into() @@ -210,9 +214,10 @@ impl FilterChainWGPU { render_pass_format.unwrap_or(TextureFormat::R8Unorm), ); + + Ok(FilterPass { - // device: vulkan.device.clone(), - device, + device: Arc::clone(&device), reflection, compiled: wgsl, uniform_storage, @@ -220,10 +225,6 @@ impl FilterChainWGPU { source, config, graphics_pipeline, - // // ubo_ring, - // frames_in_flight, - // texture_heap: [], - // sampler_heap: [], }) }) .collect(); @@ -238,17 +239,19 @@ impl FilterChainWGPU { viewport: &Viewport, cmd: wgpu::CommandEncoder, frame_count: usize, + options: Option<&FrameOptionsWGPU>, + ) -> error::Result<()> { let max = std::cmp::min(self.passes.len(), self.common.config.passes_enabled); let passes = &mut self.passes[0..max]; - // if let Some(options) = &options { - // if options.clear_history { - // for history in &mut self.history_framebuffers { - // history.clear(cmd); - // } - // } - // } + if let Some(options) = &options { + if options.clear_history { + for history in &mut self.history_framebuffers { + // history.clear(cmd); + } + } + } if passes.is_empty() { return Ok(()); @@ -280,8 +283,8 @@ impl FilterChainWGPU { } let original = InputImage { - image: input.clone(), - view: original_image_view, + image: Arc::new(input), + view: Arc::new(original_image_view), wrap_mode, filter_mode: filter, mip_filter: filter, @@ -297,12 +300,12 @@ impl FilterChainWGPU { // rescale render buffers to ensure all bindings are valid. OwnedImage::scale_framebuffers_with_context( - source.image.size, + source.image.size().into(), viewport.output.size, &mut self.output_framebuffers, &mut self.feedback_framebuffers, passes, - &None::<()>, + &(), Some(&mut |index: usize, pass: &FilterPass, output: &OwnedImage, @@ -319,7 +322,7 @@ impl FilterChainWGPU { let passes_len = passes.len(); let (pass, last) = passes.split_at_mut(passes_len - 1); - let frame_direction = options.map_or(1, |f| f.frame_direction); + // let frame_direction = options.map_or(1, |f| f.frame_direction); Ok(()) } diff --git a/librashader-runtime-wgpu/src/filter_pass.rs b/librashader-runtime-wgpu/src/filter_pass.rs index f60ff16..89cd841 100644 --- a/librashader-runtime-wgpu/src/filter_pass.rs +++ b/librashader-runtime-wgpu/src/filter_pass.rs @@ -10,10 +10,12 @@ use rustc_hash::FxHashMap; use std::sync::Arc; use wgpu::{BindGroupDescriptor, BindGroupEntry, BindingResource, Buffer, BufferBinding, BufferUsages, RenderPass, ShaderStages, TextureView}; use wgpu::util::{BufferInitDescriptor, DeviceExt}; -use librashader_common::{Size, Viewport}; +use librashader_common::{ImageFormat, Size, Viewport}; use librashader_runtime::binding::{BindSemantics, TextureInput}; +use librashader_runtime::filter_pass::FilterPassMeta; use librashader_runtime::quad::QuadType; use librashader_runtime::render_target::RenderTarget; +use crate::buffer::WgpuMappedBuffer; use crate::error; use crate::filter_chain::FilterCommon; use crate::framebuffer::OutputImage; @@ -24,13 +26,12 @@ pub struct FilterPass { pub device: Arc, pub reflection: ShaderReflection, pub(crate) compiled: ShaderCompilerOutput, - pub(crate) uniform_storage: UniformStorage, + pub(crate) uniform_storage: UniformStorage, WgpuMappedBuffer, WgpuMappedBuffer>, pub uniform_bindings: FxHashMap, pub source: ShaderSource, pub config: ShaderPassConfig, pub graphics_pipeline: WgpuGraphicsPipeline, - // pub ubo_ring: VkUboRing, - // pub frames_in_flight: u32, + } impl TextureInput for InputImage { @@ -39,12 +40,17 @@ impl TextureInput for InputImage { } } -impl BindSemantics> for FilterPass { +pub struct WgpuArcBinding { + binding: u32, + resource: Arc +} + +impl BindSemantics, WgpuMappedBuffer, WgpuMappedBuffer> for FilterPass { type InputTexture = InputImage; type SamplerSet = SamplerSet; type DescriptorSet<'a> = ( - &'a mut FxHashMap>, - &'a mut FxHashMap>, + &'a mut FxHashMap>, + &'a mut FxHashMap>, ); type DeviceContext = Arc; type UniformOffset = MemberOffset; @@ -60,13 +66,14 @@ impl BindSemantics> for FilterPass { let sampler = samplers.get(texture.wrap_mode, texture.filter_mode, texture.mip_filter); let (texture_binding, sampler_binding) = descriptors; - texture_binding.insert(binding.binding, BindGroupEntry { + texture_binding.insert(binding.binding, WgpuArcBinding { binding: binding.binding, - resource:BindingResource::TextureView(&texture.view)} - ); - sampler_binding.insert(binding.binding, BindGroupEntry { + resource: Arc::clone(&texture.view) + }); + + sampler_binding.insert(binding.binding, WgpuArcBinding { binding: binding.binding, - resource: BindingResource::Sampler(&sampler), + resource: sampler, }); } } @@ -84,7 +91,7 @@ impl FilterPass { source: &InputImage, output: &RenderTarget, vbo_type: QuadType, - ) -> error::Result { + ) -> error::Result<()> { let mut main_heap = FxHashMap::default(); let mut sampler_heap = FxHashMap::default(); @@ -103,21 +110,29 @@ impl FilterPass { &mut sampler_heap, ); + + let mut main_heap_array = Vec::with_capacity(main_heap.len() + 1); + let mut sampler_heap_array = Vec::with_capacity(sampler_heap.len() + 1); + + for binding in main_heap.values() { + main_heap_array.push(BindGroupEntry { + binding: binding.binding, + resource: BindingResource::TextureView(&binding.resource) + }) + } + + for binding in sampler_heap.values() { + sampler_heap_array.push(BindGroupEntry { + binding: binding.binding, + resource: BindingResource::Sampler(&binding.resource) + }) + } - let main_buffer: Buffer; - let pcb_buffer: Buffer; if let Some(ubo) = &self.reflection.ubo { - main_buffer = self.device - .create_buffer_init(&BufferInitDescriptor { - label: Some("ubo buffer"), - contents: self.uniform_storage.ubo_slice(), - usage: BufferUsages::UNIFORM, - }); - - main_heap.insert(ubo.binding, BindGroupEntry { + main_heap_array.push(BindGroupEntry { binding: ubo.binding, resource: BindingResource::Buffer(BufferBinding { - buffer: &main_buffer, + buffer: self.uniform_storage.inner_ubo().buffer(), offset: 0, size: None, }), @@ -127,17 +142,10 @@ impl FilterPass { let mut has_pcb_buffer = false; if let Some(pcb) = &self.reflection.push_constant { if let Some(binding) = pcb.binding { - pcb_buffer = self.device - .create_buffer_init(&BufferInitDescriptor { - label: Some("ubo buffer"), - contents: self.uniform_storage.push_slice(), - usage: BufferUsages::UNIFORM, - }); - - main_heap.insert(binding, BindGroupEntry { + main_heap_array.push(BindGroupEntry { binding, resource: BindingResource::Buffer(BufferBinding { - buffer: &pcb_buffer, + buffer: self.uniform_storage.inner_push().buffer(), offset: 0, size: None, }), @@ -146,22 +154,21 @@ impl FilterPass { } } - - let mut render_pass = self.graphics_pipeline - .begin_rendering(output, cmd); - let main_bind_group = self.device.create_bind_group(&BindGroupDescriptor { label: Some("main bind group"), layout: &self.graphics_pipeline.layout.main_bind_group_layout, - entries: &main_heap.into_values().collect::>() + entries: &main_heap_array }); let sampler_bind_group = self.device.create_bind_group(&BindGroupDescriptor { label: Some("sampler bind group"), layout: &self.graphics_pipeline.layout.sampler_bind_group_layout, - entries: &sampler_heap.into_values().collect::>() + entries: &sampler_heap_array }); + let mut render_pass = self.graphics_pipeline + .begin_rendering(output, cmd); + render_pass.set_bind_group( 0, &main_bind_group, @@ -191,10 +198,10 @@ impl FilterPass { parent.draw_quad.draw_quad(&mut render_pass, vbo_type); - Ok(render_pass) + Ok(()) } - fn build_semantics( + fn build_semantics<'a, 'b>( &mut self, pass_index: usize, parent: &FilterCommon, @@ -205,9 +212,9 @@ impl FilterPass { viewport_size: Size, original: &InputImage, source: &InputImage, - main_heap: &mut FxHashMap - sampler_heap: &mut FxHashMap - ) { + main_heap: &'a mut FxHashMap>, + sampler_heap: &'a mut FxHashMap> + ) where 'a: 'b { Self::bind_semantics( &self.device, &parent.samplers, @@ -231,5 +238,19 @@ impl FilterPass { &self.source.parameters, &parent.config.parameters, ); + + // flush to buffers + self.uniform_storage.inner_ubo().flush(); + self.uniform_storage.inner_push().flush(); } } + +impl FilterPassMeta for FilterPass { + fn framebuffer_format(&self) -> ImageFormat { + self.source.format + } + + fn config(&self) -> &ShaderPassConfig { + &self.config + } +} \ No newline at end of file diff --git a/librashader-runtime-wgpu/src/graphics_pipeline.rs b/librashader-runtime-wgpu/src/graphics_pipeline.rs index 5d37b0f..10eb565 100644 --- a/librashader-runtime-wgpu/src/graphics_pipeline.rs +++ b/librashader-runtime-wgpu/src/graphics_pipeline.rs @@ -124,8 +124,8 @@ impl PipelineLayoutObjects { Self { layout, - main_bind_group_layout, - sampler_bind_group_layout, + main_bind_group_layout: main_bind_group, + sampler_bind_group_layout: sampler_bind_group, fragment_entry_name: shader_assembly.context.fragment.entry_points[0] .name .clone(), diff --git a/librashader-runtime-wgpu/src/lib.rs b/librashader-runtime-wgpu/src/lib.rs index b15da91..fcb373a 100644 --- a/librashader-runtime-wgpu/src/lib.rs +++ b/librashader-runtime-wgpu/src/lib.rs @@ -17,6 +17,8 @@ mod texture; mod util; mod framebuffer; mod luts; +mod options; +mod buffer; pub use filter_chain::FilterChainWGPU; pub use filter_pass::FilterPass; diff --git a/librashader-runtime-wgpu/src/luts.rs b/librashader-runtime-wgpu/src/luts.rs index fe05857..eeff3cc 100644 --- a/librashader-runtime-wgpu/src/luts.rs +++ b/librashader-runtime-wgpu/src/luts.rs @@ -1,11 +1,16 @@ +use std::sync::Arc; use wgpu::{ImageDataLayout, Label, TextureDescriptor}; use wgpu::util::DeviceExt; use librashader_presets::TextureConfig; use librashader_runtime::image::{BGRA8, Image}; use librashader_runtime::scaling::MipmapSize; +use crate::texture::{Handle, InputImage}; -pub(crate) struct LutTexture { - texture: wgpu::Texture, +pub(crate) struct LutTexture(InputImage); +impl AsRef for LutTexture { + fn as_ref(&self) -> &InputImage { + &self.0 + } } impl LutTexture { @@ -53,8 +58,26 @@ impl LutTexture { // todo: mipmaps - Self { - texture - } + // todo: fix this + let view = texture.create_view(&wgpu::TextureViewDescriptor { + label: Some("lut view"), + format: None, + dimension: None, + aspect: Default::default(), + base_mip_level: 0, + mip_level_count: None, + base_array_layer: 0, + array_layer_count: None, + }); + + let image = InputImage { + image: Arc::new(texture), + view: Arc::new(view), + wrap_mode: config.wrap_mode, + filter_mode: config.filter_mode, + mip_filter: config.filter_mode, + }; + + Self(image) } } \ No newline at end of file diff --git a/librashader-runtime-wgpu/src/options.rs b/librashader-runtime-wgpu/src/options.rs new file mode 100644 index 0000000..a685c85 --- /dev/null +++ b/librashader-runtime-wgpu/src/options.rs @@ -0,0 +1,10 @@ +/// Options for each WGPU shader frame. +#[repr(C)] +#[derive(Default, Debug, Clone)] +pub struct FrameOptionsWGPU { + /// Whether or not to clear the history buffers. + pub clear_history: bool, + /// The direction of rendering. + /// -1 indicates that the frames are played in reverse order. + pub frame_direction: i32, +} \ No newline at end of file diff --git a/librashader-runtime-wgpu/src/samplers.rs b/librashader-runtime-wgpu/src/samplers.rs index bd056a0..e93e29d 100644 --- a/librashader-runtime-wgpu/src/samplers.rs +++ b/librashader-runtime-wgpu/src/samplers.rs @@ -6,19 +6,19 @@ use wgpu::{Sampler, SamplerBorderColor, SamplerDescriptor}; pub struct SamplerSet { // todo: may need to deal with differences in mip filter. - samplers: FxHashMap<(WrapMode, FilterMode, FilterMode), Sampler>, + samplers: FxHashMap<(WrapMode, FilterMode, FilterMode), Arc>, } impl SamplerSet { #[inline(always)] - pub fn get(&self, wrap: WrapMode, filter: FilterMode, mipmap: FilterMode) -> &Sampler { + pub fn get(&self, wrap: WrapMode, filter: FilterMode, mipmap: FilterMode) -> Arc { // eprintln!("{wrap}, {filter}, {mip}"); // SAFETY: the sampler set is complete for the matrix // wrap x filter x mipmap unsafe { - self.samplers + Arc::clone(&self.samplers .get(&(wrap, filter, mipmap)) - .unwrap_unchecked() + .unwrap_unchecked()) } } @@ -35,7 +35,7 @@ impl SamplerSet { for mipmap_filter in &[FilterMode::Linear, FilterMode::Nearest] { samplers.insert( (*wrap_mode, *filter_mode, *mipmap_filter), - device.create_sampler(&SamplerDescriptor { + Arc::new(device.create_sampler(&SamplerDescriptor { label: None, address_mode_u: (*wrap_mode).into(), address_mode_v: (*wrap_mode).into(), @@ -49,7 +49,7 @@ impl SamplerSet { anisotropy_clamp: 1, border_color: Some(SamplerBorderColor::TransparentBlack), }), - ); + )); } } } diff --git a/librashader-runtime-wgpu/src/texture.rs b/librashader-runtime-wgpu/src/texture.rs index f155170..0cd38e9 100644 --- a/librashader-runtime-wgpu/src/texture.rs +++ b/librashader-runtime-wgpu/src/texture.rs @@ -1,28 +1,60 @@ +use std::ops::Deref; use std::sync::Arc; -use wgpu::TextureFormat; +use wgpu::{TextureFormat, TextureView}; use librashader_common::{FilterMode, ImageFormat, Size, WrapMode}; use librashader_presets::Scale2D; -use librashader_runtime::scaling::{MipmapSize, ViewportSize}; +use librashader_runtime::scaling::{MipmapSize, ScaleFramebuffer, ViewportSize}; +use crate::error::FilterChainError; pub struct OwnedImage { device: Arc, - pub image: wgpu::Texture, - pub view: wgpu::TextureView, + pub image: Arc, + pub view: Arc, pub max_miplevels: u32, pub levels: u32, pub size: Size, pub format: wgpu::TextureFormat, } +pub enum Handle<'a, T> { + Borrowed(&'a T), + Owned(Arc) +} + +impl Clone for Handle<'_, T> { + fn clone(&self) -> Self { + match self { + Handle::Borrowed(r) => Handle::Borrowed(r), + Handle::Owned(r) => Handle::Owned(Arc::clone(r)) + } + } +} +impl Deref for Handle<'_, T> { + type Target = T; + + fn deref(&self) -> &Self::Target { + match self { + Handle::Borrowed(r) => &r, + Handle::Owned(r) => &r + } + } +} + +#[derive(Clone)] pub struct InputImage { /// A handle to the `VkImage`. - pub image: wgpu::Texture, - pub view: wgpu::TextureView, + pub image: Arc, + pub view: Arc, pub wrap_mode: WrapMode, pub filter_mode: FilterMode, pub mip_filter: FilterMode, } +impl AsRef for InputImage { + fn as_ref(&self) -> &InputImage { + &self + } +} impl OwnedImage { pub fn new(device: Arc, @@ -61,8 +93,8 @@ impl OwnedImage { Self { device, - image: texture, - view, + image: Arc::new(texture), + view: Arc::new(view), max_miplevels, levels: std::cmp::min(max_miplevels, size.calculate_miplevels()), size, @@ -94,14 +126,33 @@ impl OwnedImage { } pub(crate) fn as_input(&self, filter: FilterMode, wrap_mode: WrapMode) -> InputImage { - let image = self.clone(); InputImage { - image: self.image.clone(), - view: self.clone()., + image: Arc::clone(&self.image), + view: Arc::clone(&self.view), wrap_mode, filter_mode: filter, mip_filter: filter, } } +} +impl ScaleFramebuffer for OwnedImage { + type Error = FilterChainError; + type Context = (); + + fn scale(&mut self, + scaling: Scale2D, + format: ImageFormat, + viewport_size: &Size, + source_size: &Size, + should_mipmap: bool, + _context: &Self::Context) -> Result, Self::Error> { + Ok(self.scale( + scaling, + format, + viewport_size, + source_size, + should_mipmap, + )) + } } \ No newline at end of file diff --git a/librashader-runtime/src/uniforms.rs b/librashader-runtime/src/uniforms.rs index 9d1a5f1..26e04aa 100644 --- a/librashader-runtime/src/uniforms.rs +++ b/librashader-runtime/src/uniforms.rs @@ -8,6 +8,11 @@ impl UniformScalar for f32 {} impl UniformScalar for i32 {} impl UniformScalar for u32 {} +pub trait AsDerefable { + fn get_deref(&self) -> impl Deref; + fn get_deref_mut(&mut self) -> impl DerefMut; +} + /// A trait for a binder that binds the given value and context into the uniform for a shader pass. pub trait BindUniform { /// Bind the given value to the shader uniforms given the input context.