From a1d1b81cc85d6ce154ca88691d20e2485855ca8b Mon Sep 17 00:00:00 2001 From: Justin Shrake Date: Sun, 20 Sep 2020 08:16:51 -0700 Subject: [PATCH] initial commit --- .github/workflows/ci.yml | 76 ++ .gitignore | 3 + Cargo.lock | 1206 +++++++++++++++++ Cargo.toml | 30 + LICENSE | 25 + Makefile | 27 + README.md | 98 ++ examples/README.md | 19 + examples/cat.png | Bin 0 -> 380604 bytes examples/cat.rs | 105 ++ examples/checkerboard.rs | 109 ++ src/backends/compute.rs | 375 +++++ src/backends/copy.rs | 171 +++ src/backends/mod.rs | 9 + src/backends/recommended.rs | 658 +++++++++ src/backends/render.rs | 399 ++++++ src/backends/shaders/README.md | 16 + src/backends/shaders/box.comp | 26 + src/backends/shaders/box.frag | 11 + src/backends/shaders/box.frag.spv | Bin 0 -> 784 bytes .../shaders/box_r11f_g11f_b10f.comp.spv | Bin 0 -> 1452 bytes src/backends/shaders/box_r16_snorm.comp.spv | Bin 0 -> 1452 bytes src/backends/shaders/box_r16f.comp.spv | Bin 0 -> 1452 bytes src/backends/shaders/box_r32f.comp.spv | Bin 0 -> 1444 bytes src/backends/shaders/box_r8.comp.spv | Bin 0 -> 1452 bytes src/backends/shaders/box_r8_snorm.comp.spv | Bin 0 -> 1452 bytes src/backends/shaders/box_rg16_snorm.comp.spv | Bin 0 -> 1452 bytes src/backends/shaders/box_rg16f.comp.spv | Bin 0 -> 1452 bytes src/backends/shaders/box_rg32f.comp.spv | Bin 0 -> 1452 bytes src/backends/shaders/box_rg8.comp.spv | Bin 0 -> 1452 bytes src/backends/shaders/box_rg8_snorm.comp.spv | Bin 0 -> 1452 bytes src/backends/shaders/box_rgb10_a2.comp.spv | Bin 0 -> 1452 bytes .../shaders/box_rgba16_snorm.comp.spv | Bin 0 -> 1452 bytes src/backends/shaders/box_rgba16f.comp.spv | Bin 0 -> 1444 bytes src/backends/shaders/box_rgba32f.comp.spv | Bin 0 -> 1444 bytes src/backends/shaders/box_rgba8.comp.spv | Bin 0 -> 1444 bytes src/backends/shaders/box_rgba8_snorm.comp.spv | Bin 0 -> 1444 bytes src/backends/shaders/box_srgb.comp | 38 + src/backends/shaders/box_srgb.comp.spv | Bin 0 -> 3060 bytes src/backends/shaders/box_srgb_macos.comp | 35 + src/backends/shaders/box_srgb_macos.comp.spv | Bin 0 -> 2076 bytes src/backends/shaders/compile.sh | 40 + src/backends/shaders/triangle.vert | 8 + src/backends/shaders/triangle.vert.spv | Bin 0 -> 1372 bytes src/core.rs | 33 + src/lib.rs | 56 + src/util.rs | 284 ++++ 47 files changed, 3857 insertions(+) create mode 100644 .github/workflows/ci.yml create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100644 examples/README.md create mode 100644 examples/cat.png create mode 100644 examples/cat.rs create mode 100644 examples/checkerboard.rs create mode 100644 src/backends/compute.rs create mode 100644 src/backends/copy.rs create mode 100644 src/backends/mod.rs create mode 100644 src/backends/recommended.rs create mode 100644 src/backends/render.rs create mode 100644 src/backends/shaders/README.md create mode 100644 src/backends/shaders/box.comp create mode 100644 src/backends/shaders/box.frag create mode 100644 src/backends/shaders/box.frag.spv create mode 100644 src/backends/shaders/box_r11f_g11f_b10f.comp.spv create mode 100644 src/backends/shaders/box_r16_snorm.comp.spv create mode 100644 src/backends/shaders/box_r16f.comp.spv create mode 100644 src/backends/shaders/box_r32f.comp.spv create mode 100644 src/backends/shaders/box_r8.comp.spv create mode 100644 src/backends/shaders/box_r8_snorm.comp.spv create mode 100644 src/backends/shaders/box_rg16_snorm.comp.spv create mode 100644 src/backends/shaders/box_rg16f.comp.spv create mode 100644 src/backends/shaders/box_rg32f.comp.spv create mode 100644 src/backends/shaders/box_rg8.comp.spv create mode 100644 src/backends/shaders/box_rg8_snorm.comp.spv create mode 100644 src/backends/shaders/box_rgb10_a2.comp.spv create mode 100644 src/backends/shaders/box_rgba16_snorm.comp.spv create mode 100644 src/backends/shaders/box_rgba16f.comp.spv create mode 100644 src/backends/shaders/box_rgba32f.comp.spv create mode 100644 src/backends/shaders/box_rgba8.comp.spv create mode 100644 src/backends/shaders/box_rgba8_snorm.comp.spv create mode 100644 src/backends/shaders/box_srgb.comp create mode 100644 src/backends/shaders/box_srgb.comp.spv create mode 100644 src/backends/shaders/box_srgb_macos.comp create mode 100644 src/backends/shaders/box_srgb_macos.comp.spv create mode 100755 src/backends/shaders/compile.sh create mode 100644 src/backends/shaders/triangle.vert create mode 100644 src/backends/shaders/triangle.vert.spv create mode 100644 src/core.rs create mode 100644 src/lib.rs create mode 100644 src/util.rs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..539e381 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,76 @@ +name: ci + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + build: + runs-on: ${{ matrix.os }} + env: + RUSTFLAGS: ${{ matrix.RUSTFLAGS }} + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + include: + - os: ubuntu-latest + CHECK_COMMAND: cargo check --all-targets --verbose + TEST_COMMAND: cargo test --all-targets --no-run --verbose + - os: macos-latest + CHECK_COMMAND: cargo check --all-targets --verbose + TEST_COMMAND: cargo test --all-targets --no-run --verbose + - os: windows-latest + CHECK_COMMAND: rustup default stable-msvc && cargo check --all-targets --verbose + TEST_COMMAND: rustup default stable-msvc && cargo test --all-targets --no-run --verbose + steps: + - name: Checkout sources + uses: actions/checkout@v2 + - name: Install stable toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + - name: cargo check + run: ${{ matrix.CHECK_COMMAND }} + - name: cargo test --no-run + run: ${{ matrix.TEST_COMMAND }} + + lint: + name: lint + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v2 + - name: Install stable toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + components: rustfmt, clippy + - name: Run cargo fmt + uses: actions-rs/cargo@v1 + with: + command: fmt + args: --all -- --check + - name: Run cargo clippy + uses: actions-rs/cargo@v1 + with: + command: clippy + args: -- -D warnings + + docs: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Install latest nightly + uses: actions-rs/toolchain@v1 + with: + toolchain: nightly + override: true + continue-on-error: true + - name: cargo doc + run: cargo --version; cargo doc --lib --no-deps diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..67d6deb --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/target +*png +*cap \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..eee9325 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,1206 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "adler32" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" + +[[package]] +name = "aho-corasick" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "043164d8ba5c4c3035fec9bbee8647c0261d788f3474306f93bb65901cae0e86" +dependencies = [ + "memchr", +] + +[[package]] +name = "arrayvec" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" + +[[package]] +name = "ash" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c69a8137596e84c22d57f3da1b5de1d4230b1742a710091c85f4d7ce50f00f38" +dependencies = [ + "libloading", +] + +[[package]] +name = "atom" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c86699c3f02778ec07158376991c8f783dd1f2f95c579ffaf0738dc984b2fe2" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "bumpalo" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e8c087f005730276d1096a652e92a8bacee2e2472bcc9715a74d2bec38b5820" + +[[package]] +name = "bytemuck" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41aa2ec95ca3b5c54cf73c91acf06d24f4495d5f1b1c12506ae3483d646177ac" + +[[package]] +name = "byteorder" +version = "1.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" + +[[package]] +name = "cc" +version = "1.0.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66120af515773fb005778dc07c261bd201ec8ce50bd6e7144c927753fe013381" +dependencies = [ + "jobserver", +] + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "cloudabi" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4344512281c643ae7638bbabc3af17a11307803ec8f0fcad9fae512a8bf36467" +dependencies = [ + "bitflags", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318" +dependencies = [ + "bitflags", + "block", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "copyless" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2df960f5d869b2dd8532793fde43eb5427cceb126c929747a26823ab0eeb536" + +[[package]] +name = "core-foundation" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b5ed8e7e76c45974e15e41bfa8d5b0483cd90191639e01d8f5f1e606299d3fb" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a21fa21941700a3cd8fcb4091f361a6a712fac632f85d9f487cc892045d55c6" + +[[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", + "foreign-types", + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "d3d12" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a60cceb22c7c53035f8980524fdc7f17cf49681a3c154e6757d30afbec6ec4" +dependencies = [ + "bitflags", + "libloading", + "winapi", +] + +[[package]] +name = "deflate" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174" +dependencies = [ + "adler32", + "byteorder", +] + +[[package]] +name = "env_logger" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "float-cmp" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1267f4ac4f343772758f7b1bdcbe767c218bbab93bb432acbf5162bbf85a6c4" +dependencies = [ + "num-traits", +] + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "futures" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e05b85ec287aac0dc34db7d4a569323df697f9c55b99b15d6b4ef8cde49f613" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f366ad74c28cca6ba456d95e6422883cfb4b252a83bed929c83abfdbbf2967d5" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59f5fff90fd5d971f936ad674802482ba441b6f09ba5e15fd8b39145582ca399" + +[[package]] +name = "futures-executor" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d6bb888be1153d3abeb9006b11b02cf5e9b209fda28693c31ae1e4e012e314" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de27142b013a8e869c14957e6d2edeef89e97c289e69d042ee3a49acd8b51789" + +[[package]] +name = "futures-macro" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0b5a30a4328ab5473878237c447333c093297bded83a4983d10f4deea240d39" +dependencies = [ + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f2032893cb734c7a05d85ce0cc8b8c4075278e93b24b66f9de99d6eb0fa8acc" + +[[package]] +name = "futures-task" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb66b5f09e22019b1ab0830f7785bcea8e7a42148683f99214f73f8ec21a626" +dependencies = [ + "once_cell", +] + +[[package]] +name = "futures-util" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8764574ff08b701a084482c3c7031349104b07ac897393010494beaa18ce32c6" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project", + "pin-utils", + "proc-macro-hack", + "proc-macro-nested", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gfx-auxil" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ec012a32036c6439180b688b15a24dc8a3fbdb3b1cd02eb55266201db4c1b0f" +dependencies = [ + "fxhash", + "gfx-hal", + "spirv_cross", +] + +[[package]] +name = "gfx-backend-dx11" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c7fd31dcf0f8496fc94fe44b285a0bfeeb33b5a8ec0f59ea5f8fa64428071b4" +dependencies = [ + "bitflags", + "gfx-auxil", + "gfx-hal", + "libloading", + "log", + "parking_lot", + "range-alloc", + "raw-window-handle", + "smallvec", + "spirv_cross", + "winapi", + "wio", +] + +[[package]] +name = "gfx-backend-dx12" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfc194d9a1540073f181bae94087ffc9d84a5586b71962cd1b46b86e5a6d697" +dependencies = [ + "bitflags", + "d3d12", + "gfx-auxil", + "gfx-hal", + "log", + "range-alloc", + "raw-window-handle", + "smallvec", + "spirv_cross", + "winapi", +] + +[[package]] +name = "gfx-backend-empty" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2085227c12b78f6657a900c829f2d0deb46a9be3eaf86844fde263cdc218f77c" +dependencies = [ + "gfx-hal", + "log", + "raw-window-handle", +] + +[[package]] +name = "gfx-backend-metal" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6b2b1e2510c8a283beac1e680cd152edc05d138c00dfabc0e3f636e143ffd66" +dependencies = [ + "arrayvec", + "bitflags", + "block", + "cocoa-foundation", + "copyless", + "foreign-types", + "gfx-auxil", + "gfx-hal", + "lazy_static", + "log", + "metal", + "objc", + "parking_lot", + "range-alloc", + "raw-window-handle", + "smallvec", + "spirv_cross", + "storage-map", +] + +[[package]] +name = "gfx-backend-vulkan" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84bda4200a82e1912d575801e2bb76ae19c6256359afbc0adfbbaec02fcadc6" +dependencies = [ + "arrayvec", + "ash", + "byteorder", + "core-graphics-types", + "gfx-hal", + "inplace_it", + "lazy_static", + "log", + "objc", + "raw-window-handle", + "smallvec", + "winapi", + "x11", +] + +[[package]] +name = "gfx-descriptor" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd8c7afcd000f279d541a490e27117e61037537279b9342279abf4938fe60c6b" +dependencies = [ + "arrayvec", + "fxhash", + "gfx-hal", + "log", +] + +[[package]] +name = "gfx-hal" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d0754f5b7a43915fd7466883b2d1bb0800d7cc4609178d0b27bf143b9e5123" +dependencies = [ + "bitflags", + "raw-window-handle", +] + +[[package]] +name = "gfx-memory" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe8d8855df07f438eb8a765e90356d5b821d644ea3b59b870091450b89576a9f" +dependencies = [ + "fxhash", + "gfx-hal", + "hibitset", + "log", + "slab", +] + +[[package]] +name = "hermit-abi" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3deed196b6e7f9e44a2ae8d94225d80302d81208b1bb673fd21fe634645c85a9" +dependencies = [ + "libc", +] + +[[package]] +name = "hibitset" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93a1bb8316a44459a7d14253c4d28dd7395cbd23cc04a68c46e851b8e46d64b1" +dependencies = [ + "atom", +] + +[[package]] +name = "humantime" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" +dependencies = [ + "quick-error", +] + +[[package]] +name = "image" +version = "0.23.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "974e194911d1f7efe3cd8a8f9db3b767e43536327e899e8bc9a12ef5711b74d2" +dependencies = [ + "bytemuck", + "byteorder", + "num-iter", + "num-rational", + "num-traits", + "png", +] + +[[package]] +name = "inplace_it" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd01a2a73f2f399df96b22dc88ea687ef4d76226284e7531ae3c7ee1dc5cb534" + +[[package]] +name = "instant" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b141fdc7836c525d4d594027d318c84161ca17aaf8113ab1f81ab93ae897485" + +[[package]] +name = "jobserver" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c71313ebb9439f74b00d9d2dcec36440beaf57a6aa0623068441dd7cd81a7f2" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca059e81d9486668f12d455a4ea6daa600bd408134cd17e3d3fb5a32d1f016f8" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f96b10ec2560088a8e76961b00d47107b3a625fecb76dedb29ee7ccbf98235" + +[[package]] +name = "libloading" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2443d8f0478b16759158b2f66d525991a05491138bc05814ef52a250148ef4f9" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "lock_api" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28247cc5a5be2f05fbcd76dd0cf2c7d3b5400cb978a28042abcd4fa0b3f8261c" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" + +[[package]] +name = "metal" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c4e8a431536529327e28c9ba6992f2cb0c15d4222f0602a16e6d7695ff3bccf" +dependencies = [ + "bitflags", + "block", + "cocoa-foundation", + "foreign-types", + "log", + "objc", +] + +[[package]] +name = "miniz_oxide" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435" +dependencies = [ + "adler32", +] + +[[package]] +name = "naga" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0873deb76cf44b7454fba7b2ba6a89d3de70c08aceffd2c489379b3d9d08e661" +dependencies = [ + "bitflags", + "fxhash", + "log", + "num-traits", + "spirv_headers", + "thiserror", +] + +[[package]] +name = "num-integer" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d59457e662d541ba17869cf51cf177c0b5f0cbf476c66bdc90bf1edac4f875b" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6e6b7c748f995c4c29c5f5ae0248536e04a5739927c74ec0fa564805094b9f" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5b4d7360f362cfb50dde8143501e6940b22f644be75a4cc90b2d81968908138" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac267bcc07f48ee5f8935ab0d24f316fb722d7a1292e2913f0cc196b29ffd611" +dependencies = [ + "autocfg", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", + "objc_exception", +] + +[[package]] +name = "objc_exception" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +dependencies = [ + "cc", +] + +[[package]] +name = "once_cell" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "260e51e7efe62b592207e9e13a68e43692a7a279171d6ba57abd208bf23645ad" + +[[package]] +name = "parking_lot" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4893845fa2ca272e647da5d0e46660a314ead9c2fdd9a883aabc32e481a8733" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c361aa727dd08437f2f1447be8b59a33b0edd15e0fcee698f935613d9efbca9b" +dependencies = [ + "cfg-if", + "cloudabi", + "instant", + "libc", + "redox_syscall", + "smallvec", + "winapi", +] + +[[package]] +name = "pin-project" +version = "0.4.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca4433fff2ae79342e497d9f8ee990d174071408f28f726d6d83af93e58e48aa" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "0.4.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c0e815c3ee9a031fdf5af21c10aa17c573c9c6a566328d99e3936c34e36461f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d36492546b6af1463394d46f0c834346f31548646f6ba10849802c9c9a27ac33" + +[[package]] +name = "png" +version = "0.16.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfe7f9f1c730833200b134370e1d5098964231af8450bce9b78ee3ab5278b970" +dependencies = [ + "bitflags", + "crc32fast", + "deflate", + "miniz_oxide", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99c605b9a0adc77b7211c6b1f722dcb613d68d66859a44f3d485a6da332b0598" + +[[package]] +name = "proc-macro-nested" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eba180dafb9038b050a4c280019bbedf9f2467b61e5d892dcad585bb57aadc5a" + +[[package]] +name = "proc-macro2" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36e28516df94f3dd551a587da5357459d9b36d945a7c37c3557928c1c2ff2a2c" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quote" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "range-alloc" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a871f1e45a3a3f0c73fb60343c811238bb5143a81642e27c2ac7aac27ff01a63" + +[[package]] +name = "raw-window-handle" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a441a7a6c80ad6473bd4b74ec1c9a4c951794285bf941c2126f607c72e48211" +dependencies = [ + "libc", +] + +[[package]] +name = "redox_syscall" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" + +[[package]] +name = "regex" +version = "1.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", + "thread_local", +] + +[[package]] +name = "regex-syntax" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8" + +[[package]] +name = "renderdoc" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f084dd613b0ac0d206540f11f32e9627322479005733b17cc0c346afc2ec6e1a" +dependencies = [ + "bitflags", + "float-cmp", + "libloading", + "once_cell", + "renderdoc-sys", + "winapi", + "wio", +] + +[[package]] +name = "renderdoc-sys" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1382d1f0a252c4bf97dc20d979a2fdd05b024acd7c2ed0f7595d7817666a157" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "slab" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" + +[[package]] +name = "smallvec" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbee7696b84bbf3d89a1c2eccff0850e3047ed46bfcd2e92c29a2d074d57e252" + +[[package]] +name = "spirv_cross" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b631bd956108f3e34a4fb7e39621711ac15ce022bc567da2d953c6df13f00e00" +dependencies = [ + "cc", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "spirv_headers" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f5b132530b1ac069df335577e3581765995cba5a13995cdbbdbc8fb057c532c" +dependencies = [ + "bitflags", + "num-traits", +] + +[[package]] +name = "storage-map" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418bb14643aa55a7841d5303f72cf512cfb323b8cc221d51580500a1ca75206c" +dependencies = [ + "lock_api", +] + +[[package]] +name = "syn" +version = "1.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6690e3e9f692504b941dc6c3b188fd28df054f7fb8469ab40680df52fdcc842b" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "termcolor" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dfdd070ccd8ccb78f4ad66bf1982dc37f620ef696c6b5028fe2ed83dd3d0d08" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd80fc12f73063ac132ac92aceea36734f04a1d93c1240c6944e23a3b8841793" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "tracing" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d79ca061b032d6ce30c660fded31189ca0b9922bf483cd70759f13a2d86786c" +dependencies = [ + "cfg-if", + "log", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e0ccfc3378da0cce270c946b676a376943f5cd16aeba64568e7939806f4ada" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bcf46c1f1f06aeea2d6b81f3c863d0930a596c86ad1920d4e5bad6dd1d7119a" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "typed-arena" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0685c84d5d54d1c26f7d3eb96cd41550adb97baed141a761cf335d3d33bcd0ae" + +[[package]] +name = "unicode-xid" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" + +[[package]] +name = "wasm-bindgen" +version = "0.2.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ac64ead5ea5f05873d7c12b545865ca2b8d28adfc50a49b84770a3a97265d42" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f22b422e2a757c35a73774860af8e112bff612ce6cb604224e8e47641a9e4f68" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7866cab0aa01de1edf8b5d7936938a7e397ee50ce24119aef3e1eaa3b6171da" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b13312a745c08c469f0b292dd2fcd6411dba5f7160f593da6ef69b64e407038" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f249f06ef7ee334cc3b8ff031bfc11ec99d00f34d86da7498396dc1e3b1498fe" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d649a3145108d7d3fbcde896a468d1bd636791823c9921135218ad89be08307" + +[[package]] +name = "web-sys" +version = "0.3.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bf6ef87ad7ae8008e15a355ce696bed26012b7caa21605188cfd8214ab51e2d" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wgpu" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "549160f188eef412ac978499ddf0ceadad4c9159bb1160f9e6b9d4cc8ee977dc" +dependencies = [ + "arrayvec", + "futures", + "gfx-backend-vulkan", + "js-sys", + "objc", + "parking_lot", + "raw-window-handle", + "smallvec", + "tracing", + "typed-arena", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core", + "wgpu-types", +] + +[[package]] +name = "wgpu-core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317d19c2876fc26d5bc15fe986a0d2d28958337e639323fcaded23a7cf8865b9" +dependencies = [ + "arrayvec", + "bitflags", + "copyless", + "fxhash", + "gfx-backend-dx11", + "gfx-backend-dx12", + "gfx-backend-empty", + "gfx-backend-metal", + "gfx-backend-vulkan", + "gfx-descriptor", + "gfx-hal", + "gfx-memory", + "naga", + "parking_lot", + "raw-window-handle", + "smallvec", + "thiserror", + "tracing", + "wgpu-types", +] + +[[package]] +name = "wgpu-mipmap" +version = "0.1.0" +dependencies = [ + "bytemuck", + "env_logger", + "futures", + "image", + "log", + "renderdoc", + "thiserror", + "tracing", + "wgpu", +] + +[[package]] +name = "wgpu-types" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e3529528e608b54838ee618c3923b0f46e6db0334cfc6c42a16cf4ceb3bdb57" +dependencies = [ + "bitflags", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "wio" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5" +dependencies = [ + "winapi", +] + +[[package]] +name = "x11" +version = "2.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ecd092546cb16f25783a5451538e73afc8d32e242648d54f4ae5459ba1e773" +dependencies = [ + "libc", + "pkg-config", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..eaf73e2 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "wgpu-mipmap" +version = "0.1.0" +authors = ["Justin Shrake "] +edition = "2018" + +[features] +debug = ["renderdoc"] + +[dependencies] +log = "0.4" +# renderdoc is only used in the examples, but +# cargo does not support optional dev dependencies +renderdoc = {version = "0.9.1", optional=true} +thiserror = "1.0" +wgpu = "0.6" + +[dev-dependencies] +bytemuck = "1.4.1" +env_logger = "0.7.1" +futures = "0.3" +image = {version = "0.23", default-features = false, features = ["png"]} +tracing = { version = "0.1", features = ["log"] } + +# TODO: Compiling for target=wasm32-unknown-unknown only works +# against the HEAD of the master branch of wgpu-rs. Users +# who wish to compile for this target will need to manually +# fiddle with this for now. +[patch.crates-io] +#wgpu = {git = "https://github.com/gfx-rs/wgpu-rs", branch = "master"} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ed98d18 --- /dev/null +++ b/LICENSE @@ -0,0 +1,25 @@ +Copyright (c) 2020 Justin Shrake + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..da7d50f --- /dev/null +++ b/Makefile @@ -0,0 +1,27 @@ +.PHONY: test +test: + cargo test + +.PHONY: check +check: + cargo check + +.PHONY: lint +lint: + cargo clippy -- -D warnings + +.PHONY: doc +doc: + cargo doc --open + +.PHONY: cat +cat: + cargo run --example cat + +.PHONY: checkerboard +checkerboard: + cargo run --example checkerboard + +.PHONY: build-shaders +build-shaders: + ./src/backends/shaders/compile.sh diff --git a/README.md b/README.md new file mode 100644 index 0000000..31fd658 --- /dev/null +++ b/README.md @@ -0,0 +1,98 @@ +# wgpu-mipmap + +![ci](https://github.com/jshrake/wgpu-mipmap/workflows/ci/badge.svg) + +Generate mipmaps for [wgpu](https://github.com/gfx-rs/wgpu-rs) textures. + +## Usage + +Add this to your `Cargo.toml`: + +```toml +[dependencies] +wgpu-mipmap = "0.1" +``` + +Example usage: + +```rust +use wgpu_mipmap::*; +fn example(device: &wgpu::Device, queue: &wgpu::Queue) -> Result<(), Error> { + // create a recommended generator + let generator = RecommendedMipmapGenerator::new(&device); + // create and upload data to a texture + let texture_descriptor = wgpu::TextureDescriptor { + size: wgpu::Extent3d { + width: 512, + height: 512, + depth: 1, + }, + mip_level_count: 10, // 1 + log2(512) + sample_count: 1, + format: wgpu::TextureFormat::Rgba8Unorm, + dimension: wgpu::TextureDimension::D2, + usage: wgpu::TextureUsage::STORAGE, + label: None, + }; + let texture = device.create_texture(&texture_descriptor); + // upload_data_to_texture(&texture); + // create an encoder and generate mipmaps for the texture + let mut encoder = device.create_command_encoder(&Default::default()); + generator.generate(&device, &mut encoder, &texture, &texture_descriptor)?; + queue.submit(std::iter::once(encoder.finish())); + Ok(()) +} +``` + +## Features + +wgpu-mipmap is in the early stages of development and can only generate mipmaps for +2D textures with floating-point formats. The library implements several backends +in order to support various texture usage patterns: + +- `ComputeMipmapGenerator`: For power of two textures with with usage + `TextureUsage::STORAGE`. Uses a compute pipeline to generate mipmaps. +- `RenderMipmapGenerator`: For textures with usage + `TextureUsage::OUTPUT_ATTACHMENT`. Uses a render pipeline to generate mipmaps. +- `CopyMipmapGenerator`: For textures with usage `TextureUsage::SAMPLED`. + Allocates a new texture, uses a render pipeline to generate mipmaps in the new + texture, then copies the result back to the original texture. +- `RecommendedMipmapGenerator`: Uses one of the above implementations depending + on texture usage (prefers the compute backend, followed by the render backend, + and finally the copy backend). + +## Development + +### Run the examples + +The examples test various use cases and generate images for manual inspection and comparsion. + +```console +$ cargo run --example cat +$ cargo run --example checkerboard +``` + +### Run the tests + +```console +$ cargo test +``` + +### How to compile the shaders + +```console +$ make build-shaders +``` + +See [src/shaders/README.md](src/shaders/README.md) for dependencies and more information. + +## Benchmarks + +TODO + +## Resources + +- https://github.com/gpuweb/gpuweb/issues/386 +- https://github.com/gpuweb/gpuweb/issues/513 +- https://github.com/gfx-rs/wgpu-rs/blob/master/examples/mipmap/main.rs +- https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkCmdBlitImage.html#_description diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 0000000..da45f5b --- /dev/null +++ b/examples/README.md @@ -0,0 +1,19 @@ +# examples + +The examples write out the generated mipmaps as pngs to the root directory for visual inspection. + +## cat + +Generates mipmaps for an sRGB png [cat.png](cat.png) ([https://commons.wikimedia.org/wiki/File:Avatar_cat.png](https://commons.wikimedia.org/wiki/File:Avatar_cat.png)) using the various backends. + +```console +$ cargo run --example cat +``` + +## checkerboard + +Generates mipmaps for both a linear and srgb checkerboard texture with the various backends. + +```console +$ cargo run --example checkerboard +``` diff --git a/examples/cat.png b/examples/cat.png new file mode 100644 index 0000000000000000000000000000000000000000..5991f4f34691fc57ed5d1660877dbdde5e1e013f GIT binary patch literal 380604 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%0Dt*4znOOZ$DtuYK)=%~ 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%0DqdSr+zK@0$Zj*n1nwcolQJ?4gg!ozhj%_d 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ͭkm@PTIo^eApR8vy-VF+c~=)eR{<1NbLS%?BN#M1 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 literal 0 HcmV?d00001 diff --git a/examples/cat.rs b/examples/cat.rs new file mode 100644 index 0000000..ee41286 --- /dev/null +++ b/examples/cat.rs @@ -0,0 +1,105 @@ +#[cfg(feature = "debug")] +use renderdoc::{RenderDoc, V110}; +use wgpu_mipmap::RecommendedMipmapGenerator; + +fn main() { + env_logger::init(); + + #[cfg(feature = "debug")] + let mut rd: RenderDoc = RenderDoc::new().expect("Unable to connect"); + #[cfg(feature = "debug")] + rd.start_frame_capture(std::ptr::null(), std::ptr::null()); + + let instance = wgpu::Instance::new(wgpu::BackendBit::PRIMARY); + futures::executor::block_on((|| { + async { + let adapter = instance + .request_adapter(&wgpu::RequestAdapterOptions { + power_preference: wgpu::PowerPreference::HighPerformance, + compatible_surface: None, + }) + .await + .expect("Failed to find an appropiate adapter"); + // Create the logical device and command queue + let (device, queue) = adapter + .request_device( + &wgpu::DeviceDescriptor { + features: wgpu::Features::empty(), + limits: wgpu::Limits::default(), + shader_validation: true, + }, + None, + ) + .await + .expect("Failed to create device"); + // Generate texture data on the CPU + let cat_png_bytes = include_bytes!("cat.png"); + let cat_image = image::load_from_memory(cat_png_bytes).expect("this should work"); + let cat_image = cat_image.into_rgba(); + let width = cat_image.width(); + let height = cat_image.height(); + let mip_level_count = 1 + (width.max(height) as f64).log2().floor() as u32; + // Create a texture + let format = wgpu::TextureFormat::Rgba8UnormSrgb; + let texture_extent = wgpu::Extent3d { + width, + height, + depth: 1, + }; + let supported_usage: std::collections::HashMap<_, _> = vec![ + ( + "compute", + wgpu_mipmap::ComputeMipmapGenerator::required_usage(), + ), + ( + "render", + wgpu_mipmap::RenderMipmapGenerator::required_usage(), + ), + ("copy", wgpu_mipmap::CopyMipmapGenerator::required_usage()), + ] + .into_iter() + .collect(); + let generator = RecommendedMipmapGenerator::new(&device); + for (usage_str, usage) in &supported_usage { + let texture_descriptor = wgpu::TextureDescriptor { + size: texture_extent, + mip_level_count, + format, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + usage: *usage | wgpu::TextureUsage::COPY_DST | wgpu::TextureUsage::COPY_SRC, + label: None, + }; + + let mipmap_buffers = wgpu_mipmap::util::generate_and_copy_to_cpu( + &device, + &queue, + &generator, + &cat_image.to_vec(), + &texture_descriptor, + ) + .await + .expect("shouldn't fail"); + + let has_file_system_available = cfg!(not(target_arch = "wasm32")); + if !has_file_system_available { + return; + } + + // Write the different mip levels as files + for (i, mip) in mipmap_buffers.iter().enumerate() { + image::save_buffer( + format!("cat-{}-{}.png", usage_str, i), + &mip.buffer, + mip.dimensions.width as u32, + mip.dimensions.height as u32, + image::ColorType::Rgba8, + ) + .unwrap(); + } + } + } + })()); + #[cfg(feature = "debug")] + rd.end_frame_capture(std::ptr::null(), std::ptr::null()); +} diff --git a/examples/checkerboard.rs b/examples/checkerboard.rs new file mode 100644 index 0000000..24de813 --- /dev/null +++ b/examples/checkerboard.rs @@ -0,0 +1,109 @@ +#[cfg(feature = "debug")] +use renderdoc::{RenderDoc, V110}; +use wgpu_mipmap::RecommendedMipmapGenerator; + +fn main() { + env_logger::init(); + #[cfg(feature = "debug")] + let mut rd: RenderDoc = RenderDoc::new().expect("Unable to connect"); + #[cfg(feature = "debug")] + rd.start_frame_capture(std::ptr::null(), std::ptr::null()); + let instance = wgpu::Instance::new(wgpu::BackendBit::PRIMARY); + futures::executor::block_on((|| { + async { + let adapter = instance + .request_adapter(&wgpu::RequestAdapterOptions { + power_preference: wgpu::PowerPreference::HighPerformance, + compatible_surface: None, + }) + .await + .expect("Failed to find an appropiate adapter"); + // Create the logical device and command queue + let (device, queue) = adapter + .request_device( + &wgpu::DeviceDescriptor { + features: wgpu::Features::empty(), + limits: wgpu::Limits::default(), + shader_validation: true, + }, + None, + ) + .await + .expect("Failed to create device"); + // Generate texture data on the CPU + let width = 512; + let height = 512; + let mip_level_count = 1 + (width.max(height) as f32).log2().floor() as u32; + let data = wgpu_mipmap::util::checkerboard_rgba8(width, height, 16); + let texture_extent = wgpu::Extent3d { + width, + height, + depth: 1, + }; + // Generate different mipmaps for both a linear and srgb format + // with both the render and compute code paths + let formats: std::collections::HashMap<_, _> = vec![ + ("linear", wgpu::TextureFormat::Rgba8Unorm), + ("srgb", wgpu::TextureFormat::Rgba8UnormSrgb), + ] + .into_iter() + .collect(); + let supported_usage: std::collections::HashMap<_, _> = vec![ + ( + "compute", + wgpu_mipmap::ComputeMipmapGenerator::required_usage(), + ), + ( + "render", + wgpu_mipmap::RenderMipmapGenerator::required_usage(), + ), + ("copy", wgpu_mipmap::CopyMipmapGenerator::required_usage()), + ] + .into_iter() + .collect(); + let generator = RecommendedMipmapGenerator::new(&device); + for (format_str, format) in &formats { + for (usage_str, usage) in &supported_usage { + let texture_descriptor = wgpu::TextureDescriptor { + size: texture_extent, + mip_level_count, + format: *format, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + usage: *usage | wgpu::TextureUsage::COPY_DST | wgpu::TextureUsage::COPY_SRC, + label: None, + }; + + let mipmap_buffers = wgpu_mipmap::util::generate_and_copy_to_cpu( + &device, + &queue, + &generator, + &data, + &texture_descriptor, + ) + .await + .expect("shouldn't fail"); + + let has_file_system_available = cfg!(not(target_arch = "wasm32")); + if !has_file_system_available { + return; + } + + // Write the different mip levels as files + for (i, mip) in mipmap_buffers.iter().enumerate() { + image::save_buffer( + format!("checkerboard-{}-{}-{}.png", format_str, usage_str, i), + &mip.buffer, + mip.dimensions.width as u32, + mip.dimensions.height as u32, + image::ColorType::Rgba8, + ) + .unwrap(); + } + } + } + } + })()); + #[cfg(feature = "debug")] + rd.end_frame_capture(std::ptr::null(), std::ptr::null()); +} diff --git a/src/backends/compute.rs b/src/backends/compute.rs new file mode 100644 index 0000000..70fff6e --- /dev/null +++ b/src/backends/compute.rs @@ -0,0 +1,375 @@ +use crate::core::*; +use crate::util::get_mip_extent; +use log::warn; +use std::collections::HashMap; + +/// Generates mipmaps for textures with storage usage. +#[derive(Debug)] +pub struct ComputeMipmapGenerator { + layout_cache: HashMap, + pipeline_cache: HashMap, +} + +impl ComputeMipmapGenerator { + /// Returns the texture usage `ComputeMipmapGenerator` requires for mipmap generation. + pub fn required_usage() -> wgpu::TextureUsage { + wgpu::TextureUsage::STORAGE + } + + /// Creates a new `ComputeMipmapGenerator`. Once created, it can be used repeatedly to + /// generate mipmaps for any texture with format specified in `format_hints`. + pub fn new_with_format_hints( + device: &wgpu::Device, + format_hints: &[wgpu::TextureFormat], + ) -> Self { + let mut layout_cache = HashMap::new(); + let mut pipeline_cache = HashMap::new(); + for format in format_hints { + if let Some(module) = shader_for_format(device, format) { + let bind_group_layout = bind_group_layout_for_format(device, format); + let pipeline = + compute_pipeline_for_format(device, &module, &bind_group_layout, format); + layout_cache.insert(*format, bind_group_layout); + pipeline_cache.insert(*format, pipeline); + } else { + warn!( + "ComputeMipmapGenerator does not support requested format {:?}", + format + ); + continue; + } + } + Self { + layout_cache, + pipeline_cache, + } + } +} + +impl MipmapGenerator for ComputeMipmapGenerator { + fn generate( + &self, + device: &wgpu::Device, + encoder: &mut wgpu::CommandEncoder, + texture: &wgpu::Texture, + texture_descriptor: &wgpu::TextureDescriptor, + ) -> Result<(), Error> { + // Texture width and height must be a power of 2 + if !texture_descriptor.size.width.is_power_of_two() + || !texture_descriptor.size.height.is_power_of_two() + { + return Err(Error::NpotTexture); + } + // Texture dimension must be 2D + if texture_descriptor.dimension != wgpu::TextureDimension::D2 { + return Err(Error::UnsupportedDimension(texture_descriptor.dimension)); + } + if !texture_descriptor.usage.contains(Self::required_usage()) { + return Err(Error::UnsupportedUsage(texture_descriptor.usage)); + } + + let layout = self + .layout_cache + .get(&texture_descriptor.format) + .ok_or(Error::UnknownFormat(texture_descriptor.format))?; + let pipeline = self + .pipeline_cache + .get(&texture_descriptor.format) + .ok_or(Error::UnknownFormat(texture_descriptor.format))?; + + let mip_count = texture_descriptor.mip_level_count; + // TODO: Can we create the views every call? + let views = (0..mip_count) + .map(|base_mip_level| { + texture.create_view(&wgpu::TextureViewDescriptor { + label: None, + format: None, + dimension: None, + aspect: wgpu::TextureAspect::All, + base_mip_level, + level_count: std::num::NonZeroU32::new(1), + array_layer_count: None, + base_array_layer: 0, + }) + }) + .collect::>(); + // Now dispatch the compute pipeline for each mip level + // TODO: Likely need more flexibility here + // - The compute shaders must have matching local_size_x and local_size_y values + // - When the image size is less than 32x32, more work is performed than required + let x_work_group_count = 32; + let y_work_group_count = 32; + for mip in 1..mip_count as usize { + let src_view = &views[mip - 1]; + let dst_view = &views[mip]; + let mip_ext = get_mip_extent(&texture_descriptor.size, mip as u32); + let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { + label: None, + layout, + entries: &[ + wgpu::BindGroupEntry { + binding: 0, + resource: wgpu::BindingResource::TextureView(&src_view), + }, + wgpu::BindGroupEntry { + binding: 1, + resource: wgpu::BindingResource::TextureView(&dst_view), + }, + ], + }); + let mut pass = encoder.begin_compute_pass(); + pass.set_pipeline(pipeline); + pass.set_bind_group(0, &bind_group, &[]); + pass.dispatch( + (mip_ext.width / x_work_group_count).max(1), + (mip_ext.height / y_work_group_count).max(1), + 1, + ); + } + Ok(()) + } +} + +fn shader_for_format( + device: &wgpu::Device, + format: &wgpu::TextureFormat, +) -> Option { + use wgpu::TextureFormat; + let s = |d| Some(device.create_shader_module(wgpu::util::make_spirv(d))); + match format { + TextureFormat::R8Unorm => s(include_bytes!("shaders/box_r8.comp.spv")), + TextureFormat::R8Snorm => s(include_bytes!("shaders/box_r8_snorm.comp.spv")), + TextureFormat::R16Float => s(include_bytes!("shaders/box_r16f.comp.spv")), + TextureFormat::Rg8Unorm => s(include_bytes!("shaders/box_rg8.comp.spv")), + TextureFormat::Rg8Snorm => s(include_bytes!("shaders/box_rg8_snorm.comp.spv")), + TextureFormat::R32Float => s(include_bytes!("shaders/box_r32f.comp.spv")), + TextureFormat::Rg16Float => s(include_bytes!("shaders/box_rg16f.comp.spv")), + TextureFormat::Rgba8Unorm => s(include_bytes!("shaders/box_rgba8.comp.spv")), + TextureFormat::Rgba8UnormSrgb | TextureFormat::Bgra8UnormSrgb => { + // On MacOS, my GPUFamily2 v1 capable GPU + // seems to perform the srgb -> linear before I load it + // in the shader, but expects me to perform the linear -> srgb + // conversion before storing. + #[cfg(target_os = "macos")] + { + s(include_bytes!("shaders/box_srgb_macos.comp.spv")) + } + // On Vulkan (and DX12?), the implementation does not perform + // any conversion, so this shader handles it all + #[cfg(not(target_os = "macos"))] + { + s(include_bytes!("shaders/box_srgb.comp.spv")) + } + } + TextureFormat::Rgba8Snorm => s(include_bytes!("shaders/box_rgba8_snorm.comp.spv")), + TextureFormat::Bgra8Unorm => s(include_bytes!("shaders/box_rgba8.comp.spv")), + TextureFormat::Rgb10a2Unorm => s(include_bytes!("shaders/box_rgb10_a2.comp.spv")), + TextureFormat::Rg11b10Float => s(include_bytes!("shaders/box_r11f_g11f_b10f.comp.spv")), + TextureFormat::Rg32Float => s(include_bytes!("shaders/box_rg32f.comp.spv")), + TextureFormat::Rgba16Float => s(include_bytes!("shaders/box_rgba16f.comp.spv")), + TextureFormat::Rgba32Float => s(include_bytes!("shaders/box_rgba32f.comp.spv")), + _ => None, + } +} + +fn bind_group_layout_for_format( + device: &wgpu::Device, + format: &wgpu::TextureFormat, +) -> wgpu::BindGroupLayout { + device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + label: None, + entries: &[ + wgpu::BindGroupLayoutEntry { + binding: 0, + visibility: wgpu::ShaderStage::COMPUTE, + ty: wgpu::BindingType::StorageTexture { + dimension: wgpu::TextureViewDimension::D2, + format: *format, + readonly: true, + }, + count: None, + }, + wgpu::BindGroupLayoutEntry { + binding: 1, + visibility: wgpu::ShaderStage::COMPUTE, + ty: wgpu::BindingType::StorageTexture { + dimension: wgpu::TextureViewDimension::D2, + format: *format, + readonly: false, + }, + count: None, + }, + ], + }) +} + +fn compute_pipeline_for_format( + device: &wgpu::Device, + module: &wgpu::ShaderModule, + bind_group_layout: &wgpu::BindGroupLayout, + format: &wgpu::TextureFormat, +) -> wgpu::ComputePipeline { + let pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { + label: None, + bind_group_layouts: &[&bind_group_layout], + push_constant_ranges: &[], + }); + device.create_compute_pipeline(&wgpu::ComputePipelineDescriptor { + label: Some(&format!("wgpu-mipmap-compute-pipeline-{:?}", format)), + layout: Some(&pipeline_layout), + compute_stage: wgpu::ProgrammableStageDescriptor { + module: &module, + entry_point: "main", + }, + }) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::util::*; + + fn init() { + let _ = env_logger::builder().is_test(true).try_init(); + } + + #[allow(dead_code)] + async fn generate_and_copy_to_cpu_compute( + buffer: &[u8], + texture_descriptor: &wgpu::TextureDescriptor<'_>, + ) -> Result, Error> { + let (_instance, _adaptor, device, queue) = wgpu_setup().await; + let generator = crate::backends::ComputeMipmapGenerator::new_with_format_hints( + &device, + &[texture_descriptor.format], + ); + Ok( + generate_and_copy_to_cpu(&device, &queue, &generator, buffer, texture_descriptor) + .await?, + ) + } + + async fn generate_test(texture_descriptor: &wgpu::TextureDescriptor<'_>) -> Result<(), Error> { + let (_instance, _adapter, device, _queue) = wgpu_setup().await; + let generator = + ComputeMipmapGenerator::new_with_format_hints(&device, &[texture_descriptor.format]); + let texture = device.create_texture(&texture_descriptor); + let mut encoder = device.create_command_encoder(&Default::default()); + generator.generate(&device, &mut encoder, &texture, &texture_descriptor) + } + + #[test] + fn sanity_check() { + init(); + // Generate texture data on the CPU + let size = 512; + let mip_level_count = 1 + (size as f32).log2() as u32; + // Create a texture + let format = wgpu::TextureFormat::R8Unorm; + let texture_extent = wgpu::Extent3d { + width: size, + height: size, + depth: 1, + }; + let texture_descriptor = wgpu::TextureDescriptor { + size: texture_extent, + mip_level_count, + format, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + usage: ComputeMipmapGenerator::required_usage(), + label: None, + }; + futures::executor::block_on((|| async { + let res = generate_test(&texture_descriptor).await; + assert!(res.is_ok()); + })()); + } + + #[test] + fn unsupported_npot() { + init(); + // Generate texture data on the CPU + let size = 511; + let mip_level_count = 1 + (size as f32).log2() as u32; + // Create a texture + let format = wgpu::TextureFormat::R8Unorm; + let texture_extent = wgpu::Extent3d { + width: size, + height: size, + depth: 1, + }; + let texture_descriptor = wgpu::TextureDescriptor { + size: texture_extent, + mip_level_count, + format, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + usage: ComputeMipmapGenerator::required_usage(), + label: None, + }; + futures::executor::block_on((|| async { + let res = generate_test(&texture_descriptor).await; + assert!(res.is_err()); + assert!(res.err() == Some(Error::NpotTexture)); + })()); + } + + #[test] + fn unsupported_usage() { + init(); + // Generate texture data on the CPU + let size = 512; + let mip_level_count = 1 + (size as f32).log2() as u32; + // Create a texture + let format = wgpu::TextureFormat::R8Unorm; + let texture_extent = wgpu::Extent3d { + width: size, + height: size, + depth: 1, + }; + let texture_descriptor = wgpu::TextureDescriptor { + size: texture_extent, + mip_level_count, + format, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + usage: wgpu::TextureUsage::empty(), + label: None, + }; + futures::executor::block_on((|| async { + let res = generate_test(&texture_descriptor).await; + assert!(res.is_err()); + assert!(res.err() == Some(Error::UnsupportedUsage(wgpu::TextureUsage::empty()))); + })()); + } + + #[test] + fn unknown_format() { + init(); + // Generate texture data on the CPU + let size = 512; + let mip_level_count = 1 + (size as f32).log2() as u32; + // Create a texture + let format = wgpu::TextureFormat::Rg16Sint; + let texture_extent = wgpu::Extent3d { + width: size, + height: size, + depth: 1, + }; + let texture_descriptor = wgpu::TextureDescriptor { + size: texture_extent, + mip_level_count, + format, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + usage: ComputeMipmapGenerator::required_usage(), + label: None, + }; + futures::executor::block_on((|| async { + let res = generate_test(&texture_descriptor).await; + assert!(res.is_err()); + assert!(res.err() == Some(Error::UnknownFormat(wgpu::TextureFormat::Rg16Sint))); + })()); + } +} diff --git a/src/backends/copy.rs b/src/backends/copy.rs new file mode 100644 index 0000000..abe31c0 --- /dev/null +++ b/src/backends/copy.rs @@ -0,0 +1,171 @@ +use crate::backends::RenderMipmapGenerator; +use crate::core::*; +use crate::util::get_mip_extent; + +/// Generates mipmaps for textures with sampled usage. +pub struct CopyMipmapGenerator<'a> { + generator: &'a RenderMipmapGenerator, +} + +impl<'a> CopyMipmapGenerator<'a> { + // Creates a new `CopyMipmapGenerator` from an existing `RenderMipmapGenerator` + /// Once created, it can be used repeatedly to generate mipmaps for any + /// texture supported by the render generator. + pub fn new(generator: &'a RenderMipmapGenerator) -> Self { + Self { generator } + } + + /// Returns the texture usage `CopyMipmapGenerator` requires for mipmap + /// generation. + pub fn required_usage() -> wgpu::TextureUsage { + wgpu::TextureUsage::SAMPLED | wgpu::TextureUsage::COPY_DST + } +} + +impl<'a> MipmapGenerator for CopyMipmapGenerator<'a> { + fn generate( + &self, + device: &wgpu::Device, + encoder: &mut wgpu::CommandEncoder, + texture: &wgpu::Texture, + texture_descriptor: &wgpu::TextureDescriptor, + ) -> Result<(), Error> { + // Create a temporary texture with half the resolution + // of the original texture, and one less mip level + // We'll generate mipmaps into this texture, then + // copy the results back into the mip levels of the original texture + let tmp_descriptor = wgpu::TextureDescriptor { + label: None, + size: get_mip_extent(&texture_descriptor.size, 1), + mip_level_count: texture_descriptor.mip_level_count - 1, + sample_count: texture_descriptor.sample_count, + dimension: texture_descriptor.dimension, + format: texture_descriptor.format, + usage: RenderMipmapGenerator::required_usage() | wgpu::TextureUsage::COPY_SRC, + }; + let tmp_texture = device.create_texture(&tmp_descriptor); + self.generator.generate_src_dst( + device, + encoder, + &texture, + &tmp_texture, + texture_descriptor, + &tmp_descriptor, + 1, + )?; + let mip_count = tmp_descriptor.mip_level_count; + for i in 0..mip_count { + encoder.copy_texture_to_texture( + wgpu::TextureCopyView { + texture: &tmp_texture, + mip_level: i, + origin: wgpu::Origin3d::default(), + }, + wgpu::TextureCopyView { + texture: &texture, + mip_level: i + 1, + origin: wgpu::Origin3d::default(), + }, + get_mip_extent(&tmp_descriptor.size, i), + ); + } + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::util::*; + + fn init() { + let _ = env_logger::builder().is_test(true).try_init(); + } + + #[allow(dead_code)] + async fn generate_and_copy_to_cpu_render_slow( + buffer: &[u8], + texture_descriptor: &wgpu::TextureDescriptor<'_>, + ) -> Result, Error> { + let (_instance, _adaptor, device, queue) = wgpu_setup().await; + + let generator = crate::backends::RenderMipmapGenerator::new_with_format_hints( + &device, + &[texture_descriptor.format], + ); + let fallback = CopyMipmapGenerator::new(&generator); + Ok( + generate_and_copy_to_cpu(&device, &queue, &fallback, buffer, texture_descriptor) + .await?, + ) + } + + async fn generate_test(texture_descriptor: &wgpu::TextureDescriptor<'_>) -> Result<(), Error> { + let (_instance, _adapter, device, _queue) = wgpu_setup().await; + let render = crate::backends::RenderMipmapGenerator::new_with_format_hints( + &device, + &[texture_descriptor.format], + ); + let generator = CopyMipmapGenerator::new(&render); + let texture = device.create_texture(&texture_descriptor); + let mut encoder = device.create_command_encoder(&Default::default()); + generator.generate(&device, &mut encoder, &texture, &texture_descriptor) + } + + #[test] + fn sanity_check() { + init(); + // Generate texture data on the CPU + let size = 511; + let mip_level_count = 1 + (size as f32).log2() as u32; + // Create a texture + let format = wgpu::TextureFormat::R8Unorm; + let texture_extent = wgpu::Extent3d { + width: size, + height: size, + depth: 1, + }; + let texture_descriptor = wgpu::TextureDescriptor { + size: texture_extent, + mip_level_count, + format, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + usage: CopyMipmapGenerator::required_usage(), + label: None, + }; + futures::executor::block_on((|| async { + let res = generate_test(&texture_descriptor).await; + assert!(res.is_ok()); + })()); + } + + #[test] + fn unsupported_format() { + init(); + // Generate texture data on the CPU + let size = 511; + let mip_level_count = 1 + (size as f32).log2() as u32; + // Create a texture + let format = wgpu::TextureFormat::R8Unorm; + let texture_extent = wgpu::Extent3d { + width: size, + height: size, + depth: 1, + }; + let texture_descriptor = wgpu::TextureDescriptor { + size: texture_extent, + mip_level_count, + format, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + usage: wgpu::TextureUsage::empty(), + label: None, + }; + futures::executor::block_on((|| async { + let res = generate_test(&texture_descriptor).await; + assert!(res.is_err()); + assert!(res.err() == Some(Error::UnsupportedUsage(texture_descriptor.usage))); + })()); + } +} diff --git a/src/backends/mod.rs b/src/backends/mod.rs new file mode 100644 index 0000000..25823fa --- /dev/null +++ b/src/backends/mod.rs @@ -0,0 +1,9 @@ +mod compute; +mod copy; +mod recommended; +mod render; + +pub use compute::*; +pub use copy::*; +pub use recommended::*; +pub use render::*; diff --git a/src/backends/recommended.rs b/src/backends/recommended.rs new file mode 100644 index 0000000..39b0409 --- /dev/null +++ b/src/backends/recommended.rs @@ -0,0 +1,658 @@ +use super::compute::*; +use super::copy::*; +use super::render::*; +use crate::core::*; +use log::{debug, warn}; + +/// Generates mipmaps for textures with any usage using the compute, render, or copy backends. +#[derive(Debug)] +pub struct RecommendedMipmapGenerator { + render: RenderMipmapGenerator, + compute: ComputeMipmapGenerator, +} + +/// A list of supported texture formats. +const SUPPORTED_FORMATS: [wgpu::TextureFormat; 17] = { + use wgpu::TextureFormat; + [ + TextureFormat::R8Unorm, + TextureFormat::R8Snorm, + TextureFormat::R16Float, + TextureFormat::Rg8Unorm, + TextureFormat::Rg8Snorm, + TextureFormat::R32Float, + TextureFormat::Rg16Float, + TextureFormat::Rgba8Unorm, + TextureFormat::Rgba8Snorm, + TextureFormat::Bgra8Unorm, + TextureFormat::Bgra8UnormSrgb, + TextureFormat::Rgba8UnormSrgb, + TextureFormat::Rgb10a2Unorm, + TextureFormat::Rg11b10Float, + TextureFormat::Rg32Float, + TextureFormat::Rgba16Float, + TextureFormat::Rgba32Float, + ] +}; + +impl RecommendedMipmapGenerator { + /// Creates a new `RecommendedMipmapGenerator`. Once created, it can be used repeatedly to + /// generate mipmaps for any texture with a supported format. + pub fn new(device: &wgpu::Device) -> Self { + Self::new_with_format_hints(device, &SUPPORTED_FORMATS) + } + + /// Creates a new `RecommendedMipmapGenerator`. Once created, it can be used repeatedly to + /// generate mipmaps for any texture with format specified in `format_hints`. + pub fn new_with_format_hints( + device: &wgpu::Device, + format_hints: &[wgpu::TextureFormat], + ) -> Self { + for format in format_hints { + if !SUPPORTED_FORMATS.contains(&format) { + warn!("[RecommendedMipmapGenerator::new] No support for requested texture format {:?}", *format); + warn!("[RecommendedMipmapGenerator::new] Attempting to continue, but calls to generate may fail or produce unexpected results."); + continue; + } + } + let render = RenderMipmapGenerator::new_with_format_hints(device, format_hints); + let compute = ComputeMipmapGenerator::new_with_format_hints(device, format_hints); + Self { render, compute } + } +} + +impl MipmapGenerator for RecommendedMipmapGenerator { + fn generate( + &self, + device: &wgpu::Device, + encoder: &mut wgpu::CommandEncoder, + texture: &wgpu::Texture, + texture_descriptor: &wgpu::TextureDescriptor, + ) -> Result<(), Error> { + // compute backend + match self + .compute + .generate(device, encoder, texture, texture_descriptor) + { + Err(e) => { + debug!("[RecommendedMipmapGenerator::generate] compute error {}.\n falling back to render backend.", e); + } + ok => return ok, + }; + // render backend + match self + .render + .generate(device, encoder, texture, texture_descriptor) + { + Err(e) => { + debug!("[RecommendedMipmapGenerator::generate] render error {}.\n falling back to copy backend.", e); + } + ok => return ok, + }; + // copy backend + match CopyMipmapGenerator::new(&self.render).generate( + device, + encoder, + texture, + texture_descriptor, + ) { + Err(e) => { + debug!("[RecommendedMipmapGenerator::generate] copy error {}.", e); + } + ok => return ok, + } + Err(Error::UnsupportedUsage(texture_descriptor.usage)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::util::*; + + fn init() { + let _ = env_logger::builder().is_test(true).try_init(); + } + + #[allow(dead_code)] + async fn generate_and_copy_to_cpu_recommended( + buffer: &[u8], + texture_descriptor: &wgpu::TextureDescriptor<'_>, + ) -> Result, Error> { + let (_instance, _adaptor, device, queue) = wgpu_setup().await; + let generator = crate::backends::RecommendedMipmapGenerator::new_with_format_hints( + &device, + &[texture_descriptor.format], + ); + Ok( + generate_and_copy_to_cpu(&device, &queue, &generator, buffer, texture_descriptor) + .await?, + ) + } + #[test] + fn checkerboard_r8_render() { + init(); + // Generate texture data on the CPU + let size = 512; + let mip_level_count = 1 + (size as f32).log2() as u32; + let checkboard_size = 16; + let data = checkerboard_r8(size, size, checkboard_size); + // Create a texture + let format = wgpu::TextureFormat::R8Unorm; + let texture_extent = wgpu::Extent3d { + width: size, + height: size, + depth: 1, + }; + let texture_descriptor = wgpu::TextureDescriptor { + size: texture_extent, + mip_level_count, + format, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + usage: crate::RenderMipmapGenerator::required_usage() + | wgpu::TextureUsage::COPY_DST + | wgpu::TextureUsage::COPY_SRC, + label: None, + }; + dbg!(format); + futures::executor::block_on((|| async { + let mipmap_buffers = generate_and_copy_to_cpu_recommended(&data, &texture_descriptor) + .await + .unwrap(); + + assert!(mipmap_buffers.len() == mip_level_count as usize); + + for mip in &mipmap_buffers { + assert!( + mip.buffer.len() + == mip.dimensions.unpadded_bytes_per_row * mip.dimensions.height + ); + } + // The last mip map level should be 1x1 and the value is an average of 0 and 255 + mipmap_buffers.last().map(|mip| { + let width = mip.dimensions.width; + let height = mip.dimensions.height; + let bpp = mip.dimensions.bytes_per_channel; + let data = &mip.buffer; + dbg!(data); + assert!(width == 1); + assert!(height == 1); + assert!(data.len() == width * height * bpp); + // The final result is implementation dependent + // but we expect the pixel to be a perfect + // blend of white and black, i.e 255 / 2 = 127.5 + // Depending on the platform and underlying implementation, + // this might round up or down so check 127 and 128 + assert!(data[0] == 127 || data[0] == 128); + }); + })()); + } + + #[test] + fn checkerboard_rgba8_render() { + init(); + // Generate texture data on the CPU + let size = 512; + let mip_level_count = 1 + (size as f32).log2() as u32; + let checkboard_size = 16; + let data = checkerboard_rgba8(size, size, checkboard_size); + // Create a texture + let format = wgpu::TextureFormat::Rgba8Unorm; + let texture_extent = wgpu::Extent3d { + width: size, + height: size, + depth: 1, + }; + let texture_descriptor = wgpu::TextureDescriptor { + size: texture_extent, + mip_level_count, + format, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + usage: crate::RenderMipmapGenerator::required_usage() + | wgpu::TextureUsage::COPY_DST + | wgpu::TextureUsage::COPY_SRC, + label: None, + }; + futures::executor::block_on((|| async { + let mipmap_buffers = generate_and_copy_to_cpu_recommended(&data, &texture_descriptor) + .await + .unwrap(); + assert!(mipmap_buffers.len() == mip_level_count as usize); + for mip in &mipmap_buffers { + assert!( + mip.buffer.len() + == mip.dimensions.unpadded_bytes_per_row * mip.dimensions.height + ); + } + // The last mip map level should be 1x1 and each of the 4 componenets per pixel + // should be the average of 0 and 255, but in sRGB color space + mipmap_buffers.last().map(|mip| { + let width = mip.dimensions.width; + let height = mip.dimensions.height; + let bpp = mip.dimensions.bytes_per_channel; + let data = &mip.buffer; + assert!(width == 1); + assert!(height == 1); + assert!(data.len() == width * height * bpp); + assert!(data[0] == 127 || data[0] == 128); + assert!(data[1] == 127 || data[1] == 128); + assert!(data[2] == 127 || data[2] == 128); + assert!(data[3] == 255); + }); + })()); + } + + #[test] + fn checkerboard_srgba8_render() { + init(); + // Generate texture data on the CPU + let size = 512; + let mip_level_count = 1 + (size as f32).log2() as u32; + let checkboard_size = 16; + let data = checkerboard_rgba8(size, size, checkboard_size); + // Create a texture + let format = wgpu::TextureFormat::Rgba8UnormSrgb; + let texture_extent = wgpu::Extent3d { + width: size, + height: size, + depth: 1, + }; + let texture_descriptor = wgpu::TextureDescriptor { + size: texture_extent, + mip_level_count, + format, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + usage: crate::RenderMipmapGenerator::required_usage() + | wgpu::TextureUsage::COPY_DST + | wgpu::TextureUsage::COPY_SRC, + label: None, + }; + futures::executor::block_on((|| async { + let mipmap_buffers = generate_and_copy_to_cpu_recommended(&data, &texture_descriptor) + .await + .unwrap(); + assert!(mipmap_buffers.len() == mip_level_count as usize); + for mip in &mipmap_buffers { + assert!( + mip.buffer.len() + == mip.dimensions.unpadded_bytes_per_row * mip.dimensions.height + ); + } + // The last mip map level should be 1x1 and each of the 4 componenets per pixel + // should be the average of 0 and 255, but in sRGB color space + mipmap_buffers.last().map(|mip| { + let width = mip.dimensions.width; + let height = mip.dimensions.height; + let bpp = mip.dimensions.bytes_per_channel; + let data = &mip.buffer; + assert!(width == 1); + assert!(height == 1); + assert!(data.len() == width * height * bpp); + // The final result is implementation dependent + // See https://entropymine.com/imageworsener/srgbformula/ + // for how to convert between linear and srgb + // Where does 187 and 188 come from? Solve for x in: + // ((((x / 255 + 0.055) / 1.055)^2.4) * 255) == (255 / 2) + // -> x = 187.516155 + assert!(data[0] == 187 || data[0] == 188); + assert!(data[1] == 187 || data[1] == 188); + assert!(data[2] == 187 || data[2] == 188); + assert!(data[3] == 255); + }); + })()); + } + + #[test] + fn checkerboard_r8_compute() { + init(); + // Generate texture data on the CPU + let size = 512; + let mip_level_count = 1 + (size as f32).log2() as u32; + let checkboard_size = 16; + let data = checkerboard_r8(size, size, checkboard_size); + // Create a texture + let format = wgpu::TextureFormat::R8Unorm; + let texture_extent = wgpu::Extent3d { + width: size, + height: size, + depth: 1, + }; + let texture_descriptor = wgpu::TextureDescriptor { + size: texture_extent, + mip_level_count, + format, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + usage: crate::ComputeMipmapGenerator::required_usage() + | wgpu::TextureUsage::COPY_DST + | wgpu::TextureUsage::COPY_SRC, + label: None, + }; + futures::executor::block_on((|| async { + let mipmap_buffers = generate_and_copy_to_cpu_recommended(&data, &texture_descriptor) + .await + .unwrap(); + + assert!(mipmap_buffers.len() == mip_level_count as usize); + + for mip in &mipmap_buffers { + assert!( + mip.buffer.len() + == mip.dimensions.unpadded_bytes_per_row * mip.dimensions.height + ); + } + // The last mip map level should be 1x1 and the value is an average of 0 and 255 + mipmap_buffers.last().map(|mip| { + let width = mip.dimensions.width; + let height = mip.dimensions.height; + let bpp = mip.dimensions.bytes_per_channel; + let data = &mip.buffer; + assert!(width == 1); + assert!(height == 1); + assert!(data.len() == width * height * bpp); + // The final result is implementation dependent + // but we expect the pixel to be a perfect + // blend of white and black, i.e 255 / 2 = 127.5 + // Depending on the platform and underlying implementation, + // this might round up or down so check 127 and 128 + assert!(data[0] == 127 || data[0] == 128); + }); + })()); + } + + #[test] + fn checkerboard_rgba8_compute() { + init(); + // Generate texture data on the CPU + let size = 512; + let mip_level_count = 1 + (size as f32).log2() as u32; + let checkboard_size = 16; + let data = checkerboard_rgba8(size, size, checkboard_size); + // Create a texture + let format = wgpu::TextureFormat::Rgba8Unorm; + let texture_extent = wgpu::Extent3d { + width: size, + height: size, + depth: 1, + }; + let texture_descriptor = wgpu::TextureDescriptor { + size: texture_extent, + mip_level_count, + format, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + usage: crate::ComputeMipmapGenerator::required_usage() + | wgpu::TextureUsage::COPY_DST + | wgpu::TextureUsage::COPY_SRC, + label: None, + }; + futures::executor::block_on((|| async { + let mipmap_buffers = generate_and_copy_to_cpu_recommended(&data, &texture_descriptor) + .await + .unwrap(); + assert!(mipmap_buffers.len() == mip_level_count as usize); + for mip in &mipmap_buffers { + assert!( + mip.buffer.len() + == mip.dimensions.unpadded_bytes_per_row * mip.dimensions.height + ); + } + // The last mip map level should be 1x1 and each of the 4 componenets per pixel + // should be the average of 0 and 255 + mipmap_buffers.last().map(|mip| { + let width = mip.dimensions.width; + let height = mip.dimensions.height; + let bpp = mip.dimensions.bytes_per_channel; + let data = &mip.buffer; + assert!(width == 1); + assert!(height == 1); + assert!(data.len() == width * height * bpp); + assert!(data[0] == 127 || data[0] == 128); + assert!(data[1] == 127 || data[1] == 128); + assert!(data[2] == 127 || data[2] == 128); + assert!(data[3] == 255); + }); + })()); + } + + #[test] + fn checkerboard_srgba8_compute() { + init(); + // Generate texture data on the CPU + let size = 512; + let mip_level_count = 1 + (size as f32).log2() as u32; + let checkboard_size = 16; + let data = checkerboard_rgba8(size, size, checkboard_size); + // Create a texture + let format = wgpu::TextureFormat::Rgba8UnormSrgb; + let texture_extent = wgpu::Extent3d { + width: size, + height: size, + depth: 1, + }; + let texture_descriptor = wgpu::TextureDescriptor { + size: texture_extent, + mip_level_count, + format, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + usage: crate::ComputeMipmapGenerator::required_usage() + | wgpu::TextureUsage::COPY_DST + | wgpu::TextureUsage::COPY_SRC, + label: None, + }; + futures::executor::block_on((|| async { + let mipmap_buffers = generate_and_copy_to_cpu_recommended(&data, &texture_descriptor) + .await + .unwrap(); + assert!(mipmap_buffers.len() == mip_level_count as usize); + for mip in &mipmap_buffers { + assert!( + mip.buffer.len() + == mip.dimensions.unpadded_bytes_per_row * mip.dimensions.height + ); + } + // The last mip map level should be 1x1 and each of the 4 componenets per pixel + // should be the average of 0 and 255, but in sRGB color space + mipmap_buffers.last().map(|mip| { + let width = mip.dimensions.width; + let height = mip.dimensions.height; + let bpp = mip.dimensions.bytes_per_channel; + let data = &mip.buffer; + assert!(width == 1); + assert!(height == 1); + assert!(data.len() == width * height * bpp); + // The final result is implementation dependent + // See https://entropymine.com/imageworsener/srgbformula/ + // for how to convert between linear and srgb + // Where does 187 and 188 come from? Solve for x in: + // ((((x / 255 + 0.055) / 1.055)^2.4) * 255) == (255 / 2) + // -> x = 187.516155 + dbg!(data); + assert!(data[0] == 187 || data[0] == 188); + assert!(data[1] == 187 || data[1] == 188); + assert!(data[2] == 187 || data[2] == 188); + assert!(data[3] == 255); + }); + })()); + } + + #[test] + fn checkerboard_rgba32f_render() { + init(); + // Generate texture data on the CPU + let size = 512; + let mip_level_count = 1 + (size as f32).log2() as u32; + let checkboard_size = 16; + let data = checkerboard_rgba32f(size, size, checkboard_size); + // Create a texture + let format = wgpu::TextureFormat::Rgba32Float; + let texture_extent = wgpu::Extent3d { + width: size, + height: size, + depth: 1, + }; + let texture_descriptor = wgpu::TextureDescriptor { + size: texture_extent, + mip_level_count, + format, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + usage: crate::RenderMipmapGenerator::required_usage() + | wgpu::TextureUsage::COPY_DST + | wgpu::TextureUsage::COPY_SRC, + label: None, + }; + futures::executor::block_on((|| async { + let mipmap_buffers = generate_and_copy_to_cpu_recommended( + bytemuck::cast_slice(&data), + &texture_descriptor, + ) + .await + .unwrap(); + assert!(mipmap_buffers.len() == mip_level_count as usize); + for mip in &mipmap_buffers { + assert!( + mip.buffer.len() + == mip.dimensions.unpadded_bytes_per_row * mip.dimensions.height + ); + } + // The last mip map level should be 1x1 and each of the 4 componenets per pixel + // should be the average of 0.0 and 1.0 + mipmap_buffers.last().map(|mip| { + let width = mip.dimensions.width; + let height = mip.dimensions.height; + let bpp = mip.dimensions.bytes_per_channel; + let data = &mip.buffer; + assert!(width == 1); + assert!(height == 1); + assert!(data.len() == width * height * bpp); + let data: &[f32] = bytemuck::try_cast_slice(data).unwrap(); + dbg!(data); + assert!(data[0] == 0.5); + assert!(data[1] == 0.5); + assert!(data[2] == 0.5); + assert!(data[3] == 1.0); + }); + })()); + } + + #[test] + fn checkerboard_rgba32f_compute() { + init(); + // Generate texture data on the CPU + let size = 512; + let mip_level_count = 1 + (size as f32).log2() as u32; + let checkboard_size = 16; + let data = checkerboard_rgba32f(size, size, checkboard_size); + // Create a texture + let format = wgpu::TextureFormat::Rgba32Float; + let texture_extent = wgpu::Extent3d { + width: size, + height: size, + depth: 1, + }; + let texture_descriptor = wgpu::TextureDescriptor { + size: texture_extent, + mip_level_count, + format, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + usage: crate::ComputeMipmapGenerator::required_usage() + | wgpu::TextureUsage::COPY_DST + | wgpu::TextureUsage::COPY_SRC, + label: None, + }; + futures::executor::block_on((|| async { + let mipmap_buffers = generate_and_copy_to_cpu_recommended( + bytemuck::cast_slice(&data), + &texture_descriptor, + ) + .await + .unwrap(); + assert!(mipmap_buffers.len() == mip_level_count as usize); + for mip in &mipmap_buffers { + assert!( + mip.buffer.len() + == mip.dimensions.unpadded_bytes_per_row * mip.dimensions.height + ); + } + // The last mip map level should be 1x1 and each of the 4 componenets per pixel + // should be the average of 0.0 and 1.0 + mipmap_buffers.last().map(|mip| { + let width = mip.dimensions.width; + let height = mip.dimensions.height; + let bpp = mip.dimensions.bytes_per_channel; + let data = &mip.buffer; + assert!(width == 1); + assert!(height == 1); + assert!(data.len() == width * height * bpp); + let data: &[f32] = bytemuck::try_cast_slice(data).unwrap(); + dbg!(data); + assert!(data[0] == 0.5); + assert!(data[1] == 0.5); + assert!(data[2] == 0.5); + assert!(data[3] == 1.0); + }); + })()); + } + + #[test] + fn checkerboard_rgba8_copy() { + init(); + // Generate texture data on the CPU + let size = 512; + let mip_level_count = 1 + (size as f32).log2() as u32; + let checkboard_size = 16; + let data = checkerboard_rgba8(size, size, checkboard_size); + // Create a texture + let format = wgpu::TextureFormat::Rgba8Unorm; + let texture_extent = wgpu::Extent3d { + width: size, + height: size, + depth: 1, + }; + let texture_descriptor = wgpu::TextureDescriptor { + size: texture_extent, + mip_level_count, + format, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + usage: crate::CopyMipmapGenerator::required_usage() + | wgpu::TextureUsage::COPY_SRC + | wgpu::TextureUsage::COPY_DST, + label: None, + }; + futures::executor::block_on((|| async { + let mipmap_buffers = generate_and_copy_to_cpu_recommended(&data, &texture_descriptor) + .await + .unwrap(); + assert!(mipmap_buffers.len() == mip_level_count as usize); + for mip in &mipmap_buffers { + assert!( + mip.buffer.len() + == mip.dimensions.unpadded_bytes_per_row * mip.dimensions.height + ); + } + // The last mip map level should be 1x1 and each of the 4 componenets per pixel + // should be the average of 0 and 255 + mipmap_buffers.last().map(|mip| { + let width = mip.dimensions.width; + let height = mip.dimensions.height; + let bpp = mip.dimensions.bytes_per_channel; + let data = &mip.buffer; + dbg!(data); + assert!(width == 1); + assert!(height == 1); + assert!(data.len() == width * height * bpp); + assert!(data[0] == 127 || data[0] == 128); + assert!(data[1] == 127 || data[1] == 128); + assert!(data[2] == 127 || data[2] == 128); + assert!(data[3] == 255); + }); + })()); + } +} diff --git a/src/backends/render.rs b/src/backends/render.rs new file mode 100644 index 0000000..7826461 --- /dev/null +++ b/src/backends/render.rs @@ -0,0 +1,399 @@ +use crate::core::*; +use crate::util::get_mip_extent; +use log::warn; +use std::collections::HashMap; + +/// Generates mipmaps for textures with output attachment usage. +#[derive(Debug)] +pub struct RenderMipmapGenerator { + sampler: wgpu::Sampler, + layout_cache: HashMap, + pipeline_cache: HashMap, +} + +impl RenderMipmapGenerator { + /// Returns the texture usage `RenderMipmapGenerator` requires for mipmap generation. + pub fn required_usage() -> wgpu::TextureUsage { + wgpu::TextureUsage::OUTPUT_ATTACHMENT | wgpu::TextureUsage::SAMPLED + } + + /// Creates a new `RenderMipmapGenerator`. Once created, it can be used repeatedly to + /// generate mipmaps for any texture with format specified in `format_hints`. + pub fn new_with_format_hints( + device: &wgpu::Device, + format_hints: &[wgpu::TextureFormat], + ) -> Self { + // A sampler for box filter with clamp to edge behavior + // In practice, the final result may be implementation dependent + // - [Vulkan](https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#textures-texel-linear-filtering) + // - [Metal](https://developer.apple.com/documentation/metal/mtlsamplerminmagfilter/linear) + // - [DX12](https://docs.microsoft.com/en-us/windows/win32/api/d3d12/ne-d3d12-d3d12_filter) + let sampler = device.create_sampler(&wgpu::SamplerDescriptor { + label: Some(&"wgpu-mipmap-sampler"), + address_mode_u: wgpu::AddressMode::ClampToEdge, + address_mode_v: wgpu::AddressMode::ClampToEdge, + address_mode_w: wgpu::AddressMode::ClampToEdge, + mag_filter: wgpu::FilterMode::Linear, + min_filter: wgpu::FilterMode::Nearest, + mipmap_filter: wgpu::FilterMode::Nearest, + ..Default::default() + }); + + let render_layout_cache = { + let mut layout_cache = HashMap::new(); + // For now, we only cache a bind group layout for floating-point textures + for component_type in &[wgpu::TextureComponentType::Float] { + let bind_group_layout = + device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + label: Some(&format!("wgpu-mipmap-bg-layout-{:?}", component_type)), + entries: &[ + wgpu::BindGroupLayoutEntry { + binding: 0, + visibility: wgpu::ShaderStage::FRAGMENT, + ty: wgpu::BindingType::SampledTexture { + dimension: wgpu::TextureViewDimension::D2, + component_type: *component_type, + multisampled: false, + }, + count: None, + }, + wgpu::BindGroupLayoutEntry { + binding: 1, + visibility: wgpu::ShaderStage::FRAGMENT, + ty: wgpu::BindingType::Sampler { comparison: false }, + count: None, + }, + ], + }); + layout_cache.insert(*component_type, bind_group_layout); + } + layout_cache + }; + + let render_pipeline_cache = { + let mut pipeline_cache = HashMap::new(); + let vertex_module = device.create_shader_module(wgpu::util::make_spirv( + include_bytes!("shaders/triangle.vert.spv"), + )); + let box_filter = device.create_shader_module(wgpu::util::make_spirv(include_bytes!( + "shaders/box.frag.spv" + ))); + for format in format_hints { + let fragment_module = &box_filter; + + let component_type = wgpu::TextureComponentType::from(*format); + if let Some(bind_group_layout) = render_layout_cache.get(&component_type) { + let layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { + label: None, + bind_group_layouts: &[bind_group_layout], + push_constant_ranges: &[], + }); + let pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { + label: Some(&format!("wgpu-mipmap-render-pipeline-{:?}", format)), + layout: Some(&layout), + vertex_stage: wgpu::ProgrammableStageDescriptor { + module: &vertex_module, + entry_point: "main", + }, + fragment_stage: Some(wgpu::ProgrammableStageDescriptor { + module: &fragment_module, + entry_point: "main", + }), + rasterization_state: Some(wgpu::RasterizationStateDescriptor { + front_face: wgpu::FrontFace::Ccw, + cull_mode: wgpu::CullMode::Back, + ..Default::default() + }), + primitive_topology: wgpu::PrimitiveTopology::TriangleList, + color_states: &[(*format).into()], + depth_stencil_state: None, + vertex_state: wgpu::VertexStateDescriptor { + index_format: wgpu::IndexFormat::Uint16, + vertex_buffers: &[], + }, + sample_count: 1, + sample_mask: !0, + alpha_to_coverage_enabled: false, + }); + pipeline_cache.insert(*format, pipeline); + } else { + warn!( + "RenderMipmapGenerator does not support requested format {:?}", + format + ); + continue; + } + } + pipeline_cache + }; + + Self { + sampler, + layout_cache: render_layout_cache, + pipeline_cache: render_pipeline_cache, + } + } + + /// Generate mipmaps from level 0 of `src_texture` to + /// levels `dst_mip_offset..dst_texture_descriptor.mip_level_count` + // of `dst_texture`. + #[allow(clippy::too_many_arguments)] + pub(crate) fn generate_src_dst( + &self, + device: &wgpu::Device, + encoder: &mut wgpu::CommandEncoder, + src_texture: &wgpu::Texture, + dst_texture: &wgpu::Texture, + src_texture_descriptor: &wgpu::TextureDescriptor, + dst_texture_descriptor: &wgpu::TextureDescriptor, + dst_mip_offset: u32, + ) -> Result<(), Error> { + let src_format = src_texture_descriptor.format; + let src_mip_count = src_texture_descriptor.mip_level_count; + let src_ext = src_texture_descriptor.size; + let src_dim = src_texture_descriptor.dimension; + let src_usage = src_texture_descriptor.usage; + let src_next_mip_ext = get_mip_extent(&src_ext, 1); + + let dst_format = dst_texture_descriptor.format; + let dst_mip_count = dst_texture_descriptor.mip_level_count; + let dst_ext = dst_texture_descriptor.size; + let dst_dim = dst_texture_descriptor.dimension; + let dst_usage = dst_texture_descriptor.usage; + // invariants that we expect callers to uphold + if src_format != dst_format { + dbg!(src_texture_descriptor); + dbg!(dst_texture_descriptor); + panic!("src and dst texture formats must be equal"); + } + if src_dim != dst_dim { + dbg!(src_texture_descriptor); + dbg!(dst_texture_descriptor); + panic!("src and dst texture dimensions must be eqaul"); + } + if !((src_mip_count == dst_mip_count && src_ext == dst_ext) + || (src_next_mip_ext == dst_ext)) + { + dbg!(src_texture_descriptor); + dbg!(dst_texture_descriptor); + panic!("src and dst texture extents must match or dst must be half the size of src"); + } + + if src_dim != wgpu::TextureDimension::D2 { + return Err(Error::UnsupportedDimension(src_dim)); + } + // src texture must be sampled + if !src_usage.contains(wgpu::TextureUsage::SAMPLED) { + return Err(Error::UnsupportedUsage(src_usage)); + } + // dst texture must be sampled and output attachment + if !dst_usage.contains(Self::required_usage()) { + return Err(Error::UnsupportedUsage(dst_usage)); + } + let format = src_format; + let pipeline = self + .pipeline_cache + .get(&format) + .ok_or(Error::UnknownFormat(format))?; + let component_type = wgpu::TextureComponentType::from(format); + let layout = self + .layout_cache + .get(&component_type) + .ok_or(Error::UnknownFormat(format))?; + let views = (0..src_mip_count) + .map(|mip_level| { + // The first view is mip level 0 of the src texture + // Subsequent views are for the dst_texture + let (texture, base_mip_level) = if mip_level == 0 { + (src_texture, 0) + } else { + (dst_texture, mip_level - dst_mip_offset) + }; + texture.create_view(&wgpu::TextureViewDescriptor { + label: None, + format: None, + dimension: None, + aspect: wgpu::TextureAspect::All, + base_mip_level, + level_count: std::num::NonZeroU32::new(1), + array_layer_count: None, + base_array_layer: 0, + }) + }) + .collect::>(); + for mip in 1..src_mip_count as usize { + let src_view = &views[mip - 1]; + let dst_view = &views[mip]; + let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { + label: None, + layout, + entries: &[ + wgpu::BindGroupEntry { + binding: 0, + resource: wgpu::BindingResource::TextureView(&src_view), + }, + wgpu::BindGroupEntry { + binding: 1, + resource: wgpu::BindingResource::Sampler(&self.sampler), + }, + ], + }); + let mut pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { + color_attachments: &[wgpu::RenderPassColorAttachmentDescriptor { + attachment: &dst_view, + resolve_target: None, + ops: wgpu::Operations { + load: wgpu::LoadOp::Load, + store: true, + }, + }], + depth_stencil_attachment: None, + }); + pass.set_pipeline(pipeline); + pass.set_bind_group(0, &bind_group, &[]); + pass.draw(0..3, 0..1); + } + Ok(()) + } +} + +impl MipmapGenerator for RenderMipmapGenerator { + fn generate( + &self, + device: &wgpu::Device, + encoder: &mut wgpu::CommandEncoder, + texture: &wgpu::Texture, + texture_descriptor: &wgpu::TextureDescriptor, + ) -> Result<(), Error> { + self.generate_src_dst( + device, + encoder, + &texture, + &texture, + &texture_descriptor, + &texture_descriptor, + 0, + ) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::util::*; + + fn init() { + let _ = env_logger::builder().is_test(true).try_init(); + } + + #[allow(dead_code)] + async fn generate_and_copy_to_cpu_render( + buffer: &[u8], + texture_descriptor: &wgpu::TextureDescriptor<'_>, + ) -> Result, Error> { + let (_instance, _adaptor, device, queue) = wgpu_setup().await; + let generator = crate::backends::RenderMipmapGenerator::new_with_format_hints( + &device, + &[texture_descriptor.format], + ); + Ok( + generate_and_copy_to_cpu(&device, &queue, &generator, buffer, texture_descriptor) + .await?, + ) + } + + async fn generate_test(texture_descriptor: &wgpu::TextureDescriptor<'_>) -> Result<(), Error> { + let (_instance, _adapter, device, _queue) = wgpu_setup().await; + let generator = + RenderMipmapGenerator::new_with_format_hints(&device, &[texture_descriptor.format]); + let texture = device.create_texture(&texture_descriptor); + let mut encoder = device.create_command_encoder(&Default::default()); + generator.generate(&device, &mut encoder, &texture, &texture_descriptor) + } + + #[test] + fn sanity_check() { + init(); + // Generate texture data on the CPU + let size = 512; + let mip_level_count = 1 + (size as f32).log2() as u32; + // Create a texture + let format = wgpu::TextureFormat::R8Unorm; + let texture_extent = wgpu::Extent3d { + width: size, + height: size, + depth: 1, + }; + let texture_descriptor = wgpu::TextureDescriptor { + size: texture_extent, + mip_level_count, + format, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + usage: RenderMipmapGenerator::required_usage(), + label: None, + }; + futures::executor::block_on((|| async { + let res = generate_test(&texture_descriptor).await; + assert!(res.is_ok()); + })()); + } + + #[test] + fn unsupported_usage() { + init(); + // Generate texture data on the CPU + let size = 512; + let mip_level_count = 1 + (size as f32).log2() as u32; + // Create a texture + let format = wgpu::TextureFormat::R8Unorm; + let texture_extent = wgpu::Extent3d { + width: size, + height: size, + depth: 1, + }; + let texture_descriptor = wgpu::TextureDescriptor { + size: texture_extent, + mip_level_count, + format, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + usage: wgpu::TextureUsage::empty(), + label: None, + }; + futures::executor::block_on((|| async { + let res = generate_test(&texture_descriptor).await; + assert!(res.is_err()); + assert!(res.err() == Some(Error::UnsupportedUsage(wgpu::TextureUsage::empty()))); + })()); + } + + #[test] + fn unknown_format() { + init(); + // Generate texture data on the CPU + let size = 512; + let mip_level_count = 1 + (size as f32).log2() as u32; + // Create a texture + let format = wgpu::TextureFormat::Rgba8Sint; + let texture_extent = wgpu::Extent3d { + width: size, + height: size, + depth: 1, + }; + let texture_descriptor = wgpu::TextureDescriptor { + size: texture_extent, + mip_level_count, + format, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + usage: wgpu::TextureUsage::SAMPLED | wgpu::TextureUsage::OUTPUT_ATTACHMENT, + label: None, + }; + futures::executor::block_on((|| async { + let res = generate_test(&texture_descriptor).await; + assert!(res.is_err()); + assert!(res.err() == Some(Error::UnknownFormat(wgpu::TextureFormat::Rgba8Sint))); + })()); + } +} diff --git a/src/backends/shaders/README.md b/src/backends/shaders/README.md new file mode 100644 index 0000000..6f91b37 --- /dev/null +++ b/src/backends/shaders/README.md @@ -0,0 +1,16 @@ +# Shaders + +## Dependencies + +In order to compile GLSL to SPIRV, the following binaries must be on your `$PATH`: + +- `glslc` from [Google/shaderc](https://github.com/google/shaderc) +- `spirv-opt` from [KhronosGroup/SPIRV-Tools][https://github.com/khronosgroup/spirv-tools] + +Then, you can run: + +```console +$ ./compile.sh +``` + +This script handles generating all the compute shader combinations required by the code. diff --git a/src/backends/shaders/box.comp b/src/backends/shaders/box.comp new file mode 100644 index 0000000..7ac706c --- /dev/null +++ b/src/backends/shaders/box.comp @@ -0,0 +1,26 @@ +// This is a template file! +// It is expectd that you wiill generate a real file from it using envsubst: +// +// FORMAT=rgba8 envsubst box.comp + +#version 450 +// The size values must match the values specified in +// backends/compute.rs +layout(local_size_x = 32, local_size_y = 32) in; + +layout(set = 0, binding = 0, ${FORMAT}) uniform readonly image2D u_src; +layout(set = 0, binding = 1, ${FORMAT}) uniform writeonly image2D u_dst; + +// Clamp to edge +#define L(u) imageLoad(u_src, clamp(u, ivec2(0), ivec2(imageSize(u_src) - 1))) + +void main() { + ivec2 dst_uv = ivec2(gl_GlobalInvocationID.xy); + ivec2 src_uv = 2 * dst_uv; + vec4 l = L(src_uv + ivec2(0, 0)); + vec4 r = L(src_uv + ivec2(1, 0)); + vec4 u = L(src_uv + ivec2(0, 1)); + vec4 d = L(src_uv + ivec2(1, 1)); + vec4 c = (l + r + u + d) / 4.0; + imageStore(u_dst, dst_uv, c); +} diff --git a/src/backends/shaders/box.frag b/src/backends/shaders/box.frag new file mode 100644 index 0000000..12a68fe --- /dev/null +++ b/src/backends/shaders/box.frag @@ -0,0 +1,11 @@ +#version 450 +// Expected that the sampler has mag_filter set to linear +layout(set = 0, binding = 0) uniform texture2D u_texture; +layout(set = 0, binding = 1) uniform sampler u_sampler; + +layout(location = 0) out vec4 out_color; +layout(location = 0) in vec2 v_uv; + +void main() { + out_color = textureLod(sampler2D(u_texture, u_sampler), v_uv, 0.0); +} diff --git a/src/backends/shaders/box.frag.spv b/src/backends/shaders/box.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..6ff6ed4645c64a97bb2835ab2d0c0d63e2e34b63 GIT binary patch literal 784 zcmYk3%}WAN6vc0Trfh_HY7=yRPo;Tq zy>rex@1A?F+01p(?7&J^wXSVX!!lybDpqjW8@>$(>v%f2yT3(oY*{BnQ?sJwl!@6m zoO5xgXesK_!OK8jSyeUr)}x%2%^UjOXygrF{mF9auj8*M@S|`Z_|tF|OyY18pevRdVWkNYW1&GbE(d-lY8cCxS6)Hc{h-)+X+cT3*|aXm#_diDlp#-4sl z%4{C~X@}_%uA^?t%INV+pFO5VWp{y=8erz)bk)VNGP;^$_^-D*F!OLOO-=-=QSGjf>aM@(M%Su7q^1wDf4r=g&icd6*3sXzmd e2H&;<&kt>jeRUM*;PJ!%MQ-emyI*zpsQ3e4<2nNX literal 0 HcmV?d00001 diff --git a/src/backends/shaders/box_r11f_g11f_b10f.comp.spv b/src/backends/shaders/box_r11f_g11f_b10f.comp.spv new file mode 100644 index 0000000000000000000000000000000000000000..58ccd8c6db372d2e7153416647ae46d5c6492bf7 GIT binary patch literal 1452 zcmZ9M+iMe15XPsu8GA3q*5ZYY7kp?eDk@&Ez9?%Uk_XWT5tn2W+r{msG~0sULlynU z{HuHs{C=nBz>-rwX68F{zRAp_sn>2^Fq^ZsE!m-+pEawAF~i>X_JQnzwHzP!-t~5- zMsJig7Z^j>l=4osP+CSMstV%}++vgr+j8^_#9cv;91Y^T}|K?-i$$bWmoK zV(*n|lYdS2B$*zkJ|4PwG%aOg-P6N@aMj1;-w-(56L(xhTzBzhe}`5zmzZ4oCzp83 z`3*aer4I4BCR3B`xG9>O2#N4tYW6rF?YQY0!z~2OaKbb>4_WhrFQkRz5n_zTPVi zI^56dd=Q5Yc|UxwALY|8pEYow-#`l76bNFGEVL|l?hY!|ni(rgQY4^{LZ z^RMzn@cW&f14~Z$I5XeOezP-^q+Yvy$!x}EZPAYG;;dRtj2ZVsfA8p?x0d7M?z`^x zq#SPVK6=0tOIGJ{v1R2nWjBPQepbLQ3M=B_R)xre8g+eYy8p;&*qp`PB<}U%?&~By zK29d(w|tc3Susk6*~us^v$GL-vz5H8Nb}QSHKD1DYW=3`&g>vh;(R>l=ljLkIPI6& zxY&QC+T`EReVR;8QtuC(Kb(}hW5wxVUbyak@^1+o;`nXn;n$si)yL4P=Hin}|K#Ft zI=f+qx~YS|rpeTFx80P?*;iDnB`y+penY+%=s0qT&*_c?4srD0*is~aK{wCBKleWU z1-&KNoO(O}lK@ypLA(poIqYnIVT<>f=_~C@MVOHD%_s;;X__mHa-aT2eLV6)B6`8s`v-8FKV^i+}IO2fLPGZ zWYZ@=i`je?%+B{Z>V$da0$df3)h9DzjvRLNS4>m)3$g5KSzu2+>9C^}&%twezwgRr zUi{98|MK%&m(9DuqsQ!T3e5e`KXb=(Km9ZJl+@p+jEKc_|wmb{ceI*+GZ+w9XrG=#Uq5-pWR&+Shye zL5KLX&IfVmkoUv)`cXFh@~(mVBpaT(f%_~Q9*y7r*}iP}TnPK%zlZN(s(oOyEAsy7 I&7KJV0agcJvH$=8 literal 0 HcmV?d00001 diff --git a/src/backends/shaders/box_r16f.comp.spv b/src/backends/shaders/box_r16f.comp.spv new file mode 100644 index 0000000000000000000000000000000000000000..87ea3bd3fb997d344880d112d005e78d6a0f242d GIT binary patch literal 1452 zcmZ9M+iMe15XPsu+53fJYw^Oy3qCX!6%{X7UzD}5k_XX;A}+}$wu{@OG~0sULlynU z{HuHs{C=nBz>*U_&dfKn-|WmJsn>2@GMlkkTe2g&IBQlDW5)f!-w$;!Sj+Ko@;=#_ zl!Ki|kMHxuvemg>F4ijSdH&BZ5|{>jDP za(2TGbyEj_U6ZNlZo4U&voEVwOI#%I{HA;@&~fAvpVu7;9OCG~v871v^&C8h_xr9~ z=Ed)f_%A=d4cWXKJbKLjhQQnp{WG^c_tQUfS3Vr`TGVd{-EDz7_XITC0(pHsLvI}c zUGmPo4*wzKvY(*yOm@&AKCSay96IC$omaBaVW&YSmK}76PwTuDhYoo`=bdbHs(pQs zA9RRM>wFZ44tYO(ulus;mv;@^C)x1S4cuqh@M!$@&-P@)7ed$v|2=#UGwlPLU6J=s IZ}wF94>gBhr~m)} literal 0 HcmV?d00001 diff --git a/src/backends/shaders/box_r32f.comp.spv b/src/backends/shaders/box_r32f.comp.spv new file mode 100644 index 0000000000000000000000000000000000000000..1feee16a4e9d0ddc1f44f0a00e83e59f7a838c03 GIT binary patch literal 1444 zcmZ9MTWb?h6ot3Bwf0_$t;GuyFZj?{R8+iReNo23NFGEViZ~>bv>lu#rI{84AFAjd z^H=#IxW3bKV8{uJv-dh{)}Fmjl6vj-jM*idwM9F!i?wPsF=p(Kw9i}1<#F;M*`Abx z?Z;0Zpj@&#n>$;Urm46g9QE=M{GzZT9&S~LJn*jTQ`7!ONyFwWPSUvBjgz-&c6^*p z%5TLmE%MPY9pop&tjy1b=w>Ure3TWZgQ}n@MYVp@b!B!?q;WCs_ln)o**NQ!`FOPZ zMzzu3(0-auPBNeOT|StU+GCy5!@O|a=jd+E+enI{Hj00tEweOOaExeH(lJY zL+#WdU(;l2+S_hQ=He@=)e;v8Jinn_7w0&%oX=^G1QzG`!EsBG@&)ZY3;)vR^cVb= z6r;y)OXt*E^ZB}5HWWt!-tP@Q3b*5P_@GM^lY>ydub725z3&TAB|lJnQLE+V#yz0{oCWV(F|z`A zF`KV~+4)XKoiMLLfUDxE`ea7Tk;Sb3ifL+pC6>Ed7PzObe7K_(&%v{JzwgpAFMem7 z|MK%&SIoP?3euB?)#leU3X`dJ3@Ie=RUMt3jI}JXu;^4#iw9h+n_@E0u?-k=y?dzlR;KTW} z&nI#Cp!?x_-BV1zyldb-D~6|T;Jzq^$K$tuwx<}r5W;=%-^2GX(|r(gSLpuf&7KMW E0iroyUH||9 literal 0 HcmV?d00001 diff --git a/src/backends/shaders/box_r8.comp.spv b/src/backends/shaders/box_r8.comp.spv new file mode 100644 index 0000000000000000000000000000000000000000..3e9f5815a37d6b77f80964e0cf03676b4a7ba65e GIT binary patch literal 1452 zcmZ9M+iMe15XPsuS$i+V*5ZYY7kp?eTB>-#`l76bNFGEVL|l?hY!|ni(rgQY4^{LZ z^RMzn@cW&f14~Z$I5XeOezP-^q+Yvy$!x}EZPAYG;;dRtj2ZVsfA8p?x0d7M?z`^x zq#SPVK6=0tOIGJ{v1R2nWjBPQepbLQ3M=B_R)xre8g+eYy8p;&*qp`PB<}U%?&~By zK29d(w|tc3Susk6*~us^v$GL-vz5H8Nb}QSHKD1DYW=3`&g>vh;(R>l=ljLkIPI6& zxY&QC+T`EReVR;8QtuC(Kb(}hW5wxVUbyak@^1+o;`nXn;n$si)yL4P=Hin}|K#Ft zI=f+qx~YS|rpeTFx80P?*;iDnB`y+penY+%=s0qT&*_c?4srD0*is~aK{wCBKleWU z1-&KNoO(O}lK@ypLA(ptUSepBZwg1BeCf zOg6IuXfd0wg4y|AN1ZUQT!5?MvHE02%#p*c{)%bpej%1!F+cXylMXvt@fHLvI}c zUGmPo4*wzKvY(*yRCdrIKCSai96IC$otLuFVW&YSmK}76PwTu9hYoo`=dEmXs(rne zA9RRM>wFN04tYO(uODU8FYg+-PqN{u8@SK1;nDc*pY6+r&xNoL{(JZyrrHNKyCUzO I-t39+A4vyat^fc4 literal 0 HcmV?d00001 diff --git a/src/backends/shaders/box_r8_snorm.comp.spv b/src/backends/shaders/box_r8_snorm.comp.spv new file mode 100644 index 0000000000000000000000000000000000000000..87a8f3575771d53873079dc47debae870983de94 GIT binary patch literal 1452 zcmZ9M+iMe15XPsuS$i+l*5ZYY7kp?eDk@&Ez9?%Uk_WL5A}+}$wu{?MX|@HyhbsDy z`B(WO`29}Lfh8w=oSAQCzuB2dQm@^*U^Zj3wrGcTepam}#*F)czaQ$Jx0d7M?)&cc zq#SNPdVHTJmaNX@V#~^D%5DgU{j7jr6jsE;tqPF`HR}4*bpMglusMsnN!;tj-8V^k zbd*fWZ}}+6vtpDCv*S@(W~U?aW-EDFk>)4EYC=;P)%s1>o!Ne##QAv8&v%Q{aoR7l zak2YawaLG(`y`nhr`{hpe>f?1$BNU#yl~C?>F4ijSdH&BZ5|{>jDP zbaulIbW;a^O_QnVZo4U&voEVwOI#%I{Dyoj&~fAvpVJ))9OCG~v871&IeZ!6q6)X;efW^qm5mQV{ef%_+VuWKh${ZR?DJYJH#hb~4j>k^ zGug}vpv7#y3T9_J9d*LIasjT2C+d?KF-H!&`YWcX`=wZRwJflwo^;sJis#@tyx(`_ zGB18-#DDqut;^=!;L&6DHw5N>;Genexu5=-yYk_f*MfdS=xzzrxhJ667RVdu8G7po z=#qElb@&e>F4ijSdH&BZ5|{>jDP za(2TGbyEj_U6ZNlZo4U&voEVwOI#%Iep9{{=s0qT&+Co^4srD0*is~aQ8#blpL?JF zg5I)h^3mH?oO_|YH9`Tv?mR+)|-bbr?(3p0u3veLh+>uS4ki#z{TvXxqybmAp65045)bGpYpiS>zgs9>l$ez|}xw)|?asaWQ zoy%rc04-+oRWLi>>!=gvRS0lZJXW8~h&giD)n749-7mzls}+Ggb*00ORy_yL;rqTT zmw7R3;=la-He~Z{@aQr78v=7b^lxr^?x%lqS3Vr`TGZbVy4wPE?g?nN1@iiOLvI}c zUGmPo&aP~7*-y}UDm&;9pVfIL4juA>&P&-7sv2Lsy+XeQLTYNxgRalG%*S+M*rV#agwR7&G>Ve&5kPZ!O2i-FMyX zNjco!ee{4EOIBxdXUozw6*q*VepbLQ3M=B_R)xre8g>2DwEt1kusMsnN!;tj-PcKa ze4I?mZ}}+6vtpDCvy)L;W@jUGvlU%dr1|NvDribkt>1L7GdswWI3ExC`F?RWPWxpx zF7{ukHu@XdPm{?>>hpoihm%r!taIKlFI@LI`db2vbMm&!$m=e@>d)}1YRS>^ezfG9 zE^gSNcIuF?sWUb0ZPz7p@fFo-iHij8Zz$IQ9fy|lIqi|a;v7FXrW7e((9T`>=RW6s z!EZ@1di=I@PQ5jsughgaaU|f)8_DVSrd_scKF6!N@ZvkEPY+pWsZUP-SfO6zGP91R z!@afu2ZH9V;u#@m_+^BPD%_sW;e)QLm>h)q1H~-7dHWY3s^kZXFKV@1-`y+;e#&tyj6@(^*U_&dfKn-|WmJsn>2@G`nDPwq!>(J!@7IW5)f!-w$;!Sj+Ko@;=!a zPX;@W9^dDQWvg?!*otzRvKzutFE8PjgjMlyYeM8fjk-QH-GAgXY~JD|jl11Ad6Qr?eVUF>GVk}DKNwGR$BNU#f^g0I>F4ijSdH&BZ5|{>jDP za(2TGbyEj_U6ZNlZo4U&voEVwOI#%I{HA;@&~fAvpVu7;9OCG~v871tno$N|KH zb}pM)0koLSSHbLjx1&y&S0TVv@kD(xBj(6qSAWGcb-xtLu2uy0)Rhi9TJ;<}hxhxg zT;|2^jQB4E8$5c<{)WKZ5B)Q@J@?Z;b5}kb^IFtz2;FUgI`;%L+X8ugJwtCD z0bTOWy$=5&>hYoo^e6Rbm>6dp6+$Y)a)D7Hc+3;xm_RscY!xuu>2md{M4>Ropn_ZFj JPjB{A_zx?`U!?#5 literal 0 HcmV?d00001 diff --git a/src/backends/shaders/box_rg8.comp.spv b/src/backends/shaders/box_rg8.comp.spv new file mode 100644 index 0000000000000000000000000000000000000000..96d4a2099ebbf1c83a897befc286d18a9b59672b GIT binary patch literal 1452 zcmZ9MTWb?h6oq$lv-Vz!t;GuyFZj?{v{dne^+g#Akvxb#h&UvZ*bYu7rI{84AFAjd z^H=#IxW3bKV8{uJv-dh{)}Fmjl6vj-C9@fuwM9F!i?wPsF=p%!{l24p-dc{2yYIT& zlXAGd`{)5rELok+oh?h#RNN4b`dINPW+$Vx%+5yWW-Gd^Nb}QSRnU~8TEFSKGdswWI3ExC`F?RWPWxpx zF7{ukHu@XdPm{?>>hpoihm%r!taEyp7q0sp{VjpTIeFV<P@Q3b*HT_@L`5CI_MZKrst%djBFsmHa^QMXi>b8~20;a2C8X z#moxe#caL`X6Jhyb;7)I0j`S2>XR8UM;3SWS4>m;3$fhQvcL>`^5KqFJO|I>{k}`f zy!f4Q{>#sAT`}(lj~}zYDKPg#|I8iF{q)b=Qx3`y+;e#&tyj6@(wXgTe zgAeD^J|D#4gYJj#^`m0?4utN;K2 literal 0 HcmV?d00001 diff --git a/src/backends/shaders/box_rg8_snorm.comp.spv b/src/backends/shaders/box_rg8_snorm.comp.spv new file mode 100644 index 0000000000000000000000000000000000000000..ce20ad354d59859c4ec2a870581d0d1b93b97899 GIT binary patch literal 1452 zcmZ9M+iMe15XPsuS$nU=*5ZYY7kp?eDk@&Ez9?%Uk_WL5A}+}$wu{?MX|@HyhbsDy z`B(WO`29}Lfh8w=oSAQCzuB2dQm@^*U^Zj3wrGcTepam}#*F)czaQ$Jx0d7M?)&cc zq#SNPdVHTJmaNX@V#~^D%5DgU{j7jr6jsE;tqPF`HR}4*bpMglusMsnN!;tj-8V^k zbd*fWZ}}+6vtpDCv*S@(W~U?aW-EDFk>)4EYC=;P)%s1>o!Ne##QAv8&v%Q{aoR7l zak2YawaLG(`y`nhr`{hpe>f?1$BNU#yl~C?>F4ijSdH&BZ5|{>jDP zbaulIbW;a^O_QnVZo4U&voEVwOI#%I{Dyoj&~fAvpVJ))9OCG~v871&IeZ!6q6)X;efW^qm5mQV{ef%_+VuWKh${ZR?DJYJH#hb~4j>k^ zGug}vpv7#y3T9_J9d*LIasjT2C+d?KF-H!&`YWcX`=wZRwJflwo^;sJis#@tyx(`_ zGB18-#DDqut;^=!;L&6DHw5N>;Genexu5=-yYk_f*MfdS=xzzrxhJ667RVdu8G7po z=#qElb@&eb%7 literal 0 HcmV?d00001 diff --git a/src/backends/shaders/box_rgb10_a2.comp.spv b/src/backends/shaders/box_rgb10_a2.comp.spv new file mode 100644 index 0000000000000000000000000000000000000000..193bedea55445af083b59a05e14330bb19fd2d63 GIT binary patch literal 1452 zcmZ9MTWb?h6oq$lv-Vz!t;GuyFZj?{v{dne^+g#Akvxb#h&UvZ*bYu7rI{84AFAjd z^H=#IxW3bKV8{uJv-dh{)}Fmjl6vj-C9@fuwM9F!i?wPsF=p%!{l24p-dc{2yYIT& zlXAGd`{)5rELok+oh?h#RNN4b`dINPW+$Vx%+5yWW-Gd^Nb}QSRnU~8TEFSKGdswWI3ExC`F?RWPWxpx zF7{ukHu@XdPm{?>>hpoihm%r!taEyp7q0sp{VjpTIeFV<P@Q3b*HT_@L`5CI_MZKrst%djBFsmHa^QMXi?WgL^^)I1ApH zVrB*KVm4m|v-7=V909VCh^~sEwBa6HGE2gRag;-{{EO1Xf`EW-oo`Yxce&3~K zUi{8D|K;bmu9$a&$B)_H6qx&=f98(oe)?zbDTiZT3;GS=yCqQPzJO<2KsV4c^wtsZ zMR)Ff_zywL{RE$~9{;e#&tyi|-2cN%-#`l76bNFGEVL|l?hY!|ni(rgQY4^{LZ z^RMzn@cW&f14~Z$I5XeOezP-^q+Yvy$!x}EZPAYG;;dRtj2ZVsfA8p?x0d7M?z`^x zq#SPVK6=0tOIGJ{v1R2nWjBPQepbLQ3M=B_R)xre8g+eYy8p;&*qp`PB<}U%?&~By zK29d(w|tc3Susk6*~us^v$GL-vz5H8Nb}QSHKD1DYW=3`&g>vh;(R>l=ljLkIPI6& zxY&QC+T`EReVR;8QtuC(Kb(}hW5wxVUbyak@^1+o;`nXn;n$si)yL4P=Hin}|K#Ft zI=f+qx~YS|rpeTFx80P?*;iDnB`y+penY+%=s0qT&*_c?4srD0*is~aK{wCBKleWU z1-&KNoO(O}lK@ypLA(ptT}UpBZwg1BeCf zOg6IuXfd0wg4y|AN1ZUQT!5?MvHE02%#p*c{)%bpej%1!Eeq_aCmnXgJmCO`_xr9~ z=Ed)f_%A=db=kZdJbKLjroh|}{WEtw_tQUfPd*&;TF`F@-7SGS_XRZD0(k>HLvI}c zUGmPo4*wzKvY(*yRCdrIKCSai96IC$otLuFVW&YSmK}76PwTu9hYoo`=dEmXs(rne zA9RRM>wFN04tYO(uODU8FYg+-PqN{u8@SK1;nDc*pY6+r&xNoL{(JZyrrHNKyCUzO I-t39+A52GIuK)l5 literal 0 HcmV?d00001 diff --git a/src/backends/shaders/box_rgba16f.comp.spv b/src/backends/shaders/box_rgba16f.comp.spv new file mode 100644 index 0000000000000000000000000000000000000000..e1e8aefc37b43fd95c469b410b89a6ca827d731d GIT binary patch literal 1444 zcmZ9MTWb?h6oq$lv-Vz!t;GuyFZj?{v{dne^+g#Akvxb#h&UvZ*bYu7rI{84AFAjd z^H=#IxW3bKV8{uJv-dh{)|tI`l6vj-C9@fuwM9F!i?wPsF=p&L+UKq1^0@o1yFDp~ z+q;h*pj@&#n>$;Urm46g9QCsTeoUrtVr|IVO7wSqI!SRRb_UNCviR=^z;4VY@GJXY+UTW z(%tB9Xg^IRC#lZ|E+0-x?Xk|OVP3fIbM&_a7U$$`myy?9e$}7hRn?NCrGB*Jn=WqH zp?2;eUsGpl+S{&6=He^5t0gWHcz#2<2In}moX=^G1QzG`!7-&s`GR(yg@5jI>I;5L ziqYe@rE~6E^ZB}5HWWt!-qc7=zc=l&UGq6!)rA+}etO74%l+i^j}`8VTxQnMbf~W_ zz=5E-t9V8T8orEhQH9&{IegG{6_bN-|3EPdZ)*P{M3wwN@x@&&*Ei;b25=U!-Eub6d8EWeY_@X=a zJ`WY6Wj?{@sp8t<8 literal 0 HcmV?d00001 diff --git a/src/backends/shaders/box_rgba32f.comp.spv b/src/backends/shaders/box_rgba32f.comp.spv new file mode 100644 index 0000000000000000000000000000000000000000..d566a9076ed1ea6a50fe7c7908bac43000534d8c GIT binary patch literal 1444 zcmZ9MTWb?h6oq$lv-Vz!t;GuyFZj?{v{dne^+g#Akvxb#h&UvZ*bYu7rI{84AFAjd z^H=#IxW3bKV8{uJv-dh{)|tI`l6vj-C9@fuwM9F!i?wPsF=p&L+UKq1^0@o1yFDp~ z+q;h*pj@&#n>$;Urm46g9QCsTeoUrtVr|IVO7wSqI!SRRb_UNCviR=^z;4VY@GJXY+UTW z(%tB9Xg^IRC#lZ|E+0-x?Xk|OVP3fIbM&_a7U$$`myy?9e$}7hRn?NCrGB*Jn=WqH zp?2;eUsGpl+S{&6=He^5t0gWHcz#2<2In}moX=^G1QzG`!7-&s`GR(yg@5jI>I;5L ziqYe@rE~6E^ZB}5HWWt!-qc7=zc=l&UGq6!)rA)v_tQfbTJ9&Of2?p{w`v;0ycvJfqA*$pDiZAYJxxO(cG=Q_>!=d?l?!lHJXW3bh(5BI)n749?JvYKt7U;X_2k2hRy+sK;{Co$OTYM? zasJEqZ(T9(29F=TzbVl7L;uVj&;9hz+*1xmzZUcx!govHp8EoxZ2{dt&rn-Oz!%-Q z_j#xoE%OOJPZb9r&Zm8ziNgn7@Oh~iA7&bSV#UFS^J$+q;_yKieBLU?r&`y0<-v#Z zX`c_`@Im*(*ZNU0_42NP`=l72djt1bF+3i>{j+_=@VOA?!G90m!&LJiW>)C_>CK)9 F{{fr1Ut9nH literal 0 HcmV?d00001 diff --git a/src/backends/shaders/box_rgba8.comp.spv b/src/backends/shaders/box_rgba8.comp.spv new file mode 100644 index 0000000000000000000000000000000000000000..643b6e930c6918f986dd191230833a187fefe432 GIT binary patch literal 1444 zcmZ9MTWb?h6oq$lv-Vz!t;GuyFZj?{v{dne^+g#Akvxb#h&UvZ*bYu7rI{84AFAjd z^H=#IxW3bKV8{uJv-jF-)|s<+l6vj-C9@fuwM9F!i?wPsF=p&L+UKq1^0@o1yFDp~ z+q;h*pj@&#o2xBL(^T9Lj`~>vzbLGThg%gQ54`L8)U^Lm(y%#;yGh*Z#ogCQdVHKr z%5V87$+KdV46~C_T4rY>bh8y*R;2mquqtRuQ9ZxuZe@0mCviR=^z;4VY@GJXY+UTW z(%I;5Xg^IRC#lZ|E+0-x?Xl|IVP3fIbM&_a7IpHr%gF04zv^pvRkh@3xj$O+O&2%p zP&?<4ucT}v7fkhoZIHnXSU(n98@XvkD{es_; zV)XcJsm^(8K3|v1hT=%Tn>&)z?@haG*L;pwb>W4E^XVZAE$5TdKUO#|a+z62)8T$? z0S*MsUBxp((C}r1iz?in&*6ivtC$>w^9PDqcysqJLR85Q6knXxa(!b?XaKd~ohhbQ z055v;RWLi>>*yx*D;MCZc&vMd9;xJJ^;b+&@eBDdt7U;X_2k2hRy+sK;{Co$OTYM? zQUB%px2~9XgU65F-xTQkp?~I%=YINU?kR_(UkmyT;kzYp&V2#Twt#M+XSiEOz!%-Q z_j#xoE%OOJPZb9r>eD{Y#NmT3_`Fn%4>JuuvEtxEecI=ZIDF6rpSOzfsov|o^58># z+UJ8fe9-;ycm1fC`|_@V`=l72a|8ETF+3i>{j+_=@VOA?!G90m!&LJiW>)C_>CK)9 F{{f|WUta(K literal 0 HcmV?d00001 diff --git a/src/backends/shaders/box_rgba8_snorm.comp.spv b/src/backends/shaders/box_rgba8_snorm.comp.spv new file mode 100644 index 0000000000000000000000000000000000000000..514b6913b71d521b168adc6d91cbc5fbdaa265a6 GIT binary patch literal 1444 zcmZ9MTWb_S5QQsyGv*$GiNOoAUhpAn&=AE7#usG_tn7p6gNVcK?3xTtW-7sv2Lsy+Tb9$G5$g zDZk~TB+rUbGR#g!X_=jk(9KqKS&`XVuMfLoq>&omPPvU$$=;!;z**NW&*|^w$ zrL)oB(0-asPEwx_Tt1wX+GEw}VP3fIbM&_a7IpHr%gF04zv^pvRkh@3=^rimri&YP zsGW1j*EE@$_O_dnx%i6CYKe;kp5IWei*p=W>T}v7fkhoZIBqFYzM!3F;h+1Q{(|3< zV)XcJsm^(8K3|v1hT=%Tn;yxT_oiL8Yd*)Ty71z=;CyDtLd*H&%#Rh$i(F>b(Npx- z7T`e8+*Ldy1Pvb}TvXxqd=4LUUB%=eoIg;^!kgZ|2vH?JP<(M#%gv2@LIbD;?@TeX z0(dc-uY%e6UPqlUuUvqu;<5T~9Lp{m?&i$8$gZGxwCkF|P&vhVb1IIOo2AXInrw&@=Sb5%5KK z?tLCAM$7#KpQnn05A|uEXX5Zd7kpkS#)mr%KC$B9Lw(xkjW~SJ1)sNy@u~LpUU~4L zKJD{C96soN_+CFMreEGQaGw;zb8g^1D~8A8w|};;7(N%meel1B?=aPU5OY`P{^`x0 G2>$`7xnE!a literal 0 HcmV?d00001 diff --git a/src/backends/shaders/box_srgb.comp b/src/backends/shaders/box_srgb.comp new file mode 100644 index 0000000..e73a89b --- /dev/null +++ b/src/backends/shaders/box_srgb.comp @@ -0,0 +1,38 @@ +#version 450 +layout(local_size_x = 32, local_size_y = 32) in; + +layout(set = 0, binding = 0, rgba8) uniform readonly image2D u_src; +layout(set = 0, binding = 1, rgba8) uniform writeonly image2D u_dst; + +// Clamp to edge +#define L(u) imageLoad(u_src, clamp(u, ivec2(0), ivec2(imageSize(u_src) - 1))) + +// From page 220, Chapter 7.7.7 Conversion Rules for sRGBA and sBGRA Textures +// https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf +vec3 srgb_to_linear(vec3 c) { + return mix(c / 12.92, pow((c + 0.055) / 1.055, vec3(2.4)), step(0.04045, c)); +} + +vec3 linear_to_srgb(vec3 c) { + c = mix(c, vec3(0.0), isnan(c)); + c = clamp(c, vec3(0.0), vec3(1.0)); + return mix(c * 12.92, 1.055 * pow(c, vec3(1.0 / 2.4)) - 0.055, + step(0.0031308, c)); +} + +// In contrast to box_srgb_macos.comp, we need to perform the +// conversion between srgb and linear after load and before +// store. +void main() { + ivec2 dst_uv = ivec2(gl_GlobalInvocationID.xy); + ivec2 src_uv = 2 * dst_uv; + vec4 l = L(src_uv + ivec2(0, 0)); + vec4 r = L(src_uv + ivec2(1, 0)); + vec4 u = L(src_uv + ivec2(0, 1)); + vec4 d = L(src_uv + ivec2(1, 1)); + vec3 c = (srgb_to_linear(l.rgb) + srgb_to_linear(r.rgb) + + srgb_to_linear(u.rgb) + srgb_to_linear(d.rgb)) / + 4.0; + float a = (l.a + r.a + u.a + d.a) / 4.0; + imageStore(u_dst, dst_uv, vec4(linear_to_srgb(c), a)); +} diff --git a/src/backends/shaders/box_srgb.comp.spv b/src/backends/shaders/box_srgb.comp.spv new file mode 100644 index 0000000000000000000000000000000000000000..1cb2b713edd3755f74f81c86def74e7587035929 GIT binary patch literal 3060 zcmZXVTWDNW6oyZ8nZz`;)?Q57SSN}WtEM82NK33K)-gIZHWC#Dhct;A9g~uz#exrM zs`gDQ_@KoLh)@KHC|>%cwfZ86f+7f_pbrY7pf94R==YuM6%Of17JL2w`uAFU?Xza4 zvEh=IEL)MaW~;L96X zVULVVOv>Mkod++s1}i5scO!odtY-jCSzA`A)+&R8mFk|_=z#;Znc2hj@mhUia=bP+ zF+DyyJ8@`SU28!%F*#a4I93!iqbSyIM(-IOsMjj>sr@7MfyqNtqa(8uQM-E`--l;!>g{1RLlyMVg9v>f{et^gbJj)zX|?GL;jyighG3+%c2+K%lCya{~b z`OX`zWViY3Q7$ZWo8f+3xO6GcWniD!w*_A=Y#k@Q9PBx_vg#Ml*#pk9xm~e;8%QoJ z>TZV{9{%e3(Dj1l!a}zLuB+#^o$IOBk6*^TW9#o`mGeH0?_n)tKE`iimGgXMaD~;q z@;eiD2ISNau&Oto_4`@(CTx5Nzl1r5o!L3raKi2{KJHgz%{x;-tu@8Yl~2^TXAyGe z&3RAvg5|W()bOnnnuqY^)CBiv!t%jAi7(cozO(6LZu>ohl?(VI{KZXVhtc3-?5q<}Jm}l~iH^D!1^rgPgb%Eu=LU$qD)XC|kdD{$@ z3k%&va9K9DG;d|FT-deTeY`i7&di@M&8&T#$(gwYb6y7dL^&(BCQjbR5|5$X&058b zKc3#{K78*>-h9r(-I%lRVA^wE;^xzy5wM)^u$}Ka^NwTIxe7C~!zvnE5th z#{K?`*cbT5{GoKNt>JyR?@P>B4`zMysE;#0hwt5LK5C0+{u->Nc;;^sS3L8#aPq}7 ze+M?7XEt6u^YzhY?^zkyjy{L;mUco<}jODC8{(w_c?BlP* z75n%bPQKX3Kj7%Yc(ITFQY`wgM)ct(_t}T_&7(g0copAX6vYgm1j?7;_A%=v{MRu* z8-AAsw}9{L$(c{x8<<*Sp?eeG_gmDx1y*Y;bZ_H(e?{FpV710PpEcgaRXv(n~Eblvx9OvWnpMUQC-7-&{X>E%6&aCf#^>I({!>jQL?gRYT7u@N@ gHL%{!Eex@Kh`C?=Y0SGE<<7jnDrWp&PIevkKeami{r~^~ literal 0 HcmV?d00001 diff --git a/src/backends/shaders/box_srgb_macos.comp b/src/backends/shaders/box_srgb_macos.comp new file mode 100644 index 0000000..b8e3650 --- /dev/null +++ b/src/backends/shaders/box_srgb_macos.comp @@ -0,0 +1,35 @@ +#version 450 +layout(local_size_x = 32, local_size_y = 32) in; + +layout(set = 0, binding = 0, rgba8) uniform readonly image2D u_src; +layout(set = 0, binding = 1, rgba8) uniform writeonly image2D u_dst; + +// Clamp to edge +#define L(u) imageLoad(u_src, clamp(u, ivec2(0), ivec2(imageSize(u_src) - 1))) + +// From page 220, Chapter 7.7.7 Conversion Rules for sRGBA and sBGRA Textures +// https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf +vec3 srgb_to_linear(vec3 c) { + return mix(c / 12.92, pow((c + 0.055) / 1.055, vec3(2.4)), step(0.04045, c)); +} + +vec3 linear_to_srgb(vec3 c) { + c = mix(c, vec3(0.0), isnan(c)); + c = clamp(c, vec3(0.0), vec3(1.0)); + return mix(c * 12.92, 1.055 * pow(c, vec3(1.0 / 2.4)) - 0.055, + step(0.0031308, c)); +} + +// The behavior I'm observing on MacOS with a GPUFamily2 v1 capable GPU +// is that the implementation performs the conversion from srgb to linear +// on load, but it's up to me to convert back to srgb before calling store +void main() { + ivec2 dst_uv = ivec2(gl_GlobalInvocationID.xy); + ivec2 src_uv = 2 * dst_uv; + vec4 l = L(src_uv + ivec2(0, 0)); + vec4 r = L(src_uv + ivec2(1, 0)); + vec4 u = L(src_uv + ivec2(0, 1)); + vec4 d = L(src_uv + ivec2(1, 1)); + vec4 c = (l + r + u + d) / 4.0; + imageStore(u_dst, dst_uv, vec4(linear_to_srgb(c.rgb), c.a)); +} diff --git a/src/backends/shaders/box_srgb_macos.comp.spv b/src/backends/shaders/box_srgb_macos.comp.spv new file mode 100644 index 0000000000000000000000000000000000000000..a06bb6151e4a8a8dcf66f178ac2cdb9776d4b89f GIT binary patch literal 2076 zcmZ9MTTfF#6op3$1pz_4fEXeL!xKnQ0X2wR6dOzx(BPvDw2d|?1)-35Nd!^x!I*gW zK}};c#!FCq^4b63fAPh{^&Ms>C!A(w_Fj9ENJtH3du*SvY!hFi-YeAk~C}@nU&ipE&$>-=>1s>|; zEkQ;e3G#iuhF4fij+XtSC2tJkQukUT>yYnOXG%1-1YL4LT(3APE+#Z+-ExiOoItyB z;u?XcLmBm20nV^TPMibtcWERJ&#zbR-130UZ%_tjuyyu}yZGzEkmdBIzjAHB@&n2z zC;yx>pJwH72Gh}-_4ri3%U$>W4MLv7eZ7 z?k#iS`+Uw>nqRkK^!Twp-Y0yHU%z5{%6)2d+ufkgnIC?bkA^jed|^-{YmyIp&ej<5 zd53Nvdpaw?0n?mQ%sQr-R1Am4IPNPsym8lk4rl9g$9V8&zb}PYD1W7RbFFC5EAAm0 zK+U|rDW*Tb&UIaJYY4`F7uOa7Ytzdgf^*Bd7v({JH#`S#=v7~=r>Hs4zhcTX_REL! z>=8K2G5K(gy`F>TVL!K}rN74n>i2xVPby|F@c0dCJS}ie*ZiDO&)xNN63XG|Z?(QD z_>K##LyRZqh;CYQxH}U9zUY>{&t=7EIZyMsqS$<>Z}mxv!v~%Dq!r_n63i#3*nFsO z^_dZe4?6RiSBy`1UpJMT5B04+x5VLtZpH8Qj$-!9yBfEm7@l>FTMc68@VM{iK2Qw5 zA=r65RLs2{Q?L1sJrd9X9^Q{T@l9d@ z`RFI)7uEPgVBe7t_f#?Scue<9v3VKy+;jA5T)W|3z7Uv?o;v<1^^uFvZ**Mv E562^?1poj5 literal 0 HcmV?d00001 diff --git a/src/backends/shaders/compile.sh b/src/backends/shaders/compile.sh new file mode 100755 index 0000000..2d33c8c --- /dev/null +++ b/src/backends/shaders/compile.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash +set -e + +function compile { + glslc -c $1 -o $2 + spirv-opt -Os $2 -o $2 +} + + +cd "$(dirname "$0")" +compile triangle.vert triangle.vert.spv +compile box.frag box.frag.spv +compile box_srgb.comp box_srgb.comp.spv +compile box_srgb_macos.comp box_srgb_macos.comp.spv + +# https://www.khronos.org/opengl/wiki/Image_Load_Store#Format_qualifiers +SUPPORTED_FORMATS=( + rgba32f + rgba16f + rg32f + rg16f + r32f + r16f + rgba8 + rg8 + r8 + r11f_g11f_b10f + rgb10_a2 + rgba16_snorm + rgba8_snorm + rg16_snorm + rg8_snorm + r16_snorm + r8_snorm +) +for FORMAT in ${SUPPORTED_FORMATS[@]}; do + (FORMAT=${FORMAT} envsubst < box.comp) > box_${FORMAT}.comp + compile box_${FORMAT}.comp box_${FORMAT}.comp.spv + rm box_${FORMAT}.comp +done diff --git a/src/backends/shaders/triangle.vert b/src/backends/shaders/triangle.vert new file mode 100644 index 0000000..c576c5d --- /dev/null +++ b/src/backends/shaders/triangle.vert @@ -0,0 +1,8 @@ +#version 450 +// https://www.saschawillems.de/blog/2016/08/13/vulkan-tutorial-on-rendering-a-fullscreen-quad-without-buffers/ +layout(location = 0) out vec2 v_uv; +void main() { + v_uv = vec2((gl_VertexIndex << 1) & 2, gl_VertexIndex & 2); + gl_Position = vec4(vec2(v_uv.x, v_uv.y) * 2.0 - 1.0, 0.0, 1.0); + v_uv.y = 1.0 - v_uv.y; +} diff --git a/src/backends/shaders/triangle.vert.spv b/src/backends/shaders/triangle.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..6dcda6564db168f45b5aeccecdc20c044c949a48 GIT binary patch literal 1372 zcmZ9M?Q0W35XQGjlh)R@R_&YCdbPgM)+pMRg7}8YDFhlR`1L5sA`9mwB$rVAB>3Gw zN(BEUzX(3R+uJs{VLCIOq)4#VEkD$6(PpVntGw*=5ezz$UBX_ z{YNn7O|>AxSx_ctQu6u4W!M)a7bQ0&RsAZ`KSiE2GbU~(@zGJ-e4Dg;y=0JoNo|t4 z%qAVzx9!}GEWGJ4p3B)2C|U-x*+ z_I(I`T|aP+a$4Pi%Uw4UI#uAjv%p=JAG@#WkQ^W5ZHm24UGI$>`P8HS ziZuPuJNK_jM-mSC_-hjGTbF-L8a~*DEZ!RKAcoM_x->l#r!Rc}t)BN4b`t8`6o*58 zBuzfGh@!uToPa%$ z4K^WZ=_Sm&A%RPboiJ~DWGDP{<2zvYyb~XO==ZT~`lSzQK9P_Q4xbp Result<(), Error>; +} + +/// An error that occurred during mipmap generation. +#[derive(Debug, Error, PartialEq, Eq)] +pub enum Error { + #[error("Unsupported texture usage `{0:?}`.\nYour texture usage must contain one of: 1. TextureUsage::STORAGE, 2. TextureUsage::OUTPUT_ATTACHMENT | TextureUsage::SAMPLED, 3. TextureUsage::COPY_SRC | TextureUsage::COPY_DST")] + UnsupportedUsage(wgpu::TextureUsage), + #[error( + "Unsupported texture dimension `{0:?}. You texture dimension must be TextureDimension::D2`" + )] + UnsupportedDimension(wgpu::TextureDimension), + #[error("Unsupported texture format `{0:?}`. Try using the render backend.")] + UnsupportedFormat(wgpu::TextureFormat), + #[error("Unsupported texture size. Texture size must be a power of 2.")] + NpotTexture, + #[error("Unknown texture format `{0:?}`.\nDid you mean to specify it in `MipmapGeneratorDescriptor::formats`?")] + UnknownFormat(wgpu::TextureFormat), +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..0455e4a --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,56 @@ +/*! +Generate mipmaps for [wgpu](https://github.com/gfx-rs/wgpu-rs) textures. + +## Usage + +Add this to your `Cargo.toml`: + +```toml +[dependencies] +wgpu-mipmap = "0.1" +``` + +Example usage: + +```rust +use wgpu_mipmap::*; +fn example(device: &wgpu::Device, queue: &wgpu::Queue) -> Result<(), Error> { + // create a recommended generator + let generator = RecommendedMipmapGenerator::new(&device); + // create and upload data to a texture + let texture_descriptor = wgpu::TextureDescriptor { + size: wgpu::Extent3d { + width: 512, + height: 512, + depth: 1, + }, + mip_level_count: 10, // 1 + log2(512) + sample_count: 1, + format: wgpu::TextureFormat::Rgba8Unorm, + dimension: wgpu::TextureDimension::D2, + usage: wgpu::TextureUsage::STORAGE, + label: None, + }; + let texture = device.create_texture(&texture_descriptor); + // upload_data_to_texture(&texture); + // create an encoder and generate mipmaps for the texture + let mut encoder = device.create_command_encoder(&Default::default()); + generator.generate(&device, &mut encoder, &texture, &texture_descriptor)?; + queue.submit(std::iter::once(encoder.finish())); + Ok(()) +} +``` +*/ +mod backends; +mod core; + +#[doc(hidden)] +pub mod util; + +#[doc(inline)] +pub use crate::backends::{ + ComputeMipmapGenerator, CopyMipmapGenerator, RecommendedMipmapGenerator, RenderMipmapGenerator, +}; + +#[doc(inline)] +pub use crate::core::*; diff --git a/src/util.rs b/src/util.rs new file mode 100644 index 0000000..68f4e61 --- /dev/null +++ b/src/util.rs @@ -0,0 +1,284 @@ +/// utilities used throughout the project. Not part of the official API. +use crate::core::*; + +#[derive(Debug)] +pub struct MipBuffer { + pub buffer: Vec, + pub dimensions: MipBufferDimensions, + pub level: u32, +} + +#[derive(Debug, Copy, Clone)] +pub struct MipBufferDimensions { + pub width: usize, + pub height: usize, + pub bytes_per_channel: usize, + pub unpadded_bytes_per_row: usize, + pub padded_bytes_per_row: usize, +} + +impl MipBufferDimensions { + pub fn new(width: usize, height: usize, bytes_per_channel: usize) -> Self { + let width = width.max(1); + let height = height.max(1); + let unpadded_bytes_per_row = width * bytes_per_channel; + let align = wgpu::COPY_BYTES_PER_ROW_ALIGNMENT as usize; + let padded_bytes_per_row_padding = (align - unpadded_bytes_per_row % align) % align; + let padded_bytes_per_row = unpadded_bytes_per_row + padded_bytes_per_row_padding; + Self { + width, + height, + bytes_per_channel, + unpadded_bytes_per_row, + padded_bytes_per_row, + } + } +} + +pub async fn generate_and_copy_to_cpu( + device: &wgpu::Device, + queue: &wgpu::Queue, + generator: &dyn MipmapGenerator, + data: &[u8], + texture_descriptor: &wgpu::TextureDescriptor<'_>, +) -> Result, Error> { + // Create a texture + let buffer_dimensions = MipBufferDimensions::new( + texture_descriptor.size.width as usize, + texture_descriptor.size.height as usize, + format_bytes_per_channel(&texture_descriptor.format), + ); + let texture = device.create_texture(&texture_descriptor); + // Upload `data` to the texture + queue.write_texture( + wgpu::TextureCopyView { + texture: &texture, + mip_level: 0, + origin: wgpu::Origin3d::ZERO, + }, + &data, + wgpu::TextureDataLayout { + offset: 0, + bytes_per_row: buffer_dimensions.unpadded_bytes_per_row as u32, + rows_per_image: 0, + }, + wgpu::Extent3d { + width: buffer_dimensions.width as u32, + height: buffer_dimensions.height as u32, + depth: 1, + }, + ); + let mut encoder = + device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None }); + generator.generate(&device, &mut encoder, &texture, &texture_descriptor)?; + // Copy all mipmap levels, including the base, to GPU buffers + let buffers = { + let mut buffers = Vec::new(); + for i in 0..texture_descriptor.mip_level_count { + let mip_width = buffer_dimensions.width / 2usize.pow(i); + let mip_height = buffer_dimensions.height / 2usize.pow(i); + let mip_dimensions = MipBufferDimensions::new( + mip_width, + mip_height, + buffer_dimensions.bytes_per_channel, + ); + let size = (mip_dimensions.height * mip_dimensions.padded_bytes_per_row) as u64; + let mip_texture_extent = wgpu::Extent3d { + width: mip_width as u32, + height: mip_height as u32, + depth: 1, + }; + let buffer = device.create_buffer(&wgpu::BufferDescriptor { + label: None, + size, + usage: wgpu::BufferUsage::COPY_DST | wgpu::BufferUsage::MAP_READ, + mapped_at_creation: false, + }); + encoder.copy_texture_to_buffer( + wgpu::TextureCopyView { + texture: &texture, + mip_level: i, + origin: wgpu::Origin3d::ZERO, + }, + wgpu::BufferCopyView { + buffer: &buffer, + layout: wgpu::TextureDataLayout { + offset: 0, + bytes_per_row: mip_dimensions.padded_bytes_per_row as u32, + rows_per_image: 0, + }, + }, + mip_texture_extent, + ); + buffers.push((buffer, mip_dimensions)); + } + buffers + }; + queue.submit(std::iter::once(encoder.finish())); + // Copy the GPU buffers to the CPU + let mut mip_buffers: Vec = Vec::new(); + for (level, (buffer, buffer_dimensions)) in buffers.iter().enumerate() { + // Note that we're not calling `.await` here. + let buffer_slice = buffer.slice(..); + let buffer_future = buffer_slice.map_async(wgpu::MapMode::Read); + // Poll the device in a blocking manner so that our future resolves. + // In an actual application, `device.poll(...)` should + // be called in an event loop or on another thread. + device.poll(wgpu::Maintain::Wait); + match buffer_future.await { + Err(e) => panic!("Unexpected failure: {}", e), + Ok(()) => { + let padded_buffer = buffer_slice.get_mapped_range(); + // The buffer we get back is padded, so only extract what we need + let mut exact_buffer = Vec::with_capacity( + buffer_dimensions.unpadded_bytes_per_row * buffer_dimensions.height, + ); + for y in 0..buffer_dimensions.height { + let row_beg = y * buffer_dimensions.padded_bytes_per_row; + let row_end = row_beg + buffer_dimensions.unpadded_bytes_per_row; + exact_buffer.extend_from_slice(&padded_buffer[row_beg..row_end]); + } + mip_buffers.push(MipBuffer { + buffer: exact_buffer, + dimensions: *buffer_dimensions, + level: level as u32, + }); + } + } + } + Ok(mip_buffers) +} + +pub fn checkerboard_r8(width: u32, height: u32, n: u32) -> Vec { + use std::iter; + + (0..width * height) + .flat_map(|id| { + let x = id % width; + let y = id / height; + let v = (((x / n + y / n) % 2) * 255) as u8; + iter::once(v) + }) + .collect() +} + +#[doc(hidden)] +pub fn checkerboard_rgba8(width: u32, height: u32, n: u32) -> Vec { + use std::iter; + + (0..width * height) + .flat_map(|id| { + let x = id % width; + let y = id / height; + let v = (((x / n + y / n) % 2) * 255) as u8; + iter::once(v) + .chain(iter::once(v)) + .chain(iter::once(v)) + .chain(iter::once(255)) + }) + .collect() +} + +#[doc(hidden)] +pub fn checkerboard_rgba32f(width: u32, height: u32, n: u32) -> Vec { + use std::iter; + + (0..width * height) + .flat_map(|id| { + let x = id % width; + let y = id / height; + let v = ((x / n + y / n) % 2) as f32; + iter::once(v) + .chain(iter::once(v)) + .chain(iter::once(v)) + .chain(iter::once(1.0)) + }) + .collect() +} + +fn format_bytes_per_channel(format: &wgpu::TextureFormat) -> usize { + use wgpu::TextureFormat; + match format { + // 8 bit per channel + TextureFormat::R8Unorm => 1, + TextureFormat::R8Snorm => 1, + TextureFormat::R8Uint => 1, + TextureFormat::R8Sint => 1, + // 16 bit per channel + TextureFormat::R16Uint => 2, + TextureFormat::R16Sint => 2, + TextureFormat::R16Float => 2, + TextureFormat::Rg8Unorm => 2, + TextureFormat::Rg8Snorm => 2, + TextureFormat::Rg8Uint => 2, + TextureFormat::Rg8Sint => 2, + // 32 bit per channel + TextureFormat::R32Uint => 4, + TextureFormat::R32Sint => 4, + TextureFormat::R32Float => 4, + TextureFormat::Rg16Uint => 4, + TextureFormat::Rg16Sint => 4, + TextureFormat::Rg16Float => 4, + TextureFormat::Rgba8Unorm => 4, + TextureFormat::Rgba8Snorm => 4, + TextureFormat::Rgba8Uint => 4, + TextureFormat::Rgba8Sint => 4, + TextureFormat::Bgra8Unorm => 4, + TextureFormat::Bgra8UnormSrgb => 4, + TextureFormat::Rgba8UnormSrgb => 4, + // packed 32 bit per channel + TextureFormat::Rgb10a2Unorm => 4, + TextureFormat::Rg11b10Float => 4, + // 64 bit per channel + TextureFormat::Rg32Uint => 8, + TextureFormat::Rg32Sint => 8, + TextureFormat::Rg32Float => 8, + TextureFormat::Rgba16Uint => 8, + TextureFormat::Rgba16Sint => 8, + TextureFormat::Rgba16Float => 8, + // 128 bit per channel + TextureFormat::Rgba32Uint => 16, + TextureFormat::Rgba32Sint => 16, + TextureFormat::Rgba32Float => 16, + _ => unimplemented!(), + } +} + +#[doc(hidden)] +#[allow(dead_code)] +pub(crate) async fn wgpu_setup() -> (wgpu::Instance, wgpu::Adapter, wgpu::Device, wgpu::Queue) { + let instance = wgpu::Instance::new(wgpu::BackendBit::PRIMARY); + let adapter = instance + .request_adapter(&wgpu::RequestAdapterOptions { + power_preference: wgpu::PowerPreference::HighPerformance, + compatible_surface: None, + }) + .await + .expect("Failed to find an appropiate adapter"); + // Create the logical device and command queue + let (device, queue) = adapter + .request_device( + &wgpu::DeviceDescriptor { + features: wgpu::Features::empty(), + limits: wgpu::Limits::default(), + shader_validation: true, + }, + None, + ) + .await + .expect("Failed to create device"); + (instance, adapter, device, queue) +} + +#[doc(hidden)] +#[allow(dead_code)] +pub(crate) fn get_mip_extent(extent: &wgpu::Extent3d, level: u32) -> wgpu::Extent3d { + let mip_width = ((extent.width as f32) / (2u32.pow(level) as f32)).floor() as u32; + let mip_height = ((extent.height as f32) / (2u32.pow(level) as f32)).floor() as u32; + let mip_depth = ((extent.depth as f32) / (2u32.pow(level) as f32)).floor() as u32; + wgpu::Extent3d { + width: mip_width.max(1), + height: mip_height.max(1), + depth: mip_depth.max(1), + } +}