summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeo Kettmeir <crowlkats@toaxl.com>2023-03-16 19:29:32 -0400
committerGitHub <noreply@github.com>2023-03-17 00:29:32 +0100
commit35196eab279340376929dd75ed717ef4830e2fa9 (patch)
tree5aefff339ef50d3e89ff36422c90e929dea3897f
parent3f031ad9af2d61671f8408632f31592ac4186926 (diff)
BREAKING(unstable): remove WebGPU (#18094)
This PR _**temporarily**_ removes WebGPU (which has behind the `--unstable` flag in Deno), due to performance complications due to its presence. It will be brought back in the future; as a point of reference, Chrome will ship WebGPU to stable on 26/04/2023. --------- Co-authored-by: Bartek Iwańczuk <biwanczuk@gmail.com>
-rw-r--r--Cargo.lock648
-rw-r--r--Cargo.toml7
-rw-r--r--cli/args/flags.rs1
-rw-r--r--cli/build.rs12
-rw-r--r--cli/js/40_testing.js3
-rw-r--r--cli/tests/testdata/webgpu/computepass_shader.wgsl38
-rw-r--r--cli/tests/testdata/webgpu/hellotriangle.outbin204800 -> 0 bytes
-rw-r--r--cli/tests/testdata/webgpu/hellotriangle_shader.wgsl11
-rw-r--r--cli/tests/unit/webgpu_test.ts242
-rw-r--r--cli/tsc/dts/lib.deno.window.d.ts2
-rw-r--r--cli/tsc/dts/lib.deno.worker.d.ts2
-rw-r--r--cli/tsc/dts/lib.deno_webgpu.d.ts1324
-rw-r--r--cli/tsc/mod.rs1
-rw-r--r--ext/webgpu/01_webgpu.js5249
-rw-r--r--ext/webgpu/02_idl_types.js2036
-rw-r--r--ext/webgpu/03_surface.js146
-rw-r--r--ext/webgpu/04_surface_idl_types.js82
-rw-r--r--ext/webgpu/Cargo.toml43
-rw-r--r--ext/webgpu/LICENSE.md20
-rw-r--r--ext/webgpu/README.md35
-rw-r--r--ext/webgpu/binding.rs322
-rw-r--r--ext/webgpu/buffer.rs197
-rw-r--r--ext/webgpu/bundle.rs395
-rw-r--r--ext/webgpu/command_encoder.rs540
-rw-r--r--ext/webgpu/compute_pass.rs289
-rw-r--r--ext/webgpu/error.rs314
-rw-r--r--ext/webgpu/lib.rs674
-rw-r--r--ext/webgpu/pipeline.rs424
-rw-r--r--ext/webgpu/queue.rs129
-rw-r--r--ext/webgpu/render_pass.rs538
-rw-r--r--ext/webgpu/sampler.rs70
-rw-r--r--ext/webgpu/shader.rs45
-rw-r--r--ext/webgpu/surface.rs137
-rw-r--r--ext/webgpu/texture.rs116
-rw-r--r--ext/webgpu/webgpu.idl1168
-rw-r--r--runtime/Cargo.toml2
-rw-r--r--runtime/build.rs2
-rw-r--r--runtime/errors.rs1
-rw-r--r--runtime/js/98_global_scope.js51
-rw-r--r--runtime/lib.rs1
-rw-r--r--runtime/web_worker.rs1
-rw-r--r--runtime/worker.rs1
-rw-r--r--test_util/src/lib.rs2
-rw-r--r--tools/README.md13
-rwxr-xr-xtools/wgpu_sync.js115
45 files changed, 145 insertions, 15304 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 05b9344fa..d6ad59cf6 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -107,15 +107,6 @@ dependencies = [
]
[[package]]
-name = "android_system_properties"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
-dependencies = [
- "libc",
-]
-
-[[package]]
name = "anyhow"
version = "1.0.69"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -126,18 +117,6 @@ name = "arrayvec"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "ash"
-version = "0.37.2+1.3.238"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28bf19c1f0a470be5fbf7522a308a05df06610252c5bcf5143e1b23f629a9a03"
-dependencies = [
- "libloading",
-]
[[package]]
name = "ast_node"
@@ -150,7 +129,7 @@ dependencies = [
"proc-macro2 1.0.51",
"quote 1.0.23",
"swc_macros_common",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -169,34 +148,35 @@ dependencies = [
[[package]]
name = "async-stream"
-version = "0.3.3"
+version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dad5c83079eae9969be7fadefe640a1c566901f05ff91ab221de4b6f68d9507e"
+checksum = "ad445822218ce64be7a341abfb0b1ea43b5c23aa83902542a4542e78309d8e5e"
dependencies = [
"async-stream-impl",
"futures-core",
+ "pin-project-lite",
]
[[package]]
name = "async-stream-impl"
-version = "0.3.3"
+version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "10f203db73a71dfa2fb6dd22763990fa26f3d2625a6da2da900d23b87d26be27"
+checksum = "e4655ae1a7b0cdf149156f780c5bf3f1352bc53cbd9e0a361a7ef7b22947e965"
dependencies = [
"proc-macro2 1.0.51",
"quote 1.0.23",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
name = "async-trait"
-version = "0.1.64"
+version = "0.1.66"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1cd7fce9ba8c3c042128ce72d8b2ddbf3a05747efb67ea0313c635e10bda47a2"
+checksum = "b84f9ebcc6c1f5b8cb160f6990096a5c127f423fcb6e1ccc46c370cbdfb75dfc"
dependencies = [
"proc-macro2 1.0.51",
"quote 1.0.23",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -219,7 +199,7 @@ dependencies = [
"proc-macro-error",
"proc-macro2 1.0.51",
"quote 1.0.23",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -279,15 +259,15 @@ dependencies = [
[[package]]
name = "base64ct"
-version = "1.5.3"
+version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b645a089122eccb6111b4f81cbc1a49f5900ac4666bb93ac027feaecf15607bf"
+checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
[[package]]
name = "basic-toml"
-version = "0.1.1"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e819b667739967cd44d308b8c7b71305d8bb0729ac44a248aa08f33d01950b4"
+checksum = "5c0de75129aa8d0cceaf750b89013f0e08804d6ec61416da787b35ad0d7cddf1"
dependencies = [
"serde",
]
@@ -329,12 +309,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
-name = "block"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
-
-[[package]]
name = "block-buffer"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -345,9 +319,9 @@ dependencies = [
[[package]]
name = "block-buffer"
-version = "0.10.3"
+version = "0.10.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e"
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
dependencies = [
"generic-array 0.14.6",
]
@@ -448,9 +422,9 @@ dependencies = [
[[package]]
name = "cipher"
-version = "0.4.3"
+version = "0.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d1873270f8f7942c191139cb8a40fd228da6c3fd2fc376d7e92d47aa14aeb59e"
+checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad"
dependencies = [
"crypto-common",
"inout",
@@ -512,16 +486,6 @@ dependencies = [
]
[[package]]
-name = "codespan-reporting"
-version = "0.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
-dependencies = [
- "termcolor",
- "unicode-width",
-]
-
-[[package]]
name = "console_static_text"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -533,9 +497,9 @@ dependencies = [
[[package]]
name = "const-oid"
-version = "0.9.1"
+version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cec318a675afcb6a1ea1d4340e2d377e56e47c266f28043ceccbf4412ddfdd3b"
+checksum = "520fbf3c07483f94e3e3ca9d0cfd913d7718ef2483d2cfd91c0d9e91474ab913"
[[package]]
name = "convert_case"
@@ -560,18 +524,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc"
[[package]]
-name = "core-graphics-types"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b"
-dependencies = [
- "bitflags",
- "core-foundation",
- "foreign-types",
- "libc",
-]
-
-[[package]]
name = "cpufeatures"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -606,9 +558,9 @@ dependencies = [
[[package]]
name = "crossbeam-channel"
-version = "0.5.6"
+version = "0.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521"
+checksum = "cf2b3e8478797446514c91ef04bafcb59faba183e621ad488df88983cc14128c"
dependencies = [
"cfg-if",
"crossbeam-utils",
@@ -616,9 +568,9 @@ dependencies = [
[[package]]
name = "crossbeam-utils"
-version = "0.8.14"
+version = "0.8.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f"
+checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b"
dependencies = [
"cfg-if",
]
@@ -653,7 +605,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096"
dependencies = [
"quote 1.0.23",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -666,12 +618,6 @@ dependencies = [
]
[[package]]
-name = "cty"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35"
-
-[[package]]
name = "curve25519-dalek"
version = "2.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -698,17 +644,6 @@ dependencies = [
]
[[package]]
-name = "d3d12"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8f0de2f5a8e7bd4a9eec0e3c781992a4ce1724f68aec7d7a3715344de8b39da"
-dependencies = [
- "bitflags",
- "libloading",
- "winapi",
-]
-
-[[package]]
name = "darling"
version = "0.13.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -729,7 +664,7 @@ dependencies = [
"proc-macro2 1.0.51",
"quote 1.0.23",
"strsim",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -740,7 +675,7 @@ checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835"
dependencies = [
"darling_core",
"quote 1.0.23",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -1231,7 +1166,7 @@ dependencies = [
"proc-macro2 1.0.51",
"quote 1.0.23",
"regex",
- "syn 1.0.107",
+ "syn 1.0.109",
"testing_macros",
"trybuild",
]
@@ -1260,7 +1195,6 @@ dependencies = [
"deno_tls",
"deno_url",
"deno_web",
- "deno_webgpu",
"deno_webidl",
"deno_websocket",
"deno_webstorage",
@@ -1351,18 +1285,6 @@ dependencies = [
]
[[package]]
-name = "deno_webgpu"
-version = "0.94.0"
-dependencies = [
- "deno_core",
- "raw-window-handle",
- "serde",
- "tokio",
- "wgpu-core",
- "wgpu-types",
-]
-
-[[package]]
name = "deno_webidl"
version = "0.93.0"
dependencies = [
@@ -1415,7 +1337,7 @@ dependencies = [
"proc-macro2 1.0.51",
"quote 1.0.23",
"rustc_version 0.4.0",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -1448,7 +1370,7 @@ version = "0.10.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f"
dependencies = [
- "block-buffer 0.10.3",
+ "block-buffer 0.10.4",
"const-oid",
"crypto-common",
"subtle",
@@ -1561,9 +1483,9 @@ dependencies = [
[[package]]
name = "dyn-clone"
-version = "1.0.10"
+version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c9b0705efd4599c15a38151f4721f7bc388306f61084d3bfd50bd07fbca5cb60"
+checksum = "68b0cf012f1230e43cd00ebb729c6bb58707ecfa8ad08b52ef3a4ccd2697fc30"
[[package]]
name = "dynasm"
@@ -1577,7 +1499,7 @@ dependencies = [
"proc-macro-error",
"proc-macro2 1.0.51",
"quote 1.0.23",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -1655,7 +1577,7 @@ dependencies = [
"heck",
"proc-macro2 1.0.51",
"quote 1.0.23",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -1667,7 +1589,7 @@ dependencies = [
"pmutil",
"proc-macro2 1.0.51",
"swc_macros_common",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -1765,9 +1687,9 @@ dependencies = [
[[package]]
name = "fastrand"
-version = "1.8.0"
+version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499"
+checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
dependencies = [
"instant",
]
@@ -1795,14 +1717,14 @@ dependencies = [
[[package]]
name = "filetime"
-version = "0.2.19"
+version = "0.2.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e884668cd0c7480504233e951174ddc3b382f7c2666e3b7310b5c4e7b0c37f9"
+checksum = "8a3de6e8d11b22ff9edc6d916f890800597d60f8b2da1caf2955c274638d6412"
dependencies = [
"cfg-if",
"libc",
"redox_syscall",
- "windows-sys 0.42.0",
+ "windows-sys 0.45.0",
]
[[package]]
@@ -1819,7 +1741,7 @@ checksum = "479cde5eb168cf5a056dd98f311cbfab7494c216394e4fb9eba0336827a8db93"
dependencies = [
"proc-macro2 1.0.51",
"quote 1.0.23",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -1850,21 +1772,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[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 = "form_urlencoded"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1882,7 +1789,7 @@ dependencies = [
"pmutil",
"proc-macro2 1.0.51",
"swc_macros_common",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -1971,7 +1878,7 @@ checksum = "95a73af87da33b5acf53acfebdc339fe592ecf5357ac7c0a7734ab9d8c876a70"
dependencies = [
"proc-macro2 1.0.51",
"quote 1.0.23",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -2015,15 +1922,6 @@ dependencies = [
]
[[package]]
-name = "fxhash"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
-dependencies = [
- "byteorder",
-]
-
-[[package]]
name = "generic-array"
version = "0.12.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2096,57 +1994,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
[[package]]
-name = "glow"
-version = "0.12.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8edf6019dff2d92ad27c1e3ff82ad50a0aea5b01370353cc928bfdc33e95925c"
-dependencies = [
- "js-sys",
- "slotmap",
- "wasm-bindgen",
- "web-sys",
-]
-
-[[package]]
-name = "gpu-alloc"
-version = "0.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7fc59e5f710e310e76e6707f86c561dd646f69a8876da9131703b2f717de818d"
-dependencies = [
- "bitflags",
- "gpu-alloc-types",
-]
-
-[[package]]
-name = "gpu-alloc-types"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "54804d0d6bc9d7f26db4eaec1ad10def69b599315f487d32c334a80d1efe67a5"
-dependencies = [
- "bitflags",
-]
-
-[[package]]
-name = "gpu-descriptor"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b0c02e1ba0bdb14e965058ca34e09c020f8e507a760df1121728e0aef68d57a"
-dependencies = [
- "bitflags",
- "gpu-descriptor-types",
- "hashbrown",
-]
-
-[[package]]
-name = "gpu-descriptor-types"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "363e3677e55ad168fef68cf9de3a4a310b53124c5e784c53a1d70e92d23f2126"
-dependencies = [
- "bitflags",
-]
-
-[[package]]
name = "group"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2159,9 +2006,9 @@ dependencies = [
[[package]]
name = "h2"
-version = "0.3.15"
+version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4"
+checksum = "5be7b54589b581f624f566bf5d8eb2bab1db736c51528720b6bd36b96b55924d"
dependencies = [
"bytes",
"fnv",
@@ -2225,12 +2072,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
[[package]]
-name = "hexf-parse"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df"
-
-[[package]]
name = "hkdf"
version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2449,9 +2290,9 @@ dependencies = [
[[package]]
name = "io-lifetimes"
-version = "1.0.5"
+version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1abeb7a0dd0f8181267ff8adc397075586500b81b28a73e8a0208b00fc170fb3"
+checksum = "cfa919a82ea574332e2de6e74b4c36e74d41982b335080fa59d4ef31be20fdf3"
dependencies = [
"libc",
"windows-sys 0.45.0",
@@ -2477,15 +2318,15 @@ checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146"
[[package]]
name = "is-macro"
-version = "0.2.1"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1c068d4c6b922cd6284c609cfa6dec0e41615c9c5a1a4ba729a970d8daba05fb"
+checksum = "8a7d079e129b77477a49c5c4f1cfe9ce6c2c909ef52520693e8e811a714c7b20"
dependencies = [
"Inflector",
"pmutil",
"proc-macro2 1.0.51",
"quote 1.0.23",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -2499,15 +2340,15 @@ dependencies = [
[[package]]
name = "itoa"
-version = "1.0.5"
+version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440"
+checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
[[package]]
name = "jobserver"
-version = "0.1.25"
+version = "0.1.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "068b1ee6743e4d11fb9c6a1e6064b3693a1b600e7f5f5988047d98b3dc9fb90b"
+checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2"
dependencies = [
"libc",
]
@@ -2550,17 +2391,6 @@ dependencies = [
]
[[package]]
-name = "khronos-egl"
-version = "4.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c2352bd1d0bceb871cb9d40f24360c8133c11d7486b68b5381c1dd1a32015e3"
-dependencies = [
- "libc",
- "libloading",
- "pkg-config",
-]
-
-[[package]]
name = "kqueue"
version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2778,15 +2608,6 @@ dependencies = [
]
[[package]]
-name = "malloc_buf"
-version = "0.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb"
-dependencies = [
- "libc",
-]
-
-[[package]]
name = "match_cfg"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2824,9 +2645,9 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
[[package]]
name = "memmap2"
-version = "0.5.8"
+version = "0.5.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b182332558b18d807c4ce1ca8ca983b34c3ee32765e47b3f0f69b90355cc1dc"
+checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327"
dependencies = [
"libc",
]
@@ -2841,20 +2662,6 @@ dependencies = [
]
[[package]]
-name = "metal"
-version = "0.24.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de11355d1f6781482d027a3b4d4de7825dcedb197bf573e0596d00008402d060"
-dependencies = [
- "bitflags",
- "block",
- "core-graphics-types",
- "foreign-types",
- "log",
- "objc",
-]
-
-[[package]]
name = "mime"
version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2880,14 +2687,14 @@ dependencies = [
[[package]]
name = "mio"
-version = "0.8.5"
+version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de"
+checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9"
dependencies = [
"libc",
"log",
"wasi 0.11.0+wasi-snapshot-preview1",
- "windows-sys 0.42.0",
+ "windows-sys 0.45.0",
]
[[package]]
@@ -2906,27 +2713,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1120c1ab92ab8cdacb3b89ac9a214f512d2e78e90e3b57c00d9551ced19f646f"
[[package]]
-name = "naga"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5eafe22a23b797c9bc227c6c896419b26b5bb88fa903417a3adaed08778850d5"
-dependencies = [
- "bit-set",
- "bitflags",
- "codespan-reporting",
- "hexf-parse",
- "indexmap",
- "log",
- "num-traits",
- "rustc-hash",
- "serde",
- "spirv",
- "termcolor",
- "thiserror",
- "unicode-xid 0.2.4",
-]
-
-[[package]]
name = "napi-build"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2949,7 +2735,7 @@ dependencies = [
"quote 1.0.23",
"serde",
"serde_json",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -2990,15 +2776,6 @@ dependencies = [
]
[[package]]
-name = "nom8"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae01545c9c7fc4486ab7debaf2aad7003ac19431791868fb2e8066df97fad2f8"
-dependencies = [
- "memchr",
-]
-
-[[package]]
name = "notify"
version = "5.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3096,25 +2873,6 @@ dependencies = [
]
[[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 = "object"
version = "0.30.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3329,7 +3087,7 @@ dependencies = [
"proc-macro-hack",
"proc-macro2 1.0.51",
"quote 1.0.23",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -3358,7 +3116,7 @@ checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55"
dependencies = [
"proc-macro2 1.0.51",
"quote 1.0.23",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -3409,7 +3167,7 @@ checksum = "3894e5d549cccbe44afecf72922f277f603cd4bb0219c8342631ef18fffbe004"
dependencies = [
"proc-macro2 1.0.51",
"quote 1.0.23",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -3450,19 +3208,19 @@ dependencies = [
[[package]]
name = "prettyplease"
-version = "0.1.23"
+version = "0.1.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e97e3215779627f01ee256d2fad52f3d95e8e1c11e9fc6fd08f7cd455d5d5c78"
+checksum = "4ebcd279d20a4a0a2404a33056388e950504d891c855c7975b9a8fef75f3bf04"
dependencies = [
"proc-macro2 1.0.51",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
name = "proc-macro-crate"
-version = "1.3.0"
+version = "1.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "66618389e4ec1c7afe67d51a9bf34ff9236480f8d51e7489b7d5ab0303c13f34"
+checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919"
dependencies = [
"once_cell",
"toml_edit",
@@ -3477,7 +3235,7 @@ dependencies = [
"proc-macro-error-attr",
"proc-macro2 1.0.51",
"quote 1.0.23",
- "syn 1.0.107",
+ "syn 1.0.109",
"version_check",
]
@@ -3517,12 +3275,6 @@ dependencies = [
]
[[package]]
-name = "profiling"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74605f360ce573babfe43964cbe520294dcb081afbf8c108fc6e23036b4da2df"
-
-[[package]]
name = "pty2"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3623,21 +3375,6 @@ dependencies = [
]
[[package]]
-name = "range-alloc"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "63e935c45e09cc6dcf00d2f0b2d630a58f4095320223d47fc68918722f0538b6"
-
-[[package]]
-name = "raw-window-handle"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed7e3d950b66e19e0c372f3fa3fbbcf85b1746b571f74e0c2af6042a5c93420a"
-dependencies = [
- "cty",
-]
-
-[[package]]
name = "redox_syscall"
version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3665,9 +3402,9 @@ checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
[[package]]
name = "relative-path"
-version = "1.7.3"
+version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3bf6b372449361333ac1f498b7edae4dd5e70dccd7c0c2a7c7bce8f05ede648"
+checksum = "4bf2521270932c3c7bed1a59151222bd7643c79310f2916f01925e1e16255698"
[[package]]
name = "reqwest"
@@ -3758,17 +3495,6 @@ dependencies = [
]
[[package]]
-name = "ron"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "300a51053b1cb55c80b7a9fde4120726ddf25ca241a1cbb926626f62fb136bff"
-dependencies = [
- "base64 0.13.1",
- "bitflags",
- "serde",
-]
-
-[[package]]
name = "rsa"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3835,9 +3561,9 @@ dependencies = [
[[package]]
name = "rustix"
-version = "0.36.8"
+version = "0.36.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f43abb88211988493c1abb44a70efa56ff0ce98f233b7b276146f1f3f7ba9644"
+checksum = "fd5c6ff11fecd55b40746d1995a02f2eb375bf8c00d192d521ee09f42bef37bc"
dependencies = [
"bitflags",
"errno",
@@ -3882,9 +3608,9 @@ dependencies = [
[[package]]
name = "rustversion"
-version = "1.0.11"
+version = "1.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5583e89e108996506031660fe09baa5011b9dd0341b89029313006d1fb508d70"
+checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06"
[[package]]
name = "rustyline"
@@ -3916,14 +3642,14 @@ checksum = "107c3d5d7f370ac09efa62a78375f94d94b8a33c61d8c278b96683fb4dbf2d8d"
dependencies = [
"proc-macro2 1.0.51",
"quote 1.0.23",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
name = "ryu"
-version = "1.0.12"
+version = "1.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde"
+checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041"
[[package]]
name = "same-file"
@@ -4025,9 +3751,9 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
[[package]]
name = "serde"
-version = "1.0.152"
+version = "1.0.154"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb"
+checksum = "8cdd151213925e7f1ab45a9bbfb129316bd00799784b174b7cc7bcd16961c49e"
dependencies = [
"serde_derive",
]
@@ -4053,20 +3779,20 @@ dependencies = [
[[package]]
name = "serde_derive"
-version = "1.0.152"
+version = "1.0.154"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e"
+checksum = "4fc80d722935453bcafdc2c9a73cd6fac4dc1938f0346035d84bf99fa9e33217"
dependencies = [
"proc-macro2 1.0.51",
"quote 1.0.23",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
name = "serde_json"
-version = "1.0.92"
+version = "1.0.94"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7434af0dc1cbd59268aa98b4c22c131c0584d2232f6fb166efb993e2832e896a"
+checksum = "1c533a59c9d8a93a09c6ab31f0fd5e5f4dd1b8fc9434804029839884765d04ea"
dependencies = [
"indexmap",
"itoa",
@@ -4082,7 +3808,7 @@ checksum = "1fe39d9fbb0ebf5eb2c7cb7e2a47e4f462fad1379f1166b8ae49ad9eae89a7ca"
dependencies = [
"proc-macro2 1.0.51",
"quote 1.0.23",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -4176,9 +3902,9 @@ checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f"
[[package]]
name = "signal-hook-registry"
-version = "1.4.0"
+version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0"
+checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1"
dependencies = [
"libc",
]
@@ -4201,23 +3927,14 @@ checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de"
[[package]]
name = "slab"
-version = "0.4.7"
+version = "0.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef"
+checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d"
dependencies = [
"autocfg",
]
[[package]]
-name = "slotmap"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342"
-dependencies = [
- "version_check",
-]
-
-[[package]]
name = "smallvec"
version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4225,9 +3942,9 @@ checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
[[package]]
name = "socket2"
-version = "0.4.7"
+version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd"
+checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662"
dependencies = [
"libc",
"winapi",
@@ -4235,11 +3952,11 @@ dependencies = [
[[package]]
name = "sourcemap"
-version = "6.2.1"
+version = "6.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aebe057d110ddba043708da3fb010bf562ff6e9d4d60c9ee92860527bcbeccd6"
+checksum = "eed16231c92d0a6f0388f56e0ab2be24ecff1173f8e22f0ea5e074d0525631cb"
dependencies = [
- "base64 0.13.1",
+ "data-encoding",
"if_chain",
"rustc_version 0.2.3",
"serde",
@@ -4255,16 +3972,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
[[package]]
-name = "spirv"
-version = "0.2.0+1.5.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "246bfa38fe3db3f1dfc8ca5a2cdeb7348c78be2112740cc0ec8ef18b6d94f830"
-dependencies = [
- "bitflags",
- "num-traits",
-]
-
-[[package]]
name = "spki"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4294,9 +4001,9 @@ checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0"
[[package]]
name = "string_cache"
-version = "0.8.4"
+version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "213494b7a2b503146286049378ce02b482200519accc31872ee8be91fa820a08"
+checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b"
dependencies = [
"new_debug_unreachable",
"once_cell",
@@ -4328,7 +4035,7 @@ dependencies = [
"proc-macro2 1.0.51",
"quote 1.0.23",
"swc_macros_common",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -4438,7 +4145,7 @@ dependencies = [
"proc-macro2 1.0.51",
"quote 1.0.23",
"swc_macros_common",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -4487,7 +4194,7 @@ dependencies = [
"proc-macro2 1.0.51",
"quote 1.0.23",
"swc_macros_common",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -4581,7 +4288,7 @@ dependencies = [
"proc-macro2 1.0.51",
"quote 1.0.23",
"swc_macros_common",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -4711,7 +4418,7 @@ dependencies = [
"pmutil",
"proc-macro2 1.0.51",
"quote 1.0.23",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -4748,7 +4455,7 @@ dependencies = [
"pmutil",
"proc-macro2 1.0.51",
"quote 1.0.23",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -4772,7 +4479,7 @@ dependencies = [
"proc-macro2 1.0.51",
"quote 1.0.23",
"swc_macros_common",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -4788,9 +4495,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "1.0.107"
+version = "1.0.109"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
dependencies = [
"proc-macro2 1.0.51",
"quote 1.0.23",
@@ -4805,7 +4512,7 @@ checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
dependencies = [
"proc-macro2 1.0.51",
"quote 1.0.23",
- "syn 1.0.107",
+ "syn 1.0.109",
"unicode-xid 0.2.4",
]
@@ -4907,7 +4614,7 @@ dependencies = [
"quote 1.0.23",
"regex",
"relative-path",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -4948,14 +4655,14 @@ checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f"
dependencies = [
"proc-macro2 1.0.51",
"quote 1.0.23",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
name = "time"
-version = "0.3.17"
+version = "0.3.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376"
+checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890"
dependencies = [
"serde",
"time-core",
@@ -5010,7 +4717,7 @@ checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8"
dependencies = [
"proc-macro2 1.0.51",
"quote 1.0.23",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -5038,9 +4745,9 @@ dependencies = [
[[package]]
name = "tokio-stream"
-version = "0.1.11"
+version = "0.1.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d660770404473ccd7bc9f8b28494a811bc18542b915c0855c51e8f419d5223ce"
+checksum = "8fb52b74f05dbf495a8fba459fdc331812b96aa086d9eb78101fa0d4569c3313"
dependencies = [
"futures-core",
"pin-project-lite",
@@ -5065,9 +4772,9 @@ dependencies = [
[[package]]
name = "tokio-util"
-version = "0.7.4"
+version = "0.7.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740"
+checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2"
dependencies = [
"bytes",
"futures-core",
@@ -5088,19 +4795,19 @@ dependencies = [
[[package]]
name = "toml_datetime"
-version = "0.5.1"
+version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4553f467ac8e3d374bc9a177a26801e5d0f9b211aa1673fb137a403afd1c9cf5"
+checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622"
[[package]]
name = "toml_edit"
-version = "0.18.1"
+version = "0.19.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56c59d8dd7d0dcbc6428bf7aa2f0e823e26e43b3c9aca15bbc9475d23e5fa12b"
+checksum = "9a1eb0622d28f4b9c90adc4ea4b2b46b47663fde9ac5fafcb14a1369d5508825"
dependencies = [
"indexmap",
- "nom8",
"toml_datetime",
+ "winnow",
]
[[package]]
@@ -5154,7 +4861,7 @@ checksum = "7ebd99eec668d0a450c177acbc4d05e0d0d13b1f8d3db13cd706c52cbec4ac04"
dependencies = [
"proc-macro2 1.0.51",
"quote 1.0.23",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -5183,7 +4890,7 @@ checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a"
dependencies = [
"proc-macro2 1.0.51",
"quote 1.0.23",
- "syn 1.0.107",
+ "syn 1.0.109",
]
[[package]]
@@ -5302,9 +5009,9 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed"
[[package]]
name = "trybuild"
-version = "1.0.77"
+version = "1.0.79"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a44da5a6f2164c8e14d3bbc0657d69c5966af9f5f6930d4f600b1f5c4a673413"
+checksum = "db3115bddce1b5f52dd4b5e0ec8298a66ce733e4cc6759247dc2d1c11508ec38"
dependencies = [
"basic-toml",
"glob",
@@ -5411,9 +5118,9 @@ dependencies = [
[[package]]
name = "unicode-bidi"
-version = "0.3.10"
+version = "0.3.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d54675592c1dbefd78cbd98db9bacd89886e1ca50692a0692baefffdeb92dd58"
+checksum = "524b68aca1d05e03fdf03fcdce2c6c94b6daf6d16861ddaa7e4f2b6638a9052c"
[[package]]
name = "unicode-id"
@@ -5423,9 +5130,9 @@ checksum = "d70b6494226b36008c8366c288d77190b3fad2eb4c10533139c1c1f461127f1a"
[[package]]
name = "unicode-ident"
-version = "1.0.6"
+version = "1.0.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc"
+checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4"
[[package]]
name = "unicode-normalization"
@@ -5628,7 +5335,7 @@ dependencies = [
"once_cell",
"proc-macro2 1.0.51",
"quote 1.0.23",
- "syn 1.0.107",
+ "syn 1.0.109",
"wasm-bindgen-shared",
]
@@ -5662,7 +5369,7 @@ checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6"
dependencies = [
"proc-macro2 1.0.51",
"quote 1.0.23",
- "syn 1.0.107",
+ "syn 1.0.109",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
@@ -5716,82 +5423,6 @@ dependencies = [
]
[[package]]
-name = "wgpu-core"
-version = "0.15.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be1f61be28e557a6ecb2506cac06c63fae3b6d302a006f38195a7a80995abeb9"
-dependencies = [
- "arrayvec",
- "bit-vec",
- "bitflags",
- "codespan-reporting",
- "fxhash",
- "log",
- "naga",
- "parking_lot 0.12.1",
- "profiling",
- "raw-window-handle",
- "ron",
- "serde",
- "smallvec",
- "thiserror",
- "web-sys",
- "wgpu-hal",
- "wgpu-types",
-]
-
-[[package]]
-name = "wgpu-hal"
-version = "0.15.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "82e95792925fe3d58950b9a5c2a191caa145e2bc570e2d233f0d7320f6a8e814"
-dependencies = [
- "android_system_properties",
- "arrayvec",
- "ash",
- "bit-set",
- "bitflags",
- "block",
- "core-graphics-types",
- "d3d12",
- "foreign-types",
- "fxhash",
- "glow",
- "gpu-alloc",
- "gpu-descriptor",
- "js-sys",
- "khronos-egl",
- "libc",
- "libloading",
- "log",
- "metal",
- "naga",
- "objc",
- "parking_lot 0.12.1",
- "profiling",
- "range-alloc",
- "raw-window-handle",
- "smallvec",
- "thiserror",
- "wasm-bindgen",
- "web-sys",
- "wgpu-types",
- "winapi",
-]
-
-[[package]]
-name = "wgpu-types"
-version = "0.15.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ecf8cfcbf98f94cc8bd5981544c687140cf9d3948e2ab83849367ead2cd737cf"
-dependencies = [
- "bitflags",
- "js-sys",
- "serde",
- "web-sys",
-]
-
-[[package]]
name = "which"
version = "4.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -5921,6 +5552,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd"
[[package]]
+name = "winnow"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee7b2c67f962bf5042bfd8b6a916178df33a26eec343ae064cb8e069f638fa6f"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
name = "winreg"
version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -5981,7 +5621,7 @@ checksum = "44bf07cb3e50ea2003396695d58bf46bc9887a1f362260446fad6bc4e79bd36c"
dependencies = [
"proc-macro2 1.0.51",
"quote 1.0.23",
- "syn 1.0.107",
+ "syn 1.0.109",
"synstructure",
]
@@ -6006,9 +5646,9 @@ dependencies = [
[[package]]
name = "zstd-sys"
-version = "2.0.6+zstd.1.5.2"
+version = "2.0.7+zstd.1.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68a3f9792c0c3dc6c165840a75f47ae1f4da402c2d006881129579f6597e801b"
+checksum = "94509c3ba2fe55294d752b79842c530ccfab760192521df74a081a78d2b3c7f5"
dependencies = [
"cc",
"libc",
diff --git a/Cargo.toml b/Cargo.toml
index 784f65af0..5c6d3f56a 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -27,7 +27,6 @@ members = [
"ext/node",
"ext/url",
"ext/web",
- "ext/webgpu",
"ext/webidl",
"ext/websocket",
"ext/webstorage",
@@ -71,7 +70,6 @@ deno_node = { version = "0.30.0", path = "./ext/node" }
deno_tls = { version = "0.80.0", path = "./ext/tls" }
deno_url = { version = "0.93.0", path = "./ext/url" }
deno_web = { version = "0.124.0", path = "./ext/web" }
-deno_webgpu = { version = "0.94.0", path = "./ext/webgpu" }
deno_webidl = { version = "0.93.0", path = "./ext/webidl" }
deno_websocket = { version = "0.98.0", path = "./ext/websocket" }
deno_webstorage = { version = "0.88.0", path = "./ext/webstorage" }
@@ -136,11 +134,6 @@ zstd = "=0.11.2"
# crypto
rsa = { version = "0.7.0", default-features = false, features = ["std", "pem"] }
-# webgpu
-raw-window-handle = "0.5.0"
-wgpu-core = "0.15"
-wgpu-types = "0.15"
-
# macros
proc-macro2 = "1"
quote = "1"
diff --git a/cli/args/flags.rs b/cli/args/flags.rs
index c1e422da3..0b1ba8c50 100644
--- a/cli/args/flags.rs
+++ b/cli/args/flags.rs
@@ -602,7 +602,6 @@ static ENV_VARIABLES_HELP: &str = r#"ENVIRONMENT VARIABLES:
DENO_NO_UPDATE_CHECK Set to disable checking if a newer Deno version is
available
DENO_V8_FLAGS Set V8 command line options
- DENO_WEBGPU_TRACE Directory to use for wgpu traces
DENO_JOBS Number of parallel workers used for the --parallel
flag with the test subcommand. Defaults to number
of available CPUs.
diff --git a/cli/build.rs b/cli/build.rs
index fdf57809a..5b2c5fbb4 100644
--- a/cli/build.rs
+++ b/cli/build.rs
@@ -1,7 +1,6 @@
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
use std::env;
-use std::path::Path;
use std::path::PathBuf;
use deno_core::include_js_files;
@@ -15,7 +14,6 @@ use deno_runtime::*;
mod ts {
use super::*;
- use crate::deno_webgpu_get_declaration;
use deno_core::error::custom_error;
use deno_core::error::AnyError;
use deno_core::op;
@@ -43,7 +41,6 @@ mod ts {
op_crate_libs.insert("deno.url", deno_url::get_declaration());
op_crate_libs.insert("deno.web", deno_web::get_declaration());
op_crate_libs.insert("deno.fetch", deno_fetch::get_declaration());
- op_crate_libs.insert("deno.webgpu", deno_webgpu_get_declaration());
op_crate_libs.insert("deno.websocket", deno_websocket::get_declaration());
op_crate_libs.insert("deno.webstorage", deno_webstorage::get_declaration());
op_crate_libs.insert("deno.crypto", deno_crypto::get_declaration());
@@ -323,7 +320,6 @@ fn create_cli_snapshot(snapshot_path: PathBuf) {
deno_websocket::init_ops::<PermissionsContainer>("".to_owned(), None, None),
deno_webstorage::init_ops(None),
deno_crypto::init_ops(None),
- deno_webgpu::init_ops(false),
deno_broadcast_channel::init_ops(
deno_broadcast_channel::InMemoryBroadcastChannel::default(),
false, // No --unstable.
@@ -489,11 +485,3 @@ fn main() {
res.compile().unwrap();
}
}
-
-fn deno_webgpu_get_declaration() -> PathBuf {
- let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR"));
- manifest_dir
- .join("tsc")
- .join("dts")
- .join("lib.deno_webgpu.d.ts")
-}
diff --git a/cli/js/40_testing.js b/cli/js/40_testing.js
index c0b5367f8..bcb5990a9 100644
--- a/cli/js/40_testing.js
+++ b/cli/js/40_testing.js
@@ -124,9 +124,6 @@ const OP_DETAILS = {
"op_tls_start": ["start a TLS connection", "awaiting a `Deno.startTls` call"],
"op_truncate_async": ["truncate a file", "awaiting the result of a `Deno.truncate` call"],
"op_utime_async": ["change file timestamps", "awaiting the result of a `Deno.utime` call"],
- "op_webgpu_buffer_get_map_async": ["map a WebGPU buffer", "awaiting the result of a `GPUBuffer#mapAsync` call"],
- "op_webgpu_request_adapter": ["request a WebGPU adapter", "awaiting the result of a `navigator.gpu.requestAdapter` call"],
- "op_webgpu_request_device": ["request a WebGPU device", "awaiting the result of a `GPUAdapter#requestDevice` call"],
"op_worker_recv_message": ["receive a message from a web worker", "terminating a `Worker`"],
"op_ws_close": ["close a WebSocket", "awaiting until the `close` event is emitted on a `WebSocket`, or the `WebSocketStream#closed` promise resolves"],
"op_ws_create": ["create a WebSocket", "awaiting until the `open` event is emitted on a `WebSocket`, or the result of a `WebSocketStream#connection` promise"],
diff --git a/cli/tests/testdata/webgpu/computepass_shader.wgsl b/cli/tests/testdata/webgpu/computepass_shader.wgsl
deleted file mode 100644
index 41af4363a..000000000
--- a/cli/tests/testdata/webgpu/computepass_shader.wgsl
+++ /dev/null
@@ -1,38 +0,0 @@
-@group(0)
-@binding(0)
-var<storage, read_write> v_indices: array<u32>; // this is used as both input and output for convenience
-
-// The Collatz Conjecture states that for any integer n:
-// If n is even, n = n/2
-// If n is odd, n = 3n+1
-// And repeat this process for each new n, you will always eventually reach 1.
-// Though the conjecture has not been proven, no counterexample has ever been found.
-// This function returns how many times this recurrence needs to be applied to reach 1.
-fn collatz_iterations(n_base: u32) -> u32{
- var n: u32 = n_base;
- var i: u32 = 0u;
- loop {
- if (n <= 1u) {
- break;
- }
- if (n % 2u == 0u) {
- n = n / 2u;
- }
- else {
- // Overflow? (i.e. 3*n + 1 > 0xffffffffu?)
- if (n >= 1431655765u) { // 0x55555555u
- return 4294967295u; // 0xffffffffu
- }
-
- n = 3u * n + 1u;
- }
- i = i + 1u;
- }
- return i;
-}
-
-@compute
-@workgroup_size(1)
-fn main(@builtin(global_invocation_id) global_id: vec3<u32>) {
- v_indices[global_id.x] = collatz_iterations(v_indices[global_id.x]);
-}
diff --git a/cli/tests/testdata/webgpu/hellotriangle.out b/cli/tests/testdata/webgpu/hellotriangle.out
deleted file mode 100644
index 91454dbfc..000000000
--- a/cli/tests/testdata/webgpu/hellotriangle.out
+++ /dev/null
Binary files differ
diff --git a/cli/tests/testdata/webgpu/hellotriangle_shader.wgsl b/cli/tests/testdata/webgpu/hellotriangle_shader.wgsl
deleted file mode 100644
index f84ccfe94..000000000
--- a/cli/tests/testdata/webgpu/hellotriangle_shader.wgsl
+++ /dev/null
@@ -1,11 +0,0 @@
-@vertex
-fn vs_main(@builtin(vertex_index) in_vertex_index: u32) -> @builtin(position) vec4<f32> {
- let x = f32(i32(in_vertex_index) - 1);
- let y = f32(i32(in_vertex_index & 1u) * 2 - 1);
- return vec4<f32>(x, y, 0.0, 1.0);
-}
-
-@fragment
-fn fs_main() -> @location(0) vec4<f32> {
- return vec4<f32>(1.0, 0.0, 0.0, 1.0);
-}
diff --git a/cli/tests/unit/webgpu_test.ts b/cli/tests/unit/webgpu_test.ts
deleted file mode 100644
index 2d98167cf..000000000
--- a/cli/tests/unit/webgpu_test.ts
+++ /dev/null
@@ -1,242 +0,0 @@
-// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
-
-import { assert, assertEquals } from "./test_util.ts";
-
-let isCI: boolean;
-try {
- isCI = (Deno.env.get("CI")?.length ?? 0) > 0;
-} catch {
- isCI = true;
-}
-
-// Skip these tests on linux CI, because the vulkan emulator is not good enough
-// yet, and skip on macOS CI because these do not have virtual GPUs.
-const isLinuxOrMacCI =
- (Deno.build.os === "linux" || Deno.build.os === "darwin") && isCI;
-// Skip these tests in WSL because it doesn't have good GPU support.
-const isWsl = await checkIsWsl();
-
-Deno.test({
- permissions: { read: true, env: true },
- ignore: isWsl || isLinuxOrMacCI,
-}, async function webgpuComputePass() {
- const adapter = await navigator.gpu.requestAdapter();
- assert(adapter);
-
- const numbers = [1, 4, 3, 295];
-
- const device = await adapter.requestDevice();
- assert(device);
-
- const shaderCode = await Deno.readTextFile(
- "cli/tests/testdata/webgpu/computepass_shader.wgsl",
- );
-
- const shaderModule = device.createShaderModule({
- code: shaderCode,
- });
-
- const size = new Uint32Array(numbers).byteLength;
-
- const stagingBuffer = device.createBuffer({
- size: size,
- usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,
- });
-
- const storageBuffer = device.createBuffer({
- label: "Storage Buffer",
- size: size,
- usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST |
- GPUBufferUsage.COPY_SRC,
- mappedAtCreation: true,
- });
-
- const buf = new Uint32Array(storageBuffer.getMappedRange());
-
- buf.set(numbers);
-
- storageBuffer.unmap();
-
- const computePipeline = device.createComputePipeline({
- layout: "auto",
- compute: {
- module: shaderModule,
- entryPoint: "main",
- },
- });
- const bindGroupLayout = computePipeline.getBindGroupLayout(0);
-
- const bindGroup = device.createBindGroup({
- layout: bindGroupLayout,
- entries: [
- {
- binding: 0,
- resource: {
- buffer: storageBuffer,
- },
- },
- ],
- });
-
- const encoder = device.createCommandEncoder();
-
- const computePass = encoder.beginComputePass();
- computePass.setPipeline(computePipeline);
- computePass.setBindGroup(0, bindGroup);
- computePass.insertDebugMarker("compute collatz iterations");
- computePass.dispatchWorkgroups(numbers.length);
- computePass.end();
-
- encoder.copyBufferToBuffer(storageBuffer, 0, stagingBuffer, 0, size);
-
- device.queue.submit([encoder.finish()]);
-
- await stagingBuffer.mapAsync(1);
-
- const data = stagingBuffer.getMappedRange();
-
- assertEquals(new Uint32Array(data), new Uint32Array([0, 2, 7, 55]));
-
- stagingBuffer.unmap();
-
- device.destroy();
-
- // TODO(lucacasonato): webgpu spec should add a explicit destroy method for
- // adapters.
- const resources = Object.keys(Deno.resources());
- Deno.close(Number(resources[resources.length - 1]));
-});
-
-Deno.test({
- permissions: { read: true, env: true },
- ignore: isWsl || isLinuxOrMacCI,
-}, async function webgpuHelloTriangle() {
- const adapter = await navigator.gpu.requestAdapter();
- assert(adapter);
-
- const device = await adapter.requestDevice();
- assert(device);
-
- const shaderCode = await Deno.readTextFile(
- "cli/tests/testdata/webgpu/hellotriangle_shader.wgsl",
- );
-
- const shaderModule = device.createShaderModule({
- code: shaderCode,
- });
-
- const pipelineLayout = device.createPipelineLayout({
- bindGroupLayouts: [],
- });
-
- const renderPipeline = device.createRenderPipeline({
- layout: pipelineLayout,
- vertex: {
- module: shaderModule,
- entryPoint: "vs_main",
- },
- fragment: {
- module: shaderModule,
- entryPoint: "fs_main",
- targets: [
- {
- format: "rgba8unorm-srgb",
- },
- ],
- },
- });
-
- const dimensions = {
- width: 200,
- height: 200,
- };
- const unpaddedBytesPerRow = dimensions.width * 4;
- const align = 256;
- const paddedBytesPerRowPadding = (align - unpaddedBytesPerRow % align) %
- align;
- const paddedBytesPerRow = unpaddedBytesPerRow + paddedBytesPerRowPadding;
-
- const outputBuffer = device.createBuffer({
- label: "Capture",
- size: paddedBytesPerRow * dimensions.height,
- usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,
- });
- const texture = device.createTexture({
- label: "Capture",
- size: dimensions,
- format: "rgba8unorm-srgb",
- usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,
- });
-
- const encoder = device.createCommandEncoder();
- const view = texture.createView();
- const renderPass = encoder.beginRenderPass({
- colorAttachments: [
- {
- view,
- storeOp: "store",
- loadOp: "clear",
- clearValue: [0, 1, 0, 1],
- },
- ],
- });
- renderPass.setPipeline(renderPipeline);
- renderPass.draw(3, 1);
- renderPass.end();
-
- encoder.copyTextureToBuffer(
- {
- texture,
- },
- {
- buffer: outputBuffer,
- bytesPerRow: paddedBytesPerRow,
- rowsPerImage: 0,
- },
- dimensions,
- );
-
- const bundle = encoder.finish();
- device.queue.submit([bundle]);
-
- await outputBuffer.mapAsync(1);
- const data = new Uint8Array(outputBuffer.getMappedRange());
-
- assertEquals(
- data,
- await Deno.readFile("cli/tests/testdata/webgpu/hellotriangle.out"),
- );
-
- outputBuffer.unmap();
-
- device.destroy();
-
- // TODO(lucacasonato): webgpu spec should add a explicit destroy method for
- // adapters.
- const resources = Object.keys(Deno.resources());
- Deno.close(Number(resources[resources.length - 1]));
-});
-
-Deno.test({
- ignore: isWsl || isLinuxOrMacCI,
-}, async function webgpuAdapterHasFeatures() {
- const adapter = await navigator.gpu.requestAdapter();
- assert(adapter);
- assert(adapter.features);
- const resources = Object.keys(Deno.resources());
- Deno.close(Number(resources[resources.length - 1]));
-});
-
-async function checkIsWsl() {
- return Deno.build.os === "linux" && await hasMicrosoftProcVersion();
-
- async function hasMicrosoftProcVersion() {
- // https://github.com/microsoft/WSL/issues/423#issuecomment-221627364
- try {
- const procVersion = await Deno.readTextFile("/proc/version");
- return /microsoft/i.test(procVersion);
- } catch {
- return false;
- }
- }
-}
diff --git a/cli/tsc/dts/lib.deno.window.d.ts b/cli/tsc/dts/lib.deno.window.d.ts
index e9634f80d..d0cd9b5bd 100644
--- a/cli/tsc/dts/lib.deno.window.d.ts
+++ b/cli/tsc/dts/lib.deno.window.d.ts
@@ -3,7 +3,6 @@
/// <reference no-default-lib="true" />
/// <reference lib="deno.ns" />
/// <reference lib="deno.shared_globals" />
-/// <reference lib="deno.webgpu" />
/// <reference lib="deno.webstorage" />
/// <reference lib="esnext" />
/// <reference lib="deno.cache" />
@@ -94,7 +93,6 @@ declare var caches: CacheStorage;
/** @category Web APIs */
declare class Navigator {
constructor();
- readonly gpu: GPU;
readonly hardwareConcurrency: number;
readonly userAgent: string;
readonly language: string;
diff --git a/cli/tsc/dts/lib.deno.worker.d.ts b/cli/tsc/dts/lib.deno.worker.d.ts
index f9684d826..752a427c9 100644
--- a/cli/tsc/dts/lib.deno.worker.d.ts
+++ b/cli/tsc/dts/lib.deno.worker.d.ts
@@ -3,7 +3,6 @@
/// <reference no-default-lib="true" />
/// <reference lib="deno.ns" />
/// <reference lib="deno.shared_globals" />
-/// <reference lib="deno.webgpu" />
/// <reference lib="esnext" />
/// <reference lib="deno.cache" />
@@ -58,7 +57,6 @@ declare class WorkerGlobalScope extends EventTarget {
/** @category Web APIs */
declare class WorkerNavigator {
constructor();
- readonly gpu: GPU;
readonly hardwareConcurrency: number;
readonly userAgent: string;
readonly language: string;
diff --git a/cli/tsc/dts/lib.deno_webgpu.d.ts b/cli/tsc/dts/lib.deno_webgpu.d.ts
deleted file mode 100644
index 150f16bab..000000000
--- a/cli/tsc/dts/lib.deno_webgpu.d.ts
+++ /dev/null
@@ -1,1324 +0,0 @@
-// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
-
-// deno-lint-ignore-file no-explicit-any no-empty-interface
-
-/// <reference no-default-lib="true" />
-/// <reference lib="esnext" />
-
-/** @category WebGPU */
-interface GPUObjectBase {
- label: string;
-}
-
-/** @category WebGPU */
-declare interface GPUObjectDescriptorBase {
- label?: string;
-}
-
-/** @category WebGPU */
-declare class GPUSupportedLimits {
- maxTextureDimension1D?: number;
- maxTextureDimension2D?: number;
- maxTextureDimension3D?: number;
- maxTextureArrayLayers?: number;
- maxBindGroups?: number;
- maxBindingsPerBindGroup?: number;
- maxDynamicUniformBuffersPerPipelineLayout?: number;
- maxDynamicStorageBuffersPerPipelineLayout?: number;
- maxSampledTexturesPerShaderStage?: number;
- maxSamplersPerShaderStage?: number;
- maxStorageBuffersPerShaderStage?: number;
- maxStorageTexturesPerShaderStage?: number;
- maxUniformBuffersPerShaderStage?: number;
- maxUniformBufferBindingSize?: number;
- maxStorageBufferBindingSize?: number;
- minUniformBufferOffsetAlignment?: number;
- minStorageBufferOffsetAlignment?: number;
- maxVertexBuffers?: number;
- maxBufferSize?: number;
- maxVertexAttributes?: number;
- maxVertexBufferArrayStride?: number;
- maxInterStageShaderComponents?: number;
- maxComputeWorkgroupStorageSize?: number;
- maxComputeInvocationsPerWorkgroup?: number;
- maxComputeWorkgroupSizeX?: number;
- maxComputeWorkgroupSizeY?: number;
- maxComputeWorkgroupSizeZ?: number;
- maxComputeWorkgroupsPerDimension?: number;
-}
-
-/** @category WebGPU */
-declare class GPUSupportedFeatures {
- forEach(
- callbackfn: (
- value: GPUFeatureName,
- value2: GPUFeatureName,
- set: Set<GPUFeatureName>,
- ) => void,
- thisArg?: any,
- ): void;
- has(value: GPUFeatureName): boolean;
- size: number;
- [
- Symbol
- .iterator
- ](): IterableIterator<GPUFeatureName>;
- entries(): IterableIterator<[GPUFeatureName, GPUFeatureName]>;
- keys(): IterableIterator<GPUFeatureName>;
- values(): IterableIterator<GPUFeatureName>;
-}
-
-/** @category WebGPU */
-declare class GPUAdapterInfo {
- readonly vendor: string;
- readonly architecture: string;
- readonly device: string;
- readonly description: string;
-}
-
-/** @category WebGPU */
-declare class GPU {
- requestAdapter(
- options?: GPURequestAdapterOptions,
- ): Promise<GPUAdapter | null>;
-}
-
-/** @category WebGPU */
-declare interface GPURequestAdapterOptions {
- powerPreference?: GPUPowerPreference;
- forceFallbackAdapter?: boolean;
-}
-
-/** @category WebGPU */
-declare type GPUPowerPreference = "low-power" | "high-performance";
-
-/** @category WebGPU */
-declare class GPUAdapter {
- readonly features: GPUSupportedFeatures;
- readonly limits: GPUSupportedLimits;
- readonly isFallbackAdapter: boolean;
-
- requestDevice(descriptor?: GPUDeviceDescriptor): Promise<GPUDevice>;
- requestAdapterInfo(unmaskHints?: string[]): Promise<GPUAdapterInfo>;
-}
-
-/** @category WebGPU */
-declare interface GPUDeviceDescriptor extends GPUObjectDescriptorBase {
- requiredFeatures?: GPUFeatureName[];
- requiredLimits?: Record<string, number>;
-}
-
-/** @category WebGPU */
-declare type GPUFeatureName =
- | "depth-clip-control"
- | "depth32float-stencil8"
- | "pipeline-statistics-query"
- | "texture-compression-bc"
- | "texture-compression-etc2"
- | "texture-compression-astc"
- | "timestamp-query"
- | "indirect-first-instance"
- | "shader-f16"
- // extended from spec
- | "mappable-primary-buffers"
- | "sampled-texture-binding-array"
- | "sampled-texture-array-dynamic-indexing"
- | "sampled-texture-array-non-uniform-indexing"
- | "unsized-binding-array"
- | "multi-draw-indirect"
- | "multi-draw-indirect-count"
- | "push-constants"
- | "address-mode-clamp-to-border"
- | "texture-adapter-specific-format-features"
- | "shader-float64"
- | "vertex-attribute-64bit";
-
-/** @category WebGPU */
-declare class GPUDevice extends EventTarget implements GPUObjectBase {
- label: string;
-
- readonly lost: Promise<GPUDeviceLostInfo>;
- pushErrorScope(filter: GPUErrorFilter): undefined;
- popErrorScope(): Promise<GPUError | null>;
-
- readonly features: GPUSupportedFeatures;
- readonly limits: GPUSupportedLimits;
- readonly queue: GPUQueue;
-
- destroy(): undefined;
-
- createBuffer(descriptor: GPUBufferDescriptor): GPUBuffer;
- createTexture(descriptor: GPUTextureDescriptor): GPUTexture;
- createSampler(descriptor?: GPUSamplerDescriptor): GPUSampler;
-
- createBindGroupLayout(
- descriptor: GPUBindGroupLayoutDescriptor,
- ): GPUBindGroupLayout;
- createPipelineLayout(
- descriptor: GPUPipelineLayoutDescriptor,
- ): GPUPipelineLayout;
- createBindGroup(descriptor: GPUBindGroupDescriptor): GPUBindGroup;
-
- createShaderModule(descriptor: GPUShaderModuleDescriptor): GPUShaderModule;
- createComputePipeline(
- descriptor: GPUComputePipelineDescriptor,
- ): GPUComputePipeline;
- createRenderPipeline(
- descriptor: GPURenderPipelineDescriptor,
- ): GPURenderPipeline;
- createComputePipelineAsync(
- descriptor: GPUComputePipelineDescriptor,
- ): Promise<GPUComputePipeline>;
- createRenderPipelineAsync(
- descriptor: GPURenderPipelineDescriptor,
- ): Promise<GPURenderPipeline>;
-
- createCommandEncoder(
- descriptor?: GPUCommandEncoderDescriptor,
- ): GPUCommandEncoder;
- createRenderBundleEncoder(
- descriptor: GPURenderBundleEncoderDescriptor,
- ): GPURenderBundleEncoder;
-
- createQuerySet(descriptor: GPUQuerySetDescriptor): GPUQuerySet;
-}
-
-/** @category WebGPU */
-declare class GPUBuffer implements GPUObjectBase {
- label: string;
-
- readonly size: number;
- readonly usage: GPUBufferUsageFlags;
- readonly mapState: GPUBufferMapState;
-
- mapAsync(
- mode: GPUMapModeFlags,
- offset?: number,
- size?: number,
- ): Promise<undefined>;
- getMappedRange(offset?: number, size?: number): ArrayBuffer;
- unmap(): undefined;
-
- destroy(): undefined;
-}
-
-/** @category WebGPU */
-declare type GPUBufferMapState = "unmapped" | "pending" | "mapped";
-
-/** @category WebGPU */
-declare interface GPUBufferDescriptor extends GPUObjectDescriptorBase {
- size: number;
- usage: GPUBufferUsageFlags;
- mappedAtCreation?: boolean;
-}
-
-/** @category WebGPU */
-declare type GPUBufferUsageFlags = number;
-
-/** @category WebGPU */
-declare class GPUBufferUsage {
- static MAP_READ: 0x0001;
- static MAP_WRITE: 0x0002;
- static COPY_SRC: 0x0004;
- static COPY_DST: 0x0008;
- static INDEX: 0x0010;
- static VERTEX: 0x0020;
- static UNIFORM: 0x0040;
- static STORAGE: 0x0080;
- static INDIRECT: 0x0100;
- static QUERY_RESOLVE: 0x0200;
-}
-
-/** @category WebGPU */
-declare type GPUMapModeFlags = number;
-
-/** @category WebGPU */
-declare class GPUMapMode {
- static READ: 0x0001;
- static WRITE: 0x0002;
-}
-
-/** @category WebGPU */
-declare class GPUTexture implements GPUObjectBase {
- label: string;
-
- createView(descriptor?: GPUTextureViewDescriptor): GPUTextureView;
- destroy(): undefined;
-
- readonly width: number;
- readonly height: number;
- readonly depthOrArrayLayers: number;
- readonly mipLevelCount: number;
- readonly sampleCount: number;
- readonly dimension: GPUTextureDimension;
- readonly format: GPUTextureFormat;
- readonly usage: GPUTextureUsageFlags;
-}
-
-/** @category WebGPU */
-declare interface GPUTextureDescriptor extends GPUObjectDescriptorBase {
- size: GPUExtent3D;
- mipLevelCount?: number;
- sampleCount?: number;
- dimension?: GPUTextureDimension;
- format: GPUTextureFormat;
- usage: GPUTextureUsageFlags;
- viewFormats?: GPUTextureFormat[];
-}
-
-/** @category WebGPU */
-declare type GPUTextureDimension = "1d" | "2d" | "3d";
-
-/** @category WebGPU */
-declare type GPUTextureUsageFlags = number;
-
-/** @category WebGPU */
-declare class GPUTextureUsage {
- static COPY_SRC: 0x01;
- static COPY_DST: 0x02;
- static TEXTURE_BINDING: 0x04;
- static STORAGE_BINDING: 0x08;
- static RENDER_ATTACHMENT: 0x10;
-}
-
-/** @category WebGPU */
-declare class GPUTextureView implements GPUObjectBase {
- label: string;
-}
-
-/** @category WebGPU */
-declare interface GPUTextureViewDescriptor extends GPUObjectDescriptorBase {
- format?: GPUTextureFormat;
- dimension?: GPUTextureViewDimension;
- aspect?: GPUTextureAspect;
- baseMipLevel?: number;
- mipLevelCount?: number;
- baseArrayLayer?: number;
- arrayLayerCount?: number;
-}
-
-/** @category WebGPU */
-declare type GPUTextureViewDimension =
- | "1d"
- | "2d"
- | "2d-array"
- | "cube"
- | "cube-array"
- | "3d";
-
-/** @category WebGPU */
-declare type GPUTextureAspect = "all" | "stencil-only" | "depth-only";
-
-/** @category WebGPU */
-declare type GPUTextureFormat =
- | "r8unorm"
- | "r8snorm"
- | "r8uint"
- | "r8sint"
- | "r16uint"
- | "r16sint"
- | "r16float"
- | "rg8unorm"
- | "rg8snorm"
- | "rg8uint"
- | "rg8sint"
- | "r32uint"
- | "r32sint"
- | "r32float"
- | "rg16uint"
- | "rg16sint"
- | "rg16float"
- | "rgba8unorm"
- | "rgba8unorm-srgb"
- | "rgba8snorm"
- | "rgba8uint"
- | "rgba8sint"
- | "bgra8unorm"
- | "bgra8unorm-srgb"
- | "rgb9e5ufloat"
- | "rgb10a2unorm"
- | "rg11b10ufloat"
- | "rg32uint"
- | "rg32sint"
- | "rg32float"
- | "rgba16uint"
- | "rgba16sint"
- | "rgba16float"
- | "rgba32uint"
- | "rgba32sint"
- | "rgba32float"
- | "stencil8"
- | "depth16unorm"
- | "depth24plus"
- | "depth24plus-stencil8"
- | "depth32float"
- | "depth32float-stencil8"
- | "bc1-rgba-unorm"
- | "bc1-rgba-unorm-srgb"
- | "bc2-rgba-unorm"
- | "bc2-rgba-unorm-srgb"
- | "bc3-rgba-unorm"
- | "bc3-rgba-unorm-srgb"
- | "bc4-r-unorm"
- | "bc4-r-snorm"
- | "bc5-rg-unorm"
- | "bc5-rg-snorm"
- | "bc6h-rgb-ufloat"
- | "bc6h-rgb-float"
- | "bc7-rgba-unorm"
- | "bc7-rgba-unorm-srgb"
- | "etc2-rgb8unorm"
- | "etc2-rgb8unorm-srgb"
- | "etc2-rgb8a1unorm"
- | "etc2-rgb8a1unorm-srgb"
- | "etc2-rgba8unorm"
- | "etc2-rgba8unorm-srgb"
- | "eac-r11unorm"
- | "eac-r11snorm"
- | "eac-rg11unorm"
- | "eac-rg11snorm"
- | "astc-4x4-unorm"
- | "astc-4x4-unorm-srgb"
- | "astc-5x4-unorm"
- | "astc-5x4-unorm-srgb"
- | "astc-5x5-unorm"
- | "astc-5x5-unorm-srgb"
- | "astc-6x5-unorm"
- | "astc-6x5-unorm-srgb"
- | "astc-6x6-unorm"
- | "astc-6x6-unorm-srgb"
- | "astc-8x5-unorm"
- | "astc-8x5-unorm-srgb"
- | "astc-8x6-unorm"
- | "astc-8x6-unorm-srgb"
- | "astc-8x8-unorm"
- | "astc-8x8-unorm-srgb"
- | "astc-10x5-unorm"
- | "astc-10x5-unorm-srgb"
- | "astc-10x6-unorm"
- | "astc-10x6-unorm-srgb"
- | "astc-10x8-unorm"
- | "astc-10x8-unorm-srgb"
- | "astc-10x10-unorm"
- | "astc-10x10-unorm-srgb"
- | "astc-12x10-unorm"
- | "astc-12x10-unorm-srgb"
- | "astc-12x12-unorm"
- | "astc-12x12-unorm-srgb";
-
-/** @category WebGPU */
-declare class GPUSampler implements GPUObjectBase {
- label: string;
-}
-
-/** @category WebGPU */
-declare interface GPUSamplerDescriptor extends GPUObjectDescriptorBase {
- addressModeU?: GPUAddressMode;
- addressModeV?: GPUAddressMode;
- addressModeW?: GPUAddressMode;
- magFilter?: GPUFilterMode;
- minFilter?: GPUFilterMode;
- mipmapFilter?: GPUMipmapFilterMode;
- lodMinClamp?: number;
- lodMaxClamp?: number;
- compare?: GPUCompareFunction;
- maxAnisotropy?: number;
-}
-
-/** @category WebGPU */
-declare type GPUAddressMode = "clamp-to-edge" | "repeat" | "mirror-repeat";
-
-/** @category WebGPU */
-declare type GPUFilterMode = "nearest" | "linear";
-
-/** @category WebGPU */
-declare type GPUMipmapFilterMode = "nearest" | "linear";
-
-/** @category WebGPU */
-declare type GPUCompareFunction =
- | "never"
- | "less"
- | "equal"
- | "less-equal"
- | "greater"
- | "not-equal"
- | "greater-equal"
- | "always";
-
-/** @category WebGPU */
-declare class GPUBindGroupLayout implements GPUObjectBase {
- label: string;
-}
-
-/** @category WebGPU */
-declare interface GPUBindGroupLayoutDescriptor extends GPUObjectDescriptorBase {
- entries: GPUBindGroupLayoutEntry[];
-}
-
-/** @category WebGPU */
-declare interface GPUBindGroupLayoutEntry {
- binding: number;
- visibility: GPUShaderStageFlags;
-
- buffer?: GPUBufferBindingLayout;
- sampler?: GPUSamplerBindingLayout;
- texture?: GPUTextureBindingLayout;
- storageTexture?: GPUStorageTextureBindingLayout;
-}
-
-/** @category WebGPU */
-declare type GPUShaderStageFlags = number;
-
-/** @category WebGPU */
-declare class GPUShaderStage {
- static VERTEX: 0x1;
- static FRAGMENT: 0x2;
- static COMPUTE: 0x4;
-}
-
-/** @category WebGPU */
-declare interface GPUBufferBindingLayout {
- type?: GPUBufferBindingType;
- hasDynamicOffset?: boolean;
- minBindingSize?: number;
-}
-
-/** @category WebGPU */
-declare type GPUBufferBindingType = "uniform" | "storage" | "read-only-storage";
-
-/** @category WebGPU */
-declare interface GPUSamplerBindingLayout {
- type?: GPUSamplerBindingType;
-}
-
-/** @category WebGPU */
-declare type GPUSamplerBindingType =
- | "filtering"
- | "non-filtering"
- | "comparison";
-
-/** @category WebGPU */
-declare interface GPUTextureBindingLayout {
- sampleType?: GPUTextureSampleType;
- viewDimension?: GPUTextureViewDimension;
- multisampled?: boolean;
-}
-
-/** @category WebGPU */
-declare type GPUTextureSampleType =
- | "float"
- | "unfilterable-float"
- | "depth"
- | "sint"
- | "uint";
-
-/** @category WebGPU */
-declare type GPUStorageTextureAccess = "write-only";
-
-/** @category WebGPU */
-declare interface GPUStorageTextureBindingLayout {
- access: GPUStorageTextureAccess;
- format: GPUTextureFormat;
- viewDimension?: GPUTextureViewDimension;
-}
-
-/** @category WebGPU */
-declare class GPUBindGroup implements GPUObjectBase {
- label: string;
-}
-
-/** @category WebGPU */
-declare interface GPUBindGroupDescriptor extends GPUObjectDescriptorBase {
- layout: GPUBindGroupLayout;
- entries: GPUBindGroupEntry[];
-}
-
-/** @category WebGPU */
-declare type GPUBindingResource =
- | GPUSampler
- | GPUTextureView
- | GPUBufferBinding;
-
-/** @category WebGPU */
-declare interface GPUBindGroupEntry {
- binding: number;
- resource: GPUBindingResource;
-}
-
-/** @category WebGPU */
-declare interface GPUBufferBinding {
- buffer: GPUBuffer;
- offset?: number;
- size?: number;
-}
-
-/** @category WebGPU */
-declare class GPUPipelineLayout implements GPUObjectBase {
- label: string;
-}
-
-/** @category WebGPU */
-declare interface GPUPipelineLayoutDescriptor extends GPUObjectDescriptorBase {
- bindGroupLayouts: GPUBindGroupLayout[];
-}
-
-/** @category WebGPU */
-declare type GPUCompilationMessageType = "error" | "warning" | "info";
-
-/** @category WebGPU */
-declare interface GPUCompilationMessage {
- readonly message: string;
- readonly type: GPUCompilationMessageType;
- readonly lineNum: number;
- readonly linePos: number;
-}
-
-/** @category WebGPU */
-declare interface GPUCompilationInfo {
- readonly messages: ReadonlyArray<GPUCompilationMessage>;
-}
-
-/** @category WebGPU */
-declare class GPUShaderModule implements GPUObjectBase {
- label: string;
-
- compilationInfo(): Promise<GPUCompilationInfo>;
-}
-
-/** @category WebGPU */
-declare interface GPUShaderModuleDescriptor extends GPUObjectDescriptorBase {
- code: string;
- sourceMap?: any;
-}
-
-/** @category WebGPU */
-declare type GPUAutoLayoutMode = "auto";
-
-/** @category WebGPU */
-declare interface GPUPipelineDescriptorBase extends GPUObjectDescriptorBase {
- layout: GPUPipelineLayout | GPUAutoLayoutMode;
-}
-
-/** @category WebGPU */
-declare interface GPUPipelineBase {
- getBindGroupLayout(index: number): GPUBindGroupLayout;
-}
-
-/** @category WebGPU */
-declare interface GPUProgrammableStage {
- module: GPUShaderModule;
- entryPoint: string;
-}
-
-/** @category WebGPU */
-declare class GPUComputePipeline implements GPUObjectBase, GPUPipelineBase {
- label: string;
-
- getBindGroupLayout(index: number): GPUBindGroupLayout;
-}
-
-/** @category WebGPU */
-declare interface GPUComputePipelineDescriptor
- extends GPUPipelineDescriptorBase {
- compute: GPUProgrammableStage;
-}
-
-/** @category WebGPU */
-declare class GPURenderPipeline implements GPUObjectBase, GPUPipelineBase {
- label: string;
-
- getBindGroupLayout(index: number): GPUBindGroupLayout;
-}
-
-/** @category WebGPU */
-declare interface GPURenderPipelineDescriptor
- extends GPUPipelineDescriptorBase {
- vertex: GPUVertexState;
- primitive?: GPUPrimitiveState;
- depthStencil?: GPUDepthStencilState;
- multisample?: GPUMultisampleState;
- fragment?: GPUFragmentState;
-}
-
-/** @category WebGPU */
-declare interface GPUPrimitiveState {
- topology?: GPUPrimitiveTopology;
- stripIndexFormat?: GPUIndexFormat;
- frontFace?: GPUFrontFace;
- cullMode?: GPUCullMode;
- unclippedDepth?: boolean;
-}
-
-/** @category WebGPU */
-declare type GPUPrimitiveTopology =
- | "point-list"
- | "line-list"
- | "line-strip"
- | "triangle-list"
- | "triangle-strip";
-
-/** @category WebGPU */
-declare type GPUFrontFace = "ccw" | "cw";
-
-/** @category WebGPU */
-declare type GPUCullMode = "none" | "front" | "back";
-
-/** @category WebGPU */
-declare interface GPUMultisampleState {
- count?: number;
- mask?: number;
- alphaToCoverageEnabled?: boolean;
-}
-
-/** @category WebGPU */
-declare interface GPUFragmentState extends GPUProgrammableStage {
- targets: (GPUColorTargetState | null)[];
-}
-
-/** @category WebGPU */
-declare interface GPUColorTargetState {
- format: GPUTextureFormat;
-
- blend?: GPUBlendState;
- writeMask?: GPUColorWriteFlags;
-}
-
-/** @category WebGPU */
-declare interface GPUBlendState {
- color: GPUBlendComponent;
- alpha: GPUBlendComponent;
-}
-
-/** @category WebGPU */
-declare type GPUColorWriteFlags = number;
-
-/** @category WebGPU */
-declare class GPUColorWrite {
- static RED: 0x1;
- static GREEN: 0x2;
- static BLUE: 0x4;
- static ALPHA: 0x8;
- static ALL: 0xF;
-}
-
-/** @category WebGPU */
-declare interface GPUBlendComponent {
- operation?: GPUBlendOperation;
- srcFactor?: GPUBlendFactor;
- dstFactor?: GPUBlendFactor;
-}
-
-/** @category WebGPU */
-declare type GPUBlendFactor =
- | "zero"
- | "one"
- | "src"
- | "one-minus-src"
- | "src-alpha"
- | "one-minus-src-alpha"
- | "dst"
- | "one-minus-dst"
- | "dst-alpha"
- | "one-minus-dst-alpha"
- | "src-alpha-saturated"
- | "constant"
- | "one-minus-constant";
-
-/** @category WebGPU */
-declare type GPUBlendOperation =
- | "add"
- | "subtract"
- | "reverse-subtract"
- | "min"
- | "max";
-
-/** @category WebGPU */
-declare interface GPUDepthStencilState {
- format: GPUTextureFormat;
-
- depthWriteEnabled?: boolean;
- depthCompare?: GPUCompareFunction;
-
- stencilFront?: GPUStencilFaceState;
- stencilBack?: GPUStencilFaceState;
-
- stencilReadMask?: number;
- stencilWriteMask?: number;
-
- depthBias?: number;
- depthBiasSlopeScale?: number;
- depthBiasClamp?: number;
-}
-
-/** @category WebGPU */
-declare interface GPUStencilFaceState {
- compare?: GPUCompareFunction;
- failOp?: GPUStencilOperation;
- depthFailOp?: GPUStencilOperation;
- passOp?: GPUStencilOperation;
-}
-
-/** @category WebGPU */
-declare type GPUStencilOperation =
- | "keep"
- | "zero"
- | "replace"
- | "invert"
- | "increment-clamp"
- | "decrement-clamp"
- | "increment-wrap"
- | "decrement-wrap";
-
-/** @category WebGPU */
-declare type GPUIndexFormat = "uint16" | "uint32";
-
-/** @category WebGPU */
-declare type GPUVertexFormat =
- | "uint8x2"
- | "uint8x4"
- | "sint8x2"
- | "sint8x4"
- | "unorm8x2"
- | "unorm8x4"
- | "snorm8x2"
- | "snorm8x4"
- | "uint16x2"
- | "uint16x4"
- | "sint16x2"
- | "sint16x4"
- | "unorm16x2"
- | "unorm16x4"
- | "snorm16x2"
- | "snorm16x4"
- | "float16x2"
- | "float16x4"
- | "float32"
- | "float32x2"
- | "float32x3"
- | "float32x4"
- | "uint32"
- | "uint32x2"
- | "uint32x3"
- | "uint32x4"
- | "sint32"
- | "sint32x2"
- | "sint32x3"
- | "sint32x4";
-
-/** @category WebGPU */
-declare type GPUVertexStepMode = "vertex" | "instance";
-
-/** @category WebGPU */
-declare interface GPUVertexState extends GPUProgrammableStage {
- buffers?: (GPUVertexBufferLayout | null)[];
-}
-
-/** @category WebGPU */
-declare interface GPUVertexBufferLayout {
- arrayStride: number;
- stepMode?: GPUVertexStepMode;
- attributes: GPUVertexAttribute[];
-}
-
-/** @category WebGPU */
-declare interface GPUVertexAttribute {
- format: GPUVertexFormat;
- offset: number;
-
- shaderLocation: number;
-}
-
-/** @category WebGPU */
-declare interface GPUImageDataLayout {
- offset?: number;
- bytesPerRow?: number;
- rowsPerImage?: number;
-}
-
-/** @category WebGPU */
-declare class GPUCommandBuffer implements GPUObjectBase {
- label: string;
-}
-
-/** @category WebGPU */
-declare interface GPUCommandBufferDescriptor extends GPUObjectDescriptorBase {}
-
-/** @category WebGPU */
-declare class GPUCommandEncoder implements GPUObjectBase {
- label: string;
-
- beginRenderPass(descriptor: GPURenderPassDescriptor): GPURenderPassEncoder;
- beginComputePass(
- descriptor?: GPUComputePassDescriptor,
- ): GPUComputePassEncoder;
-
- copyBufferToBuffer(
- source: GPUBuffer,
- sourceOffset: number,
- destination: GPUBuffer,
- destinationOffset: number,
- size: number,
- ): undefined;
-
- copyBufferToTexture(
- source: GPUImageCopyBuffer,
- destination: GPUImageCopyTexture,
- copySize: GPUExtent3D,
- ): undefined;
-
- copyTextureToBuffer(
- source: GPUImageCopyTexture,
- destination: GPUImageCopyBuffer,
- copySize: GPUExtent3D,
- ): undefined;
-
- copyTextureToTexture(
- source: GPUImageCopyTexture,
- destination: GPUImageCopyTexture,
- copySize: GPUExtent3D,
- ): undefined;
-
- clearBuffer(
- destination: GPUBuffer,
- destinationOffset?: number,
- size?: number,
- ): undefined;
-
- pushDebugGroup(groupLabel: string): undefined;
- popDebugGroup(): undefined;
- insertDebugMarker(markerLabel: string): undefined;
-
- writeTimestamp(querySet: GPUQuerySet, queryIndex: number): undefined;
-
- resolveQuerySet(
- querySet: GPUQuerySet,
- firstQuery: number,
- queryCount: number,
- destination: GPUBuffer,
- destinationOffset: number,
- ): undefined;
-
- finish(descriptor?: GPUCommandBufferDescriptor): GPUCommandBuffer;
-}
-
-/** @category WebGPU */
-declare interface GPUCommandEncoderDescriptor extends GPUObjectDescriptorBase {}
-
-/** @category WebGPU */
-declare interface GPUImageCopyBuffer extends GPUImageDataLayout {
- buffer: GPUBuffer;
-}
-
-/** @category WebGPU */
-declare interface GPUImageCopyTexture {
- texture: GPUTexture;
- mipLevel?: number;
- origin?: GPUOrigin3D;
- aspect?: GPUTextureAspect;
-}
-
-/** @category WebGPU */
-interface GPUProgrammablePassEncoder {
- setBindGroup(
- index: number,
- bindGroup: GPUBindGroup,
- dynamicOffsets?: number[],
- ): undefined;
-
- setBindGroup(
- index: number,
- bindGroup: GPUBindGroup,
- dynamicOffsetsData: Uint32Array,
- dynamicOffsetsDataStart: number,
- dynamicOffsetsDataLength: number,
- ): undefined;
-
- pushDebugGroup(groupLabel: string): undefined;
- popDebugGroup(): undefined;
- insertDebugMarker(markerLabel: string): undefined;
-}
-
-/** @category WebGPU */
-declare class GPUComputePassEncoder
- implements GPUObjectBase, GPUProgrammablePassEncoder {
- label: string;
- setBindGroup(
- index: number,
- bindGroup: GPUBindGroup,
- dynamicOffsets?: number[],
- ): undefined;
- setBindGroup(
- index: number,
- bindGroup: GPUBindGroup,
- dynamicOffsetsData: Uint32Array,
- dynamicOffsetsDataStart: number,
- dynamicOffsetsDataLength: number,
- ): undefined;
- pushDebugGroup(groupLabel: string): undefined;
- popDebugGroup(): undefined;
- insertDebugMarker(markerLabel: string): undefined;
- setPipeline(pipeline: GPUComputePipeline): undefined;
- dispatchWorkgroups(x: number, y?: number, z?: number): undefined;
- dispatchWorkgroupsIndirect(
- indirectBuffer: GPUBuffer,
- indirectOffset: number,
- ): undefined;
-
- beginPipelineStatisticsQuery(
- querySet: GPUQuerySet,
- queryIndex: number,
- ): undefined;
- endPipelineStatisticsQuery(): undefined;
-
- writeTimestamp(querySet: GPUQuerySet, queryIndex: number): undefined;
-
- end(): undefined;
-}
-
-/** @category WebGPU */
-declare interface GPUComputePassDescriptor extends GPUObjectDescriptorBase {}
-
-/** @category WebGPU */
-interface GPURenderEncoderBase {
- setPipeline(pipeline: GPURenderPipeline): undefined;
-
- setIndexBuffer(
- buffer: GPUBuffer,
- indexFormat: GPUIndexFormat,
- offset?: number,
- size?: number,
- ): undefined;
- setVertexBuffer(
- slot: number,
- buffer: GPUBuffer,
- offset?: number,
- size?: number,
- ): undefined;
-
- draw(
- vertexCount: number,
- instanceCount?: number,
- firstVertex?: number,
- firstInstance?: number,
- ): undefined;
- drawIndexed(
- indexCount: number,
- instanceCount?: number,
- firstIndex?: number,
- baseVertex?: number,
- firstInstance?: number,
- ): undefined;
-
- drawIndirect(indirectBuffer: GPUBuffer, indirectOffset: number): undefined;
- drawIndexedIndirect(
- indirectBuffer: GPUBuffer,
- indirectOffset: number,
- ): undefined;
-}
-
-/** @category WebGPU */
-declare class GPURenderPassEncoder
- implements GPUObjectBase, GPUProgrammablePassEncoder, GPURenderEncoderBase {
- label: string;
- setBindGroup(
- index: number,
- bindGroup: GPUBindGroup,
- dynamicOffsets?: number[],
- ): undefined;
- setBindGroup(
- index: number,
- bindGroup: GPUBindGroup,
- dynamicOffsetsData: Uint32Array,
- dynamicOffsetsDataStart: number,
- dynamicOffsetsDataLength: number,
- ): undefined;
- pushDebugGroup(groupLabel: string): undefined;
- popDebugGroup(): undefined;
- insertDebugMarker(markerLabel: string): undefined;
- setPipeline(pipeline: GPURenderPipeline): undefined;
- setIndexBuffer(
- buffer: GPUBuffer,
- indexFormat: GPUIndexFormat,
- offset?: number,
- size?: number,
- ): undefined;
- setVertexBuffer(
- slot: number,
- buffer: GPUBuffer,
- offset?: number,
- size?: number,
- ): undefined;
- draw(
- vertexCount: number,
- instanceCount?: number,
- firstVertex?: number,
- firstInstance?: number,
- ): undefined;
- drawIndexed(
- indexCount: number,
- instanceCount?: number,
- firstIndex?: number,
- baseVertex?: number,
- firstInstance?: number,
- ): undefined;
- drawIndirect(indirectBuffer: GPUBuffer, indirectOffset: number): undefined;
- drawIndexedIndirect(
- indirectBuffer: GPUBuffer,
- indirectOffset: number,
- ): undefined;
-
- setViewport(
- x: number,
- y: number,
- width: number,
- height: number,
- minDepth: number,
- maxDepth: number,
- ): undefined;
-
- setScissorRect(
- x: number,
- y: number,
- width: number,
- height: number,
- ): undefined;
-
- setBlendConstant(color: GPUColor): undefined;
- setStencilReference(reference: number): undefined;
-
- beginOcclusionQuery(queryIndex: number): undefined;
- endOcclusionQuery(): undefined;
-
- beginPipelineStatisticsQuery(
- querySet: GPUQuerySet,
- queryIndex: number,
- ): undefined;
- endPipelineStatisticsQuery(): undefined;
-
- writeTimestamp(querySet: GPUQuerySet, queryIndex: number): undefined;
-
- executeBundles(bundles: GPURenderBundle[]): undefined;
- end(): undefined;
-}
-
-/** @category WebGPU */
-declare interface GPURenderPassDescriptor extends GPUObjectDescriptorBase {
- colorAttachments: (GPURenderPassColorAttachment | null)[];
- depthStencilAttachment?: GPURenderPassDepthStencilAttachment;
-}
-
-/** @category WebGPU */
-declare interface GPURenderPassColorAttachment {
- view: GPUTextureView;
- resolveTarget?: GPUTextureView;
-
- clearValue?: GPUColor;
- loadOp: GPULoadOp;
- storeOp: GPUStoreOp;
-}
-
-/** @category WebGPU */
-declare interface GPURenderPassDepthStencilAttachment {
- view: GPUTextureView;
-
- depthClearValue?: number;
- depthLoadOp?: GPULoadOp;
- depthStoreOp?: GPUStoreOp;
- depthReadOnly?: boolean;
-
- stencilClearValue?: number;
- stencilLoadOp?: GPULoadOp;
- stencilStoreOp?: GPUStoreOp;
- stencilReadOnly?: boolean;
-}
-
-/** @category WebGPU */
-declare type GPULoadOp = "load" | "clear";
-
-/** @category WebGPU */
-declare type GPUStoreOp = "store" | "discard";
-
-/** @category WebGPU */
-declare class GPURenderBundle implements GPUObjectBase {
- label: string;
-}
-
-/** @category WebGPU */
-declare interface GPURenderBundleDescriptor extends GPUObjectDescriptorBase {}
-
-/** @category WebGPU */
-declare class GPURenderBundleEncoder
- implements GPUObjectBase, GPUProgrammablePassEncoder, GPURenderEncoderBase {
- label: string;
- draw(
- vertexCount: number,
- instanceCount?: number,
- firstVertex?: number,
- firstInstance?: number,
- ): undefined;
- drawIndexed(
- indexCount: number,
- instanceCount?: number,
- firstIndex?: number,
- baseVertex?: number,
- firstInstance?: number,
- ): undefined;
- drawIndexedIndirect(
- indirectBuffer: GPUBuffer,
- indirectOffset: number,
- ): undefined;
- drawIndirect(indirectBuffer: GPUBuffer, indirectOffset: number): undefined;
- insertDebugMarker(markerLabel: string): undefined;
- popDebugGroup(): undefined;
- pushDebugGroup(groupLabel: string): undefined;
- setBindGroup(
- index: number,
- bindGroup: GPUBindGroup,
- dynamicOffsets?: number[],
- ): undefined;
- setBindGroup(
- index: number,
- bindGroup: GPUBindGroup,
- dynamicOffsetsData: Uint32Array,
- dynamicOffsetsDataStart: number,
- dynamicOffsetsDataLength: number,
- ): undefined;
- setIndexBuffer(
- buffer: GPUBuffer,
- indexFormat: GPUIndexFormat,
- offset?: number,
- size?: number,
- ): undefined;
- setPipeline(pipeline: GPURenderPipeline): undefined;
- setVertexBuffer(
- slot: number,
- buffer: GPUBuffer,
- offset?: number,
- size?: number,
- ): undefined;
-
- finish(descriptor?: GPURenderBundleDescriptor): GPURenderBundle;
-}
-
-/** @category WebGPU */
-declare interface GPURenderPassLayout extends GPUObjectDescriptorBase {
- colorFormats: (GPUTextureFormat | null)[];
- depthStencilFormat?: GPUTextureFormat;
- sampleCount?: number;
-}
-
-/** @category WebGPU */
-declare interface GPURenderBundleEncoderDescriptor extends GPURenderPassLayout {
- depthReadOnly?: boolean;
- stencilReadOnly?: boolean;
-}
-
-/** @category WebGPU */
-declare class GPUQueue implements GPUObjectBase {
- label: string;
-
- submit(commandBuffers: GPUCommandBuffer[]): undefined;
-
- onSubmittedWorkDone(): Promise<undefined>;
-
- writeBuffer(
- buffer: GPUBuffer,
- bufferOffset: number,
- data: BufferSource,
- dataOffset?: number,
- size?: number,
- ): undefined;
-
- writeTexture(
- destination: GPUImageCopyTexture,
- data: BufferSource,
- dataLayout: GPUImageDataLayout,
- size: GPUExtent3D,
- ): undefined;
-}
-
-/** @category WebGPU */
-declare class GPUQuerySet implements GPUObjectBase {
- label: string;
-
- destroy(): undefined;
-
- readonly type: GPUQueryType;
- readonly count: number;
-}
-
-/** @category WebGPU */
-declare interface GPUQuerySetDescriptor extends GPUObjectDescriptorBase {
- type: GPUQueryType;
- count: number;
- pipelineStatistics?: GPUPipelineStatisticName[];
-}
-
-/** @category WebGPU */
-declare type GPUQueryType = "occlusion" | "pipeline-statistics" | "timestamp";
-
-/** @category WebGPU */
-declare type GPUPipelineStatisticName =
- | "vertex-shader-invocations"
- | "clipper-invocations"
- | "clipper-primitives-out"
- | "fragment-shader-invocations"
- | "compute-shader-invocations";
-
-/** @category WebGPU */
-declare type GPUDeviceLostReason = "destroyed";
-
-/** @category WebGPU */
-declare interface GPUDeviceLostInfo {
- readonly reason: GPUDeviceLostReason | undefined;
- readonly message: string;
-}
-
-/** @category WebGPU */
-declare class GPUError {
- readonly message: string;
-}
-
-/** @category WebGPU */
-declare class GPUOutOfMemoryError extends GPUError {
- constructor(message: string);
-}
-
-/** @category WebGPU */
-declare class GPUValidationError extends GPUError {
- constructor(message: string);
-}
-
-/** @category WebGPU */
-declare type GPUErrorFilter = "out-of-memory" | "validation";
-
-/** @category WebGPU */
-declare interface GPUColorDict {
- r: number;
- g: number;
- b: number;
- a: number;
-}
-
-/** @category WebGPU */
-declare type GPUColor = number[] | GPUColorDict;
-
-/** @category WebGPU */
-declare interface GPUOrigin3DDict {
- x?: number;
- y?: number;
- z?: number;
-}
-
-/** @category WebGPU */
-declare type GPUOrigin3D = number[] | GPUOrigin3DDict;
-
-/** @category WebGPU */
-declare interface GPUExtent3DDict {
- width: number;
- height?: number;
- depthOrArrayLayers?: number;
-}
-
-/** @category WebGPU */
-declare type GPUExtent3D = number[] | GPUExtent3DDict;
diff --git a/cli/tsc/mod.rs b/cli/tsc/mod.rs
index e8fe58c26..63b4e269d 100644
--- a/cli/tsc/mod.rs
+++ b/cli/tsc/mod.rs
@@ -89,7 +89,6 @@ pub fn get_types_declaration_file_text(unstable: bool) -> String {
"deno.url",
"deno.web",
"deno.fetch",
- "deno.webgpu",
"deno.websocket",
"deno.webstorage",
"deno.crypto",
diff --git a/ext/webgpu/01_webgpu.js b/ext/webgpu/01_webgpu.js
deleted file mode 100644
index 57104ca08..000000000
--- a/ext/webgpu/01_webgpu.js
+++ /dev/null
@@ -1,5249 +0,0 @@
-// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
-
-// @ts-check
-/// <reference path="../../core/lib.deno_core.d.ts" />
-/// <reference path="../web/internal.d.ts" />
-/// <reference path="../web/lib.deno_web.d.ts" />
-/// <reference path="./lib.deno_webgpu.d.ts" />
-
-const core = globalThis.Deno.core;
-const ops = core.ops;
-const primordials = globalThis.__bootstrap.primordials;
-import * as webidl from "ext:deno_webidl/00_webidl.js";
-import { EventTarget } from "ext:deno_web/02_event.js";
-import DOMException from "ext:deno_web/01_dom_exception.js";
-const {
- ArrayBuffer,
- ArrayBufferIsView,
- ArrayIsArray,
- ArrayPrototypeFilter,
- ArrayPrototypeMap,
- ArrayPrototypePop,
- ArrayPrototypePush,
- Error,
- MathMax,
- ObjectDefineProperty,
- ObjectPrototypeIsPrototypeOf,
- Promise,
- PromisePrototypeCatch,
- PromisePrototypeThen,
- PromiseReject,
- PromiseResolve,
- SafeArrayIterator,
- SafePromiseAll,
- Set,
- SetPrototypeHas,
- Symbol,
- SymbolFor,
- TypeError,
- Uint32Array,
- Uint32ArrayPrototype,
- Uint8Array,
- WeakRef,
-} = primordials;
-
-const _rid = Symbol("[[rid]]");
-const _size = Symbol("[[size]]");
-const _usage = Symbol("[[usage]]");
-const _state = Symbol("[[state]]");
-const _mappingRange = Symbol("[[mapping_range]]");
-const _mappedRanges = Symbol("[[mapped_ranges]]");
-const _mapMode = Symbol("[[map_mode]]");
-const _adapter = Symbol("[[adapter]]");
-const _cleanup = Symbol("[[cleanup]]");
-const _vendor = Symbol("[[vendor]]");
-const _architecture = Symbol("[[architecture]]");
-const _description = Symbol("[[description]]");
-const _limits = Symbol("[[limits]]");
-const _reason = Symbol("[[reason]]");
-const _message = Symbol("[[message]]");
-const _label = Symbol("[[label]]");
-const _device = Symbol("[[device]]");
-const _queue = Symbol("[[queue]]");
-const _views = Symbol("[[views]]");
-const _texture = Symbol("[[texture]]");
-const _encoders = Symbol("[[encoders]]");
-const _encoder = Symbol("[[encoder]]");
-const _descriptor = Symbol("[[descriptor]]");
-const _width = Symbol("[[width]]");
-const _height = Symbol("[[height]]");
-const _depthOrArrayLayers = Symbol("[[depthOrArrayLayers]]");
-const _mipLevelCount = Symbol("[[mipLevelCount]]");
-const _sampleCount = Symbol("[[sampleCount]]");
-const _dimension = Symbol("[[dimension]]");
-const _format = Symbol("[[format]]");
-const _type = Symbol("[[type]]");
-const _count = Symbol("[[count]]");
-
-/**
- * @param {any} self
- * @param {{prefix: string, context: string}} opts
- * @returns {InnerGPUDevice & {rid: number}}
- */
-function assertDevice(self, { prefix, context }) {
- const device = self[_device];
- const deviceRid = device?.rid;
- if (deviceRid === undefined) {
- throw new DOMException(
- `${prefix}: ${context} references an invalid or destroyed device.`,
- "OperationError",
- );
- }
- return device;
-}
-
-/**
- * @param {InnerGPUDevice} self
- * @param {any} resource
- * @param {{prefix: string, resourceContext: string, selfContext: string}} opts
- * @returns {InnerGPUDevice & {rid: number}}
- */
-function assertDeviceMatch(
- self,
- resource,
- { prefix, resourceContext, selfContext },
-) {
- const resourceDevice = assertDevice(resource, {
- prefix,
- context: resourceContext,
- });
- if (resourceDevice.rid !== self.rid) {
- throw new DOMException(
- `${prefix}: ${resourceContext} belongs to a diffent device than ${selfContext}.`,
- "OperationError",
- );
- }
- return { ...resourceDevice, rid: resourceDevice.rid };
-}
-
-/**
- * @param {any} self
- * @param {{prefix: string, context: string}} opts
- * @returns {number}
- */
-function assertResource(self, { prefix, context }) {
- const rid = self[_rid];
- if (rid === undefined) {
- throw new DOMException(
- `${prefix}: ${context} an invalid or destroyed resource.`,
- "OperationError",
- );
- }
- return rid;
-}
-
-/**
- * @param {number[] | GPUExtent3DDict} data
- * @returns {GPUExtent3DDict}
- */
-function normalizeGPUExtent3D(data) {
- if (ArrayIsArray(data)) {
- return {
- width: data[0],
- height: data[1],
- depthOrArrayLayers: data[2],
- };
- } else {
- return data;
- }
-}
-
-/**
- * @param {number[] | GPUOrigin3DDict} data
- * @returns {GPUOrigin3DDict}
- */
-function normalizeGPUOrigin3D(data) {
- if (ArrayIsArray(data)) {
- return {
- x: data[0],
- y: data[1],
- z: data[2],
- };
- } else {
- return data;
- }
-}
-
-/**
- * @param {number[] | GPUColor} data
- * @returns {GPUColor}
- */
-function normalizeGPUColor(data) {
- if (ArrayIsArray(data)) {
- return {
- r: data[0],
- g: data[1],
- b: data[2],
- a: data[3],
- };
- } else {
- return data;
- }
-}
-
-const illegalConstructorKey = Symbol("illegalConstructorKey");
-class GPUError extends Error {
- constructor(key = null) {
- super();
- if (key !== illegalConstructorKey) {
- webidl.illegalConstructor();
- }
- }
-
- [_message];
- get message() {
- webidl.assertBranded(this, GPUErrorPrototype);
- return this[_message];
- }
-}
-const GPUErrorPrototype = GPUError.prototype;
-
-class GPUValidationError extends GPUError {
- name = "GPUValidationError";
- /** @param {string} message */
- constructor(message) {
- const prefix = "Failed to construct 'GPUValidationError'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- message = webidl.converters.DOMString(message, {
- prefix,
- context: "Argument 1",
- });
- super(illegalConstructorKey);
- this[webidl.brand] = webidl.brand;
- this[_message] = message;
- }
-}
-const GPUValidationErrorPrototype = GPUValidationError.prototype;
-
-class GPUOutOfMemoryError extends GPUError {
- name = "GPUOutOfMemoryError";
- constructor(message) {
- const prefix = "Failed to construct 'GPUOutOfMemoryError'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- message = webidl.converters.DOMString(message, {
- prefix,
- context: "Argument 1",
- });
- super(illegalConstructorKey);
- this[webidl.brand] = webidl.brand;
- this[_message] = message;
- }
-}
-const GPUOutOfMemoryErrorPrototype = GPUOutOfMemoryError.prototype;
-
-class GPU {
- [webidl.brand] = webidl.brand;
-
- constructor() {
- webidl.illegalConstructor();
- }
-
- /**
- * @param {GPURequestAdapterOptions} options
- */
- async requestAdapter(options = {}) {
- webidl.assertBranded(this, GPUPrototype);
- options = webidl.converters.GPURequestAdapterOptions(options, {
- prefix: "Failed to execute 'requestAdapter' on 'GPU'",
- context: "Argument 1",
- });
-
- const { err, ...data } = await core.opAsync(
- "op_webgpu_request_adapter",
- options.powerPreference,
- options.forceFallbackAdapter,
- );
-
- if (err) {
- return null;
- } else {
- return createGPUAdapter(data);
- }
- }
-
- [SymbolFor("Deno.privateCustomInspect")](inspect) {
- return `${this.constructor.name} ${inspect({})}`;
- }
-}
-const GPUPrototype = GPU.prototype;
-
-/**
- * @typedef InnerGPUAdapter
- * @property {number} rid
- * @property {GPUSupportedFeatures} features
- * @property {GPUSupportedLimits} limits
- * @property {boolean} isFallbackAdapter
- */
-
-/**
- * @param {InnerGPUAdapter} inner
- * @returns {GPUAdapter}
- */
-function createGPUAdapter(inner) {
- /** @type {GPUAdapter} */
- const adapter = webidl.createBranded(GPUAdapter);
- adapter[_adapter] = {
- ...inner,
- features: createGPUSupportedFeatures(inner.features),
- limits: createGPUSupportedLimits(inner.limits),
- };
- return adapter;
-}
-
-class GPUAdapter {
- /** @type {InnerGPUAdapter} */
- [_adapter];
-
- /** @returns {GPUSupportedFeatures} */
- get features() {
- webidl.assertBranded(this, GPUAdapterPrototype);
- return this[_adapter].features;
- }
- /** @returns {GPUSupportedLimits} */
- get limits() {
- webidl.assertBranded(this, GPUAdapterPrototype);
- return this[_adapter].limits;
- }
- /** @returns {boolean} */
- get isFallbackAdapter() {
- return this[_adapter].isFallbackAdapter;
- }
-
- constructor() {
- webidl.illegalConstructor();
- }
-
- /**
- * @param {GPUDeviceDescriptor} descriptor
- * @returns {Promise<GPUDevice>}
- */
- async requestDevice(descriptor = {}) {
- webidl.assertBranded(this, GPUAdapterPrototype);
- const prefix = "Failed to execute 'requestDevice' on 'GPUAdapter'";
- descriptor = webidl.converters.GPUDeviceDescriptor(descriptor, {
- prefix,
- context: "Argument 1",
- });
- const requiredFeatures = descriptor.requiredFeatures ?? [];
- for (let i = 0; i < requiredFeatures.length; ++i) {
- const feature = requiredFeatures[i];
- if (
- !SetPrototypeHas(
- this[_adapter].features[webidl.setlikeInner],
- feature,
- )
- ) {
- throw new TypeError(
- `${prefix}: requiredFeatures must be a subset of the adapter features.`,
- );
- }
- }
-
- const { rid, features, limits } = await core.opAsync(
- "op_webgpu_request_device",
- this[_adapter].rid,
- descriptor.label,
- requiredFeatures,
- descriptor.requiredLimits,
- );
-
- const inner = new InnerGPUDevice({
- rid,
- adapter: this,
- features: createGPUSupportedFeatures(features),
- limits: createGPUSupportedLimits(limits),
- });
- return createGPUDevice(
- descriptor.label,
- inner,
- createGPUQueue(descriptor.label, inner),
- );
- }
-
- /**
- * @param {string[]} unmaskHints
- * @returns {Promise<GPUAdapterInfo>}
- */
- async requestAdapterInfo(unmaskHints = []) {
- webidl.assertBranded(this, GPUAdapterPrototype);
- const prefix = "Failed to execute 'requestAdapterInfo' on 'GPUAdapter'";
- unmaskHints = webidl.converters["sequence<DOMString>"](unmaskHints, {
- prefix,
- context: "Argument 1",
- });
-
- const {
- vendor,
- architecture,
- device,
- description,
- } = await core.opAsync(
- "op_webgpu_request_adapter_info",
- this[_adapter].rid,
- );
-
- const adapterInfo = webidl.createBranded(GPUAdapterInfo);
- adapterInfo[_vendor] = unmaskHints.includes("vendor") ? vendor : "";
- adapterInfo[_architecture] = unmaskHints.includes("architecture")
- ? architecture
- : "";
- adapterInfo[_device] = unmaskHints.includes("device") ? device : "";
- adapterInfo[_description] = unmaskHints.includes("description")
- ? description
- : "";
- return adapterInfo;
- }
-
- [SymbolFor("Deno.privateCustomInspect")](inspect) {
- return `${this.constructor.name} ${
- inspect({
- features: this.features,
- limits: this.limits,
- })
- }`;
- }
-}
-const GPUAdapterPrototype = GPUAdapter.prototype;
-
-class GPUAdapterInfo {
- /** @type {string} */
- [_vendor];
- /** @returns {string} */
- get vendor() {
- webidl.assertBranded(this, GPUAdapterInfoPrototype);
- return this[_vendor];
- }
-
- /** @type {string} */
- [_architecture];
- /** @returns {string} */
- get architecture() {
- webidl.assertBranded(this, GPUAdapterInfoPrototype);
- return this[_architecture];
- }
-
- /** @type {string} */
- [_device];
- /** @returns {string} */
- get device() {
- webidl.assertBranded(this, GPUAdapterInfoPrototype);
- return this[_device];
- }
-
- /** @type {string} */
- [_description];
- /** @returns {string} */
- get description() {
- webidl.assertBranded(this, GPUAdapterInfoPrototype);
- return this[_description];
- }
-
- [SymbolFor("Deno.privateCustomInspect")](inspect) {
- return `${this.constructor.name} ${
- inspect({
- vendor: this.vendor,
- architecture: this.architecture,
- device: this.device,
- description: this.description,
- })
- }`;
- }
-}
-const GPUAdapterInfoPrototype = GPUAdapterInfo.prototype;
-
-function createGPUSupportedLimits(limits) {
- /** @type {GPUSupportedLimits} */
- const adapterFeatures = webidl.createBranded(GPUSupportedLimits);
- adapterFeatures[_limits] = limits;
- return adapterFeatures;
-}
-
-/**
- * @typedef InnerAdapterLimits
- * @property {number} maxTextureDimension1D
- * @property {number} maxTextureDimension2D
- * @property {number} maxTextureDimension3D
- * @property {number} maxTextureArrayLayers
- * @property {number} maxBindGroups
- * @property {number} maxDynamicUniformBuffersPerPipelineLayout
- * @property {number} maxDynamicStorageBuffersPerPipelineLayout
- * @property {number} maxSampledTexturesPerShaderStage
- * @property {number} maxSamplersPerShaderStage
- * @property {number} maxStorageBuffersPerShaderStage
- * @property {number} maxStorageTexturesPerShaderStage
- * @property {number} maxUniformBuffersPerShaderStage
- * @property {number} maxUniformBufferBindingSize
- * @property {number} maxStorageBufferBindingSize
- * @property {number} minUniformBufferOffsetAlignment
- * @property {number} minStorageBufferOffsetAlignment
- * @property {number} maxVertexBuffers
- * @property {number} maxVertexAttributes
- * @property {number} maxVertexBufferArrayStride
- * @property {number} maxInterStageShaderComponents
- * @property {number} maxComputeWorkgroupStorageSize
- * @property {number} maxComputeInvocationsPerWorkgroup
- * @property {number} maxComputeWorkgroupSizeX
- * @property {number} maxComputeWorkgroupSizeY
- * @property {number} maxComputeWorkgroupSizeZ
- * @property {number} maxComputeWorkgroupsPerDimension
- */
-
-class GPUSupportedLimits {
- /** @type {InnerAdapterLimits} */
- [_limits];
- constructor() {
- webidl.illegalConstructor();
- }
-
- get maxTextureDimension1D() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].maxTextureDimension1D;
- }
- get maxTextureDimension2D() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].maxTextureDimension2D;
- }
- get maxTextureDimension3D() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].maxTextureDimension3D;
- }
- get maxTextureArrayLayers() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].maxTextureArrayLayers;
- }
- get maxBindGroups() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].maxBindGroups;
- }
- get maxBindingsPerBindGroup() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].maxBindingsPerBindGroup;
- }
- get maxBufferSize() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].maxBufferSize;
- }
- get maxDynamicUniformBuffersPerPipelineLayout() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].maxDynamicUniformBuffersPerPipelineLayout;
- }
- get maxDynamicStorageBuffersPerPipelineLayout() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].maxDynamicStorageBuffersPerPipelineLayout;
- }
- get maxSampledTexturesPerShaderStage() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].maxSampledTexturesPerShaderStage;
- }
- get maxSamplersPerShaderStage() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].maxSamplersPerShaderStage;
- }
- get maxStorageBuffersPerShaderStage() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].maxStorageBuffersPerShaderStage;
- }
- get maxStorageTexturesPerShaderStage() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].maxStorageTexturesPerShaderStage;
- }
- get maxUniformBuffersPerShaderStage() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].maxUniformBuffersPerShaderStage;
- }
- get maxUniformBufferBindingSize() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].maxUniformBufferBindingSize;
- }
- get maxStorageBufferBindingSize() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].maxStorageBufferBindingSize;
- }
- get minUniformBufferOffsetAlignment() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].minUniformBufferOffsetAlignment;
- }
- get minStorageBufferOffsetAlignment() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].minStorageBufferOffsetAlignment;
- }
- get maxVertexBuffers() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].maxVertexBuffers;
- }
- get maxVertexAttributes() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].maxVertexAttributes;
- }
- get maxVertexBufferArrayStride() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].maxVertexBufferArrayStride;
- }
- get maxInterStageShaderComponents() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].maxInterStageShaderComponents;
- }
- get maxComputeWorkgroupStorageSize() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].maxComputeWorkgroupStorageSize;
- }
- get maxComputeInvocationsPerWorkgroup() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].maxComputeInvocationsPerWorkgroup;
- }
- get maxComputeWorkgroupSizeX() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].maxComputeWorkgroupSizeX;
- }
- get maxComputeWorkgroupSizeY() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].maxComputeWorkgroupSizeY;
- }
- get maxComputeWorkgroupSizeZ() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].maxComputeWorkgroupSizeZ;
- }
- get maxComputeWorkgroupsPerDimension() {
- webidl.assertBranded(this, GPUSupportedLimitsPrototype);
- return this[_limits].maxComputeWorkgroupsPerDimension;
- }
-
- [SymbolFor("Deno.privateCustomInspect")](inspect) {
- return `${this.constructor.name} ${inspect(this[_limits])}`;
- }
-}
-const GPUSupportedLimitsPrototype = GPUSupportedLimits.prototype;
-
-function createGPUSupportedFeatures(features) {
- /** @type {GPUSupportedFeatures} */
- const supportedFeatures = webidl.createBranded(GPUSupportedFeatures);
- supportedFeatures[webidl.setlikeInner] = new Set(features);
- webidl.setlike(
- supportedFeatures,
- GPUSupportedFeaturesPrototype,
- true,
- );
- return supportedFeatures;
-}
-
-class GPUSupportedFeatures {
- constructor() {
- webidl.illegalConstructor();
- }
- [SymbolFor("Deno.privateCustomInspect")](inspect) {
- return `${this.constructor.name} ${
- inspect([...new SafeArrayIterator(this.values())])
- }`;
- }
-}
-
-const GPUSupportedFeaturesPrototype = GPUSupportedFeatures.prototype;
-
-/**
- * @param {string | undefined} reason
- * @param {string} message
- * @returns {GPUDeviceLostInfo}
- */
-function createGPUDeviceLostInfo(reason, message) {
- /** @type {GPUDeviceLostInfo} */
- const deviceLostInfo = webidl.createBranded(GPUDeviceLostInfo);
- deviceLostInfo[_reason] = reason;
- deviceLostInfo[_message] = message;
- return deviceLostInfo;
-}
-
-class GPUDeviceLostInfo {
- /** @type {string | undefined} */
- [_reason];
- /** @type {string} */
- [_message];
-
- constructor() {
- webidl.illegalConstructor();
- }
-
- get reason() {
- webidl.assertBranded(this, GPUDeviceLostInfoPrototype);
- return this[_reason];
- }
- get message() {
- webidl.assertBranded(this, GPUDeviceLostInfoPrototype);
- return this[_message];
- }
-
- [SymbolFor("Deno.privateCustomInspect")](inspect) {
- return `${this.constructor.name} ${
- inspect({ reason: this[_reason], message: this[_message] })
- }`;
- }
-}
-
-const GPUDeviceLostInfoPrototype = GPUDeviceLostInfo.prototype;
-
-/**
- * @param {string} name
- * @param {any} type
- */
-function GPUObjectBaseMixin(name, type) {
- type.prototype[_label] = null;
- ObjectDefineProperty(type.prototype, "label", {
- /**
- * @return {string | null}
- */
- get() {
- webidl.assertBranded(this, type.prototype);
- return this[_label];
- },
- /**
- * @param {string | null} label
- */
- set(label) {
- webidl.assertBranded(this, type.prototype);
- label = webidl.converters["UVString?"](label, {
- prefix: `Failed to set 'label' on '${name}'`,
- context: "Argument 1",
- });
- this[_label] = label;
- },
- });
-}
-
-/**
- * @typedef ErrorScope
- * @property {string} filter
- * @property {Promise<void>[]} operations
- */
-
-/**
- * @typedef InnerGPUDeviceOptions
- * @property {GPUAdapter} adapter
- * @property {number | undefined} rid
- * @property {GPUSupportedFeatures} features
- * @property {GPUSupportedLimits} limits
- */
-
-class InnerGPUDevice {
- /** @type {GPUAdapter} */
- adapter;
- /** @type {number | undefined} */
- rid;
- /** @type {GPUSupportedFeatures} */
- features;
- /** @type {GPUSupportedLimits} */
- limits;
- /** @type {WeakRef<any>[]} */
- resources;
- /** @type {boolean} */
- isLost;
- /** @type {Promise<GPUDeviceLostInfo>} */
- lost;
- /** @type {(info: GPUDeviceLostInfo) => void} */
- resolveLost;
- /** @type {ErrorScope[]} */
- errorScopeStack;
-
- /**
- * @param {InnerGPUDeviceOptions} options
- */
- constructor(options) {
- this.adapter = options.adapter;
- this.rid = options.rid;
- this.features = options.features;
- this.limits = options.limits;
- this.resources = [];
- this.isLost = false;
- this.resolveLost = () => {};
- this.lost = new Promise((resolve) => {
- this.resolveLost = resolve;
- });
- this.errorScopeStack = [];
- }
-
- /** @param {any} resource */
- trackResource(resource) {
- ArrayPrototypePush(this.resources, new WeakRef(resource));
- }
-
- /** @param {{ type: string, value: string | null } | undefined} err */
- pushError(err) {
- this.pushErrorPromise(PromiseResolve(err));
- }
-
- /** @param {Promise<{ type: string, value: string | null } | undefined>} promise */
- pushErrorPromise(promise) {
- const operation = PromisePrototypeThen(promise, (err) => {
- if (err) {
- switch (err.type) {
- case "lost":
- this.isLost = true;
- this.resolveLost(
- createGPUDeviceLostInfo(undefined, "device was lost"),
- );
- break;
- case "validation":
- return PromiseReject(
- new GPUValidationError(err.value ?? "validation error"),
- );
- case "out-of-memory":
- return PromiseReject(new GPUOutOfMemoryError());
- }
- }
- });
-
- const validationStack = ArrayPrototypeFilter(
- this.errorScopeStack,
- ({ filter }) => filter == "validation",
- );
- const validationScope = validationStack[validationStack.length - 1];
- const validationFilteredPromise = PromisePrototypeCatch(
- operation,
- (err) => {
- if (ObjectPrototypeIsPrototypeOf(GPUValidationErrorPrototype, err)) {
- return PromiseReject(err);
- }
- return PromiseResolve();
- },
- );
- if (validationScope) {
- ArrayPrototypePush(
- validationScope.operations,
- validationFilteredPromise,
- );
- } else {
- PromisePrototypeCatch(validationFilteredPromise, () => {
- // TODO(lucacasonato): emit an UncapturedErrorEvent
- });
- }
- // prevent uncaptured promise rejections
- PromisePrototypeCatch(validationFilteredPromise, (_err) => {});
-
- const oomStack = ArrayPrototypeFilter(
- this.errorScopeStack,
- ({ filter }) => filter == "out-of-memory",
- );
- const oomScope = oomStack[oomStack.length - 1];
- const oomFilteredPromise = PromisePrototypeCatch(operation, (err) => {
- if (ObjectPrototypeIsPrototypeOf(GPUOutOfMemoryErrorPrototype, err)) {
- return PromiseReject(err);
- }
- return PromiseResolve();
- });
- if (oomScope) {
- ArrayPrototypePush(oomScope.operations, oomFilteredPromise);
- } else {
- PromisePrototypeCatch(oomFilteredPromise, () => {
- // TODO(lucacasonato): emit an UncapturedErrorEvent
- });
- }
- // prevent uncaptured promise rejections
- PromisePrototypeCatch(oomFilteredPromise, (_err) => {});
- }
-}
-
-/**
- * @param {string | null} label
- * @param {InnerGPUDevice} inner
- * @param {GPUQueue} queue
- * @returns {GPUDevice}
- */
-function createGPUDevice(label, inner, queue) {
- /** @type {GPUDevice} */
- const device = webidl.createBranded(GPUDevice);
- device[_label] = label;
- device[_device] = inner;
- device[_queue] = queue;
- return device;
-}
-
-class GPUDevice extends EventTarget {
- /** @type {InnerGPUDevice} */
- [_device];
-
- /** @type {GPUQueue} */
- [_queue];
-
- [_cleanup]() {
- const device = this[_device];
- const resources = device.resources;
- while (resources.length > 0) {
- const resource = ArrayPrototypePop(resources)?.deref();
- if (resource) {
- resource[_cleanup]();
- }
- }
- const rid = device.rid;
- if (rid !== undefined) {
- core.close(rid);
- /** @type {number | undefined} */
- device.rid = undefined;
- }
- }
-
- get features() {
- webidl.assertBranded(this, GPUDevicePrototype);
- return this[_device].features;
- }
- get limits() {
- webidl.assertBranded(this, GPUDevicePrototype);
- return this[_device].limits;
- }
- get queue() {
- webidl.assertBranded(this, GPUDevicePrototype);
- return this[_queue];
- }
-
- constructor() {
- webidl.illegalConstructor();
- super();
- }
-
- destroy() {
- webidl.assertBranded(this, GPUDevicePrototype);
- this[_cleanup]();
- }
-
- /**
- * @param {GPUBufferDescriptor} descriptor
- * @returns {GPUBuffer}
- */
- createBuffer(descriptor) {
- webidl.assertBranded(this, GPUDevicePrototype);
- const prefix = "Failed to execute 'createBuffer' on 'GPUDevice'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- descriptor = webidl.converters.GPUBufferDescriptor(descriptor, {
- prefix,
- context: "Argument 1",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const { rid, err } = ops.op_webgpu_create_buffer(
- device.rid,
- descriptor.label,
- descriptor.size,
- descriptor.usage,
- descriptor.mappedAtCreation,
- );
- device.pushError(err);
- /** @type {CreateGPUBufferOptions} */
- let options;
- if (descriptor.mappedAtCreation) {
- options = {
- mapping: new ArrayBuffer(descriptor.size),
- mappingRange: [0, descriptor.size],
- mappedRanges: [],
- state: "mapped at creation",
- };
- } else {
- options = {
- mapping: null,
- mappedRanges: null,
- mappingRange: null,
- state: "unmapped",
- };
- }
- const buffer = createGPUBuffer(
- descriptor.label,
- device,
- rid,
- descriptor.size,
- descriptor.usage,
- options,
- );
- device.trackResource(buffer);
- return buffer;
- }
-
- /**
- * @param {GPUTextureDescriptor} descriptor
- * @returns {GPUTexture}
- */
- createTexture(descriptor) {
- webidl.assertBranded(this, GPUDevicePrototype);
- const prefix = "Failed to execute 'createTexture' on 'GPUDevice'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- descriptor = webidl.converters.GPUTextureDescriptor(descriptor, {
- prefix,
- context: "Argument 1",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const { rid, err } = ops.op_webgpu_create_texture({
- deviceRid: device.rid,
- ...descriptor,
- size: normalizeGPUExtent3D(descriptor.size),
- });
- device.pushError(err);
-
- const texture = createGPUTexture(
- descriptor,
- device,
- rid,
- );
- device.trackResource(texture);
- return texture;
- }
-
- /**
- * @param {GPUSamplerDescriptor} descriptor
- * @returns {GPUSampler}
- */
- createSampler(descriptor = {}) {
- webidl.assertBranded(this, GPUDevicePrototype);
- const prefix = "Failed to execute 'createSampler' on 'GPUDevice'";
- descriptor = webidl.converters.GPUSamplerDescriptor(descriptor, {
- prefix,
- context: "Argument 1",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const { rid, err } = ops.op_webgpu_create_sampler({
- deviceRid: device.rid,
- ...descriptor,
- });
- device.pushError(err);
-
- const sampler = createGPUSampler(
- descriptor.label,
- device,
- rid,
- );
- device.trackResource(sampler);
- return sampler;
- }
-
- /**
- * @param {GPUBindGroupLayoutDescriptor} descriptor
- * @returns {GPUBindGroupLayout}
- */
- createBindGroupLayout(descriptor) {
- webidl.assertBranded(this, GPUDevicePrototype);
- const prefix = "Failed to execute 'createBindGroupLayout' on 'GPUDevice'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- descriptor = webidl.converters.GPUBindGroupLayoutDescriptor(descriptor, {
- prefix,
- context: "Argument 1",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- for (let i = 0; i < descriptor.entries.length; ++i) {
- const entry = descriptor.entries[i];
-
- let j = 0;
- if (entry.buffer) j++;
- if (entry.sampler) j++;
- if (entry.texture) j++;
- if (entry.storageTexture) j++;
-
- if (j !== 1) {
- throw new Error(); // TODO(@crowlKats): correct error
- }
- }
-
- const { rid, err } = ops.op_webgpu_create_bind_group_layout(
- device.rid,
- descriptor.label,
- descriptor.entries,
- );
- device.pushError(err);
-
- const bindGroupLayout = createGPUBindGroupLayout(
- descriptor.label,
- device,
- rid,
- );
- device.trackResource(bindGroupLayout);
- return bindGroupLayout;
- }
-
- /**
- * @param {GPUPipelineLayoutDescriptor} descriptor
- * @returns {GPUPipelineLayout}
- */
- createPipelineLayout(descriptor) {
- webidl.assertBranded(this, GPUDevicePrototype);
- const prefix = "Failed to execute 'createPipelineLayout' on 'GPUDevice'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- descriptor = webidl.converters.GPUPipelineLayoutDescriptor(descriptor, {
- prefix,
- context: "Argument 1",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const bindGroupLayouts = ArrayPrototypeMap(
- descriptor.bindGroupLayouts,
- (layout, i) => {
- const context = `bind group layout ${i + 1}`;
- const rid = assertResource(layout, { prefix, context });
- assertDeviceMatch(device, layout, {
- prefix,
- selfContext: "this",
- resourceContext: context,
- });
- return rid;
- },
- );
- const { rid, err } = ops.op_webgpu_create_pipeline_layout(
- device.rid,
- descriptor.label,
- bindGroupLayouts,
- );
- device.pushError(err);
-
- const pipelineLayout = createGPUPipelineLayout(
- descriptor.label,
- device,
- rid,
- );
- device.trackResource(pipelineLayout);
- return pipelineLayout;
- }
-
- /**
- * @param {GPUBindGroupDescriptor} descriptor
- * @returns {GPUBindGroup}
- */
- createBindGroup(descriptor) {
- webidl.assertBranded(this, GPUDevicePrototype);
- const prefix = "Failed to execute 'createBindGroup' on 'GPUDevice'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- descriptor = webidl.converters.GPUBindGroupDescriptor(descriptor, {
- prefix,
- context: "Argument 1",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const layout = assertResource(descriptor.layout, {
- prefix,
- context: "layout",
- });
- assertDeviceMatch(device, descriptor.layout, {
- prefix,
- resourceContext: "layout",
- selfContext: "this",
- });
- const entries = ArrayPrototypeMap(descriptor.entries, (entry, i) => {
- const context = `entry ${i + 1}`;
- const resource = entry.resource;
- if (ObjectPrototypeIsPrototypeOf(GPUSamplerPrototype, resource)) {
- const rid = assertResource(resource, {
- prefix,
- context,
- });
- assertDeviceMatch(device, resource, {
- prefix,
- resourceContext: context,
- selfContext: "this",
- });
- return {
- binding: entry.binding,
- kind: "GPUSampler",
- resource: rid,
- };
- } else if (
- ObjectPrototypeIsPrototypeOf(GPUTextureViewPrototype, resource)
- ) {
- const rid = assertResource(resource, {
- prefix,
- context,
- });
- assertResource(resource[_texture], {
- prefix,
- context,
- });
- assertDeviceMatch(device, resource[_texture], {
- prefix,
- resourceContext: context,
- selfContext: "this",
- });
- return {
- binding: entry.binding,
- kind: "GPUTextureView",
- resource: rid,
- };
- } else {
- const rid = assertResource(resource.buffer, { prefix, context });
- assertDeviceMatch(device, resource.buffer, {
- prefix,
- resourceContext: context,
- selfContext: "this",
- });
- return {
- binding: entry.binding,
- kind: "GPUBufferBinding",
- resource: rid,
- offset: entry.resource.offset,
- size: entry.resource.size,
- };
- }
- });
-
- const { rid, err } = ops.op_webgpu_create_bind_group(
- device.rid,
- descriptor.label,
- layout,
- entries,
- );
- device.pushError(err);
-
- const bindGroup = createGPUBindGroup(
- descriptor.label,
- device,
- rid,
- );
- device.trackResource(bindGroup);
- return bindGroup;
- }
-
- /**
- * @param {GPUShaderModuleDescriptor} descriptor
- */
- createShaderModule(descriptor) {
- webidl.assertBranded(this, GPUDevicePrototype);
- const prefix = "Failed to execute 'createShaderModule' on 'GPUDevice'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- descriptor = webidl.converters.GPUShaderModuleDescriptor(descriptor, {
- prefix,
- context: "Argument 1",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const { rid, err } = ops.op_webgpu_create_shader_module(
- device.rid,
- descriptor.label,
- descriptor.code,
- );
- device.pushError(err);
-
- const shaderModule = createGPUShaderModule(
- descriptor.label,
- device,
- rid,
- );
- device.trackResource(shaderModule);
- return shaderModule;
- }
-
- /**
- * @param {GPUComputePipelineDescriptor} descriptor
- * @returns {GPUComputePipeline}
- */
- createComputePipeline(descriptor) {
- webidl.assertBranded(this, GPUDevicePrototype);
- const prefix = "Failed to execute 'createComputePipeline' on 'GPUDevice'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- descriptor = webidl.converters.GPUComputePipelineDescriptor(descriptor, {
- prefix,
- context: "Argument 1",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- let layout = descriptor.layout;
- if (typeof descriptor.layout !== "string") {
- const context = "layout";
- layout = assertResource(descriptor.layout, { prefix, context });
- assertDeviceMatch(device, descriptor.layout, {
- prefix,
- resourceContext: context,
- selfContext: "this",
- });
- }
- const module = assertResource(descriptor.compute.module, {
- prefix,
- context: "compute shader module",
- });
- assertDeviceMatch(device, descriptor.compute.module, {
- prefix,
- resourceContext: "compute shader module",
- selfContext: "this",
- });
-
- const { rid, err } = ops.op_webgpu_create_compute_pipeline(
- device.rid,
- descriptor.label,
- layout,
- {
- module,
- entryPoint: descriptor.compute.entryPoint,
- constants: descriptor.compute.constants,
- },
- );
- device.pushError(err);
-
- const computePipeline = createGPUComputePipeline(
- descriptor.label,
- device,
- rid,
- );
- device.trackResource(computePipeline);
- return computePipeline;
- }
-
- /**
- * @param {GPURenderPipelineDescriptor} descriptor
- * @returns {GPURenderPipeline}
- */
- createRenderPipeline(descriptor) {
- webidl.assertBranded(this, GPUDevicePrototype);
- const prefix = "Failed to execute 'createRenderPipeline' on 'GPUDevice'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- descriptor = webidl.converters.GPURenderPipelineDescriptor(descriptor, {
- prefix,
- context: "Argument 1",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- let layout = descriptor.layout;
- if (typeof descriptor.layout !== "string") {
- const context = "layout";
- layout = assertResource(descriptor.layout, { prefix, context });
- assertDeviceMatch(device, descriptor.layout, {
- prefix,
- resourceContext: context,
- selfContext: "this",
- });
- }
- const module = assertResource(descriptor.vertex.module, {
- prefix,
- context: "vertex shader module",
- });
- assertDeviceMatch(device, descriptor.vertex.module, {
- prefix,
- resourceContext: "vertex shader module",
- selfContext: "this",
- });
- let fragment = undefined;
- if (descriptor.fragment) {
- const module = assertResource(descriptor.fragment.module, {
- prefix,
- context: "fragment shader module",
- });
- assertDeviceMatch(device, descriptor.fragment.module, {
- prefix,
- resourceContext: "fragment shader module",
- selfContext: "this",
- });
- fragment = {
- module,
- entryPoint: descriptor.fragment.entryPoint,
- targets: descriptor.fragment.targets,
- };
- }
-
- const { rid, err } = ops.op_webgpu_create_render_pipeline({
- deviceRid: device.rid,
- label: descriptor.label,
- layout,
- vertex: {
- module,
- entryPoint: descriptor.vertex.entryPoint,
- buffers: descriptor.vertex.buffers,
- },
- primitive: descriptor.primitive,
- depthStencil: descriptor.depthStencil,
- multisample: descriptor.multisample,
- fragment,
- });
- device.pushError(err);
-
- const renderPipeline = createGPURenderPipeline(
- descriptor.label,
- device,
- rid,
- );
- device.trackResource(renderPipeline);
- return renderPipeline;
- }
-
- createComputePipelineAsync(descriptor) {
- // TODO(lucacasonato): this should be real async
- return PromiseResolve(this.createComputePipeline(descriptor));
- }
-
- createRenderPipelineAsync(descriptor) {
- // TODO(lucacasonato): this should be real async
- return PromiseResolve(this.createRenderPipeline(descriptor));
- }
-
- /**
- * @param {GPUCommandEncoderDescriptor} descriptor
- * @returns {GPUCommandEncoder}
- */
- createCommandEncoder(descriptor = {}) {
- webidl.assertBranded(this, GPUDevicePrototype);
- const prefix = "Failed to execute 'createCommandEncoder' on 'GPUDevice'";
- descriptor = webidl.converters.GPUCommandEncoderDescriptor(descriptor, {
- prefix,
- context: "Argument 1",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const { rid, err } = ops.op_webgpu_create_command_encoder(
- device.rid,
- descriptor.label,
- );
- device.pushError(err);
-
- const commandEncoder = createGPUCommandEncoder(
- descriptor.label,
- device,
- rid,
- );
- device.trackResource(commandEncoder);
- return commandEncoder;
- }
-
- /**
- * @param {GPURenderBundleEncoderDescriptor} descriptor
- * @returns {GPURenderBundleEncoder}
- */
- createRenderBundleEncoder(descriptor) {
- webidl.assertBranded(this, GPUDevicePrototype);
- const prefix =
- "Failed to execute 'createRenderBundleEncoder' on 'GPUDevice'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- descriptor = webidl.converters.GPURenderBundleEncoderDescriptor(
- descriptor,
- {
- prefix,
- context: "Argument 1",
- },
- );
- const device = assertDevice(this, { prefix, context: "this" });
- const { rid, err } = ops.op_webgpu_create_render_bundle_encoder({
- deviceRid: device.rid,
- ...descriptor,
- });
- device.pushError(err);
-
- const renderBundleEncoder = createGPURenderBundleEncoder(
- descriptor.label,
- device,
- rid,
- );
- device.trackResource(renderBundleEncoder);
- return renderBundleEncoder;
- }
-
- /**
- * @param {GPUQuerySetDescriptor} descriptor
- * @returns {GPUQuerySet}
- */
- createQuerySet(descriptor) {
- webidl.assertBranded(this, GPUDevicePrototype);
- const prefix = "Failed to execute 'createQuerySet' on 'GPUDevice'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- descriptor = webidl.converters.GPUQuerySetDescriptor(
- descriptor,
- {
- prefix,
- context: "Argument 1",
- },
- );
- const device = assertDevice(this, { prefix, context: "this" });
- const { rid, err } = ops.op_webgpu_create_query_set({
- deviceRid: device.rid,
- ...descriptor,
- });
- device.pushError(err);
-
- const querySet = createGPUQuerySet(
- descriptor.label,
- device,
- rid,
- descriptor,
- );
- device.trackResource(querySet);
- return querySet;
- }
-
- get lost() {
- webidl.assertBranded(this, GPUDevicePrototype);
- const device = this[_device];
- if (!device) {
- return PromiseResolve(true);
- }
- if (device.rid === undefined) {
- return PromiseResolve(true);
- }
- return device.lost;
- }
-
- /**
- * @param {GPUErrorFilter} filter
- */
- pushErrorScope(filter) {
- webidl.assertBranded(this, GPUDevicePrototype);
- const prefix = "Failed to execute 'pushErrorScope' on 'GPUDevice'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- filter = webidl.converters.GPUErrorFilter(filter, {
- prefix,
- context: "Argument 1",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- ArrayPrototypePush(device.errorScopeStack, { filter, operations: [] });
- }
-
- /**
- * @returns {Promise<GPUError | null>}
- */
- // deno-lint-ignore require-await
- async popErrorScope() {
- webidl.assertBranded(this, GPUDevicePrototype);
- const prefix = "Failed to execute 'popErrorScope' on 'GPUDevice'";
- const device = assertDevice(this, { prefix, context: "this" });
- if (device.isLost) {
- throw new DOMException("Device has been lost.", "OperationError");
- }
- const scope = ArrayPrototypePop(device.errorScopeStack);
- if (!scope) {
- throw new DOMException(
- "There are no error scopes on the error scope stack.",
- "OperationError",
- );
- }
- const operations = SafePromiseAll(scope.operations);
- return PromisePrototypeThen(
- operations,
- () => PromiseResolve(null),
- (err) => PromiseResolve(err),
- );
- }
-
- [SymbolFor("Deno.privateCustomInspect")](inspect) {
- return `${this.constructor.name} ${
- inspect({
- features: this.features,
- label: this.label,
- limits: this.limits,
- queue: this.queue,
- })
- }`;
- }
-}
-GPUObjectBaseMixin("GPUDevice", GPUDevice);
-const GPUDevicePrototype = GPUDevice.prototype;
-
-/**
- * @param {string | null} label
- * @param {InnerGPUDevice} device
- * @returns {GPUQueue}
- */
-function createGPUQueue(label, device) {
- /** @type {GPUQueue} */
- const queue = webidl.createBranded(GPUQueue);
- queue[_label] = label;
- queue[_device] = device;
- return queue;
-}
-
-class GPUQueue {
- /** @type {InnerGPUDevice} */
- [_device];
-
- constructor() {
- webidl.illegalConstructor();
- }
-
- /**
- * @param {GPUCommandBuffer[]} commandBuffers
- */
- submit(commandBuffers) {
- webidl.assertBranded(this, GPUQueuePrototype);
- const prefix = "Failed to execute 'submit' on 'GPUQueue'";
- webidl.requiredArguments(arguments.length, 1, {
- prefix,
- });
- commandBuffers = webidl.converters["sequence<GPUCommandBuffer>"](
- commandBuffers,
- { prefix, context: "Argument 1" },
- );
- const device = assertDevice(this, { prefix, context: "this" });
- const commandBufferRids = ArrayPrototypeMap(
- commandBuffers,
- (buffer, i) => {
- const context = `command buffer ${i + 1}`;
- const rid = assertResource(buffer, { prefix, context });
- assertDeviceMatch(device, buffer, {
- prefix,
- selfContext: "this",
- resourceContext: context,
- });
- return rid;
- },
- );
- const { err } = ops.op_webgpu_queue_submit(device.rid, commandBufferRids);
- for (let i = 0; i < commandBuffers.length; ++i) {
- commandBuffers[i][_rid] = undefined;
- }
- device.pushError(err);
- }
-
- onSubmittedWorkDone() {
- webidl.assertBranded(this, GPUQueuePrototype);
- return PromiseResolve();
- }
-
- /**
- * @param {GPUBuffer} buffer
- * @param {number} bufferOffset
- * @param {BufferSource} data
- * @param {number} [dataOffset]
- * @param {number} [size]
- */
- writeBuffer(buffer, bufferOffset, data, dataOffset = 0, size) {
- webidl.assertBranded(this, GPUQueuePrototype);
- const prefix = "Failed to execute 'writeBuffer' on 'GPUQueue'";
- webidl.requiredArguments(arguments.length, 3, { prefix });
- buffer = webidl.converters["GPUBuffer"](buffer, {
- prefix,
- context: "Argument 1",
- });
- bufferOffset = webidl.converters["GPUSize64"](bufferOffset, {
- prefix,
- context: "Argument 2",
- });
- data = webidl.converters.BufferSource(data, {
- prefix,
- context: "Argument 3",
- });
- dataOffset = webidl.converters["GPUSize64"](dataOffset, {
- prefix,
- context: "Argument 4",
- });
- size = size === undefined
- ? undefined
- : webidl.converters["GPUSize64"](size, {
- prefix,
- context: "Argument 5",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const bufferRid = assertResource(buffer, {
- prefix,
- context: "Argument 1",
- });
- assertDeviceMatch(device, buffer, {
- prefix,
- selfContext: "this",
- resourceContext: "Argument 1",
- });
- const { err } = ops.op_webgpu_write_buffer(
- device.rid,
- bufferRid,
- bufferOffset,
- dataOffset,
- size,
- new Uint8Array(ArrayBufferIsView(data) ? data.buffer : data),
- );
- device.pushError(err);
- }
-
- /**
- * @param {GPUImageCopyTexture} destination
- * @param {BufferSource} data
- * @param {GPUImageDataLayout} dataLayout
- * @param {GPUExtent3D} size
- */
- writeTexture(destination, data, dataLayout, size) {
- webidl.assertBranded(this, GPUQueuePrototype);
- const prefix = "Failed to execute 'writeTexture' on 'GPUQueue'";
- webidl.requiredArguments(arguments.length, 4, { prefix });
- destination = webidl.converters.GPUImageCopyTexture(destination, {
- prefix,
- context: "Argument 1",
- });
- data = webidl.converters.BufferSource(data, {
- prefix,
- context: "Argument 2",
- });
- dataLayout = webidl.converters.GPUImageDataLayout(dataLayout, {
- prefix,
- context: "Argument 3",
- });
- size = webidl.converters.GPUExtent3D(size, {
- prefix,
- context: "Argument 4",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const textureRid = assertResource(destination.texture, {
- prefix,
- context: "texture",
- });
- assertDeviceMatch(device, destination.texture, {
- prefix,
- selfContext: "this",
- resourceContext: "texture",
- });
- const { err } = ops.op_webgpu_write_texture(
- device.rid,
- {
- texture: textureRid,
- mipLevel: destination.mipLevel,
- origin: destination.origin
- ? normalizeGPUOrigin3D(destination.origin)
- : undefined,
- aspect: destination.aspect,
- },
- dataLayout,
- normalizeGPUExtent3D(size),
- new Uint8Array(ArrayBufferIsView(data) ? data.buffer : data),
- );
- device.pushError(err);
- }
-
- copyImageBitmapToTexture(_source, _destination, _copySize) {
- throw new Error("Not yet implemented");
- }
-
- [SymbolFor("Deno.privateCustomInspect")](inspect) {
- return `${this.constructor.name} ${
- inspect({
- label: this.label,
- })
- }`;
- }
-}
-GPUObjectBaseMixin("GPUQueue", GPUQueue);
-const GPUQueuePrototype = GPUQueue.prototype;
-
-/**
- * @typedef CreateGPUBufferOptions
- * @property {ArrayBuffer | null} mapping
- * @property {number[] | null} mappingRange
- * @property {[ArrayBuffer, number, number][] | null} mappedRanges
- * @property {"mapped" | "mapped at creation" | "mapped pending" | "unmapped" | "destroy" } state
- */
-
-/**
- * @param {string | null} label
- * @param {InnerGPUDevice} device
- * @param {number} rid
- * @param {number} size
- * @param {number} usage
- * @param {CreateGPUBufferOptions} options
- * @returns {GPUBuffer}
- */
-function createGPUBuffer(label, device, rid, size, usage, options) {
- /** @type {GPUBuffer} */
- const buffer = webidl.createBranded(GPUBuffer);
- buffer[_label] = label;
- buffer[_device] = device;
- buffer[_rid] = rid;
- buffer[_size] = size;
- buffer[_usage] = usage;
- buffer[_mappingRange] = options.mappingRange;
- buffer[_mappedRanges] = options.mappedRanges;
- buffer[_state] = options.state;
- return buffer;
-}
-
-class GPUBuffer {
- /** @type {InnerGPUDevice} */
- [_device];
- /** @type {number} */
- [_rid];
- /** @type {number} */
- [_size];
- /** @type {number} */
- [_usage];
- /** @type {"mapped" | "mapped at creation" | "pending" | "unmapped" | "destroy"} */
- [_state];
- /** @type {[number, number] | null} */
- [_mappingRange];
- /** @type {[ArrayBuffer, number, number][] | null} */
- [_mappedRanges];
- /** @type {number} */
- [_mapMode];
-
- [_cleanup]() {
- const mappedRanges = this[_mappedRanges];
- if (mappedRanges) {
- while (mappedRanges.length > 0) {
- const mappedRange = ArrayPrototypePop(mappedRanges);
- if (mappedRange !== undefined) {
- core.close(mappedRange[1]);
- }
- }
- }
- const rid = this[_rid];
- if (rid !== undefined) {
- core.close(rid);
- /** @type {number | undefined} */
- this[_rid] = undefined;
- }
- this[_state] = "destroy";
- }
-
- constructor() {
- webidl.illegalConstructor();
- }
-
- get size() {
- webidl.assertBranded(this, GPUBufferPrototype);
- return this[_size];
- }
-
- get usage() {
- webidl.assertBranded(this, GPUBufferPrototype);
- return this[_usage];
- }
-
- get mapState() {
- webidl.assertBranded(this, GPUBufferPrototype);
- const state = this[_state];
- if (state === "mapped at creation") {
- return "mapped";
- } else {
- return state;
- }
- }
-
- /**
- * @param {number} mode
- * @param {number} offset
- * @param {number} [size]
- */
- async mapAsync(mode, offset = 0, size) {
- webidl.assertBranded(this, GPUBufferPrototype);
- const prefix = "Failed to execute 'mapAsync' on 'GPUBuffer'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- mode = webidl.converters.GPUMapModeFlags(mode, {
- prefix,
- context: "Argument 1",
- });
- offset = webidl.converters.GPUSize64(offset, {
- prefix,
- context: "Argument 2",
- });
- size = size === undefined ? undefined : webidl.converters.GPUSize64(size, {
- prefix,
- context: "Argument 3",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const bufferRid = assertResource(this, { prefix, context: "this" });
- /** @type {number} */
- let rangeSize;
- if (size === undefined) {
- rangeSize = MathMax(0, this[_size] - offset);
- } else {
- rangeSize = this[_size];
- }
- if ((offset % 8) !== 0) {
- throw new DOMException(
- `${prefix}: offset must be a multiple of 8.`,
- "OperationError",
- );
- }
- if ((rangeSize % 4) !== 0) {
- throw new DOMException(
- `${prefix}: rangeSize must be a multiple of 4.`,
- "OperationError",
- );
- }
- if ((offset + rangeSize) > this[_size]) {
- throw new DOMException(
- `${prefix}: offset + rangeSize must be less than or equal to buffer size.`,
- "OperationError",
- );
- }
- if (this[_state] !== "unmapped") {
- throw new DOMException(
- `${prefix}: GPUBuffer is not currently unmapped.`,
- "OperationError",
- );
- }
- const readMode = (mode & 0x0001) === 0x0001;
- const writeMode = (mode & 0x0002) === 0x0002;
- if ((readMode && writeMode) || (!readMode && !writeMode)) {
- throw new DOMException(
- `${prefix}: exactly one of READ or WRITE map mode must be set.`,
- "OperationError",
- );
- }
- if (readMode && !((this[_usage] && 0x0001) === 0x0001)) {
- throw new DOMException(
- `${prefix}: READ map mode not valid because buffer does not have MAP_READ usage.`,
- "OperationError",
- );
- }
- if (writeMode && !((this[_usage] && 0x0002) === 0x0002)) {
- throw new DOMException(
- `${prefix}: WRITE map mode not valid because buffer does not have MAP_WRITE usage.`,
- "OperationError",
- );
- }
-
- this[_mapMode] = mode;
- this[_state] = "pending";
- const promise = PromisePrototypeThen(
- core.opAsync(
- "op_webgpu_buffer_get_map_async",
- bufferRid,
- device.rid,
- mode,
- offset,
- rangeSize,
- ),
- ({ err }) => err,
- );
- device.pushErrorPromise(promise);
- const err = await promise;
- if (err) {
- throw new DOMException("validation error occured", "OperationError");
- }
- this[_state] = "mapped";
- this[_mappingRange] = [offset, offset + rangeSize];
- /** @type {[ArrayBuffer, number, number][] | null} */
- this[_mappedRanges] = [];
- }
-
- /**
- * @param {number} offset
- * @param {number} size
- */
- getMappedRange(offset = 0, size) {
- webidl.assertBranded(this, GPUBufferPrototype);
- const prefix = "Failed to execute 'getMappedRange' on 'GPUBuffer'";
- offset = webidl.converters.GPUSize64(offset, {
- prefix,
- context: "Argument 1",
- });
- if (size !== undefined) {
- size = webidl.converters.GPUSize64(size, {
- prefix,
- context: "Argument 2",
- });
- }
- assertDevice(this, { prefix, context: "this" });
- const bufferRid = assertResource(this, { prefix, context: "this" });
- /** @type {number} */
- let rangeSize;
- if (size === undefined) {
- rangeSize = MathMax(0, this[_size] - offset);
- } else {
- rangeSize = size;
- }
-
- const mappedRanges = this[_mappedRanges];
- if (!mappedRanges) {
- throw new DOMException(`${prefix}: invalid state.`, "OperationError");
- }
- for (let i = 0; i < mappedRanges.length; ++i) {
- const { 0: buffer, /* 1: rid, */ 2: start } = mappedRanges[i];
- // TODO(lucacasonato): is this logic correct?
- const end = start + buffer.byteLength;
- if (
- (start >= offset && start < (offset + rangeSize)) ||
- (end >= offset && end < (offset + rangeSize))
- ) {
- throw new DOMException(
- `${prefix}: requested buffer overlaps with another mapped range.`,
- "OperationError",
- );
- }
- }
-
- const buffer = new ArrayBuffer(rangeSize);
- const { rid } = ops.op_webgpu_buffer_get_mapped_range(
- bufferRid,
- offset,
- size,
- new Uint8Array(buffer),
- );
-
- ArrayPrototypePush(mappedRanges, [buffer, rid, offset]);
-
- return buffer;
- }
-
- unmap() {
- webidl.assertBranded(this, GPUBufferPrototype);
- const prefix = "Failed to execute 'unmap' on 'GPUBuffer'";
- const device = assertDevice(this, { prefix, context: "this" });
- const bufferRid = assertResource(this, { prefix, context: "this" });
- if (this[_state] === "unmapped" || this[_state] === "destroyed") {
- throw new DOMException(
- `${prefix}: buffer is not ready to be unmapped.`,
- "OperationError",
- );
- }
- if (this[_state] === "pending") {
- // TODO(lucacasonato): this is not spec compliant.
- throw new DOMException(
- `${prefix}: can not unmap while mapping. This is a Deno limitation.`,
- "OperationError",
- );
- } else if (
- this[_state] === "mapped" || this[_state] === "mapped at creation"
- ) {
- /** @type {boolean} */
- let write = false;
- if (this[_state] === "mapped at creation") {
- write = true;
- } else if (this[_state] === "mapped") {
- const mapMode = this[_mapMode];
- if (mapMode === undefined) {
- throw new DOMException(
- `${prefix}: invalid state.`,
- "OperationError",
- );
- }
- if ((mapMode & 0x0002) === 0x0002) {
- write = true;
- }
- }
-
- const mappedRanges = this[_mappedRanges];
- if (!mappedRanges) {
- throw new DOMException(`${prefix}: invalid state.`, "OperationError");
- }
- for (let i = 0; i < mappedRanges.length; ++i) {
- const { 0: buffer, 1: mappedRid } = mappedRanges[i];
- const { err } = ops.op_webgpu_buffer_unmap(
- bufferRid,
- mappedRid,
- ...new SafeArrayIterator(write ? [new Uint8Array(buffer)] : []),
- );
- device.pushError(err);
- if (err) return;
- }
- this[_mappingRange] = null;
- this[_mappedRanges] = null;
- }
-
- this[_state] = "unmapped";
- }
-
- destroy() {
- webidl.assertBranded(this, GPUBufferPrototype);
- this[_cleanup]();
- }
-
- [SymbolFor("Deno.privateCustomInspect")](inspect) {
- return `${this.constructor.name} ${
- inspect({
- label: this.label,
- })
- }`;
- }
-}
-GPUObjectBaseMixin("GPUBuffer", GPUBuffer);
-const GPUBufferPrototype = GPUBuffer.prototype;
-
-class GPUBufferUsage {
- constructor() {
- webidl.illegalConstructor();
- }
-
- static get MAP_READ() {
- return 0x0001;
- }
- static get MAP_WRITE() {
- return 0x0002;
- }
- static get COPY_SRC() {
- return 0x0004;
- }
- static get COPY_DST() {
- return 0x0008;
- }
- static get INDEX() {
- return 0x0010;
- }
- static get VERTEX() {
- return 0x0020;
- }
- static get UNIFORM() {
- return 0x0040;
- }
- static get STORAGE() {
- return 0x0080;
- }
- static get INDIRECT() {
- return 0x0100;
- }
- static get QUERY_RESOLVE() {
- return 0x0200;
- }
-}
-
-class GPUMapMode {
- constructor() {
- webidl.illegalConstructor();
- }
-
- static get READ() {
- return 0x0001;
- }
- static get WRITE() {
- return 0x0002;
- }
-}
-
-/**
- * @param {GPUTextureDescriptor} descriptor
- * @param {InnerGPUDevice} device
- * @param {number} rid
- * @returns {GPUTexture}
- */
-function createGPUTexture(descriptor, device, rid) {
- /** @type {GPUTexture} */
- const texture = webidl.createBranded(GPUTexture);
- texture[_label] = descriptor.label;
- texture[_device] = device;
- texture[_rid] = rid;
- texture[_views] = [];
- texture[_width] = descriptor.size.width;
- texture[_height] = descriptor.size.height;
- texture[_depthOrArrayLayers] = descriptor.size.depthOrArrayLayers;
- texture[_mipLevelCount] = descriptor.mipLevelCount;
- texture[_sampleCount] = descriptor.sampleCount;
- texture[_dimension] = descriptor.dimension;
- texture[_format] = descriptor.format;
- texture[_usage] = descriptor.usage;
- return texture;
-}
-
-class GPUTexture {
- /** @type {InnerGPUDevice} */
- [_device];
- /** @type {number | undefined} */
- [_rid];
- /** @type {WeakRef<GPUTextureView>[]} */
- [_views];
-
- /** @type {number} */
- [_width];
- /** @type {number} */
- [_height];
- /** @type {number} */
- [_depthOrArrayLayers];
- /** @type {number} */
- [_mipLevelCount];
- /** @type {number} */
- [_sampleCount];
- /** @type {GPUTextureDimension} */
- [_dimension];
- /** @type {GPUTextureFormat} */
- [_format];
- /** @type {number} */
- [_usage];
-
- [_cleanup]() {
- const views = this[_views];
- while (views.length > 0) {
- const view = ArrayPrototypePop(views)?.deref();
- if (view) {
- view[_cleanup]();
- }
- }
- const rid = this[_rid];
- if (rid !== undefined) {
- core.close(rid);
- /** @type {number | undefined} */
- this[_rid] = undefined;
- }
- }
-
- constructor() {
- webidl.illegalConstructor();
- }
-
- /**
- * @param {GPUTextureViewDescriptor} descriptor
- */
- createView(descriptor = {}) {
- webidl.assertBranded(this, GPUTexturePrototype);
- const prefix = "Failed to execute 'createView' on 'GPUTexture'";
- webidl.requiredArguments(arguments.length, 0, { prefix });
- descriptor = webidl.converters.GPUTextureViewDescriptor(descriptor, {
- prefix,
- context: "Argument 1",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const textureRid = assertResource(this, { prefix, context: "this" });
- const { rid, err } = ops.op_webgpu_create_texture_view({
- textureRid,
- ...descriptor,
- });
- device.pushError(err);
-
- const textureView = createGPUTextureView(
- descriptor.label,
- this,
- rid,
- );
- ArrayPrototypePush(this[_views], new WeakRef(textureView));
- return textureView;
- }
-
- destroy() {
- webidl.assertBranded(this, GPUTexturePrototype);
- this[_cleanup]();
- }
-
- get width() {
- webidl.assertBranded(this, GPUTexturePrototype);
- return this[_width];
- }
-
- get height() {
- webidl.assertBranded(this, GPUTexturePrototype);
- return this[_height];
- }
-
- get depthOrArrayLayers() {
- webidl.assertBranded(this, GPUTexturePrototype);
- return this[_depthOrArrayLayers];
- }
-
- get mipLevelCount() {
- webidl.assertBranded(this, GPUTexturePrototype);
- return this[_mipLevelCount];
- }
-
- get sampleCount() {
- webidl.assertBranded(this, GPUTexturePrototype);
- return this[_sampleCount];
- }
-
- get dimension() {
- webidl.assertBranded(this, GPUTexturePrototype);
- return this[_dimension];
- }
-
- get format() {
- webidl.assertBranded(this, GPUTexturePrototype);
- return this[_format];
- }
-
- get usage() {
- webidl.assertBranded(this, GPUTexturePrototype);
- return this[_usage];
- }
-
- [SymbolFor("Deno.privateCustomInspect")](inspect) {
- return `${this.constructor.name} ${
- inspect({
- label: this.label,
- })
- }`;
- }
-}
-GPUObjectBaseMixin("GPUTexture", GPUTexture);
-const GPUTexturePrototype = GPUTexture.prototype;
-
-class GPUTextureUsage {
- constructor() {
- webidl.illegalConstructor();
- }
-
- static get COPY_SRC() {
- return 0x01;
- }
- static get COPY_DST() {
- return 0x02;
- }
- static get TEXTURE_BINDING() {
- return 0x04;
- }
- static get STORAGE_BINDING() {
- return 0x08;
- }
- static get RENDER_ATTACHMENT() {
- return 0x10;
- }
-}
-
-/**
- * @param {string | null} label
- * @param {GPUTexture} texture
- * @param {number} rid
- * @returns {GPUTextureView}
- */
-function createGPUTextureView(label, texture, rid) {
- /** @type {GPUTextureView} */
- const textureView = webidl.createBranded(GPUTextureView);
- textureView[_label] = label;
- textureView[_texture] = texture;
- textureView[_rid] = rid;
- return textureView;
-}
-class GPUTextureView {
- /** @type {GPUTexture} */
- [_texture];
- /** @type {number | undefined} */
- [_rid];
-
- [_cleanup]() {
- const rid = this[_rid];
- if (rid !== undefined) {
- core.close(rid);
- /** @type {number | undefined} */
- this[_rid] = undefined;
- }
- }
-
- constructor() {
- webidl.illegalConstructor();
- }
-
- [SymbolFor("Deno.privateCustomInspect")](inspect) {
- return `${this.constructor.name} ${
- inspect({
- label: this.label,
- })
- }`;
- }
-}
-GPUObjectBaseMixin("GPUTextureView", GPUTextureView);
-const GPUTextureViewPrototype = GPUTextureView.prototype;
-/**
- * @param {string | null} label
- * @param {InnerGPUDevice} device
- * @param {number} rid
- * @returns {GPUSampler}
- */
-function createGPUSampler(label, device, rid) {
- /** @type {GPUSampler} */
- const sampler = webidl.createBranded(GPUSampler);
- sampler[_label] = label;
- sampler[_device] = device;
- sampler[_rid] = rid;
- return sampler;
-}
-class GPUSampler {
- /** @type {InnerGPUDevice} */
- [_device];
- /** @type {number | undefined} */
- [_rid];
-
- [_cleanup]() {
- const rid = this[_rid];
- if (rid !== undefined) {
- core.close(rid);
- /** @type {number | undefined} */
- this[_rid] = undefined;
- }
- }
-
- constructor() {
- webidl.illegalConstructor();
- }
-
- [SymbolFor("Deno.privateCustomInspect")](inspect) {
- return `${this.constructor.name} ${
- inspect({
- label: this.label,
- })
- }`;
- }
-}
-GPUObjectBaseMixin("GPUSampler", GPUSampler);
-const GPUSamplerPrototype = GPUSampler.prototype;
-/**
- * @param {string | null} label
- * @param {InnerGPUDevice} device
- * @param {number} rid
- * @returns {GPUBindGroupLayout}
- */
-function createGPUBindGroupLayout(label, device, rid) {
- /** @type {GPUBindGroupLayout} */
- const bindGroupLayout = webidl.createBranded(GPUBindGroupLayout);
- bindGroupLayout[_label] = label;
- bindGroupLayout[_device] = device;
- bindGroupLayout[_rid] = rid;
- return bindGroupLayout;
-}
-class GPUBindGroupLayout {
- /** @type {InnerGPUDevice} */
- [_device];
- /** @type {number | undefined} */
- [_rid];
-
- [_cleanup]() {
- const rid = this[_rid];
- if (rid !== undefined) {
- core.close(rid);
- /** @type {number | undefined} */
- this[_rid] = undefined;
- }
- }
-
- constructor() {
- webidl.illegalConstructor();
- }
-
- [SymbolFor("Deno.privateCustomInspect")](inspect) {
- return `${this.constructor.name} ${
- inspect({
- label: this.label,
- })
- }`;
- }
-}
-GPUObjectBaseMixin("GPUBindGroupLayout", GPUBindGroupLayout);
-
-/**
- * @param {string | null} label
- * @param {InnerGPUDevice} device
- * @param {number} rid
- * @returns {GPUPipelineLayout}
- */
-function createGPUPipelineLayout(label, device, rid) {
- /** @type {GPUPipelineLayout} */
- const pipelineLayout = webidl.createBranded(GPUPipelineLayout);
- pipelineLayout[_label] = label;
- pipelineLayout[_device] = device;
- pipelineLayout[_rid] = rid;
- return pipelineLayout;
-}
-class GPUPipelineLayout {
- /** @type {InnerGPUDevice} */
- [_device];
- /** @type {number | undefined} */
- [_rid];
-
- [_cleanup]() {
- const rid = this[_rid];
- if (rid !== undefined) {
- core.close(rid);
- /** @type {number | undefined} */
- this[_rid] = undefined;
- }
- }
-
- constructor() {
- webidl.illegalConstructor();
- }
-
- [SymbolFor("Deno.privateCustomInspect")](inspect) {
- return `${this.constructor.name} ${
- inspect({
- label: this.label,
- })
- }`;
- }
-}
-GPUObjectBaseMixin("GPUPipelineLayout", GPUPipelineLayout);
-
-/**
- * @param {string | null} label
- * @param {InnerGPUDevice} device
- * @param {number} rid
- * @returns {GPUBindGroup}
- */
-function createGPUBindGroup(label, device, rid) {
- /** @type {GPUBindGroup} */
- const bindGroup = webidl.createBranded(GPUBindGroup);
- bindGroup[_label] = label;
- bindGroup[_device] = device;
- bindGroup[_rid] = rid;
- return bindGroup;
-}
-class GPUBindGroup {
- /** @type {InnerGPUDevice} */
- [_device];
- /** @type {number | undefined} */
- [_rid];
-
- [_cleanup]() {
- const rid = this[_rid];
- if (rid !== undefined) {
- core.close(rid);
- /** @type {number | undefined} */
- this[_rid] = undefined;
- }
- }
-
- constructor() {
- webidl.illegalConstructor();
- }
-
- [SymbolFor("Deno.privateCustomInspect")](inspect) {
- return `${this.constructor.name} ${
- inspect({
- label: this.label,
- })
- }`;
- }
-}
-GPUObjectBaseMixin("GPUBindGroup", GPUBindGroup);
-
-/**
- * @param {string | null} label
- * @param {InnerGPUDevice} device
- * @param {number} rid
- * @returns {GPUShaderModule}
- */
-function createGPUShaderModule(label, device, rid) {
- /** @type {GPUShaderModule} */
- const bindGroup = webidl.createBranded(GPUShaderModule);
- bindGroup[_label] = label;
- bindGroup[_device] = device;
- bindGroup[_rid] = rid;
- return bindGroup;
-}
-class GPUShaderModule {
- /** @type {InnerGPUDevice} */
- [_device];
- /** @type {number | undefined} */
- [_rid];
-
- [_cleanup]() {
- const rid = this[_rid];
- if (rid !== undefined) {
- core.close(rid);
- /** @type {number | undefined} */
- this[_rid] = undefined;
- }
- }
-
- constructor() {
- webidl.illegalConstructor();
- }
-
- compilationInfo() {
- throw new Error("Not yet implemented");
- }
-
- [SymbolFor("Deno.privateCustomInspect")](inspect) {
- return `${this.constructor.name} ${
- inspect({
- label: this.label,
- })
- }`;
- }
-}
-GPUObjectBaseMixin("GPUShaderModule", GPUShaderModule);
-
-class GPUShaderStage {
- constructor() {
- webidl.illegalConstructor();
- }
-
- static get VERTEX() {
- return 0x1;
- }
-
- static get FRAGMENT() {
- return 0x2;
- }
-
- static get COMPUTE() {
- return 0x4;
- }
-}
-
-/**
- * @param {string | null} label
- * @param {InnerGPUDevice} device
- * @param {number} rid
- * @returns {GPUComputePipeline}
- */
-function createGPUComputePipeline(label, device, rid) {
- /** @type {GPUComputePipeline} */
- const pipeline = webidl.createBranded(GPUComputePipeline);
- pipeline[_label] = label;
- pipeline[_device] = device;
- pipeline[_rid] = rid;
- return pipeline;
-}
-class GPUComputePipeline {
- /** @type {InnerGPUDevice} */
- [_device];
- /** @type {number | undefined} */
- [_rid];
-
- [_cleanup]() {
- const rid = this[_rid];
- if (rid !== undefined) {
- core.close(rid);
- /** @type {number | undefined} */
- this[_rid] = undefined;
- }
- }
-
- constructor() {
- webidl.illegalConstructor();
- }
-
- /**
- * @param {number} index
- * @returns {GPUBindGroupLayout}
- */
- getBindGroupLayout(index) {
- webidl.assertBranded(this, GPUComputePipelinePrototype);
- const prefix =
- "Failed to execute 'getBindGroupLayout' on 'GPUComputePipeline'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- index = webidl.converters["unsigned long"](index, {
- prefix,
- context: "Argument 1",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const computePipelineRid = assertResource(this, {
- prefix,
- context: "this",
- });
- const { rid, label, err } = ops
- .op_webgpu_compute_pipeline_get_bind_group_layout(
- computePipelineRid,
- index,
- );
- device.pushError(err);
-
- const bindGroupLayout = createGPUBindGroupLayout(
- label,
- device,
- rid,
- );
- device.trackResource(bindGroupLayout);
- return bindGroupLayout;
- }
-
- [SymbolFor("Deno.privateCustomInspect")](inspect) {
- return `${this.constructor.name} ${
- inspect({
- label: this.label,
- })
- }`;
- }
-}
-GPUObjectBaseMixin("GPUComputePipeline", GPUComputePipeline);
-const GPUComputePipelinePrototype = GPUComputePipeline.prototype;
-
-/**
- * @param {string | null} label
- * @param {InnerGPUDevice} device
- * @param {number} rid
- * @returns {GPURenderPipeline}
- */
-function createGPURenderPipeline(label, device, rid) {
- /** @type {GPURenderPipeline} */
- const pipeline = webidl.createBranded(GPURenderPipeline);
- pipeline[_label] = label;
- pipeline[_device] = device;
- pipeline[_rid] = rid;
- return pipeline;
-}
-class GPURenderPipeline {
- /** @type {InnerGPUDevice} */
- [_device];
- /** @type {number | undefined} */
- [_rid];
-
- [_cleanup]() {
- const rid = this[_rid];
- if (rid !== undefined) {
- core.close(rid);
- /** @type {number | undefined} */
- this[_rid] = undefined;
- }
- }
-
- constructor() {
- webidl.illegalConstructor();
- }
-
- /**
- * @param {number} index
- */
- getBindGroupLayout(index) {
- webidl.assertBranded(this, GPURenderPipelinePrototype);
- const prefix =
- "Failed to execute 'getBindGroupLayout' on 'GPURenderPipeline'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- index = webidl.converters["unsigned long"](index, {
- prefix,
- context: "Argument 1",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const renderPipelineRid = assertResource(this, {
- prefix,
- context: "this",
- });
- const { rid, label, err } = ops
- .op_webgpu_render_pipeline_get_bind_group_layout(
- renderPipelineRid,
- index,
- );
- device.pushError(err);
-
- const bindGroupLayout = createGPUBindGroupLayout(
- label,
- device,
- rid,
- );
- device.trackResource(bindGroupLayout);
- return bindGroupLayout;
- }
-
- [SymbolFor("Deno.privateCustomInspect")](inspect) {
- return `${this.constructor.name} ${
- inspect({
- label: this.label,
- })
- }`;
- }
-}
-GPUObjectBaseMixin("GPURenderPipeline", GPURenderPipeline);
-const GPURenderPipelinePrototype = GPURenderPipeline.prototype;
-
-class GPUColorWrite {
- constructor() {
- webidl.illegalConstructor();
- }
-
- static get RED() {
- return 0x1;
- }
- static get GREEN() {
- return 0x2;
- }
- static get BLUE() {
- return 0x4;
- }
- static get ALPHA() {
- return 0x8;
- }
- static get ALL() {
- return 0xF;
- }
-}
-
-/**
- * @param {string | null} label
- * @param {InnerGPUDevice} device
- * @param {number} rid
- * @returns {GPUCommandEncoder}
- */
-function createGPUCommandEncoder(label, device, rid) {
- /** @type {GPUCommandEncoder} */
- const encoder = webidl.createBranded(GPUCommandEncoder);
- encoder[_label] = label;
- encoder[_device] = device;
- encoder[_rid] = rid;
- encoder[_encoders] = [];
- return encoder;
-}
-class GPUCommandEncoder {
- /** @type {InnerGPUDevice} */
- [_device];
- /** @type {number | undefined} */
- [_rid];
- /** @type {WeakRef<GPURenderPassEncoder | GPUComputePassEncoder>[]} */
- [_encoders];
-
- [_cleanup]() {
- const encoders = this[_encoders];
- while (encoders.length > 0) {
- const encoder = ArrayPrototypePop(encoders)?.deref();
- if (encoder) {
- encoder[_cleanup]();
- }
- }
- const rid = this[_rid];
- if (rid !== undefined) {
- core.close(rid);
- /** @type {number | undefined} */
- this[_rid] = undefined;
- }
- }
-
- constructor() {
- webidl.illegalConstructor();
- }
-
- /**
- * @param {GPURenderPassDescriptor} descriptor
- * @return {GPURenderPassEncoder}
- */
- beginRenderPass(descriptor) {
- webidl.assertBranded(this, GPUCommandEncoderPrototype);
- const prefix = "Failed to execute 'beginRenderPass' on 'GPUCommandEncoder'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- descriptor = webidl.converters.GPURenderPassDescriptor(descriptor, {
- prefix,
- context: "Argument 1",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const commandEncoderRid = assertResource(this, {
- prefix,
- context: "this",
- });
-
- if (this[_rid] === undefined) {
- throw new DOMException(
- "Failed to execute 'beginRenderPass' on 'GPUCommandEncoder': already consumed",
- "OperationError",
- );
- }
-
- let depthStencilAttachment;
- if (descriptor.depthStencilAttachment) {
- const view = assertResource(descriptor.depthStencilAttachment.view, {
- prefix,
- context: "texture view for depth stencil attachment",
- });
- assertDeviceMatch(
- device,
- descriptor.depthStencilAttachment.view[_texture],
- {
- prefix,
- resourceContext: "texture view for depth stencil attachment",
- selfContext: "this",
- },
- );
-
- depthStencilAttachment = {
- ...descriptor.depthStencilAttachment,
- view,
- };
- }
- const colorAttachments = ArrayPrototypeMap(
- descriptor.colorAttachments,
- (colorAttachment, i) => {
- const context = `color attachment ${i + 1}`;
- const view = assertResource(colorAttachment.view, {
- prefix,
- context: `texture view for ${context}`,
- });
- assertResource(colorAttachment.view[_texture], {
- prefix,
- context: `texture backing texture view for ${context}`,
- });
- assertDeviceMatch(
- device,
- colorAttachment.view[_texture],
- {
- prefix,
- resourceContext: `texture view for ${context}`,
- selfContext: "this",
- },
- );
- let resolveTarget;
- if (colorAttachment.resolveTarget) {
- resolveTarget = assertResource(
- colorAttachment.resolveTarget,
- {
- prefix,
- context: `resolve target texture view for ${context}`,
- },
- );
- assertResource(colorAttachment.resolveTarget[_texture], {
- prefix,
- context:
- `texture backing resolve target texture view for ${context}`,
- });
- assertDeviceMatch(
- device,
- colorAttachment.resolveTarget[_texture],
- {
- prefix,
- resourceContext: `resolve target texture view for ${context}`,
- selfContext: "this",
- },
- );
- }
- return {
- view: view,
- resolveTarget,
- storeOp: colorAttachment.storeOp,
- loadOp: colorAttachment.loadOp,
- clearValue: normalizeGPUColor(colorAttachment.clearValue),
- };
- },
- );
-
- const { rid } = ops.op_webgpu_command_encoder_begin_render_pass(
- commandEncoderRid,
- descriptor.label,
- colorAttachments,
- depthStencilAttachment,
- );
-
- const renderPassEncoder = createGPURenderPassEncoder(
- descriptor.label,
- this,
- rid,
- );
- ArrayPrototypePush(this[_encoders], new WeakRef(renderPassEncoder));
- return renderPassEncoder;
- }
-
- /**
- * @param {GPUComputePassDescriptor} descriptor
- */
- beginComputePass(descriptor = {}) {
- webidl.assertBranded(this, GPUCommandEncoderPrototype);
- const prefix =
- "Failed to execute 'beginComputePass' on 'GPUCommandEncoder'";
- descriptor = webidl.converters.GPUComputePassDescriptor(descriptor, {
- prefix,
- context: "Argument 1",
- });
-
- assertDevice(this, { prefix, context: "this" });
- const commandEncoderRid = assertResource(this, {
- prefix,
- context: "this",
- });
-
- const { rid } = ops.op_webgpu_command_encoder_begin_compute_pass(
- commandEncoderRid,
- descriptor.label,
- );
-
- const computePassEncoder = createGPUComputePassEncoder(
- descriptor.label,
- this,
- rid,
- );
- ArrayPrototypePush(this[_encoders], new WeakRef(computePassEncoder));
- return computePassEncoder;
- }
-
- /**
- * @param {GPUBuffer} source
- * @param {number} sourceOffset
- * @param {GPUBuffer} destination
- * @param {number} destinationOffset
- * @param {number} size
- */
- copyBufferToBuffer(
- source,
- sourceOffset,
- destination,
- destinationOffset,
- size,
- ) {
- webidl.assertBranded(this, GPUCommandEncoderPrototype);
- const prefix =
- "Failed to execute 'copyBufferToBuffer' on 'GPUCommandEncoder'";
- webidl.requiredArguments(arguments.length, 5, { prefix });
- source = webidl.converters.GPUBuffer(source, {
- prefix,
- context: "Argument 1",
- });
- sourceOffset = webidl.converters.GPUSize64(sourceOffset, {
- prefix,
- context: "Argument 2",
- });
- destination = webidl.converters.GPUBuffer(destination, {
- prefix,
- context: "Argument 3",
- });
- destinationOffset = webidl.converters.GPUSize64(destinationOffset, {
- prefix,
- context: "Argument 4",
- });
- size = webidl.converters.GPUSize64(size, {
- prefix,
- context: "Argument 5",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const commandEncoderRid = assertResource(this, {
- prefix,
- context: "this",
- });
- const sourceRid = assertResource(source, {
- prefix,
- context: "Argument 1",
- });
- assertDeviceMatch(device, source, {
- prefix,
- resourceContext: "Argument 1",
- selfContext: "this",
- });
- const destinationRid = assertResource(destination, {
- prefix,
- context: "Argument 3",
- });
- assertDeviceMatch(device, destination, {
- prefix,
- resourceContext: "Argument 3",
- selfContext: "this",
- });
-
- const { err } = ops.op_webgpu_command_encoder_copy_buffer_to_buffer(
- commandEncoderRid,
- sourceRid,
- sourceOffset,
- destinationRid,
- destinationOffset,
- size,
- );
- device.pushError(err);
- }
-
- /**
- * @param {GPUImageCopyBuffer} source
- * @param {GPUImageCopyTexture} destination
- * @param {GPUExtent3D} copySize
- */
- copyBufferToTexture(source, destination, copySize) {
- webidl.assertBranded(this, GPUCommandEncoderPrototype);
- const prefix =
- "Failed to execute 'copyBufferToTexture' on 'GPUCommandEncoder'";
- webidl.requiredArguments(arguments.length, 3, { prefix });
- source = webidl.converters.GPUImageCopyBuffer(source, {
- prefix,
- context: "Argument 1",
- });
- destination = webidl.converters.GPUImageCopyTexture(destination, {
- prefix,
- context: "Argument 2",
- });
- copySize = webidl.converters.GPUExtent3D(copySize, {
- prefix,
- context: "Argument 3",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const commandEncoderRid = assertResource(this, {
- prefix,
- context: "this",
- });
- const sourceBufferRid = assertResource(source.buffer, {
- prefix,
- context: "source in Argument 1",
- });
- assertDeviceMatch(device, source.buffer, {
- prefix,
- resourceContext: "source in Argument 1",
- selfContext: "this",
- });
- const destinationTextureRid = assertResource(destination.texture, {
- prefix,
- context: "texture in Argument 2",
- });
- assertDeviceMatch(device, destination.texture, {
- prefix,
- resourceContext: "texture in Argument 2",
- selfContext: "this",
- });
-
- const { err } = ops.op_webgpu_command_encoder_copy_buffer_to_texture(
- commandEncoderRid,
- {
- ...source,
- buffer: sourceBufferRid,
- },
- {
- texture: destinationTextureRid,
- mipLevel: destination.mipLevel,
- origin: destination.origin
- ? normalizeGPUOrigin3D(destination.origin)
- : undefined,
- aspect: destination.aspect,
- },
- normalizeGPUExtent3D(copySize),
- );
- device.pushError(err);
- }
-
- /**
- * @param {GPUImageCopyTexture} source
- * @param {GPUImageCopyBuffer} destination
- * @param {GPUExtent3D} copySize
- */
- copyTextureToBuffer(source, destination, copySize) {
- webidl.assertBranded(this, GPUCommandEncoderPrototype);
- const prefix =
- "Failed to execute 'copyTextureToBuffer' on 'GPUCommandEncoder'";
- webidl.requiredArguments(arguments.length, 3, { prefix });
- source = webidl.converters.GPUImageCopyTexture(source, {
- prefix,
- context: "Argument 1",
- });
- destination = webidl.converters.GPUImageCopyBuffer(destination, {
- prefix,
- context: "Argument 2",
- });
- copySize = webidl.converters.GPUExtent3D(copySize, {
- prefix,
- context: "Argument 3",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const commandEncoderRid = assertResource(this, {
- prefix,
- context: "this",
- });
- const sourceTextureRid = assertResource(source.texture, {
- prefix,
- context: "texture in Argument 1",
- });
- assertDeviceMatch(device, source.texture, {
- prefix,
- resourceContext: "texture in Argument 1",
- selfContext: "this",
- });
- const destinationBufferRid = assertResource(destination.buffer, {
- prefix,
- context: "buffer in Argument 2",
- });
- assertDeviceMatch(device, destination.buffer, {
- prefix,
- resourceContext: "buffer in Argument 2",
- selfContext: "this",
- });
- const { err } = ops.op_webgpu_command_encoder_copy_texture_to_buffer(
- commandEncoderRid,
- {
- texture: sourceTextureRid,
- mipLevel: source.mipLevel,
- origin: source.origin ? normalizeGPUOrigin3D(source.origin) : undefined,
- aspect: source.aspect,
- },
- {
- ...destination,
- buffer: destinationBufferRid,
- },
- normalizeGPUExtent3D(copySize),
- );
- device.pushError(err);
- }
-
- /**
- * @param {GPUImageCopyTexture} source
- * @param {GPUImageCopyTexture} destination
- * @param {GPUExtent3D} copySize
- */
- copyTextureToTexture(source, destination, copySize) {
- webidl.assertBranded(this, GPUCommandEncoderPrototype);
- const prefix =
- "Failed to execute 'copyTextureToTexture' on 'GPUCommandEncoder'";
- webidl.requiredArguments(arguments.length, 3, { prefix });
- source = webidl.converters.GPUImageCopyTexture(source, {
- prefix,
- context: "Argument 1",
- });
- destination = webidl.converters.GPUImageCopyTexture(destination, {
- prefix,
- context: "Argument 2",
- });
- copySize = webidl.converters.GPUExtent3D(copySize, {
- prefix,
- context: "Argument 3",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const commandEncoderRid = assertResource(this, {
- prefix,
- context: "this",
- });
- const sourceTextureRid = assertResource(source.texture, {
- prefix,
- context: "texture in Argument 1",
- });
- assertDeviceMatch(device, source.texture, {
- prefix,
- resourceContext: "texture in Argument 1",
- selfContext: "this",
- });
- const destinationTextureRid = assertResource(destination.texture, {
- prefix,
- context: "texture in Argument 2",
- });
- assertDeviceMatch(device, destination.texture, {
- prefix,
- resourceContext: "texture in Argument 2",
- selfContext: "this",
- });
- const { err } = ops.op_webgpu_command_encoder_copy_texture_to_texture(
- commandEncoderRid,
- {
- texture: sourceTextureRid,
- mipLevel: source.mipLevel,
- origin: source.origin ? normalizeGPUOrigin3D(source.origin) : undefined,
- aspect: source.aspect,
- },
- {
- texture: destinationTextureRid,
- mipLevel: destination.mipLevel,
- origin: destination.origin
- ? normalizeGPUOrigin3D(destination.origin)
- : undefined,
- aspect: source.aspect,
- },
- normalizeGPUExtent3D(copySize),
- );
- device.pushError(err);
- }
-
- /**
- * @param {GPUBuffer} buffer
- * @param {GPUSize64} offset
- * @param {GPUSize64} size
- */
- clearBuffer(buffer, offset = 0, size = undefined) {
- webidl.assertBranded(this, GPUCommandEncoderPrototype);
- const prefix = "Failed to execute 'clearBuffer' on 'GPUCommandEncoder'";
- webidl.requiredArguments(arguments.length, 3, { prefix });
- buffer = webidl.converters.GPUBuffer(buffer, {
- prefix,
- context: "Argument 1",
- });
- offset = webidl.converters.GPUSize64(offset, {
- prefix,
- context: "Argument 2",
- });
- size = webidl.converters.GPUSize64(size, {
- prefix,
- context: "Argument 3",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const commandEncoderRid = assertResource(this, {
- prefix,
- context: "this",
- });
- const bufferRid = assertResource(buffer, {
- prefix,
- context: "Argument 1",
- });
- const { err } = ops.op_webgpu_command_encoder_clear_buffer(
- commandEncoderRid,
- bufferRid,
- offset,
- size,
- );
- device.pushError(err);
- }
-
- /**
- * @param {string} groupLabel
- */
- pushDebugGroup(groupLabel) {
- webidl.assertBranded(this, GPUCommandEncoderPrototype);
- const prefix = "Failed to execute 'pushDebugGroup' on 'GPUCommandEncoder'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- groupLabel = webidl.converters.USVString(groupLabel, {
- prefix,
- context: "Argument 1",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const commandEncoderRid = assertResource(this, {
- prefix,
- context: "this",
- });
- const { err } = ops.op_webgpu_command_encoder_push_debug_group(
- commandEncoderRid,
- groupLabel,
- );
- device.pushError(err);
- }
-
- popDebugGroup() {
- webidl.assertBranded(this, GPUCommandEncoderPrototype);
- const prefix = "Failed to execute 'popDebugGroup' on 'GPUCommandEncoder'";
- const device = assertDevice(this, { prefix, context: "this" });
- const commandEncoderRid = assertResource(this, {
- prefix,
- context: "this",
- });
- const { err } = ops.op_webgpu_command_encoder_pop_debug_group(
- commandEncoderRid,
- );
- device.pushError(err);
- }
-
- /**
- * @param {string} markerLabel
- */
- insertDebugMarker(markerLabel) {
- webidl.assertBranded(this, GPUCommandEncoderPrototype);
- const prefix =
- "Failed to execute 'insertDebugMarker' on 'GPUCommandEncoder'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- markerLabel = webidl.converters.USVString(markerLabel, {
- prefix,
- context: "Argument 1",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const commandEncoderRid = assertResource(this, {
- prefix,
- context: "this",
- });
- const { err } = ops.op_webgpu_command_encoder_insert_debug_marker(
- commandEncoderRid,
- markerLabel,
- );
- device.pushError(err);
- }
-
- /**
- * @param {GPUQuerySet} querySet
- * @param {number} queryIndex
- */
- writeTimestamp(querySet, queryIndex) {
- webidl.assertBranded(this, GPUCommandEncoderPrototype);
- const prefix = "Failed to execute 'writeTimestamp' on 'GPUCommandEncoder'";
- webidl.requiredArguments(arguments.length, 2, { prefix });
- querySet = webidl.converters.GPUQuerySet(querySet, {
- prefix,
- context: "Argument 1",
- });
- queryIndex = webidl.converters.GPUSize32(queryIndex, {
- prefix,
- context: "Argument 2",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const commandEncoderRid = assertResource(this, {
- prefix,
- context: "this",
- });
- const querySetRid = assertResource(querySet, {
- prefix,
- context: "Argument 1",
- });
- assertDeviceMatch(device, querySet, {
- prefix,
- resourceContext: "Argument 1",
- selfContext: "this",
- });
- const { err } = ops.op_webgpu_command_encoder_write_timestamp(
- commandEncoderRid,
- querySetRid,
- queryIndex,
- );
- device.pushError(err);
- }
-
- /**
- * @param {GPUQuerySet} querySet
- * @param {number} firstQuery
- * @param {number} queryCount
- * @param {GPUBuffer} destination
- * @param {number} destinationOffset
- */
- resolveQuerySet(
- querySet,
- firstQuery,
- queryCount,
- destination,
- destinationOffset,
- ) {
- webidl.assertBranded(this, GPUCommandEncoderPrototype);
- const prefix = "Failed to execute 'resolveQuerySet' on 'GPUCommandEncoder'";
- webidl.requiredArguments(arguments.length, 5, { prefix });
- querySet = webidl.converters.GPUQuerySet(querySet, {
- prefix,
- context: "Argument 1",
- });
- firstQuery = webidl.converters.GPUSize32(firstQuery, {
- prefix,
- context: "Argument 2",
- });
- queryCount = webidl.converters.GPUSize32(queryCount, {
- prefix,
- context: "Argument 3",
- });
- destination = webidl.converters.GPUBuffer(destination, {
- prefix,
- context: "Argument 4",
- });
- destinationOffset = webidl.converters.GPUSize64(destinationOffset, {
- prefix,
- context: "Argument 5",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const commandEncoderRid = assertResource(this, {
- prefix,
- context: "this",
- });
- const querySetRid = assertResource(querySet, {
- prefix,
- context: "Argument 1",
- });
- assertDeviceMatch(device, querySet, {
- prefix,
- resourceContext: "Argument 1",
- selfContext: "this",
- });
- const destinationRid = assertResource(destination, {
- prefix,
- context: "Argument 3",
- });
- assertDeviceMatch(device, destination, {
- prefix,
- resourceContext: "Argument 3",
- selfContext: "this",
- });
- const { err } = ops.op_webgpu_command_encoder_resolve_query_set(
- commandEncoderRid,
- querySetRid,
- firstQuery,
- queryCount,
- destinationRid,
- destinationOffset,
- );
- device.pushError(err);
- }
-
- /**
- * @param {GPUCommandBufferDescriptor} descriptor
- * @returns {GPUCommandBuffer}
- */
- finish(descriptor = {}) {
- webidl.assertBranded(this, GPUCommandEncoderPrototype);
- const prefix = "Failed to execute 'finish' on 'GPUCommandEncoder'";
- descriptor = webidl.converters.GPUCommandBufferDescriptor(descriptor, {
- prefix,
- context: "Argument 1",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const commandEncoderRid = assertResource(this, {
- prefix,
- context: "this",
- });
- const { rid, err } = ops.op_webgpu_command_encoder_finish(
- commandEncoderRid,
- descriptor.label,
- );
- device.pushError(err);
- /** @type {number | undefined} */
- this[_rid] = undefined;
-
- const commandBuffer = createGPUCommandBuffer(
- descriptor.label,
- device,
- rid,
- );
- device.trackResource(commandBuffer);
- return commandBuffer;
- }
-
- [SymbolFor("Deno.privateCustomInspect")](inspect) {
- return `${this.constructor.name} ${
- inspect({
- label: this.label,
- })
- }`;
- }
-}
-GPUObjectBaseMixin("GPUCommandEncoder", GPUCommandEncoder);
-const GPUCommandEncoderPrototype = GPUCommandEncoder.prototype;
-
-/**
- * @param {string | null} label
- * @param {GPUCommandEncoder} encoder
- * @param {number} rid
- * @returns {GPURenderPassEncoder}
- */
-function createGPURenderPassEncoder(label, encoder, rid) {
- /** @type {GPURenderPassEncoder} */
- const passEncoder = webidl.createBranded(GPURenderPassEncoder);
- passEncoder[_label] = label;
- passEncoder[_encoder] = encoder;
- passEncoder[_rid] = rid;
- return passEncoder;
-}
-
-class GPURenderPassEncoder {
- /** @type {GPUCommandEncoder} */
- [_encoder];
- /** @type {number | undefined} */
- [_rid];
-
- [_cleanup]() {
- const rid = this[_rid];
- if (rid !== undefined) {
- core.close(rid);
- /** @type {number | undefined} */
- this[_rid] = undefined;
- }
- }
-
- constructor() {
- webidl.illegalConstructor();
- }
-
- /**
- * @param {number} x
- * @param {number} y
- * @param {number} width
- * @param {number} height
- * @param {number} minDepth
- * @param {number} maxDepth
- */
- setViewport(x, y, width, height, minDepth, maxDepth) {
- webidl.assertBranded(this, GPURenderPassEncoderPrototype);
- const prefix = "Failed to execute 'setViewport' on 'GPUComputePassEncoder'";
- webidl.requiredArguments(arguments.length, 6, { prefix });
- x = webidl.converters.float(x, { prefix, context: "Argument 1" });
- y = webidl.converters.float(y, { prefix, context: "Argument 2" });
- width = webidl.converters.float(width, { prefix, context: "Argument 3" });
- height = webidl.converters.float(height, {
- prefix,
- context: "Argument 4",
- });
- minDepth = webidl.converters.float(minDepth, {
- prefix,
- context: "Argument 5",
- });
- maxDepth = webidl.converters.float(maxDepth, {
- prefix,
- context: "Argument 6",
- });
- assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const renderPassRid = assertResource(this, { prefix, context: "this" });
- ops.op_webgpu_render_pass_set_viewport({
- renderPassRid,
- x,
- y,
- width,
- height,
- minDepth,
- maxDepth,
- });
- }
-
- /**
- * @param {number} x
- * @param {number} y
- * @param {number} width
- * @param {number} height
- */
- setScissorRect(x, y, width, height) {
- webidl.assertBranded(this, GPURenderPassEncoderPrototype);
- const prefix =
- "Failed to execute 'setScissorRect' on 'GPUComputePassEncoder'";
- webidl.requiredArguments(arguments.length, 4, { prefix });
- x = webidl.converters.GPUIntegerCoordinate(x, {
- prefix,
- context: "Argument 1",
- });
- y = webidl.converters.GPUIntegerCoordinate(y, {
- prefix,
- context: "Argument 2",
- });
- width = webidl.converters.GPUIntegerCoordinate(width, {
- prefix,
- context: "Argument 3",
- });
- height = webidl.converters.GPUIntegerCoordinate(height, {
- prefix,
- context: "Argument 4",
- });
- assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const renderPassRid = assertResource(this, { prefix, context: "this" });
- ops.op_webgpu_render_pass_set_scissor_rect(
- renderPassRid,
- x,
- y,
- width,
- height,
- );
- }
-
- /**
- * @param {GPUColor} color
- */
- setBlendConstant(color) {
- webidl.assertBranded(this, GPURenderPassEncoderPrototype);
- const prefix =
- "Failed to execute 'setBlendConstant' on 'GPUComputePassEncoder'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- color = webidl.converters.GPUColor(color, {
- prefix,
- context: "Argument 1",
- });
- assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const renderPassRid = assertResource(this, { prefix, context: "this" });
- ops.op_webgpu_render_pass_set_blend_constant(
- renderPassRid,
- normalizeGPUColor(color),
- );
- }
-
- /**
- * @param {number} reference
- */
- setStencilReference(reference) {
- webidl.assertBranded(this, GPURenderPassEncoderPrototype);
- const prefix =
- "Failed to execute 'setStencilReference' on 'GPUComputePassEncoder'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- reference = webidl.converters.GPUStencilValue(reference, {
- prefix,
- context: "Argument 1",
- });
- assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const renderPassRid = assertResource(this, { prefix, context: "this" });
- ops.op_webgpu_render_pass_set_stencil_reference(
- renderPassRid,
- reference,
- );
- }
-
- beginOcclusionQuery(_queryIndex) {
- throw new Error("Not yet implemented");
- }
-
- endOcclusionQuery() {
- throw new Error("Not yet implemented");
- }
-
- /**
- * @param {GPUQuerySet} querySet
- * @param {number} queryIndex
- */
- beginPipelineStatisticsQuery(querySet, queryIndex) {
- webidl.assertBranded(this, GPURenderPassEncoderPrototype);
- const prefix =
- "Failed to execute 'beginPipelineStatisticsQuery' on 'GPURenderPassEncoder'";
- webidl.requiredArguments(arguments.length, 2, { prefix });
- querySet = webidl.converters.GPUQuerySet(querySet, {
- prefix,
- context: "Argument 1",
- });
- queryIndex = webidl.converters.GPUSize32(queryIndex, {
- prefix,
- context: "Argument 2",
- });
- const device = assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const renderPassRid = assertResource(this, { prefix, context: "this" });
- const querySetRid = assertResource(querySet, {
- prefix,
- context: "Argument 1",
- });
- assertDeviceMatch(device, querySet, {
- prefix,
- resourceContext: "Argument 1",
- selfContext: "this",
- });
- ops.op_webgpu_render_pass_begin_pipeline_statistics_query(
- renderPassRid,
- querySetRid,
- queryIndex,
- );
- }
-
- endPipelineStatisticsQuery() {
- webidl.assertBranded(this, GPURenderPassEncoderPrototype);
- const prefix =
- "Failed to execute 'endPipelineStatisticsQuery' on 'GPURenderPassEncoder'";
- assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const renderPassRid = assertResource(this, { prefix, context: "this" });
- ops.op_webgpu_render_pass_end_pipeline_statistics_query(renderPassRid);
- }
-
- /**
- * @param {GPUQuerySet} querySet
- * @param {number} queryIndex
- */
- writeTimestamp(querySet, queryIndex) {
- webidl.assertBranded(this, GPURenderPassEncoderPrototype);
- const prefix =
- "Failed to execute 'writeTimestamp' on 'GPURenderPassEncoder'";
- webidl.requiredArguments(arguments.length, 2, { prefix });
- querySet = webidl.converters.GPUQuerySet(querySet, {
- prefix,
- context: "Argument 1",
- });
- queryIndex = webidl.converters.GPUSize32(queryIndex, {
- prefix,
- context: "Argument 2",
- });
- const device = assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const renderPassRid = assertResource(this, { prefix, context: "this" });
- const querySetRid = assertResource(querySet, {
- prefix,
- context: "Argument 1",
- });
- assertDeviceMatch(device, querySet, {
- prefix,
- resourceContext: "Argument 1",
- selfContext: "this",
- });
- ops.op_webgpu_render_pass_write_timestamp(
- renderPassRid,
- querySetRid,
- queryIndex,
- );
- }
-
- /**
- * @param {GPURenderBundle[]} bundles
- */
- executeBundles(bundles) {
- webidl.assertBranded(this, GPURenderPassEncoderPrototype);
- const prefix =
- "Failed to execute 'executeBundles' on 'GPURenderPassEncoder'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- bundles = webidl.converters["sequence<GPURenderBundle>"](bundles, {
- prefix,
- context: "Argument 1",
- });
- const device = assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const renderPassRid = assertResource(this, { prefix, context: "this" });
- const bundleRids = ArrayPrototypeMap(bundles, (bundle, i) => {
- const context = `bundle ${i + 1}`;
- const rid = assertResource(bundle, { prefix, context });
- assertDeviceMatch(device, bundle, {
- prefix,
- resourceContext: context,
- selfContext: "this",
- });
- return rid;
- });
- ops.op_webgpu_render_pass_execute_bundles(renderPassRid, bundleRids);
- }
-
- end() {
- webidl.assertBranded(this, GPURenderPassEncoderPrototype);
- const prefix = "Failed to execute 'end' on 'GPURenderPassEncoder'";
- const device = assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const commandEncoderRid = assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const renderPassRid = assertResource(this, { prefix, context: "this" });
- const { err } = ops.op_webgpu_render_pass_end(
- commandEncoderRid,
- renderPassRid,
- );
- device.pushError(err);
- this[_rid] = undefined;
- }
-
- // TODO(lucacasonato): has an overload
- setBindGroup(
- index,
- bindGroup,
- dynamicOffsetsData,
- dynamicOffsetsDataStart,
- dynamicOffsetsDataLength,
- ) {
- webidl.assertBranded(this, GPURenderPassEncoderPrototype);
- const prefix = "Failed to execute 'setBindGroup' on 'GPURenderPassEncoder'";
- const device = assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const renderPassRid = assertResource(this, { prefix, context: "this" });
- const bindGroupRid = assertResource(bindGroup, {
- prefix,
- context: "Argument 2",
- });
- assertDeviceMatch(device, bindGroup, {
- prefix,
- resourceContext: "Argument 2",
- selfContext: "this",
- });
- if (
- !(ObjectPrototypeIsPrototypeOf(
- Uint32ArrayPrototype,
- dynamicOffsetsData,
- ))
- ) {
- dynamicOffsetsData = new Uint32Array(dynamicOffsetsData ?? []);
- dynamicOffsetsDataStart = 0;
- dynamicOffsetsDataLength = dynamicOffsetsData.length;
- }
- ops.op_webgpu_render_pass_set_bind_group(
- renderPassRid,
- index,
- bindGroupRid,
- dynamicOffsetsData,
- dynamicOffsetsDataStart,
- dynamicOffsetsDataLength,
- );
- }
-
- /**
- * @param {string} groupLabel
- */
- pushDebugGroup(groupLabel) {
- webidl.assertBranded(this, GPURenderPassEncoderPrototype);
- const prefix =
- "Failed to execute 'pushDebugGroup' on 'GPURenderPassEncoder'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- groupLabel = webidl.converters.USVString(groupLabel, {
- prefix,
- context: "Argument 1",
- });
- assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const renderPassRid = assertResource(this, { prefix, context: "this" });
- ops.op_webgpu_render_pass_push_debug_group(renderPassRid, groupLabel);
- }
-
- popDebugGroup() {
- webidl.assertBranded(this, GPURenderPassEncoderPrototype);
- const prefix =
- "Failed to execute 'popDebugGroup' on 'GPURenderPassEncoder'";
- assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const renderPassRid = assertResource(this, { prefix, context: "this" });
- ops.op_webgpu_render_pass_pop_debug_group(renderPassRid);
- }
-
- /**
- * @param {string} markerLabel
- */
- insertDebugMarker(markerLabel) {
- webidl.assertBranded(this, GPURenderPassEncoderPrototype);
- const prefix =
- "Failed to execute 'insertDebugMarker' on 'GPURenderPassEncoder'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- markerLabel = webidl.converters.USVString(markerLabel, {
- prefix,
- context: "Argument 1",
- });
- assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const renderPassRid = assertResource(this, { prefix, context: "this" });
- ops.op_webgpu_render_pass_insert_debug_marker(renderPassRid, markerLabel);
- }
-
- /**
- * @param {GPURenderPipeline} pipeline
- */
- setPipeline(pipeline) {
- webidl.assertBranded(this, GPURenderPassEncoderPrototype);
- const prefix = "Failed to execute 'setPipeline' on 'GPURenderPassEncoder'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- pipeline = webidl.converters.GPURenderPipeline(pipeline, {
- prefix,
- context: "Argument 1",
- });
- const device = assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const renderPassRid = assertResource(this, { prefix, context: "this" });
- const pipelineRid = assertResource(pipeline, {
- prefix,
- context: "Argument 1",
- });
- assertDeviceMatch(device, pipeline, {
- prefix,
- resourceContext: "Argument 1",
- selfContext: "this",
- });
- ops.op_webgpu_render_pass_set_pipeline(renderPassRid, pipelineRid);
- }
-
- /**
- * @param {GPUBuffer} buffer
- * @param {GPUIndexFormat} indexFormat
- * @param {number} offset
- * @param {number} size
- */
- setIndexBuffer(buffer, indexFormat, offset = 0, size) {
- webidl.assertBranded(this, GPURenderPassEncoderPrototype);
- const prefix =
- "Failed to execute 'setIndexBuffer' on 'GPURenderPassEncoder'";
- webidl.requiredArguments(arguments.length, 2, { prefix });
- buffer = webidl.converters.GPUBuffer(buffer, {
- prefix,
- context: "Argument 1",
- });
- indexFormat = webidl.converters.GPUIndexFormat(indexFormat, {
- prefix,
- context: "Argument 2",
- });
- offset = webidl.converters.GPUSize64(offset, {
- prefix,
- context: "Argument 3",
- });
- if (size !== undefined) {
- size = webidl.converters.GPUSize64(size, {
- prefix,
- context: "Argument 4",
- });
- }
- const device = assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const renderPassRid = assertResource(this, { prefix, context: "this" });
- const bufferRid = assertResource(buffer, {
- prefix,
- context: "Argument 1",
- });
- assertDeviceMatch(device, buffer, {
- prefix,
- resourceContext: "Argument 1",
- selfContext: "this",
- });
- ops.op_webgpu_render_pass_set_index_buffer(
- renderPassRid,
- bufferRid,
- indexFormat,
- offset,
- size,
- );
- }
-
- /**
- * @param {number} slot
- * @param {GPUBuffer} buffer
- * @param {number} offset
- * @param {number} size
- */
- setVertexBuffer(slot, buffer, offset = 0, size) {
- webidl.assertBranded(this, GPURenderPassEncoderPrototype);
- const prefix =
- "Failed to execute 'setVertexBuffer' on 'GPURenderPassEncoder'";
- webidl.requiredArguments(arguments.length, 2, { prefix });
- slot = webidl.converters.GPUSize32(slot, {
- prefix,
- context: "Argument 2",
- });
- buffer = webidl.converters.GPUBuffer(buffer, {
- prefix,
- context: "Argument 2",
- });
- offset = webidl.converters.GPUSize64(offset, {
- prefix,
- context: "Argument 3",
- });
- if (size !== undefined) {
- size = webidl.converters.GPUSize64(size, {
- prefix,
- context: "Argument 4",
- });
- }
- const device = assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const renderPassRid = assertResource(this, { prefix, context: "this" });
- const bufferRid = assertResource(buffer, {
- prefix,
- context: "Argument 2",
- });
- assertDeviceMatch(device, buffer, {
- prefix,
- resourceContext: "Argument 2",
- selfContext: "this",
- });
- ops.op_webgpu_render_pass_set_vertex_buffer(
- renderPassRid,
- slot,
- bufferRid,
- offset,
- size,
- );
- }
-
- /**
- * @param {number} vertexCount
- * @param {number} instanceCount
- * @param {number} firstVertex
- * @param {number} firstInstance
- */
- draw(vertexCount, instanceCount = 1, firstVertex = 0, firstInstance = 0) {
- webidl.assertBranded(this, GPURenderPassEncoderPrototype);
- const prefix = "Failed to execute 'draw' on 'GPURenderPassEncoder'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- vertexCount = webidl.converters.GPUSize32(vertexCount, {
- prefix,
- context: "Argument 1",
- });
- instanceCount = webidl.converters.GPUSize32(instanceCount, {
- prefix,
- context: "Argument 2",
- });
- firstVertex = webidl.converters.GPUSize32(firstVertex, {
- prefix,
- context: "Argument 3",
- });
- firstInstance = webidl.converters.GPUSize32(firstInstance, {
- prefix,
- context: "Argument 4",
- });
- assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const renderPassRid = assertResource(this, { prefix, context: "this" });
- ops.op_webgpu_render_pass_draw(
- renderPassRid,
- vertexCount,
- instanceCount,
- firstVertex,
- firstInstance,
- );
- }
-
- /**
- * @param {number} indexCount
- * @param {number} instanceCount
- * @param {number} firstIndex
- * @param {number} baseVertex
- * @param {number} firstInstance
- */
- drawIndexed(
- indexCount,
- instanceCount = 1,
- firstIndex = 0,
- baseVertex = 0,
- firstInstance = 0,
- ) {
- webidl.assertBranded(this, GPURenderPassEncoderPrototype);
- const prefix = "Failed to execute 'drawIndexed' on 'GPURenderPassEncoder'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- indexCount = webidl.converters.GPUSize32(indexCount, {
- prefix,
- context: "Argument 1",
- });
- instanceCount = webidl.converters.GPUSize32(instanceCount, {
- prefix,
- context: "Argument 2",
- });
- firstIndex = webidl.converters.GPUSize32(firstIndex, {
- prefix,
- context: "Argument 3",
- });
- baseVertex = webidl.converters.GPUSignedOffset32(baseVertex, {
- prefix,
- context: "Argument 4",
- });
- firstInstance = webidl.converters.GPUSize32(firstInstance, {
- prefix,
- context: "Argument 5",
- });
- assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const renderPassRid = assertResource(this, { prefix, context: "this" });
- ops.op_webgpu_render_pass_draw_indexed(
- renderPassRid,
- indexCount,
- instanceCount,
- firstIndex,
- baseVertex,
- firstInstance,
- );
- }
-
- /**
- * @param {GPUBuffer} indirectBuffer
- * @param {number} indirectOffset
- */
- drawIndirect(indirectBuffer, indirectOffset) {
- webidl.assertBranded(this, GPURenderPassEncoderPrototype);
- const prefix = "Failed to execute 'drawIndirect' on 'GPURenderPassEncoder'";
- webidl.requiredArguments(arguments.length, 2, { prefix });
- indirectBuffer = webidl.converters.GPUBuffer(indirectBuffer, {
- prefix,
- context: "Argument 1",
- });
- indirectOffset = webidl.converters.GPUSize64(indirectOffset, {
- prefix,
- context: "Argument 2",
- });
- const device = assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const renderPassRid = assertResource(this, { prefix, context: "this" });
- const indirectBufferRid = assertResource(indirectBuffer, {
- prefix,
- context: "Argument 1",
- });
- assertDeviceMatch(device, indirectBuffer, {
- prefix,
- resourceContext: "Argument 1",
- selfContext: "this",
- });
- ops.op_webgpu_render_pass_draw_indirect(
- renderPassRid,
- indirectBufferRid,
- indirectOffset,
- );
- }
-
- /**
- * @param {GPUBuffer} indirectBuffer
- * @param {number} indirectOffset
- */
- drawIndexedIndirect(indirectBuffer, indirectOffset) {
- webidl.assertBranded(this, GPURenderPassEncoderPrototype);
- const prefix = "Failed to execute 'drawIndirect' on 'GPURenderPassEncoder'";
- webidl.requiredArguments(arguments.length, 2, { prefix });
- indirectBuffer = webidl.converters.GPUBuffer(indirectBuffer, {
- prefix,
- context: "Argument 1",
- });
- indirectOffset = webidl.converters.GPUSize64(indirectOffset, {
- prefix,
- context: "Argument 2",
- });
- const device = assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const renderPassRid = assertResource(this, { prefix, context: "this" });
- const indirectBufferRid = assertResource(indirectBuffer, {
- prefix,
- context: "Argument 1",
- });
- assertDeviceMatch(device, indirectBuffer, {
- prefix,
- resourceContext: "Argument 1",
- selfContext: "this",
- });
- ops.op_webgpu_render_pass_draw_indexed_indirect(
- renderPassRid,
- indirectBufferRid,
- indirectOffset,
- );
- }
-
- [SymbolFor("Deno.privateCustomInspect")](inspect) {
- return `${this.constructor.name} ${
- inspect({
- label: this.label,
- })
- }`;
- }
-}
-GPUObjectBaseMixin("GPURenderPassEncoder", GPURenderPassEncoder);
-const GPURenderPassEncoderPrototype = GPURenderPassEncoder.prototype;
-
-/**
- * @param {string | null} label
- * @param {GPUCommandEncoder} encoder
- * @param {number} rid
- * @returns {GPUComputePassEncoder}
- */
-function createGPUComputePassEncoder(label, encoder, rid) {
- /** @type {GPUComputePassEncoder} */
- const computePassEncoder = webidl.createBranded(GPUComputePassEncoder);
- computePassEncoder[_label] = label;
- computePassEncoder[_encoder] = encoder;
- computePassEncoder[_rid] = rid;
- return computePassEncoder;
-}
-
-class GPUComputePassEncoder {
- /** @type {GPUCommandEncoder} */
- [_encoder];
-
- /** @type {number | undefined} */
- [_rid];
-
- [_cleanup]() {
- const rid = this[_rid];
- if (rid !== undefined) {
- core.close(rid);
- /** @type {number | undefined} */
- this[_rid] = undefined;
- }
- }
-
- constructor() {
- webidl.illegalConstructor();
- }
-
- /**
- * @param {GPUComputePipeline} pipeline
- */
- setPipeline(pipeline) {
- webidl.assertBranded(this, GPUComputePassEncoderPrototype);
- const prefix = "Failed to execute 'setPipeline' on 'GPUComputePassEncoder'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- pipeline = webidl.converters.GPUComputePipeline(pipeline, {
- prefix,
- context: "Argument 1",
- });
- const device = assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const computePassRid = assertResource(this, { prefix, context: "this" });
- const pipelineRid = assertResource(pipeline, {
- prefix,
- context: "Argument 1",
- });
- assertDeviceMatch(device, pipeline, {
- prefix,
- resourceContext: "Argument 1",
- selfContext: "this",
- });
- ops.op_webgpu_compute_pass_set_pipeline(computePassRid, pipelineRid);
- }
-
- /**
- * @param {number} workgroupCountX
- * @param {number} workgroupCountY
- * @param {number} workgroupCountZ
- */
- dispatchWorkgroups(
- workgroupCountX,
- workgroupCountY = 1,
- workgroupCountZ = 1,
- ) {
- webidl.assertBranded(this, GPUComputePassEncoderPrototype);
- const prefix =
- "Failed to execute 'dispatchWorkgroups' on 'GPUComputePassEncoder'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- workgroupCountX = webidl.converters.GPUSize32(workgroupCountX, {
- prefix,
- context: "Argument 1",
- });
- workgroupCountY = webidl.converters.GPUSize32(workgroupCountY, {
- prefix,
- context: "Argument 2",
- });
- workgroupCountZ = webidl.converters.GPUSize32(workgroupCountZ, {
- prefix,
- context: "Argument 3",
- });
- assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const computePassRid = assertResource(this, { prefix, context: "this" });
- ops.op_webgpu_compute_pass_dispatch_workgroups(
- computePassRid,
- workgroupCountX,
- workgroupCountY,
- workgroupCountZ,
- );
- }
-
- /**
- * @param {GPUBuffer} indirectBuffer
- * @param {number} indirectOffset
- */
- dispatchWorkgroupsIndirect(indirectBuffer, indirectOffset) {
- webidl.assertBranded(this, GPUComputePassEncoderPrototype);
- const prefix =
- "Failed to execute 'dispatchWorkgroupsIndirect' on 'GPUComputePassEncoder'";
- webidl.requiredArguments(arguments.length, 2, { prefix });
- indirectBuffer = webidl.converters.GPUBuffer(indirectBuffer, {
- prefix,
- context: "Argument 1",
- });
- indirectOffset = webidl.converters.GPUSize64(indirectOffset, {
- prefix,
- context: "Argument 2",
- });
- const device = assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const computePassRid = assertResource(this, { prefix, context: "this" });
- const indirectBufferRid = assertResource(indirectBuffer, {
- prefix,
- context: "Argument 1",
- });
- assertDeviceMatch(device, indirectBuffer, {
- prefix,
- resourceContext: "Argument 1",
- selfContext: "this",
- });
- ops.op_webgpu_compute_pass_dispatch_workgroups_indirect(
- computePassRid,
- indirectBufferRid,
- indirectOffset,
- );
- }
-
- /**
- * @param {GPUQuerySet} querySet
- * @param {number} queryIndex
- */
- beginPipelineStatisticsQuery(querySet, queryIndex) {
- webidl.assertBranded(this, GPUComputePassEncoderPrototype);
- const prefix =
- "Failed to execute 'beginPipelineStatisticsQuery' on 'GPUComputePassEncoder'";
- webidl.requiredArguments(arguments.length, 2, { prefix });
- querySet = webidl.converters.GPUQuerySet(querySet, {
- prefix,
- context: "Argument 1",
- });
- queryIndex = webidl.converters.GPUSize32(queryIndex, {
- prefix,
- context: "Argument 2",
- });
- const device = assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const computePassRid = assertResource(this, { prefix, context: "this" });
- const querySetRid = assertResource(querySet, {
- prefix,
- context: "Argument 1",
- });
- assertDeviceMatch(device, querySet, {
- prefix,
- resourceContext: "Argument 1",
- selfContext: "this",
- });
- ops.op_webgpu_compute_pass_begin_pipeline_statistics_query(
- computePassRid,
- querySetRid,
- queryIndex,
- );
- }
-
- endPipelineStatisticsQuery() {
- webidl.assertBranded(this, GPUComputePassEncoderPrototype);
- const prefix =
- "Failed to execute 'endPipelineStatisticsQuery' on 'GPUComputePassEncoder'";
- assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const computePassRid = assertResource(this, { prefix, context: "this" });
- ops.op_webgpu_compute_pass_end_pipeline_statistics_query(computePassRid);
- }
-
- /**
- * @param {GPUQuerySet} querySet
- * @param {number} queryIndex
- */
- writeTimestamp(querySet, queryIndex) {
- webidl.assertBranded(this, GPUComputePassEncoderPrototype);
- const prefix =
- "Failed to execute 'writeTimestamp' on 'GPUComputePassEncoder'";
- webidl.requiredArguments(arguments.length, 2, { prefix });
- querySet = webidl.converters.GPUQuerySet(querySet, {
- prefix,
- context: "Argument 1",
- });
- queryIndex = webidl.converters.GPUSize32(queryIndex, {
- prefix,
- context: "Argument 2",
- });
- const device = assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const computePassRid = assertResource(this, { prefix, context: "this" });
- const querySetRid = assertResource(querySet, {
- prefix,
- context: "Argument 1",
- });
- assertDeviceMatch(device, querySet, {
- prefix,
- resourceContext: "Argument 1",
- selfContext: "this",
- });
- ops.op_webgpu_compute_pass_write_timestamp(
- computePassRid,
- querySetRid,
- queryIndex,
- );
- }
-
- end() {
- webidl.assertBranded(this, GPUComputePassEncoderPrototype);
- const prefix = "Failed to execute 'end' on 'GPUComputePassEncoder'";
- const device = assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const commandEncoderRid = assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const computePassRid = assertResource(this, { prefix, context: "this" });
- const { err } = ops.op_webgpu_compute_pass_end(
- commandEncoderRid,
- computePassRid,
- );
- device.pushError(err);
- this[_rid] = undefined;
- }
-
- // TODO(lucacasonato): has an overload
- setBindGroup(
- index,
- bindGroup,
- dynamicOffsetsData,
- dynamicOffsetsDataStart,
- dynamicOffsetsDataLength,
- ) {
- webidl.assertBranded(this, GPUComputePassEncoderPrototype);
- const prefix =
- "Failed to execute 'setBindGroup' on 'GPUComputePassEncoder'";
- const device = assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const computePassRid = assertResource(this, { prefix, context: "this" });
- const bindGroupRid = assertResource(bindGroup, {
- prefix,
- context: "Argument 2",
- });
- assertDeviceMatch(device, bindGroup, {
- prefix,
- resourceContext: "Argument 2",
- selfContext: "this",
- });
- if (
- !(ObjectPrototypeIsPrototypeOf(
- Uint32ArrayPrototype,
- dynamicOffsetsData,
- ))
- ) {
- dynamicOffsetsData = new Uint32Array(dynamicOffsetsData ?? []);
- dynamicOffsetsDataStart = 0;
- dynamicOffsetsDataLength = dynamicOffsetsData.length;
- }
- ops.op_webgpu_compute_pass_set_bind_group(
- computePassRid,
- index,
- bindGroupRid,
- dynamicOffsetsData,
- dynamicOffsetsDataStart,
- dynamicOffsetsDataLength,
- );
- }
-
- /**
- * @param {string} groupLabel
- */
- pushDebugGroup(groupLabel) {
- webidl.assertBranded(this, GPUComputePassEncoderPrototype);
- const prefix =
- "Failed to execute 'pushDebugGroup' on 'GPUComputePassEncoder'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- groupLabel = webidl.converters.USVString(groupLabel, {
- prefix,
- context: "Argument 1",
- });
- assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const computePassRid = assertResource(this, { prefix, context: "this" });
- ops.op_webgpu_compute_pass_push_debug_group(computePassRid, groupLabel);
- }
-
- popDebugGroup() {
- webidl.assertBranded(this, GPUComputePassEncoderPrototype);
- const prefix =
- "Failed to execute 'popDebugGroup' on 'GPUComputePassEncoder'";
- assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const computePassRid = assertResource(this, { prefix, context: "this" });
- ops.op_webgpu_compute_pass_pop_debug_group(computePassRid);
- }
-
- /**
- * @param {string} markerLabel
- */
- insertDebugMarker(markerLabel) {
- webidl.assertBranded(this, GPUComputePassEncoderPrototype);
- const prefix =
- "Failed to execute 'insertDebugMarker' on 'GPUComputePassEncoder'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- markerLabel = webidl.converters.USVString(markerLabel, {
- prefix,
- context: "Argument 1",
- });
- assertDevice(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- assertResource(this[_encoder], {
- prefix,
- context: "encoder referenced by this",
- });
- const computePassRid = assertResource(this, { prefix, context: "this" });
- ops.op_webgpu_compute_pass_insert_debug_marker(
- computePassRid,
- markerLabel,
- );
- }
-
- [SymbolFor("Deno.privateCustomInspect")](inspect) {
- return `${this.constructor.name} ${
- inspect({
- label: this.label,
- })
- }`;
- }
-}
-GPUObjectBaseMixin("GPUComputePassEncoder", GPUComputePassEncoder);
-const GPUComputePassEncoderPrototype = GPUComputePassEncoder.prototype;
-
-/**
- * @param {string | null} label
- * @param {InnerGPUDevice} device
- * @param {number} rid
- * @returns {GPUCommandBuffer}
- */
-function createGPUCommandBuffer(label, device, rid) {
- /** @type {GPUCommandBuffer} */
- const commandBuffer = webidl.createBranded(GPUCommandBuffer);
- commandBuffer[_label] = label;
- commandBuffer[_device] = device;
- commandBuffer[_rid] = rid;
- return commandBuffer;
-}
-
-class GPUCommandBuffer {
- /** @type {InnerGPUDevice} */
- [_device];
- /** @type {number | undefined} */
- [_rid];
-
- [_cleanup]() {
- const rid = this[_rid];
- if (rid !== undefined) {
- core.close(rid);
- /** @type {number | undefined} */
- this[_rid] = undefined;
- }
- }
-
- constructor() {
- webidl.illegalConstructor();
- }
-
- [SymbolFor("Deno.privateCustomInspect")](inspect) {
- return `${this.constructor.name} ${
- inspect({
- label: this.label,
- })
- }`;
- }
-}
-GPUObjectBaseMixin("GPUCommandBuffer", GPUCommandBuffer);
-
-/**
- * @param {string | null} label
- * @param {InnerGPUDevice} device
- * @param {number} rid
- * @returns {GPURenderBundleEncoder}
- */
-function createGPURenderBundleEncoder(label, device, rid) {
- /** @type {GPURenderBundleEncoder} */
- const bundleEncoder = webidl.createBranded(GPURenderBundleEncoder);
- bundleEncoder[_label] = label;
- bundleEncoder[_device] = device;
- bundleEncoder[_rid] = rid;
- return bundleEncoder;
-}
-
-class GPURenderBundleEncoder {
- /** @type {InnerGPUDevice} */
- [_device];
- /** @type {number | undefined} */
- [_rid];
-
- [_cleanup]() {
- const rid = this[_rid];
- if (rid !== undefined) {
- core.close(rid);
- /** @type {number | undefined} */
- this[_rid] = undefined;
- }
- }
-
- constructor() {
- webidl.illegalConstructor();
- }
-
- /**
- * @param {GPURenderBundleDescriptor} descriptor
- */
- finish(descriptor = {}) {
- webidl.assertBranded(this, GPURenderBundleEncoderPrototype);
- const prefix = "Failed to execute 'finish' on 'GPURenderBundleEncoder'";
- descriptor = webidl.converters.GPURenderBundleDescriptor(descriptor, {
- prefix,
- context: "Argument 1",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const renderBundleEncoderRid = assertResource(this, {
- prefix,
- context: "this",
- });
- const { rid, err } = ops.op_webgpu_render_bundle_encoder_finish(
- renderBundleEncoderRid,
- descriptor.label,
- );
- device.pushError(err);
- this[_rid] = undefined;
-
- const renderBundle = createGPURenderBundle(
- descriptor.label,
- device,
- rid,
- );
- device.trackResource(renderBundle);
- return renderBundle;
- }
-
- // TODO(lucacasonato): has an overload
- setBindGroup(
- index,
- bindGroup,
- dynamicOffsetsData,
- dynamicOffsetsDataStart,
- dynamicOffsetsDataLength,
- ) {
- webidl.assertBranded(this, GPURenderBundleEncoderPrototype);
- const prefix =
- "Failed to execute 'setBindGroup' on 'GPURenderBundleEncoder'";
- const device = assertDevice(this, { prefix, context: "this" });
- const renderBundleEncoderRid = assertResource(this, {
- prefix,
- context: "this",
- });
- const bindGroupRid = assertResource(bindGroup, {
- prefix,
- context: "Argument 2",
- });
- assertDeviceMatch(device, bindGroup, {
- prefix,
- resourceContext: "Argument 2",
- selfContext: "this",
- });
- if (
- !(ObjectPrototypeIsPrototypeOf(
- Uint32ArrayPrototype,
- dynamicOffsetsData,
- ))
- ) {
- dynamicOffsetsData = new Uint32Array(dynamicOffsetsData ?? []);
- dynamicOffsetsDataStart = 0;
- dynamicOffsetsDataLength = dynamicOffsetsData.length;
- }
- ops.op_webgpu_render_bundle_encoder_set_bind_group(
- renderBundleEncoderRid,
- index,
- bindGroupRid,
- dynamicOffsetsData,
- dynamicOffsetsDataStart,
- dynamicOffsetsDataLength,
- );
- }
-
- /**
- * @param {string} groupLabel
- */
- pushDebugGroup(groupLabel) {
- webidl.assertBranded(this, GPURenderBundleEncoderPrototype);
- const prefix =
- "Failed to execute 'pushDebugGroup' on 'GPURenderBundleEncoder'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- groupLabel = webidl.converters.USVString(groupLabel, {
- prefix,
- context: "Argument 1",
- });
- assertDevice(this, { prefix, context: "this" });
- const renderBundleEncoderRid = assertResource(this, {
- prefix,
- context: "this",
- });
- ops.op_webgpu_render_bundle_encoder_push_debug_group(
- renderBundleEncoderRid,
- groupLabel,
- );
- }
-
- popDebugGroup() {
- webidl.assertBranded(this, GPURenderBundleEncoderPrototype);
- const prefix =
- "Failed to execute 'popDebugGroup' on 'GPURenderBundleEncoder'";
- assertDevice(this, { prefix, context: "this" });
- const renderBundleEncoderRid = assertResource(this, {
- prefix,
- context: "this",
- });
- ops.op_webgpu_render_bundle_encoder_pop_debug_group(
- renderBundleEncoderRid,
- );
- }
-
- /**
- * @param {string} markerLabel
- */
- insertDebugMarker(markerLabel) {
- webidl.assertBranded(this, GPURenderBundleEncoderPrototype);
- const prefix =
- "Failed to execute 'insertDebugMarker' on 'GPURenderBundleEncoder'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- markerLabel = webidl.converters.USVString(markerLabel, {
- prefix,
- context: "Argument 1",
- });
- assertDevice(this, { prefix, context: "this" });
- const renderBundleEncoderRid = assertResource(this, {
- prefix,
- context: "this",
- });
- ops.op_webgpu_render_bundle_encoder_insert_debug_marker(
- renderBundleEncoderRid,
- markerLabel,
- );
- }
-
- /**
- * @param {GPURenderPipeline} pipeline
- */
- setPipeline(pipeline) {
- webidl.assertBranded(this, GPURenderBundleEncoderPrototype);
- const prefix =
- "Failed to execute 'setPipeline' on 'GPURenderBundleEncoder'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- pipeline = webidl.converters.GPURenderPipeline(pipeline, {
- prefix,
- context: "Argument 1",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const renderBundleEncoderRid = assertResource(this, {
- prefix,
- context: "this",
- });
- const pipelineRid = assertResource(pipeline, {
- prefix,
- context: "Argument 1",
- });
- assertDeviceMatch(device, pipeline, {
- prefix,
- resourceContext: "Argument 1",
- selfContext: "this",
- });
- ops.op_webgpu_render_bundle_encoder_set_pipeline(
- renderBundleEncoderRid,
- pipelineRid,
- );
- }
-
- /**
- * @param {GPUBuffer} buffer
- * @param {GPUIndexFormat} indexFormat
- * @param {number} offset
- * @param {number} size
- */
- setIndexBuffer(buffer, indexFormat, offset = 0, size = 0) {
- webidl.assertBranded(this, GPURenderBundleEncoderPrototype);
- const prefix =
- "Failed to execute 'setIndexBuffer' on 'GPURenderBundleEncoder'";
- webidl.requiredArguments(arguments.length, 2, { prefix });
- buffer = webidl.converters.GPUBuffer(buffer, {
- prefix,
- context: "Argument 1",
- });
- indexFormat = webidl.converters.GPUIndexFormat(indexFormat, {
- prefix,
- context: "Argument 2",
- });
- offset = webidl.converters.GPUSize64(offset, {
- prefix,
- context: "Argument 3",
- });
- size = webidl.converters.GPUSize64(size, {
- prefix,
- context: "Argument 4",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const renderBundleEncoderRid = assertResource(this, {
- prefix,
- context: "this",
- });
- const bufferRid = assertResource(buffer, {
- prefix,
- context: "Argument 1",
- });
- assertDeviceMatch(device, buffer, {
- prefix,
- resourceContext: "Argument 1",
- selfContext: "this",
- });
- ops.op_webgpu_render_bundle_encoder_set_index_buffer(
- renderBundleEncoderRid,
- bufferRid,
- indexFormat,
- offset,
- size,
- );
- }
-
- /**
- * @param {number} slot
- * @param {GPUBuffer} buffer
- * @param {number} offset
- * @param {number} size
- */
- setVertexBuffer(slot, buffer, offset = 0, size) {
- webidl.assertBranded(this, GPURenderBundleEncoderPrototype);
- const prefix =
- "Failed to execute 'setVertexBuffer' on 'GPURenderBundleEncoder'";
- webidl.requiredArguments(arguments.length, 2, { prefix });
- slot = webidl.converters.GPUSize32(slot, {
- prefix,
- context: "Argument 1",
- });
- buffer = webidl.converters.GPUBuffer(buffer, {
- prefix,
- context: "Argument 2",
- });
- offset = webidl.converters.GPUSize64(offset, {
- prefix,
- context: "Argument 3",
- });
- if (size !== undefined) {
- size = webidl.converters.GPUSize64(size, {
- prefix,
- context: "Argument 4",
- });
- }
- const device = assertDevice(this, { prefix, context: "this" });
- const renderBundleEncoderRid = assertResource(this, {
- prefix,
- context: "this",
- });
- const bufferRid = assertResource(buffer, {
- prefix,
- context: "Argument 2",
- });
- assertDeviceMatch(device, buffer, {
- prefix,
- resourceContext: "Argument 2",
- selfContext: "this",
- });
- ops.op_webgpu_render_bundle_encoder_set_vertex_buffer(
- renderBundleEncoderRid,
- slot,
- bufferRid,
- offset,
- size,
- );
- }
-
- /**
- * @param {number} vertexCount
- * @param {number} instanceCount
- * @param {number} firstVertex
- * @param {number} firstInstance
- */
- draw(vertexCount, instanceCount = 1, firstVertex = 0, firstInstance = 0) {
- webidl.assertBranded(this, GPURenderBundleEncoderPrototype);
- const prefix = "Failed to execute 'draw' on 'GPURenderBundleEncoder'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- vertexCount = webidl.converters.GPUSize32(vertexCount, {
- prefix,
- context: "Argument 1",
- });
- instanceCount = webidl.converters.GPUSize32(instanceCount, {
- prefix,
- context: "Argument 2",
- });
- firstVertex = webidl.converters.GPUSize32(firstVertex, {
- prefix,
- context: "Argument 3",
- });
- firstInstance = webidl.converters.GPUSize32(firstInstance, {
- prefix,
- context: "Argument 4",
- });
- assertDevice(this, { prefix, context: "this" });
- const renderBundleEncoderRid = assertResource(this, {
- prefix,
- context: "this",
- });
- ops.op_webgpu_render_bundle_encoder_draw(
- renderBundleEncoderRid,
- vertexCount,
- instanceCount,
- firstVertex,
- firstInstance,
- );
- }
-
- /**
- * @param {number} indexCount
- * @param {number} instanceCount
- * @param {number} firstIndex
- * @param {number} baseVertex
- * @param {number} firstInstance
- */
- drawIndexed(
- indexCount,
- instanceCount = 1,
- firstIndex = 0,
- baseVertex = 0,
- firstInstance = 0,
- ) {
- webidl.assertBranded(this, GPURenderBundleEncoderPrototype);
- const prefix =
- "Failed to execute 'drawIndexed' on 'GPURenderBundleEncoder'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- indexCount = webidl.converters.GPUSize32(indexCount, {
- prefix,
- context: "Argument 1",
- });
- instanceCount = webidl.converters.GPUSize32(instanceCount, {
- prefix,
- context: "Argument 2",
- });
- firstIndex = webidl.converters.GPUSize32(firstIndex, {
- prefix,
- context: "Argument 3",
- });
- baseVertex = webidl.converters.GPUSignedOffset32(baseVertex, {
- prefix,
- context: "Argument 4",
- });
- firstInstance = webidl.converters.GPUSize32(firstInstance, {
- prefix,
- context: "Argument 5",
- });
- assertDevice(this, { prefix, context: "this" });
- const renderBundleEncoderRid = assertResource(this, {
- prefix,
- context: "this",
- });
- ops.op_webgpu_render_bundle_encoder_draw_indexed(
- renderBundleEncoderRid,
- indexCount,
- instanceCount,
- firstIndex,
- baseVertex,
- firstInstance,
- );
- }
-
- /**
- * @param {GPUBuffer} indirectBuffer
- * @param {number} indirectOffset
- */
- drawIndirect(indirectBuffer, indirectOffset) {
- webidl.assertBranded(this, GPURenderBundleEncoderPrototype);
- const prefix =
- "Failed to execute 'drawIndirect' on 'GPURenderBundleEncoder'";
- webidl.requiredArguments(arguments.length, 2, { prefix });
- indirectBuffer = webidl.converters.GPUBuffer(indirectBuffer, {
- prefix,
- context: "Argument 1",
- });
- indirectOffset = webidl.converters.GPUSize64(indirectOffset, {
- prefix,
- context: "Argument 2",
- });
- const device = assertDevice(this, { prefix, context: "this" });
- const renderBundleEncoderRid = assertResource(this, {
- prefix,
- context: "this",
- });
- const indirectBufferRid = assertResource(indirectBuffer, {
- prefix,
- context: "Argument 1",
- });
- assertDeviceMatch(device, indirectBuffer, {
- prefix,
- resourceContext: "Argument 1",
- selfContext: "this",
- });
- ops.op_webgpu_render_bundle_encoder_draw_indirect(
- renderBundleEncoderRid,
- indirectBufferRid,
- indirectOffset,
- );
- }
-
- drawIndexedIndirect(_indirectBuffer, _indirectOffset) {
- throw new Error("Not yet implemented");
- }
-
- [SymbolFor("Deno.privateCustomInspect")](inspect) {
- return `${this.constructor.name} ${
- inspect({
- label: this.label,
- })
- }`;
- }
-}
-GPUObjectBaseMixin("GPURenderBundleEncoder", GPURenderBundleEncoder);
-const GPURenderBundleEncoderPrototype = GPURenderBundleEncoder.prototype;
-
-/**
- * @param {string | null} label
- * @param {InnerGPUDevice} device
- * @param {number} rid
- * @returns {GPURenderBundle}
- */
-function createGPURenderBundle(label, device, rid) {
- /** @type {GPURenderBundle} */
- const bundle = webidl.createBranded(GPURenderBundle);
- bundle[_label] = label;
- bundle[_device] = device;
- bundle[_rid] = rid;
- return bundle;
-}
-
-class GPURenderBundle {
- /** @type {InnerGPUDevice} */
- [_device];
- /** @type {number | undefined} */
- [_rid];
-
- [_cleanup]() {
- const rid = this[_rid];
- if (rid !== undefined) {
- core.close(rid);
- /** @type {number | undefined} */
- this[_rid] = undefined;
- }
- }
-
- constructor() {
- webidl.illegalConstructor();
- }
-
- [SymbolFor("Deno.privateCustomInspect")](inspect) {
- return `${this.constructor.name} ${
- inspect({
- label: this.label,
- })
- }`;
- }
-}
-GPUObjectBaseMixin("GPURenderBundle", GPURenderBundle);
-
-/**
- * @param {string | null} label
- * @param {InnerGPUDevice} device
- * @param {number} rid
- * @returns {GPUQuerySet}
- */
-function createGPUQuerySet(label, device, rid, descriptor) {
- /** @type {GPUQuerySet} */
- const queue = webidl.createBranded(GPUQuerySet);
- queue[_label] = label;
- queue[_device] = device;
- queue[_rid] = rid;
- queue[_descriptor] = descriptor;
- return queue;
-}
-
-class GPUQuerySet {
- /** @type {InnerGPUDevice} */
- [_device];
- /** @type {number | undefined} */
- [_rid];
- /** @type {GPUQuerySetDescriptor} */
- [_descriptor];
- /** @type {GPUQueryType} */
- [_type];
- /** @type {number} */
- [_count];
-
- [_cleanup]() {
- const rid = this[_rid];
- if (rid !== undefined) {
- core.close(rid);
- /** @type {number | undefined} */
- this[_rid] = undefined;
- }
- }
-
- constructor() {
- webidl.illegalConstructor();
- }
-
- destroy() {
- webidl.assertBranded(this, GPUQuerySetPrototype);
- this[_cleanup]();
- }
-
- get type() {
- webidl.assertBranded(this, GPUQuerySetPrototype);
- return this[_type]();
- }
-
- get count() {
- webidl.assertBranded(this, GPUQuerySetPrototype);
- return this[_count]();
- }
-
- [SymbolFor("Deno.privateCustomInspect")](inspect) {
- return `${this.constructor.name} ${
- inspect({
- label: this.label,
- })
- }`;
- }
-}
-GPUObjectBaseMixin("GPUQuerySet", GPUQuerySet);
-const GPUQuerySetPrototype = GPUQuerySet.prototype;
-
-const gpu = webidl.createBranded(GPU);
-export {
- _device,
- assertDevice,
- createGPUTexture,
- GPU,
- gpu,
- GPUAdapter,
- GPUAdapterInfo,
- GPUBindGroup,
- GPUBindGroupLayout,
- GPUBuffer,
- GPUBufferUsage,
- GPUColorWrite,
- GPUCommandBuffer,
- GPUCommandEncoder,
- GPUComputePassEncoder,
- GPUComputePipeline,
- GPUDevice,
- GPUDeviceLostInfo,
- GPUError,
- GPUMapMode,
- GPUOutOfMemoryError,
- GPUPipelineLayout,
- GPUQuerySet,
- GPUQueue,
- GPURenderBundle,
- GPURenderBundleEncoder,
- GPURenderPassEncoder,
- GPURenderPipeline,
- GPUSampler,
- GPUShaderModule,
- GPUShaderStage,
- GPUSupportedFeatures,
- GPUSupportedLimits,
- GPUTexture,
- GPUTextureUsage,
- GPUTextureView,
- GPUValidationError,
-};
diff --git a/ext/webgpu/02_idl_types.js b/ext/webgpu/02_idl_types.js
deleted file mode 100644
index bbde2fdc6..000000000
--- a/ext/webgpu/02_idl_types.js
+++ /dev/null
@@ -1,2036 +0,0 @@
-// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
-
-// @ts-check
-/// <reference path="../web/internal.d.ts" />
-
-import * as webidl from "ext:deno_webidl/00_webidl.js";
-import {
- GPU,
- GPUAdapter,
- GPUBindGroup,
- GPUBindGroupLayout,
- GPUBuffer,
- GPUBufferUsage,
- GPUColorWrite,
- GPUCommandBuffer,
- GPUCommandEncoder,
- GPUComputePassEncoder,
- GPUComputePipeline,
- GPUDevice,
- GPUMapMode,
- GPUOutOfMemoryError,
- GPUPipelineLayout,
- GPUQuerySet,
- GPUQueue,
- GPURenderBundle,
- GPURenderBundleEncoder,
- GPURenderPassEncoder,
- GPURenderPipeline,
- GPUSampler,
- GPUShaderModule,
- GPUShaderStage,
- GPUSupportedFeatures,
- GPUSupportedLimits,
- GPUTexture,
- GPUTextureUsage,
- GPUTextureView,
- GPUValidationError,
-} from "ext:deno_webgpu/01_webgpu.js";
-const primordials = globalThis.__bootstrap.primordials;
-const { SymbolIterator, TypeError } = primordials;
-
-// This needs to be initialized after all of the base classes are implemented,
-// otherwise their converters might not be available yet.
-// DICTIONARY: GPUObjectDescriptorBase
-const dictMembersGPUObjectDescriptorBase = [
- { key: "label", converter: webidl.converters["USVString"] },
-];
-webidl.converters["GPUObjectDescriptorBase"] = webidl
- .createDictionaryConverter(
- "GPUObjectDescriptorBase",
- dictMembersGPUObjectDescriptorBase,
- );
-
-// INTERFACE: GPUSupportedLimits
-webidl.converters.GPUSupportedLimits = webidl.createInterfaceConverter(
- "GPUSupportedLimits",
- GPUSupportedLimits.prototype,
-);
-
-// INTERFACE: GPUSupportedFeatures
-webidl.converters.GPUSupportedFeatures = webidl.createInterfaceConverter(
- "GPUSupportedFeatures",
- GPUSupportedFeatures.prototype,
-);
-
-// INTERFACE: GPU
-webidl.converters.GPU = webidl.createInterfaceConverter("GPU", GPU.prototype);
-
-// ENUM: GPUPowerPreference
-webidl.converters["GPUPowerPreference"] = webidl.createEnumConverter(
- "GPUPowerPreference",
- [
- "low-power",
- "high-performance",
- ],
-);
-
-// DICTIONARY: GPURequestAdapterOptions
-const dictMembersGPURequestAdapterOptions = [
- {
- key: "powerPreference",
- converter: webidl.converters["GPUPowerPreference"],
- },
- {
- key: "forceFallbackAdapter",
- converter: webidl.converters.boolean,
- defaultValue: false,
- },
-];
-webidl.converters["GPURequestAdapterOptions"] = webidl
- .createDictionaryConverter(
- "GPURequestAdapterOptions",
- dictMembersGPURequestAdapterOptions,
- );
-
-// INTERFACE: GPUAdapter
-webidl.converters.GPUAdapter = webidl.createInterfaceConverter(
- "GPUAdapter",
- GPUAdapter.prototype,
-);
-
-// ENUM: GPUFeatureName
-webidl.converters["GPUFeatureName"] = webidl.createEnumConverter(
- "GPUFeatureName",
- [
- "depth-clip-control",
- "depth32float-stencil8",
- "pipeline-statistics-query",
- "texture-compression-bc",
- "texture-compression-etc2",
- "texture-compression-astc",
- "timestamp-query",
- "indirect-first-instance",
- "shader-f16",
- // extended from spec
- "mappable-primary-buffers",
- "texture-binding-array",
- "buffer-binding-array",
- "storage-resource-binding-array",
- "sampled-texture-and-storage-buffer-array-non-uniform-indexing",
- "uniform-buffer-and-storage-buffer-texture-non-uniform-indexing",
- "unsized-binding-array",
- "multi-draw-indirect",
- "multi-draw-indirect-count",
- "push-constants",
- "address-mode-clamp-to-border",
- "texture-adapter-specific-format-features",
- "shader-float64",
- "vertex-attribute-64bit",
- "conservative-rasterization",
- "vertex-writable-storage",
- "clear-commands",
- "spirv-shader-passthrough",
- "shader-primitive-index",
- ],
-);
-
-// TYPEDEF: GPUSize32
-webidl.converters["GPUSize32"] = (V, opts) =>
- webidl.converters["unsigned long"](V, { ...opts, enforceRange: true });
-
-// TYPEDEF: GPUSize64
-webidl.converters["GPUSize64"] = (V, opts) =>
- webidl.converters["unsigned long long"](V, { ...opts, enforceRange: true });
-
-// DICTIONARY: GPUDeviceDescriptor
-const dictMembersGPUDeviceDescriptor = [
- {
- key: "requiredFeatures",
- converter: webidl.createSequenceConverter(
- webidl.converters["GPUFeatureName"],
- ),
- get defaultValue() {
- return [];
- },
- },
- {
- key: "requiredLimits",
- converter: webidl.createRecordConverter(
- webidl.converters["DOMString"],
- webidl.converters["GPUSize64"],
- ),
- },
-];
-webidl.converters["GPUDeviceDescriptor"] = webidl.createDictionaryConverter(
- "GPUDeviceDescriptor",
- dictMembersGPUObjectDescriptorBase,
- dictMembersGPUDeviceDescriptor,
-);
-
-// INTERFACE: GPUDevice
-webidl.converters.GPUDevice = webidl.createInterfaceConverter(
- "GPUDevice",
- GPUDevice.prototype,
-);
-
-// INTERFACE: GPUBuffer
-webidl.converters.GPUBuffer = webidl.createInterfaceConverter(
- "GPUBuffer",
- GPUBuffer.prototype,
-);
-
-// TYPEDEF: GPUBufferUsageFlags
-webidl.converters["GPUBufferUsageFlags"] = (V, opts) =>
- webidl.converters["unsigned long"](V, { ...opts, enforceRange: true });
-
-// DICTIONARY: GPUBufferDescriptor
-const dictMembersGPUBufferDescriptor = [
- { key: "size", converter: webidl.converters["GPUSize64"], required: true },
- {
- key: "usage",
- converter: webidl.converters["GPUBufferUsageFlags"],
- required: true,
- },
- {
- key: "mappedAtCreation",
- converter: webidl.converters["boolean"],
- defaultValue: false,
- },
-];
-webidl.converters["GPUBufferDescriptor"] = webidl.createDictionaryConverter(
- "GPUBufferDescriptor",
- dictMembersGPUObjectDescriptorBase,
- dictMembersGPUBufferDescriptor,
-);
-
-// INTERFACE: GPUBufferUsage
-webidl.converters.GPUBufferUsage = webidl.createInterfaceConverter(
- "GPUBufferUsage",
- GPUBufferUsage.prototype,
-);
-
-// TYPEDEF: GPUMapModeFlags
-webidl.converters["GPUMapModeFlags"] = (V, opts) =>
- webidl.converters["unsigned long"](V, { ...opts, enforceRange: true });
-
-// INTERFACE: GPUMapMode
-webidl.converters.GPUMapMode = webidl.createInterfaceConverter(
- "GPUMapMode",
- GPUMapMode.prototype,
-);
-
-// INTERFACE: GPUTexture
-webidl.converters.GPUTexture = webidl.createInterfaceConverter(
- "GPUTexture",
- GPUTexture.prototype,
-);
-
-// TYPEDEF: GPUIntegerCoordinate
-webidl.converters["GPUIntegerCoordinate"] = (V, opts) =>
- webidl.converters["unsigned long"](V, { ...opts, enforceRange: true });
-webidl.converters["sequence<GPUIntegerCoordinate>"] = webidl
- .createSequenceConverter(webidl.converters["GPUIntegerCoordinate"]);
-
-// DICTIONARY: GPUExtent3DDict
-const dictMembersGPUExtent3DDict = [
- {
- key: "width",
- converter: webidl.converters["GPUIntegerCoordinate"],
- required: true,
- },
- {
- key: "height",
- converter: webidl.converters["GPUIntegerCoordinate"],
- defaultValue: 1,
- },
- {
- key: "depthOrArrayLayers",
- converter: webidl.converters["GPUIntegerCoordinate"],
- defaultValue: 1,
- },
-];
-webidl.converters["GPUExtent3DDict"] = webidl.createDictionaryConverter(
- "GPUExtent3DDict",
- dictMembersGPUExtent3DDict,
-);
-
-// TYPEDEF: GPUExtent3D
-webidl.converters["GPUExtent3D"] = (V, opts) => {
- // Union for (sequence<GPUIntegerCoordinate> or GPUExtent3DDict)
- if (V === null || V === undefined) {
- return webidl.converters["GPUExtent3DDict"](V, opts);
- }
- if (typeof V === "object") {
- const method = V[SymbolIterator];
- if (method !== undefined) {
- return webidl.converters["sequence<GPUIntegerCoordinate>"](V, opts);
- }
- return webidl.converters["GPUExtent3DDict"](V, opts);
- }
- throw webidl.makeException(
- TypeError,
- "can not be converted to sequence<GPUIntegerCoordinate> or GPUExtent3DDict.",
- opts,
- );
-};
-
-// ENUM: GPUTextureDimension
-webidl.converters["GPUTextureDimension"] = webidl.createEnumConverter(
- "GPUTextureDimension",
- [
- "1d",
- "2d",
- "3d",
- ],
-);
-
-// ENUM: GPUTextureFormat
-webidl.converters["GPUTextureFormat"] = webidl.createEnumConverter(
- "GPUTextureFormat",
- [
- "r8unorm",
- "r8snorm",
- "r8uint",
- "r8sint",
- "r16uint",
- "r16sint",
- "r16float",
- "rg8unorm",
- "rg8snorm",
- "rg8uint",
- "rg8sint",
- "r32uint",
- "r32sint",
- "r32float",
- "rg16uint",
- "rg16sint",
- "rg16float",
- "rgba8unorm",
- "rgba8unorm-srgb",
- "rgba8snorm",
- "rgba8uint",
- "rgba8sint",
- "bgra8unorm",
- "bgra8unorm-srgb",
- "rgb9e5ufloat",
- "rgb10a2unorm",
- "rg11b10ufloat",
- "rg32uint",
- "rg32sint",
- "rg32float",
- "rgba16uint",
- "rgba16sint",
- "rgba16float",
- "rgba32uint",
- "rgba32sint",
- "rgba32float",
- "stencil8",
- "depth16unorm",
- "depth24plus",
- "depth24plus-stencil8",
- "depth32float",
- "depth32float-stencil8",
- "bc1-rgba-unorm",
- "bc1-rgba-unorm-srgb",
- "bc2-rgba-unorm",
- "bc2-rgba-unorm-srgb",
- "bc3-rgba-unorm",
- "bc3-rgba-unorm-srgb",
- "bc4-r-unorm",
- "bc4-r-snorm",
- "bc5-rg-unorm",
- "bc5-rg-snorm",
- "bc6h-rgb-ufloat",
- "bc6h-rgb-float",
- "bc7-rgba-unorm",
- "bc7-rgba-unorm-srgb",
- "etc2-rgb8unorm",
- "etc2-rgb8unorm-srgb",
- "etc2-rgb8a1unorm",
- "etc2-rgb8a1unorm-srgb",
- "etc2-rgba8unorm",
- "etc2-rgba8unorm-srgb",
- "eac-r11unorm",
- "eac-r11snorm",
- "eac-rg11unorm",
- "eac-rg11snorm",
- "astc-4x4-unorm",
- "astc-4x4-unorm-srgb",
- "astc-5x4-unorm",
- "astc-5x4-unorm-srgb",
- "astc-5x5-unorm",
- "astc-5x5-unorm-srgb",
- "astc-6x5-unorm",
- "astc-6x5-unorm-srgb",
- "astc-6x6-unorm",
- "astc-6x6-unorm-srgb",
- "astc-8x5-unorm",
- "astc-8x5-unorm-srgb",
- "astc-8x6-unorm",
- "astc-8x6-unorm-srgb",
- "astc-8x8-unorm",
- "astc-8x8-unorm-srgb",
- "astc-10x5-unorm",
- "astc-10x5-unorm-srgb",
- "astc-10x6-unorm",
- "astc-10x6-unorm-srgb",
- "astc-10x8-unorm",
- "astc-10x8-unorm-srgb",
- "astc-10x10-unorm",
- "astc-10x10-unorm-srgb",
- "astc-12x10-unorm",
- "astc-12x10-unorm-srgb",
- "astc-12x12-unorm",
- "astc-12x12-unorm-srgb",
- ],
-);
-
-// TYPEDEF: GPUTextureUsageFlags
-webidl.converters["GPUTextureUsageFlags"] = (V, opts) =>
- webidl.converters["unsigned long"](V, { ...opts, enforceRange: true });
-
-// DICTIONARY: GPUTextureDescriptor
-const dictMembersGPUTextureDescriptor = [
- {
- key: "size",
- converter: webidl.converters["GPUExtent3D"],
- required: true,
- },
- {
- key: "mipLevelCount",
- converter: webidl.converters["GPUIntegerCoordinate"],
- defaultValue: 1,
- },
- {
- key: "sampleCount",
- converter: webidl.converters["GPUSize32"],
- defaultValue: 1,
- },
- {
- key: "dimension",
- converter: webidl.converters["GPUTextureDimension"],
- defaultValue: "2d",
- },
- {
- key: "format",
- converter: webidl.converters["GPUTextureFormat"],
- required: true,
- },
- {
- key: "usage",
- converter: webidl.converters["GPUTextureUsageFlags"],
- required: true,
- },
- {
- key: "viewFormats",
- converter: webidl.createSequenceConverter(
- webidl.converters["GPUTextureFormat"],
- ),
- get defaultValue() {
- return [];
- },
- },
-];
-webidl.converters["GPUTextureDescriptor"] = webidl.createDictionaryConverter(
- "GPUTextureDescriptor",
- dictMembersGPUObjectDescriptorBase,
- dictMembersGPUTextureDescriptor,
-);
-
-// INTERFACE: GPUTextureUsage
-webidl.converters.GPUTextureUsage = webidl.createInterfaceConverter(
- "GPUTextureUsage",
- GPUTextureUsage.prototype,
-);
-
-// INTERFACE: GPUTextureView
-webidl.converters.GPUTextureView = webidl.createInterfaceConverter(
- "GPUTextureView",
- GPUTextureView.prototype,
-);
-
-// ENUM: GPUTextureViewDimension
-webidl.converters["GPUTextureViewDimension"] = webidl.createEnumConverter(
- "GPUTextureViewDimension",
- [
- "1d",
- "2d",
- "2d-array",
- "cube",
- "cube-array",
- "3d",
- ],
-);
-
-// ENUM: GPUTextureAspect
-webidl.converters["GPUTextureAspect"] = webidl.createEnumConverter(
- "GPUTextureAspect",
- [
- "all",
- "stencil-only",
- "depth-only",
- ],
-);
-
-// DICTIONARY: GPUTextureViewDescriptor
-const dictMembersGPUTextureViewDescriptor = [
- { key: "format", converter: webidl.converters["GPUTextureFormat"] },
- {
- key: "dimension",
- converter: webidl.converters["GPUTextureViewDimension"],
- },
- {
- key: "aspect",
- converter: webidl.converters["GPUTextureAspect"],
- defaultValue: "all",
- },
- {
- key: "baseMipLevel",
- converter: webidl.converters["GPUIntegerCoordinate"],
- defaultValue: 0,
- },
- {
- key: "mipLevelCount",
- converter: webidl.converters["GPUIntegerCoordinate"],
- },
- {
- key: "baseArrayLayer",
- converter: webidl.converters["GPUIntegerCoordinate"],
- defaultValue: 0,
- },
- {
- key: "arrayLayerCount",
- converter: webidl.converters["GPUIntegerCoordinate"],
- },
-];
-webidl.converters["GPUTextureViewDescriptor"] = webidl
- .createDictionaryConverter(
- "GPUTextureViewDescriptor",
- dictMembersGPUObjectDescriptorBase,
- dictMembersGPUTextureViewDescriptor,
- );
-
-// INTERFACE: GPUSampler
-webidl.converters.GPUSampler = webidl.createInterfaceConverter(
- "GPUSampler",
- GPUSampler.prototype,
-);
-
-// ENUM: GPUAddressMode
-webidl.converters["GPUAddressMode"] = webidl.createEnumConverter(
- "GPUAddressMode",
- [
- "clamp-to-edge",
- "repeat",
- "mirror-repeat",
- ],
-);
-
-// ENUM: GPUFilterMode
-webidl.converters["GPUFilterMode"] = webidl.createEnumConverter(
- "GPUFilterMode",
- [
- "nearest",
- "linear",
- ],
-);
-
-// ENUM: GPUMipmapFilterMode
-webidl.converters["GPUMipmapFilterMode"] = webidl.createEnumConverter(
- "GPUMipmapFilterMode",
- [
- "nearest",
- "linear",
- ],
-);
-
-// ENUM: GPUCompareFunction
-webidl.converters["GPUCompareFunction"] = webidl.createEnumConverter(
- "GPUCompareFunction",
- [
- "never",
- "less",
- "equal",
- "less-equal",
- "greater",
- "not-equal",
- "greater-equal",
- "always",
- ],
-);
-
-// DICTIONARY: GPUSamplerDescriptor
-const dictMembersGPUSamplerDescriptor = [
- {
- key: "addressModeU",
- converter: webidl.converters["GPUAddressMode"],
- defaultValue: "clamp-to-edge",
- },
- {
- key: "addressModeV",
- converter: webidl.converters["GPUAddressMode"],
- defaultValue: "clamp-to-edge",
- },
- {
- key: "addressModeW",
- converter: webidl.converters["GPUAddressMode"],
- defaultValue: "clamp-to-edge",
- },
- {
- key: "magFilter",
- converter: webidl.converters["GPUFilterMode"],
- defaultValue: "nearest",
- },
- {
- key: "minFilter",
- converter: webidl.converters["GPUFilterMode"],
- defaultValue: "nearest",
- },
- {
- key: "mipmapFilter",
- converter: webidl.converters["GPUMipmapFilterMode"],
- defaultValue: "nearest",
- },
- {
- key: "lodMinClamp",
- converter: webidl.converters["float"],
- defaultValue: 0,
- },
- {
- key: "lodMaxClamp",
- converter: webidl.converters["float"],
- defaultValue: 0xffffffff,
- },
- { key: "compare", converter: webidl.converters["GPUCompareFunction"] },
- {
- key: "maxAnisotropy",
- converter: (V, opts) =>
- webidl.converters["unsigned short"](V, { ...opts, clamp: true }),
- defaultValue: 1,
- },
-];
-webidl.converters["GPUSamplerDescriptor"] = webidl.createDictionaryConverter(
- "GPUSamplerDescriptor",
- dictMembersGPUObjectDescriptorBase,
- dictMembersGPUSamplerDescriptor,
-);
-
-// INTERFACE: GPUBindGroupLayout
-webidl.converters.GPUBindGroupLayout = webidl.createInterfaceConverter(
- "GPUBindGroupLayout",
- GPUBindGroupLayout.prototype,
-);
-
-// TYPEDEF: GPUIndex32
-webidl.converters["GPUIndex32"] = (V, opts) =>
- webidl.converters["unsigned long"](V, { ...opts, enforceRange: true });
-
-// TYPEDEF: GPUShaderStageFlags
-webidl.converters["GPUShaderStageFlags"] = (V, opts) =>
- webidl.converters["unsigned long"](V, { ...opts, enforceRange: true });
-
-// ENUM: GPUBufferBindingType
-webidl.converters["GPUBufferBindingType"] = webidl.createEnumConverter(
- "GPUBufferBindingType",
- [
- "uniform",
- "storage",
- "read-only-storage",
- ],
-);
-
-// DICTIONARY: GPUBufferBindingLayout
-const dictMembersGPUBufferBindingLayout = [
- {
- key: "type",
- converter: webidl.converters["GPUBufferBindingType"],
- defaultValue: "uniform",
- },
- {
- key: "hasDynamicOffset",
- converter: webidl.converters["boolean"],
- defaultValue: false,
- },
- {
- key: "minBindingSize",
- converter: webidl.converters["GPUSize64"],
- defaultValue: 0,
- },
-];
-webidl.converters["GPUBufferBindingLayout"] = webidl
- .createDictionaryConverter(
- "GPUBufferBindingLayout",
- dictMembersGPUBufferBindingLayout,
- );
-
-// ENUM: GPUSamplerBindingType
-webidl.converters["GPUSamplerBindingType"] = webidl.createEnumConverter(
- "GPUSamplerBindingType",
- [
- "filtering",
- "non-filtering",
- "comparison",
- ],
-);
-
-// DICTIONARY: GPUSamplerBindingLayout
-const dictMembersGPUSamplerBindingLayout = [
- {
- key: "type",
- converter: webidl.converters["GPUSamplerBindingType"],
- defaultValue: "filtering",
- },
-];
-webidl.converters["GPUSamplerBindingLayout"] = webidl
- .createDictionaryConverter(
- "GPUSamplerBindingLayout",
- dictMembersGPUSamplerBindingLayout,
- );
-
-// ENUM: GPUTextureSampleType
-webidl.converters["GPUTextureSampleType"] = webidl.createEnumConverter(
- "GPUTextureSampleType",
- [
- "float",
- "unfilterable-float",
- "depth",
- "sint",
- "uint",
- ],
-);
-
-// DICTIONARY: GPUTextureBindingLayout
-const dictMembersGPUTextureBindingLayout = [
- {
- key: "sampleType",
- converter: webidl.converters["GPUTextureSampleType"],
- defaultValue: "float",
- },
- {
- key: "viewDimension",
- converter: webidl.converters["GPUTextureViewDimension"],
- defaultValue: "2d",
- },
- {
- key: "multisampled",
- converter: webidl.converters["boolean"],
- defaultValue: false,
- },
-];
-webidl.converters["GPUTextureBindingLayout"] = webidl
- .createDictionaryConverter(
- "GPUTextureBindingLayout",
- dictMembersGPUTextureBindingLayout,
- );
-
-// ENUM: GPUStorageTextureAccess
-webidl.converters["GPUStorageTextureAccess"] = webidl.createEnumConverter(
- "GPUStorageTextureAccess",
- [
- "write-only",
- ],
-);
-
-// DICTIONARY: GPUStorageTextureBindingLayout
-const dictMembersGPUStorageTextureBindingLayout = [
- {
- key: "access",
- converter: webidl.converters["GPUStorageTextureAccess"],
- defaultValue: "write-only",
- },
- {
- key: "format",
- converter: webidl.converters["GPUTextureFormat"],
- required: true,
- },
- {
- key: "viewDimension",
- converter: webidl.converters["GPUTextureViewDimension"],
- defaultValue: "2d",
- },
-];
-webidl.converters["GPUStorageTextureBindingLayout"] = webidl
- .createDictionaryConverter(
- "GPUStorageTextureBindingLayout",
- dictMembersGPUStorageTextureBindingLayout,
- );
-
-// DICTIONARY: GPUBindGroupLayoutEntry
-const dictMembersGPUBindGroupLayoutEntry = [
- {
- key: "binding",
- converter: webidl.converters["GPUIndex32"],
- required: true,
- },
- {
- key: "visibility",
- converter: webidl.converters["GPUShaderStageFlags"],
- required: true,
- },
- { key: "buffer", converter: webidl.converters["GPUBufferBindingLayout"] },
- { key: "sampler", converter: webidl.converters["GPUSamplerBindingLayout"] },
- { key: "texture", converter: webidl.converters["GPUTextureBindingLayout"] },
- {
- key: "storageTexture",
- converter: webidl.converters["GPUStorageTextureBindingLayout"],
- },
-];
-webidl.converters["GPUBindGroupLayoutEntry"] = webidl
- .createDictionaryConverter(
- "GPUBindGroupLayoutEntry",
- dictMembersGPUBindGroupLayoutEntry,
- );
-
-// DICTIONARY: GPUBindGroupLayoutDescriptor
-const dictMembersGPUBindGroupLayoutDescriptor = [
- {
- key: "entries",
- converter: webidl.createSequenceConverter(
- webidl.converters["GPUBindGroupLayoutEntry"],
- ),
- required: true,
- },
-];
-webidl.converters["GPUBindGroupLayoutDescriptor"] = webidl
- .createDictionaryConverter(
- "GPUBindGroupLayoutDescriptor",
- dictMembersGPUObjectDescriptorBase,
- dictMembersGPUBindGroupLayoutDescriptor,
- );
-
-// INTERFACE: GPUShaderStage
-webidl.converters.GPUShaderStage = webidl.createInterfaceConverter(
- "GPUShaderStage",
- GPUShaderStage.prototype,
-);
-
-// INTERFACE: GPUBindGroup
-webidl.converters.GPUBindGroup = webidl.createInterfaceConverter(
- "GPUBindGroup",
- GPUBindGroup.prototype,
-);
-
-// DICTIONARY: GPUBufferBinding
-const dictMembersGPUBufferBinding = [
- {
- key: "buffer",
- converter: webidl.converters["GPUBuffer"],
- required: true,
- },
- {
- key: "offset",
- converter: webidl.converters["GPUSize64"],
- defaultValue: 0,
- },
- { key: "size", converter: webidl.converters["GPUSize64"] },
-];
-webidl.converters["GPUBufferBinding"] = webidl.createDictionaryConverter(
- "GPUBufferBinding",
- dictMembersGPUBufferBinding,
-);
-
-// TYPEDEF: GPUBindingResource
-webidl.converters["GPUBindingResource"] =
- webidl.converters.any /** put union here! **/;
-
-// DICTIONARY: GPUBindGroupEntry
-const dictMembersGPUBindGroupEntry = [
- {
- key: "binding",
- converter: webidl.converters["GPUIndex32"],
- required: true,
- },
- {
- key: "resource",
- converter: webidl.converters["GPUBindingResource"],
- required: true,
- },
-];
-webidl.converters["GPUBindGroupEntry"] = webidl.createDictionaryConverter(
- "GPUBindGroupEntry",
- dictMembersGPUBindGroupEntry,
-);
-
-// DICTIONARY: GPUBindGroupDescriptor
-const dictMembersGPUBindGroupDescriptor = [
- {
- key: "layout",
- converter: webidl.converters["GPUBindGroupLayout"],
- required: true,
- },
- {
- key: "entries",
- converter: webidl.createSequenceConverter(
- webidl.converters["GPUBindGroupEntry"],
- ),
- required: true,
- },
-];
-webidl.converters["GPUBindGroupDescriptor"] = webidl
- .createDictionaryConverter(
- "GPUBindGroupDescriptor",
- dictMembersGPUObjectDescriptorBase,
- dictMembersGPUBindGroupDescriptor,
- );
-
-// INTERFACE: GPUPipelineLayout
-webidl.converters.GPUPipelineLayout = webidl.createInterfaceConverter(
- "GPUPipelineLayout",
- GPUPipelineLayout.prototype,
-);
-
-// DICTIONARY: GPUPipelineLayoutDescriptor
-const dictMembersGPUPipelineLayoutDescriptor = [
- {
- key: "bindGroupLayouts",
- converter: webidl.createSequenceConverter(
- webidl.converters["GPUBindGroupLayout"],
- ),
- required: true,
- },
-];
-webidl.converters["GPUPipelineLayoutDescriptor"] = webidl
- .createDictionaryConverter(
- "GPUPipelineLayoutDescriptor",
- dictMembersGPUObjectDescriptorBase,
- dictMembersGPUPipelineLayoutDescriptor,
- );
-
-// INTERFACE: GPUShaderModule
-webidl.converters.GPUShaderModule = webidl.createInterfaceConverter(
- "GPUShaderModule",
- GPUShaderModule.prototype,
-);
-
-// DICTIONARY: GPUShaderModuleDescriptor
-const dictMembersGPUShaderModuleDescriptor = [
- {
- key: "code",
- converter: webidl.converters["DOMString"],
- required: true,
- },
-];
-webidl.converters["GPUShaderModuleDescriptor"] = webidl
- .createDictionaryConverter(
- "GPUShaderModuleDescriptor",
- dictMembersGPUObjectDescriptorBase,
- dictMembersGPUShaderModuleDescriptor,
- );
-
-// // ENUM: GPUCompilationMessageType
-// webidl.converters["GPUCompilationMessageType"] = webidl.createEnumConverter(
-// "GPUCompilationMessageType",
-// [
-// "error",
-// "warning",
-// "info",
-// ],
-// );
-
-// // INTERFACE: GPUCompilationMessage
-// webidl.converters.GPUCompilationMessage = webidl.createInterfaceConverter(
-// "GPUCompilationMessage",
-// GPUCompilationMessage.prototype,
-// );
-
-// // INTERFACE: GPUCompilationInfo
-// webidl.converters.GPUCompilationInfo = webidl.createInterfaceConverter(
-// "GPUCompilationInfo",
-// GPUCompilationInfo.prototype,
-// );
-
-webidl.converters["GPUAutoLayoutMode"] = webidl.createEnumConverter(
- "GPUAutoLayoutMode",
- [
- "auto",
- ],
-);
-
-webidl.converters["GPUPipelineLayout or GPUAutoLayoutMode"] = (V, opts) => {
- if (typeof V === "object") {
- return webidl.converters["GPUPipelineLayout"](V, opts);
- }
- return webidl.converters["GPUAutoLayoutMode"](V, opts);
-};
-
-// DICTIONARY: GPUPipelineDescriptorBase
-const dictMembersGPUPipelineDescriptorBase = [
- {
- key: "layout",
- converter: webidl.converters["GPUPipelineLayout or GPUAutoLayoutMode"],
- },
-];
-webidl.converters["GPUPipelineDescriptorBase"] = webidl
- .createDictionaryConverter(
- "GPUPipelineDescriptorBase",
- dictMembersGPUObjectDescriptorBase,
- dictMembersGPUPipelineDescriptorBase,
- );
-
-// TYPEDEF: GPUPipelineConstantValue
-webidl.converters.GPUPipelineConstantValue = webidl.converters.double;
-
-webidl.converters["record<USVString, GPUPipelineConstantValue>"] = webidl
- .createRecordConverter(
- webidl.converters.USVString,
- webidl.converters.GPUPipelineConstantValue,
- );
-
-// DICTIONARY: GPUProgrammableStage
-const dictMembersGPUProgrammableStage = [
- {
- key: "module",
- converter: webidl.converters["GPUShaderModule"],
- required: true,
- },
- {
- key: "entryPoint",
- converter: webidl.converters["USVString"],
- required: true,
- },
- {
- key: "constants",
- converter: webidl.converters["record<USVString, GPUPipelineConstantValue>"],
- },
-];
-webidl.converters["GPUProgrammableStage"] = webidl.createDictionaryConverter(
- "GPUProgrammableStage",
- dictMembersGPUProgrammableStage,
-);
-
-// INTERFACE: GPUComputePipeline
-webidl.converters.GPUComputePipeline = webidl.createInterfaceConverter(
- "GPUComputePipeline",
- GPUComputePipeline.prototype,
-);
-
-// DICTIONARY: GPUComputePipelineDescriptor
-const dictMembersGPUComputePipelineDescriptor = [
- {
- key: "compute",
- converter: webidl.converters["GPUProgrammableStage"],
- required: true,
- },
-];
-webidl.converters["GPUComputePipelineDescriptor"] = webidl
- .createDictionaryConverter(
- "GPUComputePipelineDescriptor",
- dictMembersGPUObjectDescriptorBase,
- dictMembersGPUPipelineDescriptorBase,
- dictMembersGPUComputePipelineDescriptor,
- );
-
-// INTERFACE: GPURenderPipeline
-webidl.converters.GPURenderPipeline = webidl.createInterfaceConverter(
- "GPURenderPipeline",
- GPURenderPipeline.prototype,
-);
-
-// ENUM: GPUVertexStepMode
-webidl.converters["GPUVertexStepMode"] = webidl.createEnumConverter(
- "GPUVertexStepMode",
- [
- "vertex",
- "instance",
- ],
-);
-
-// ENUM: GPUVertexFormat
-webidl.converters["GPUVertexFormat"] = webidl.createEnumConverter(
- "GPUVertexFormat",
- [
- "uint8x2",
- "uint8x4",
- "sint8x2",
- "sint8x4",
- "unorm8x2",
- "unorm8x4",
- "snorm8x2",
- "snorm8x4",
- "uint16x2",
- "uint16x4",
- "sint16x2",
- "sint16x4",
- "unorm16x2",
- "unorm16x4",
- "snorm16x2",
- "snorm16x4",
- "float16x2",
- "float16x4",
- "float32",
- "float32x2",
- "float32x3",
- "float32x4",
- "uint32",
- "uint32x2",
- "uint32x3",
- "uint32x4",
- "sint32",
- "sint32x2",
- "sint32x3",
- "sint32x4",
- ],
-);
-
-// DICTIONARY: GPUVertexAttribute
-const dictMembersGPUVertexAttribute = [
- {
- key: "format",
- converter: webidl.converters["GPUVertexFormat"],
- required: true,
- },
- {
- key: "offset",
- converter: webidl.converters["GPUSize64"],
- required: true,
- },
- {
- key: "shaderLocation",
- converter: webidl.converters["GPUIndex32"],
- required: true,
- },
-];
-webidl.converters["GPUVertexAttribute"] = webidl.createDictionaryConverter(
- "GPUVertexAttribute",
- dictMembersGPUVertexAttribute,
-);
-
-// DICTIONARY: GPUVertexBufferLayout
-const dictMembersGPUVertexBufferLayout = [
- {
- key: "arrayStride",
- converter: webidl.converters["GPUSize64"],
- required: true,
- },
- {
- key: "stepMode",
- converter: webidl.converters["GPUVertexStepMode"],
- defaultValue: "vertex",
- },
- {
- key: "attributes",
- converter: webidl.createSequenceConverter(
- webidl.converters["GPUVertexAttribute"],
- ),
- required: true,
- },
-];
-webidl.converters["GPUVertexBufferLayout"] = webidl.createDictionaryConverter(
- "GPUVertexBufferLayout",
- dictMembersGPUVertexBufferLayout,
-);
-
-// DICTIONARY: GPUVertexState
-const dictMembersGPUVertexState = [
- {
- key: "buffers",
- converter: webidl.createSequenceConverter(
- webidl.createNullableConverter(
- webidl.converters["GPUVertexBufferLayout"],
- ),
- ),
- get defaultValue() {
- return [];
- },
- },
-];
-webidl.converters["GPUVertexState"] = webidl.createDictionaryConverter(
- "GPUVertexState",
- dictMembersGPUProgrammableStage,
- dictMembersGPUVertexState,
-);
-
-// ENUM: GPUPrimitiveTopology
-webidl.converters["GPUPrimitiveTopology"] = webidl.createEnumConverter(
- "GPUPrimitiveTopology",
- [
- "point-list",
- "line-list",
- "line-strip",
- "triangle-list",
- "triangle-strip",
- ],
-);
-
-// ENUM: GPUIndexFormat
-webidl.converters["GPUIndexFormat"] = webidl.createEnumConverter(
- "GPUIndexFormat",
- [
- "uint16",
- "uint32",
- ],
-);
-
-// ENUM: GPUFrontFace
-webidl.converters["GPUFrontFace"] = webidl.createEnumConverter(
- "GPUFrontFace",
- [
- "ccw",
- "cw",
- ],
-);
-
-// ENUM: GPUCullMode
-webidl.converters["GPUCullMode"] = webidl.createEnumConverter("GPUCullMode", [
- "none",
- "front",
- "back",
-]);
-
-// DICTIONARY: GPUPrimitiveState
-const dictMembersGPUPrimitiveState = [
- {
- key: "topology",
- converter: webidl.converters["GPUPrimitiveTopology"],
- defaultValue: "triangle-list",
- },
- { key: "stripIndexFormat", converter: webidl.converters["GPUIndexFormat"] },
- {
- key: "frontFace",
- converter: webidl.converters["GPUFrontFace"],
- defaultValue: "ccw",
- },
- {
- key: "cullMode",
- converter: webidl.converters["GPUCullMode"],
- defaultValue: "none",
- },
- {
- key: "unclippedDepth",
- converter: webidl.converters["boolean"],
- defaultValue: false,
- },
-];
-webidl.converters["GPUPrimitiveState"] = webidl.createDictionaryConverter(
- "GPUPrimitiveState",
- dictMembersGPUPrimitiveState,
-);
-
-// ENUM: GPUStencilOperation
-webidl.converters["GPUStencilOperation"] = webidl.createEnumConverter(
- "GPUStencilOperation",
- [
- "keep",
- "zero",
- "replace",
- "invert",
- "increment-clamp",
- "decrement-clamp",
- "increment-wrap",
- "decrement-wrap",
- ],
-);
-
-// DICTIONARY: GPUStencilFaceState
-const dictMembersGPUStencilFaceState = [
- {
- key: "compare",
- converter: webidl.converters["GPUCompareFunction"],
- defaultValue: "always",
- },
- {
- key: "failOp",
- converter: webidl.converters["GPUStencilOperation"],
- defaultValue: "keep",
- },
- {
- key: "depthFailOp",
- converter: webidl.converters["GPUStencilOperation"],
- defaultValue: "keep",
- },
- {
- key: "passOp",
- converter: webidl.converters["GPUStencilOperation"],
- defaultValue: "keep",
- },
-];
-webidl.converters["GPUStencilFaceState"] = webidl.createDictionaryConverter(
- "GPUStencilFaceState",
- dictMembersGPUStencilFaceState,
-);
-
-// TYPEDEF: GPUStencilValue
-webidl.converters["GPUStencilValue"] = (V, opts) =>
- webidl.converters["unsigned long"](V, { ...opts, enforceRange: true });
-
-// TYPEDEF: GPUDepthBias
-webidl.converters["GPUDepthBias"] = (V, opts) =>
- webidl.converters["long"](V, { ...opts, enforceRange: true });
-
-// DICTIONARY: GPUDepthStencilState
-const dictMembersGPUDepthStencilState = [
- {
- key: "format",
- converter: webidl.converters["GPUTextureFormat"],
- required: true,
- },
- {
- key: "depthWriteEnabled",
- converter: webidl.converters["boolean"],
- defaultValue: false,
- },
- {
- key: "depthCompare",
- converter: webidl.converters["GPUCompareFunction"],
- defaultValue: "always",
- },
- {
- key: "stencilFront",
- converter: webidl.converters["GPUStencilFaceState"],
- get defaultValue() {
- return {};
- },
- },
- {
- key: "stencilBack",
- converter: webidl.converters["GPUStencilFaceState"],
- get defaultValue() {
- return {};
- },
- },
- {
- key: "stencilReadMask",
- converter: webidl.converters["GPUStencilValue"],
- defaultValue: 0xFFFFFFFF,
- },
- {
- key: "stencilWriteMask",
- converter: webidl.converters["GPUStencilValue"],
- defaultValue: 0xFFFFFFFF,
- },
- {
- key: "depthBias",
- converter: webidl.converters["GPUDepthBias"],
- defaultValue: 0,
- },
- {
- key: "depthBiasSlopeScale",
- converter: webidl.converters["float"],
- defaultValue: 0,
- },
- {
- key: "depthBiasClamp",
- converter: webidl.converters["float"],
- defaultValue: 0,
- },
-];
-webidl.converters["GPUDepthStencilState"] = webidl.createDictionaryConverter(
- "GPUDepthStencilState",
- dictMembersGPUDepthStencilState,
-);
-
-// TYPEDEF: GPUSampleMask
-webidl.converters["GPUSampleMask"] = (V, opts) =>
- webidl.converters["unsigned long"](V, { ...opts, enforceRange: true });
-
-// DICTIONARY: GPUMultisampleState
-const dictMembersGPUMultisampleState = [
- {
- key: "count",
- converter: webidl.converters["GPUSize32"],
- defaultValue: 1,
- },
- {
- key: "mask",
- converter: webidl.converters["GPUSampleMask"],
- defaultValue: 0xFFFFFFFF,
- },
- {
- key: "alphaToCoverageEnabled",
- converter: webidl.converters["boolean"],
- defaultValue: false,
- },
-];
-webidl.converters["GPUMultisampleState"] = webidl.createDictionaryConverter(
- "GPUMultisampleState",
- dictMembersGPUMultisampleState,
-);
-
-// ENUM: GPUBlendFactor
-webidl.converters["GPUBlendFactor"] = webidl.createEnumConverter(
- "GPUBlendFactor",
- [
- "zero",
- "one",
- "src",
- "one-minus-src",
- "src-alpha",
- "one-minus-src-alpha",
- "dst",
- "one-minus-dst",
- "dst-alpha",
- "one-minus-dst-alpha",
- "src-alpha-saturated",
- "constant",
- "one-minus-constant",
- ],
-);
-
-// ENUM: GPUBlendOperation
-webidl.converters["GPUBlendOperation"] = webidl.createEnumConverter(
- "GPUBlendOperation",
- [
- "add",
- "subtract",
- "reverse-subtract",
- "min",
- "max",
- ],
-);
-
-// DICTIONARY: GPUBlendComponent
-const dictMembersGPUBlendComponent = [
- {
- key: "srcFactor",
- converter: webidl.converters["GPUBlendFactor"],
- defaultValue: "one",
- },
- {
- key: "dstFactor",
- converter: webidl.converters["GPUBlendFactor"],
- defaultValue: "zero",
- },
- {
- key: "operation",
- converter: webidl.converters["GPUBlendOperation"],
- defaultValue: "add",
- },
-];
-webidl.converters["GPUBlendComponent"] = webidl.createDictionaryConverter(
- "GPUBlendComponent",
- dictMembersGPUBlendComponent,
-);
-
-// DICTIONARY: GPUBlendState
-const dictMembersGPUBlendState = [
- {
- key: "color",
- converter: webidl.converters["GPUBlendComponent"],
- required: true,
- },
- {
- key: "alpha",
- converter: webidl.converters["GPUBlendComponent"],
- required: true,
- },
-];
-webidl.converters["GPUBlendState"] = webidl.createDictionaryConverter(
- "GPUBlendState",
- dictMembersGPUBlendState,
-);
-
-// TYPEDEF: GPUColorWriteFlags
-webidl.converters["GPUColorWriteFlags"] = (V, opts) =>
- webidl.converters["unsigned long"](V, { ...opts, enforceRange: true });
-
-// DICTIONARY: GPUColorTargetState
-const dictMembersGPUColorTargetState = [
- {
- key: "format",
- converter: webidl.converters["GPUTextureFormat"],
- required: true,
- },
- { key: "blend", converter: webidl.converters["GPUBlendState"] },
- {
- key: "writeMask",
- converter: webidl.converters["GPUColorWriteFlags"],
- defaultValue: 0xF,
- },
-];
-webidl.converters["GPUColorTargetState"] = webidl.createDictionaryConverter(
- "GPUColorTargetState",
- dictMembersGPUColorTargetState,
-);
-
-// DICTIONARY: GPUFragmentState
-const dictMembersGPUFragmentState = [
- {
- key: "targets",
- converter: webidl.createSequenceConverter(
- webidl.createNullableConverter(
- webidl.converters["GPUColorTargetState"],
- ),
- ),
- required: true,
- },
-];
-webidl.converters["GPUFragmentState"] = webidl.createDictionaryConverter(
- "GPUFragmentState",
- dictMembersGPUProgrammableStage,
- dictMembersGPUFragmentState,
-);
-
-// DICTIONARY: GPURenderPipelineDescriptor
-const dictMembersGPURenderPipelineDescriptor = [
- {
- key: "vertex",
- converter: webidl.converters["GPUVertexState"],
- required: true,
- },
- {
- key: "primitive",
- converter: webidl.converters["GPUPrimitiveState"],
- get defaultValue() {
- return {};
- },
- },
- {
- key: "depthStencil",
- converter: webidl.converters["GPUDepthStencilState"],
- },
- {
- key: "multisample",
- converter: webidl.converters["GPUMultisampleState"],
- get defaultValue() {
- return {};
- },
- },
- { key: "fragment", converter: webidl.converters["GPUFragmentState"] },
-];
-webidl.converters["GPURenderPipelineDescriptor"] = webidl
- .createDictionaryConverter(
- "GPURenderPipelineDescriptor",
- dictMembersGPUObjectDescriptorBase,
- dictMembersGPUPipelineDescriptorBase,
- dictMembersGPURenderPipelineDescriptor,
- );
-
-// INTERFACE: GPUColorWrite
-webidl.converters.GPUColorWrite = webidl.createInterfaceConverter(
- "GPUColorWrite",
- GPUColorWrite.prototype,
-);
-
-// INTERFACE: GPUCommandBuffer
-webidl.converters.GPUCommandBuffer = webidl.createInterfaceConverter(
- "GPUCommandBuffer",
- GPUCommandBuffer.prototype,
-);
-webidl.converters["sequence<GPUCommandBuffer>"] = webidl
- .createSequenceConverter(webidl.converters["GPUCommandBuffer"]);
-
-// DICTIONARY: GPUCommandBufferDescriptor
-const dictMembersGPUCommandBufferDescriptor = [];
-webidl.converters["GPUCommandBufferDescriptor"] = webidl
- .createDictionaryConverter(
- "GPUCommandBufferDescriptor",
- dictMembersGPUObjectDescriptorBase,
- dictMembersGPUCommandBufferDescriptor,
- );
-
-// INTERFACE: GPUCommandEncoder
-webidl.converters.GPUCommandEncoder = webidl.createInterfaceConverter(
- "GPUCommandEncoder",
- GPUCommandEncoder.prototype,
-);
-
-// DICTIONARY: GPUCommandEncoderDescriptor
-const dictMembersGPUCommandEncoderDescriptor = [];
-webidl.converters["GPUCommandEncoderDescriptor"] = webidl
- .createDictionaryConverter(
- "GPUCommandEncoderDescriptor",
- dictMembersGPUObjectDescriptorBase,
- dictMembersGPUCommandEncoderDescriptor,
- );
-
-// DICTIONARY: GPUImageDataLayout
-const dictMembersGPUImageDataLayout = [
- {
- key: "offset",
- converter: webidl.converters["GPUSize64"],
- defaultValue: 0,
- },
- { key: "bytesPerRow", converter: webidl.converters["GPUSize32"] },
- { key: "rowsPerImage", converter: webidl.converters["GPUSize32"] },
-];
-webidl.converters["GPUImageDataLayout"] = webidl.createDictionaryConverter(
- "GPUImageDataLayout",
- dictMembersGPUImageDataLayout,
-);
-
-// DICTIONARY: GPUImageCopyBuffer
-const dictMembersGPUImageCopyBuffer = [
- {
- key: "buffer",
- converter: webidl.converters["GPUBuffer"],
- required: true,
- },
-];
-webidl.converters["GPUImageCopyBuffer"] = webidl.createDictionaryConverter(
- "GPUImageCopyBuffer",
- dictMembersGPUImageDataLayout,
- dictMembersGPUImageCopyBuffer,
-);
-
-// DICTIONARY: GPUOrigin3DDict
-const dictMembersGPUOrigin3DDict = [
- {
- key: "x",
- converter: webidl.converters["GPUIntegerCoordinate"],
- defaultValue: 0,
- },
- {
- key: "y",
- converter: webidl.converters["GPUIntegerCoordinate"],
- defaultValue: 0,
- },
- {
- key: "z",
- converter: webidl.converters["GPUIntegerCoordinate"],
- defaultValue: 0,
- },
-];
-webidl.converters["GPUOrigin3DDict"] = webidl.createDictionaryConverter(
- "GPUOrigin3DDict",
- dictMembersGPUOrigin3DDict,
-);
-
-// TYPEDEF: GPUOrigin3D
-webidl.converters["GPUOrigin3D"] = (V, opts) => {
- // Union for (sequence<GPUIntegerCoordinate> or GPUOrigin3DDict)
- if (V === null || V === undefined) {
- return webidl.converters["GPUOrigin3DDict"](V, opts);
- }
- if (typeof V === "object") {
- const method = V[SymbolIterator];
- if (method !== undefined) {
- return webidl.converters["sequence<GPUIntegerCoordinate>"](V, opts);
- }
- return webidl.converters["GPUOrigin3DDict"](V, opts);
- }
- throw webidl.makeException(
- TypeError,
- "can not be converted to sequence<GPUIntegerCoordinate> or GPUOrigin3DDict.",
- opts,
- );
-};
-
-// DICTIONARY: GPUImageCopyTexture
-const dictMembersGPUImageCopyTexture = [
- {
- key: "texture",
- converter: webidl.converters["GPUTexture"],
- required: true,
- },
- {
- key: "mipLevel",
- converter: webidl.converters["GPUIntegerCoordinate"],
- defaultValue: 0,
- },
- {
- key: "origin",
- converter: webidl.converters["GPUOrigin3D"],
- get defaultValue() {
- return {};
- },
- },
- {
- key: "aspect",
- converter: webidl.converters["GPUTextureAspect"],
- defaultValue: "all",
- },
-];
-webidl.converters["GPUImageCopyTexture"] = webidl.createDictionaryConverter(
- "GPUImageCopyTexture",
- dictMembersGPUImageCopyTexture,
-);
-
-// DICTIONARY: GPUOrigin2DDict
-const dictMembersGPUOrigin2DDict = [
- {
- key: "x",
- converter: webidl.converters["GPUIntegerCoordinate"],
- defaultValue: 0,
- },
- {
- key: "y",
- converter: webidl.converters["GPUIntegerCoordinate"],
- defaultValue: 0,
- },
-];
-webidl.converters["GPUOrigin2DDict"] = webidl.createDictionaryConverter(
- "GPUOrigin2DDict",
- dictMembersGPUOrigin2DDict,
-);
-
-// TYPEDEF: GPUOrigin2D
-webidl.converters["GPUOrigin2D"] = (V, opts) => {
- // Union for (sequence<GPUIntegerCoordinate> or GPUOrigin2DDict)
- if (V === null || V === undefined) {
- return webidl.converters["GPUOrigin2DDict"](V, opts);
- }
- if (typeof V === "object") {
- const method = V[SymbolIterator];
- if (method !== undefined) {
- return webidl.converters["sequence<GPUIntegerCoordinate>"](V, opts);
- }
- return webidl.converters["GPUOrigin2DDict"](V, opts);
- }
- throw webidl.makeException(
- TypeError,
- "can not be converted to sequence<GPUIntegerCoordinate> or GPUOrigin2DDict.",
- opts,
- );
-};
-
-// INTERFACE: GPUComputePassEncoder
-webidl.converters.GPUComputePassEncoder = webidl.createInterfaceConverter(
- "GPUComputePassEncoder",
- GPUComputePassEncoder.prototype,
-);
-
-// DICTIONARY: GPUComputePassDescriptor
-const dictMembersGPUComputePassDescriptor = [];
-webidl.converters["GPUComputePassDescriptor"] = webidl
- .createDictionaryConverter(
- "GPUComputePassDescriptor",
- dictMembersGPUObjectDescriptorBase,
- dictMembersGPUComputePassDescriptor,
- );
-
-// INTERFACE: GPURenderPassEncoder
-webidl.converters.GPURenderPassEncoder = webidl.createInterfaceConverter(
- "GPURenderPassEncoder",
- GPURenderPassEncoder.prototype,
-);
-
-// ENUM: GPULoadOp
-webidl.converters["GPULoadOp"] = webidl.createEnumConverter("GPULoadOp", [
- "load",
- "clear",
-]);
-
-// DICTIONARY: GPUColorDict
-const dictMembersGPUColorDict = [
- { key: "r", converter: webidl.converters["double"], required: true },
- { key: "g", converter: webidl.converters["double"], required: true },
- { key: "b", converter: webidl.converters["double"], required: true },
- { key: "a", converter: webidl.converters["double"], required: true },
-];
-webidl.converters["GPUColorDict"] = webidl.createDictionaryConverter(
- "GPUColorDict",
- dictMembersGPUColorDict,
-);
-
-// TYPEDEF: GPUColor
-webidl.converters["GPUColor"] = (V, opts) => {
- // Union for (sequence<double> or GPUColorDict)
- if (V === null || V === undefined) {
- return webidl.converters["GPUColorDict"](V, opts);
- }
- if (typeof V === "object") {
- const method = V[SymbolIterator];
- if (method !== undefined) {
- return webidl.converters["sequence<double>"](V, opts);
- }
- return webidl.converters["GPUColorDict"](V, opts);
- }
- throw webidl.makeException(
- TypeError,
- "can not be converted to sequence<double> or GPUColorDict.",
- opts,
- );
-};
-
-// ENUM: GPUStoreOp
-webidl.converters["GPUStoreOp"] = webidl.createEnumConverter("GPUStoreOp", [
- "store",
- "discard",
-]);
-
-// DICTIONARY: GPURenderPassColorAttachment
-const dictMembersGPURenderPassColorAttachment = [
- {
- key: "view",
- converter: webidl.converters["GPUTextureView"],
- required: true,
- },
- { key: "resolveTarget", converter: webidl.converters["GPUTextureView"] },
- {
- key: "clearValue",
- converter: webidl.converters["GPUColor"],
- },
- {
- key: "loadOp",
- converter: webidl.converters["GPULoadOp"],
- required: true,
- },
- {
- key: "storeOp",
- converter: webidl.converters["GPUStoreOp"],
- required: true,
- },
-];
-webidl.converters["GPURenderPassColorAttachment"] = webidl
- .createDictionaryConverter(
- "GPURenderPassColorAttachment",
- dictMembersGPURenderPassColorAttachment,
- );
-
-// DICTIONARY: GPURenderPassDepthStencilAttachment
-const dictMembersGPURenderPassDepthStencilAttachment = [
- {
- key: "view",
- converter: webidl.converters["GPUTextureView"],
- required: true,
- },
- {
- key: "depthClearValue",
- converter: webidl.converters["float"],
- defaultValue: 0,
- },
- {
- key: "depthLoadOp",
- converter: webidl.converters["GPULoadOp"],
- },
- {
- key: "depthStoreOp",
- converter: webidl.converters["GPUStoreOp"],
- },
- {
- key: "depthReadOnly",
- converter: webidl.converters["boolean"],
- defaultValue: false,
- },
- {
- key: "stencilClearValue",
- converter: webidl.converters["GPUStencilValue"],
- defaultValue: 0,
- },
- {
- key: "stencilLoadOp",
- converter: webidl.converters["GPULoadOp"],
- },
- {
- key: "stencilStoreOp",
- converter: webidl.converters["GPUStoreOp"],
- },
- {
- key: "stencilReadOnly",
- converter: webidl.converters["boolean"],
- defaultValue: false,
- },
-];
-webidl.converters["GPURenderPassDepthStencilAttachment"] = webidl
- .createDictionaryConverter(
- "GPURenderPassDepthStencilAttachment",
- dictMembersGPURenderPassDepthStencilAttachment,
- );
-
-// INTERFACE: GPUQuerySet
-webidl.converters.GPUQuerySet = webidl.createInterfaceConverter(
- "GPUQuerySet",
- GPUQuerySet.prototype,
-);
-
-// DICTIONARY: GPURenderPassDescriptor
-const dictMembersGPURenderPassDescriptor = [
- {
- key: "colorAttachments",
- converter: webidl.createSequenceConverter(
- webidl.createNullableConverter(
- webidl.converters["GPURenderPassColorAttachment"],
- ),
- ),
- required: true,
- },
- {
- key: "depthStencilAttachment",
- converter: webidl.converters["GPURenderPassDepthStencilAttachment"],
- },
-];
-webidl.converters["GPURenderPassDescriptor"] = webidl
- .createDictionaryConverter(
- "GPURenderPassDescriptor",
- dictMembersGPUObjectDescriptorBase,
- dictMembersGPURenderPassDescriptor,
- );
-
-// INTERFACE: GPURenderBundle
-webidl.converters.GPURenderBundle = webidl.createInterfaceConverter(
- "GPURenderBundle",
- GPURenderBundle.prototype,
-);
-webidl.converters["sequence<GPURenderBundle>"] = webidl
- .createSequenceConverter(webidl.converters["GPURenderBundle"]);
-
-// DICTIONARY: GPURenderBundleDescriptor
-const dictMembersGPURenderBundleDescriptor = [];
-webidl.converters["GPURenderBundleDescriptor"] = webidl
- .createDictionaryConverter(
- "GPURenderBundleDescriptor",
- dictMembersGPUObjectDescriptorBase,
- dictMembersGPURenderBundleDescriptor,
- );
-
-// INTERFACE: GPURenderBundleEncoder
-webidl.converters.GPURenderBundleEncoder = webidl.createInterfaceConverter(
- "GPURenderBundleEncoder",
- GPURenderBundleEncoder.prototype,
-);
-
-// DICTIONARY: GPURenderPassLayout
-const dictMembersGPURenderPassLayout = [
- {
- key: "colorFormats",
- converter: webidl.createSequenceConverter(
- webidl.createNullableConverter(webidl.converters["GPUTextureFormat"]),
- ),
- required: true,
- },
- {
- key: "depthStencilFormat",
- converter: webidl.converters["GPUTextureFormat"],
- },
- {
- key: "sampleCount",
- converter: webidl.converters["GPUSize32"],
- defaultValue: 1,
- },
-];
-webidl.converters["GPURenderPassLayout"] = webidl
- .createDictionaryConverter(
- "GPURenderPassLayout",
- dictMembersGPUObjectDescriptorBase,
- dictMembersGPURenderPassLayout,
- );
-
-// DICTIONARY: GPURenderBundleEncoderDescriptor
-const dictMembersGPURenderBundleEncoderDescriptor = [
- {
- key: "depthReadOnly",
- converter: webidl.converters.boolean,
- defaultValue: false,
- },
- {
- key: "stencilReadOnly",
- converter: webidl.converters.boolean,
- defaultValue: false,
- },
-];
-webidl.converters["GPURenderBundleEncoderDescriptor"] = webidl
- .createDictionaryConverter(
- "GPURenderBundleEncoderDescriptor",
- dictMembersGPUObjectDescriptorBase,
- dictMembersGPURenderPassLayout,
- dictMembersGPURenderBundleEncoderDescriptor,
- );
-
-// INTERFACE: GPUQueue
-webidl.converters.GPUQueue = webidl.createInterfaceConverter(
- "GPUQueue",
- GPUQueue.prototype,
-);
-
-// ENUM: GPUQueryType
-webidl.converters["GPUQueryType"] = webidl.createEnumConverter(
- "GPUQueryType",
- [
- "occlusion",
- "pipeline-statistics",
- "timestamp",
- ],
-);
-
-// ENUM: GPUPipelineStatisticName
-webidl.converters["GPUPipelineStatisticName"] = webidl.createEnumConverter(
- "GPUPipelineStatisticName",
- [
- "vertex-shader-invocations",
- "clipper-invocations",
- "clipper-primitives-out",
- "fragment-shader-invocations",
- "compute-shader-invocations",
- ],
-);
-
-// DICTIONARY: GPUQuerySetDescriptor
-const dictMembersGPUQuerySetDescriptor = [
- {
- key: "type",
- converter: webidl.converters["GPUQueryType"],
- required: true,
- },
- { key: "count", converter: webidl.converters["GPUSize32"], required: true },
- {
- key: "pipelineStatistics",
- converter: webidl.createSequenceConverter(
- webidl.converters["GPUPipelineStatisticName"],
- ),
- get defaultValue() {
- return [];
- },
- },
-];
-webidl.converters["GPUQuerySetDescriptor"] = webidl.createDictionaryConverter(
- "GPUQuerySetDescriptor",
- dictMembersGPUObjectDescriptorBase,
- dictMembersGPUQuerySetDescriptor,
-);
-
-// ENUM: GPUDeviceLostReason
-webidl.converters["GPUDeviceLostReason"] = webidl.createEnumConverter(
- "GPUDeviceLostReason",
- [
- "destroyed",
- ],
-);
-
-// // INTERFACE: GPUDeviceLostInfo
-// webidl.converters.GPUDeviceLostInfo = webidl.createInterfaceConverter(
-// "GPUDeviceLostInfo",
-// GPUDeviceLostInfo.prototype,
-// );
-
-// ENUM: GPUErrorFilter
-webidl.converters["GPUErrorFilter"] = webidl.createEnumConverter(
- "GPUErrorFilter",
- [
- "out-of-memory",
- "validation",
- ],
-);
-
-// INTERFACE: GPUOutOfMemoryError
-webidl.converters.GPUOutOfMemoryError = webidl.createInterfaceConverter(
- "GPUOutOfMemoryError",
- GPUOutOfMemoryError.prototype,
-);
-
-// INTERFACE: GPUValidationError
-webidl.converters.GPUValidationError = webidl.createInterfaceConverter(
- "GPUValidationError",
- GPUValidationError.prototype,
-);
-
-// TYPEDEF: GPUError
-webidl.converters["GPUError"] = webidl.converters.any /** put union here! **/;
-
-// // INTERFACE: GPUUncapturedErrorEvent
-// webidl.converters.GPUUncapturedErrorEvent = webidl.createInterfaceConverter(
-// "GPUUncapturedErrorEvent",
-// GPUUncapturedErrorEvent.prototype,
-// );
-
-// DICTIONARY: GPUUncapturedErrorEventInit
-const dictMembersGPUUncapturedErrorEventInit = [
- { key: "error", converter: webidl.converters["GPUError"], required: true },
-];
-webidl.converters["GPUUncapturedErrorEventInit"] = webidl
- .createDictionaryConverter(
- "GPUUncapturedErrorEventInit",
- // dictMembersEventInit,
- dictMembersGPUUncapturedErrorEventInit,
- );
-
-// TYPEDEF: GPUBufferDynamicOffset
-webidl.converters["GPUBufferDynamicOffset"] = (V, opts) =>
- webidl.converters["unsigned long"](V, { ...opts, enforceRange: true });
-
-// TYPEDEF: GPUSignedOffset32
-webidl.converters["GPUSignedOffset32"] = (V, opts) =>
- webidl.converters["long"](V, { ...opts, enforceRange: true });
-
-// TYPEDEF: GPUFlagsConstant
-webidl.converters["GPUFlagsConstant"] = webidl.converters["unsigned long"];
diff --git a/ext/webgpu/03_surface.js b/ext/webgpu/03_surface.js
deleted file mode 100644
index 2a391613c..000000000
--- a/ext/webgpu/03_surface.js
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
-
-// @ts-check
-/// <reference path="../../core/lib.deno_core.d.ts" />
-/// <reference path="../web/internal.d.ts" />
-/// <reference path="../web/lib.deno_web.d.ts" />
-/// <reference path="./lib.deno_webgpu.d.ts" />
-
-const core = globalThis.Deno.core;
-const ops = core.ops;
-import * as webidl from "ext:deno_webidl/00_webidl.js";
-const primordials = globalThis.__bootstrap.primordials;
-const { Symbol } = primordials;
-import {
- _device,
- assertDevice,
- createGPUTexture,
-} from "ext:deno_webgpu/01_webgpu.js";
-
-const _surfaceRid = Symbol("[[surfaceRid]]");
-const _configuration = Symbol("[[configuration]]");
-const _canvas = Symbol("[[canvas]]");
-const _currentTexture = Symbol("[[currentTexture]]");
-class GPUCanvasContext {
- /** @type {number} */
- [_surfaceRid];
- /** @type {InnerGPUDevice} */
- [_device];
- [_configuration];
- [_canvas];
- /** @type {GPUTexture | undefined} */
- [_currentTexture];
-
- get canvas() {
- webidl.assertBranded(this, GPUCanvasContextPrototype);
- return this[_canvas];
- }
-
- constructor() {
- webidl.illegalConstructor();
- }
-
- configure(configuration) {
- webidl.assertBranded(this, GPUCanvasContextPrototype);
- const prefix = "Failed to execute 'configure' on 'GPUCanvasContext'";
- webidl.requiredArguments(arguments.length, 1, { prefix });
- configuration = webidl.converters.GPUCanvasConfiguration(configuration, {
- prefix,
- context: "Argument 1",
- });
-
- this[_device] = configuration.device[_device];
- this[_configuration] = configuration;
- const device = assertDevice(this, {
- prefix,
- context: "configuration.device",
- });
-
- const { err } = ops.op_webgpu_surface_configure({
- surfaceRid: this[_surfaceRid],
- deviceRid: device.rid,
- format: configuration.format,
- viewFormats: configuration.viewFormats,
- usage: configuration.usage,
- width: configuration.width,
- height: configuration.height,
- alphaMode: configuration.alphaMode,
- });
-
- device.pushError(err);
- }
-
- unconfigure() {
- webidl.assertBranded(this, GPUCanvasContextPrototype);
-
- this[_configuration] = null;
- this[_device] = null;
- }
-
- getCurrentTexture() {
- webidl.assertBranded(this, GPUCanvasContextPrototype);
- const prefix =
- "Failed to execute 'getCurrentTexture' on 'GPUCanvasContext'";
-
- if (this[_configuration] === null) {
- throw new DOMException(
- "context is not configured.",
- "InvalidStateError",
- );
- }
-
- const device = assertDevice(this, { prefix, context: "this" });
-
- if (this[_currentTexture]) {
- return this[_currentTexture];
- }
-
- const { rid } = ops.op_webgpu_surface_get_current_texture(
- device.rid,
- this[_surfaceRid],
- );
-
- const texture = createGPUTexture(
- {
- size: {
- width: this[_configuration].width,
- height: this[_configuration].height,
- depthOrArrayLayers: 1,
- },
- mipLevelCount: 1,
- sampleCount: 1,
- dimension: "2d",
- format: this[_configuration].format,
- usage: this[_configuration].usage,
- },
- device,
- rid,
- );
- device.trackResource(texture);
- this[_currentTexture] = texture;
- return texture;
- }
-
- // Extended from spec. Required to present the texture; browser don't need this.
- present() {
- webidl.assertBranded(this, GPUCanvasContextPrototype);
- const prefix = "Failed to execute 'present' on 'GPUCanvasContext'";
- const device = assertDevice(this[_currentTexture], {
- prefix,
- context: "this",
- });
- ops.op_webgpu_surface_present(device.rid, this[_surfaceRid]);
- this[_currentTexture].destroy();
- this[_currentTexture] = undefined;
- }
-}
-const GPUCanvasContextPrototype = GPUCanvasContext.prototype;
-
-function createCanvasContext(options) {
- const canvasContext = webidl.createBranded(GPUCanvasContext);
- canvasContext[_surfaceRid] = options.surfaceRid;
- canvasContext[_canvas] = options.canvas;
- return canvasContext;
-}
-
-export { createCanvasContext, GPUCanvasContext };
diff --git a/ext/webgpu/04_surface_idl_types.js b/ext/webgpu/04_surface_idl_types.js
deleted file mode 100644
index 1e998ef57..000000000
--- a/ext/webgpu/04_surface_idl_types.js
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
-
-// @ts-check
-/// <reference path="../../core/lib.deno_core.d.ts" />
-/// <reference path="../web/internal.d.ts" />
-/// <reference path="../web/lib.deno_web.d.ts" />
-/// <reference path="./lib.deno_webgpu.d.ts" />
-
-import * as webidl from "ext:deno_webidl/00_webidl.js";
-import { GPUTextureUsage } from "ext:deno_webgpu/01_webgpu.js";
-
-// ENUM: GPUCanvasAlphaMode
-webidl.converters["GPUCanvasAlphaMode"] = webidl.createEnumConverter(
- "GPUCanvasAlphaMode",
- [
- "opaque",
- "premultiplied",
- ],
-);
-
-// NON-SPEC: ENUM: GPUPresentMode
-webidl.converters["GPUPresentMode"] = webidl.createEnumConverter(
- "GPUPresentMode",
- [
- "autoVsync",
- "autoNoVsync",
- "fifo",
- "fifoRelaxed",
- "immediate",
- "mailbox",
- ],
-);
-
-// DICT: GPUCanvasConfiguration
-const dictMembersGPUCanvasConfiguration = [
- { key: "device", converter: webidl.converters.GPUDevice, required: true },
- {
- key: "format",
- converter: webidl.converters.GPUTextureFormat,
- required: true,
- },
- {
- key: "usage",
- converter: webidl.converters["GPUTextureUsageFlags"],
- defaultValue: GPUTextureUsage.RENDER_ATTACHMENT,
- },
- {
- key: "alphaMode",
- converter: webidl.converters["GPUCanvasAlphaMode"],
- defaultValue: "opaque",
- },
-
- // Extended from spec
- {
- key: "presentMode",
- converter: webidl.converters["GPUPresentMode"],
- },
- {
- key: "width",
- converter: webidl.converters["long"],
- required: true,
- },
- {
- key: "height",
- converter: webidl.converters["long"],
- required: true,
- },
- {
- key: "viewFormats",
- converter: webidl.createSequenceConverter(
- webidl.converters["GPUTextureFormat"],
- ),
- get defaultValue() {
- return [];
- },
- },
-];
-webidl.converters["GPUCanvasConfiguration"] = webidl
- .createDictionaryConverter(
- "GPUCanvasConfiguration",
- dictMembersGPUCanvasConfiguration,
- );
diff --git a/ext/webgpu/Cargo.toml b/ext/webgpu/Cargo.toml
deleted file mode 100644
index 4deec261a..000000000
--- a/ext/webgpu/Cargo.toml
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
-
-[package]
-name = "deno_webgpu"
-version = "0.94.0"
-authors = ["the Deno authors"]
-edition.workspace = true
-license = "MIT"
-readme = "README.md"
-repository = "https://github.com/gfx-rs/wgpu"
-description = "WebGPU implementation for Deno"
-
-[lib]
-path = "lib.rs"
-
-[features]
-surface = ["wgpu-core/raw-window-handle", "dep:raw-window-handle"]
-
-[dependencies]
-deno_core.workspace = true
-raw-window-handle = { workspace = true, optional = true }
-serde.workspace = true
-tokio.workspace = true
-wgpu-types = { workspace = true, features = ["trace", "replay", "serde"] }
-
-[dependencies.wgpu-core]
-workspace = true
-features = ["trace", "replay", "serde", "strict_asserts", "wgsl", "gles"]
-
-# We want the wgpu-core Metal backend on macOS and iOS.
-[target.'cfg(any(target_os = "macos", target_os = "ios"))'.dependencies.wgpu-core]
-workspace = true
-features = ["metal"]
-
-# We want the wgpu-core Direct3D backends on Windows.
-[target.'cfg(windows)'.dependencies.wgpu-core]
-workspace = true
-features = ["dx11", "dx12"]
-
-# We want the wgpu-core Vulkan backend on Unix (but not Emscripten) and Windows.
-[target.'cfg(any(windows, all(unix, not(target_arch = "emscripten"))))'.dependencies.wgpu-core]
-workspace = true
-features = ["vulkan"]
diff --git a/ext/webgpu/LICENSE.md b/ext/webgpu/LICENSE.md
deleted file mode 100644
index aec557f3a..000000000
--- a/ext/webgpu/LICENSE.md
+++ /dev/null
@@ -1,20 +0,0 @@
-MIT License
-
-Copyright 2018-2023 the Deno authors
-
-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/ext/webgpu/README.md b/ext/webgpu/README.md
deleted file mode 100644
index 2f915dcbb..000000000
--- a/ext/webgpu/README.md
+++ /dev/null
@@ -1,35 +0,0 @@
-# deno_webgpu
-
-This op crate implements the WebGPU API as defined in
-https://gpuweb.github.io/gpuweb/ in Deno. The implementation targets the spec
-draft as of February 22, 2021. The spec is still very much in flux. This op
-crate tries to stay up to date with the spec, but is constrained by the features
-implemented in our GPU backend library [wgpu](https://github.com/gfx-rs/wgpu).
-
-The spec is still very bare bones, and is still missing many details. As the
-spec becomes more concrete, we will implement to follow the spec more closely.
-
-In addition, setting the `DENO_WEBGPU_TRACE` environmental variable will output
-a
-[wgpu trace](https://github.com/gfx-rs/wgpu/wiki/Debugging-wgpu-Applications#tracing-infrastructure)
-to the specified directory.
-
-For testing this op crate will make use of the WebGPU conformance tests suite,
-running through our WPT runner. This will be used to validate implementation
-conformance.
-
-GitHub CI doesn't run with GPUs, so testing relies on software like DX WARP &
-Vulkan lavapipe. Currently only using DX WARP works, so tests are only run on
-Windows.
-
-## Links
-
-Specification: https://gpuweb.github.io/gpuweb/
-
-Design documents: https://github.com/gpuweb/gpuweb/tree/main/design
-
-Conformance tests suite: https://github.com/gpuweb/cts
-
-WebGPU examples for Deno: https://github.com/crowlKats/webgpu-examples
-
-wgpu-users matrix channel: https://matrix.to/#/#wgpu-users:matrix.org
diff --git a/ext/webgpu/binding.rs b/ext/webgpu/binding.rs
deleted file mode 100644
index 4c4a864fd..000000000
--- a/ext/webgpu/binding.rs
+++ /dev/null
@@ -1,322 +0,0 @@
-// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
-
-use deno_core::error::AnyError;
-use deno_core::op;
-use deno_core::OpState;
-use deno_core::Resource;
-use deno_core::ResourceId;
-use serde::Deserialize;
-use std::borrow::Cow;
-
-use super::error::WebGpuResult;
-
-pub(crate) struct WebGpuBindGroupLayout(
- pub(crate) wgpu_core::id::BindGroupLayoutId,
-);
-impl Resource for WebGpuBindGroupLayout {
- fn name(&self) -> Cow<str> {
- "webGPUBindGroupLayout".into()
- }
-}
-
-pub(crate) struct WebGpuBindGroup(pub(crate) wgpu_core::id::BindGroupId);
-impl Resource for WebGpuBindGroup {
- fn name(&self) -> Cow<str> {
- "webGPUBindGroup".into()
- }
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-struct GpuBufferBindingLayout {
- r#type: GpuBufferBindingType,
- has_dynamic_offset: bool,
- min_binding_size: u64,
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "kebab-case")]
-enum GpuBufferBindingType {
- Uniform,
- Storage,
- ReadOnlyStorage,
-}
-
-impl From<GpuBufferBindingType> for wgpu_types::BufferBindingType {
- fn from(binding_type: GpuBufferBindingType) -> Self {
- match binding_type {
- GpuBufferBindingType::Uniform => wgpu_types::BufferBindingType::Uniform,
- GpuBufferBindingType::Storage => {
- wgpu_types::BufferBindingType::Storage { read_only: false }
- }
- GpuBufferBindingType::ReadOnlyStorage => {
- wgpu_types::BufferBindingType::Storage { read_only: true }
- }
- }
- }
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-struct GpuSamplerBindingLayout {
- r#type: wgpu_types::SamplerBindingType,
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-struct GpuTextureBindingLayout {
- sample_type: GpuTextureSampleType,
- view_dimension: wgpu_types::TextureViewDimension,
- multisampled: bool,
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "kebab-case")]
-enum GpuTextureSampleType {
- Float,
- UnfilterableFloat,
- Depth,
- Sint,
- Uint,
-}
-
-impl From<GpuTextureSampleType> for wgpu_types::TextureSampleType {
- fn from(sample_type: GpuTextureSampleType) -> Self {
- match sample_type {
- GpuTextureSampleType::Float => {
- wgpu_types::TextureSampleType::Float { filterable: true }
- }
- GpuTextureSampleType::UnfilterableFloat => {
- wgpu_types::TextureSampleType::Float { filterable: false }
- }
- GpuTextureSampleType::Depth => wgpu_types::TextureSampleType::Depth,
- GpuTextureSampleType::Sint => wgpu_types::TextureSampleType::Sint,
- GpuTextureSampleType::Uint => wgpu_types::TextureSampleType::Uint,
- }
- }
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-struct GpuStorageTextureBindingLayout {
- access: GpuStorageTextureAccess,
- format: wgpu_types::TextureFormat,
- view_dimension: wgpu_types::TextureViewDimension,
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "kebab-case")]
-enum GpuStorageTextureAccess {
- WriteOnly,
-}
-
-impl From<GpuStorageTextureAccess> for wgpu_types::StorageTextureAccess {
- fn from(access: GpuStorageTextureAccess) -> Self {
- match access {
- GpuStorageTextureAccess::WriteOnly => {
- wgpu_types::StorageTextureAccess::WriteOnly
- }
- }
- }
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-pub struct GpuBindGroupLayoutEntry {
- binding: u32,
- visibility: u32,
- #[serde(flatten)]
- binding_type: GpuBindingType,
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-enum GpuBindingType {
- Buffer(GpuBufferBindingLayout),
- Sampler(GpuSamplerBindingLayout),
- Texture(GpuTextureBindingLayout),
- StorageTexture(GpuStorageTextureBindingLayout),
-}
-
-impl From<GpuBindingType> for wgpu_types::BindingType {
- fn from(binding_type: GpuBindingType) -> wgpu_types::BindingType {
- match binding_type {
- GpuBindingType::Buffer(buffer) => wgpu_types::BindingType::Buffer {
- ty: buffer.r#type.into(),
- has_dynamic_offset: buffer.has_dynamic_offset,
- min_binding_size: std::num::NonZeroU64::new(buffer.min_binding_size),
- },
- GpuBindingType::Sampler(sampler) => {
- wgpu_types::BindingType::Sampler(sampler.r#type)
- }
- GpuBindingType::Texture(texture) => wgpu_types::BindingType::Texture {
- sample_type: texture.sample_type.into(),
- view_dimension: texture.view_dimension,
- multisampled: texture.multisampled,
- },
- GpuBindingType::StorageTexture(storage_texture) => {
- wgpu_types::BindingType::StorageTexture {
- access: storage_texture.access.into(),
- format: storage_texture.format,
- view_dimension: storage_texture.view_dimension,
- }
- }
- }
- }
-}
-
-#[op]
-pub fn op_webgpu_create_bind_group_layout(
- state: &mut OpState,
- device_rid: ResourceId,
- label: Option<String>,
- entries: Vec<GpuBindGroupLayoutEntry>,
-) -> Result<WebGpuResult, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let device_resource = state
- .resource_table
- .get::<super::WebGpuDevice>(device_rid)?;
- let device = device_resource.0;
-
- let entries = entries
- .into_iter()
- .map(|entry| {
- wgpu_types::BindGroupLayoutEntry {
- binding: entry.binding,
- visibility: wgpu_types::ShaderStages::from_bits(entry.visibility)
- .unwrap(),
- ty: entry.binding_type.into(),
- count: None, // native-only
- }
- })
- .collect::<Vec<_>>();
-
- let descriptor = wgpu_core::binding_model::BindGroupLayoutDescriptor {
- label: label.map(Cow::from),
- entries: Cow::from(entries),
- };
-
- gfx_put!(device => instance.device_create_bind_group_layout(
- device,
- &descriptor,
- ()
- ) => state, WebGpuBindGroupLayout)
-}
-
-#[op]
-pub fn op_webgpu_create_pipeline_layout(
- state: &mut OpState,
- device_rid: ResourceId,
- label: Option<String>,
- bind_group_layouts: Vec<u32>,
-) -> Result<WebGpuResult, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let device_resource = state
- .resource_table
- .get::<super::WebGpuDevice>(device_rid)?;
- let device = device_resource.0;
-
- let bind_group_layouts = bind_group_layouts
- .into_iter()
- .map(|rid| {
- let bind_group_layout =
- state.resource_table.get::<WebGpuBindGroupLayout>(rid)?;
- Ok(bind_group_layout.0)
- })
- .collect::<Result<Vec<_>, AnyError>>()?;
-
- let descriptor = wgpu_core::binding_model::PipelineLayoutDescriptor {
- label: label.map(Cow::from),
- bind_group_layouts: Cow::from(bind_group_layouts),
- push_constant_ranges: Default::default(),
- };
-
- gfx_put!(device => instance.device_create_pipeline_layout(
- device,
- &descriptor,
- ()
- ) => state, super::pipeline::WebGpuPipelineLayout)
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-pub struct GpuBindGroupEntry {
- binding: u32,
- kind: String,
- resource: ResourceId,
- offset: Option<u64>,
- size: Option<u64>,
-}
-
-#[op]
-pub fn op_webgpu_create_bind_group(
- state: &mut OpState,
- device_rid: ResourceId,
- label: Option<String>,
- layout: ResourceId,
- entries: Vec<GpuBindGroupEntry>,
-) -> Result<WebGpuResult, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let device_resource = state
- .resource_table
- .get::<super::WebGpuDevice>(device_rid)?;
- let device = device_resource.0;
-
- let entries = entries
- .into_iter()
- .map(|entry| {
- Ok(wgpu_core::binding_model::BindGroupEntry {
- binding: entry.binding,
- resource: match entry.kind.as_str() {
- "GPUSampler" => {
- let sampler_resource =
- state
- .resource_table
- .get::<super::sampler::WebGpuSampler>(entry.resource)?;
- wgpu_core::binding_model::BindingResource::Sampler(
- sampler_resource.0,
- )
- }
- "GPUTextureView" => {
- let texture_view_resource =
- state
- .resource_table
- .get::<super::texture::WebGpuTextureView>(entry.resource)?;
- wgpu_core::binding_model::BindingResource::TextureView(
- texture_view_resource.0,
- )
- }
- "GPUBufferBinding" => {
- let buffer_resource =
- state
- .resource_table
- .get::<super::buffer::WebGpuBuffer>(entry.resource)?;
- wgpu_core::binding_model::BindingResource::Buffer(
- wgpu_core::binding_model::BufferBinding {
- buffer_id: buffer_resource.0,
- offset: entry.offset.unwrap_or(0),
- size: std::num::NonZeroU64::new(entry.size.unwrap_or(0)),
- },
- )
- }
- _ => unreachable!(),
- },
- })
- })
- .collect::<Result<Vec<_>, AnyError>>()?;
-
- let bind_group_layout =
- state.resource_table.get::<WebGpuBindGroupLayout>(layout)?;
-
- let descriptor = wgpu_core::binding_model::BindGroupDescriptor {
- label: label.map(Cow::from),
- layout: bind_group_layout.0,
- entries: Cow::from(entries),
- };
-
- gfx_put!(device => instance.device_create_bind_group(
- device,
- &descriptor,
- ()
- ) => state, WebGpuBindGroup)
-}
diff --git a/ext/webgpu/buffer.rs b/ext/webgpu/buffer.rs
deleted file mode 100644
index 58348129e..000000000
--- a/ext/webgpu/buffer.rs
+++ /dev/null
@@ -1,197 +0,0 @@
-// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
-
-use deno_core::error::type_error;
-use deno_core::error::AnyError;
-use deno_core::futures::channel::oneshot;
-use deno_core::op;
-use deno_core::OpState;
-use deno_core::Resource;
-use deno_core::ResourceId;
-use deno_core::ZeroCopyBuf;
-use std::borrow::Cow;
-use std::cell::RefCell;
-use std::convert::TryFrom;
-use std::rc::Rc;
-use std::time::Duration;
-use wgpu_core::resource::BufferAccessResult;
-
-use super::error::DomExceptionOperationError;
-use super::error::WebGpuResult;
-
-pub(crate) struct WebGpuBuffer(pub(crate) wgpu_core::id::BufferId);
-impl Resource for WebGpuBuffer {
- fn name(&self) -> Cow<str> {
- "webGPUBuffer".into()
- }
-}
-
-struct WebGpuBufferMapped(*mut u8, usize);
-impl Resource for WebGpuBufferMapped {
- fn name(&self) -> Cow<str> {
- "webGPUBufferMapped".into()
- }
-}
-
-#[op]
-pub fn op_webgpu_create_buffer(
- state: &mut OpState,
- device_rid: ResourceId,
- label: Option<String>,
- size: u64,
- usage: u32,
- mapped_at_creation: bool,
-) -> Result<WebGpuResult, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let device_resource = state
- .resource_table
- .get::<super::WebGpuDevice>(device_rid)?;
- let device = device_resource.0;
-
- let descriptor = wgpu_core::resource::BufferDescriptor {
- label: label.map(Cow::from),
- size,
- usage: wgpu_types::BufferUsages::from_bits(usage)
- .ok_or_else(|| type_error("usage is not valid"))?,
- mapped_at_creation,
- };
-
- gfx_put!(device => instance.device_create_buffer(
- device,
- &descriptor,
- ()
- ) => state, WebGpuBuffer)
-}
-
-#[op]
-pub async fn op_webgpu_buffer_get_map_async(
- state: Rc<RefCell<OpState>>,
- buffer_rid: ResourceId,
- device_rid: ResourceId,
- mode: u32,
- offset: u64,
- size: u64,
-) -> Result<WebGpuResult, AnyError> {
- let (sender, receiver) = oneshot::channel::<BufferAccessResult>();
-
- let device;
- {
- let state_ = state.borrow();
- let instance = state_.borrow::<super::Instance>();
- let buffer_resource =
- state_.resource_table.get::<WebGpuBuffer>(buffer_rid)?;
- let buffer = buffer_resource.0;
- let device_resource = state_
- .resource_table
- .get::<super::WebGpuDevice>(device_rid)?;
- device = device_resource.0;
-
- let callback = Box::new(move |status| {
- sender.send(status).unwrap();
- });
-
- // TODO(lucacasonato): error handling
- let maybe_err = gfx_select!(buffer => instance.buffer_map_async(
- buffer,
- offset..(offset + size),
- wgpu_core::resource::BufferMapOperation {
- host: match mode {
- 1 => wgpu_core::device::HostMap::Read,
- 2 => wgpu_core::device::HostMap::Write,
- _ => unreachable!(),
- },
- callback: wgpu_core::resource::BufferMapCallback::from_rust(callback),
- }
- ))
- .err();
-
- if maybe_err.is_some() {
- return Ok(WebGpuResult::maybe_err(maybe_err));
- }
- }
-
- let done = Rc::new(RefCell::new(false));
- let done_ = done.clone();
- let device_poll_fut = async move {
- while !*done.borrow() {
- {
- let state = state.borrow();
- let instance = state.borrow::<super::Instance>();
- gfx_select!(device => instance.device_poll(device, wgpu_types::Maintain::Wait))
- .unwrap();
- }
- tokio::time::sleep(Duration::from_millis(10)).await;
- }
- Ok::<(), AnyError>(())
- };
-
- let receiver_fut = async move {
- receiver.await??;
- let mut done = done_.borrow_mut();
- *done = true;
- Ok::<(), AnyError>(())
- };
-
- tokio::try_join!(device_poll_fut, receiver_fut)?;
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_buffer_get_mapped_range(
- state: &mut OpState,
- buffer_rid: ResourceId,
- offset: u64,
- size: Option<u64>,
- mut buf: ZeroCopyBuf,
-) -> Result<WebGpuResult, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let buffer_resource = state.resource_table.get::<WebGpuBuffer>(buffer_rid)?;
- let buffer = buffer_resource.0;
-
- let (slice_pointer, range_size) =
- gfx_select!(buffer => instance.buffer_get_mapped_range(
- buffer,
- offset,
- size
- ))
- .map_err(|e| DomExceptionOperationError::new(&e.to_string()))?;
-
- // TODO(crowlKats):
- #[allow(clippy::undocumented_unsafe_blocks)]
- let slice = unsafe {
- std::slice::from_raw_parts_mut(slice_pointer, range_size as usize)
- };
- buf.copy_from_slice(slice);
-
- let rid = state
- .resource_table
- .add(WebGpuBufferMapped(slice_pointer, range_size as usize));
-
- Ok(WebGpuResult::rid(rid))
-}
-
-#[op]
-pub fn op_webgpu_buffer_unmap(
- state: &mut OpState,
- buffer_rid: ResourceId,
- mapped_rid: ResourceId,
- buf: Option<ZeroCopyBuf>,
-) -> Result<WebGpuResult, AnyError> {
- let mapped_resource = state
- .resource_table
- .take::<WebGpuBufferMapped>(mapped_rid)?;
- let instance = state.borrow::<super::Instance>();
- let buffer_resource = state.resource_table.get::<WebGpuBuffer>(buffer_rid)?;
- let buffer = buffer_resource.0;
-
- if let Some(buf) = buf {
- // TODO(crowlKats):
- #[allow(clippy::undocumented_unsafe_blocks)]
- let slice = unsafe {
- std::slice::from_raw_parts_mut(mapped_resource.0, mapped_resource.1)
- };
- slice.copy_from_slice(&buf);
- }
-
- gfx_ok!(buffer => instance.buffer_unmap(buffer))
-}
diff --git a/ext/webgpu/bundle.rs b/ext/webgpu/bundle.rs
deleted file mode 100644
index 65897d80b..000000000
--- a/ext/webgpu/bundle.rs
+++ /dev/null
@@ -1,395 +0,0 @@
-// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
-
-use deno_core::error::type_error;
-use deno_core::error::AnyError;
-use deno_core::op;
-use deno_core::OpState;
-use deno_core::Resource;
-use deno_core::ResourceId;
-use deno_core::ZeroCopyBuf;
-use serde::Deserialize;
-use std::borrow::Cow;
-use std::cell::RefCell;
-use std::rc::Rc;
-
-use super::error::WebGpuResult;
-
-struct WebGpuRenderBundleEncoder(
- RefCell<wgpu_core::command::RenderBundleEncoder>,
-);
-impl Resource for WebGpuRenderBundleEncoder {
- fn name(&self) -> Cow<str> {
- "webGPURenderBundleEncoder".into()
- }
-}
-
-pub(crate) struct WebGpuRenderBundle(pub(crate) wgpu_core::id::RenderBundleId);
-impl Resource for WebGpuRenderBundle {
- fn name(&self) -> Cow<str> {
- "webGPURenderBundle".into()
- }
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-pub struct CreateRenderBundleEncoderArgs {
- device_rid: ResourceId,
- label: Option<String>,
- color_formats: Vec<Option<wgpu_types::TextureFormat>>,
- depth_stencil_format: Option<wgpu_types::TextureFormat>,
- sample_count: u32,
- depth_read_only: bool,
- stencil_read_only: bool,
-}
-
-#[op]
-pub fn op_webgpu_create_render_bundle_encoder(
- state: &mut OpState,
- args: CreateRenderBundleEncoderArgs,
-) -> Result<WebGpuResult, AnyError> {
- let device_resource = state
- .resource_table
- .get::<super::WebGpuDevice>(args.device_rid)?;
- let device = device_resource.0;
-
- let depth_stencil = args.depth_stencil_format.map(|format| {
- wgpu_types::RenderBundleDepthStencil {
- format,
- depth_read_only: args.depth_read_only,
- stencil_read_only: args.stencil_read_only,
- }
- });
-
- let descriptor = wgpu_core::command::RenderBundleEncoderDescriptor {
- label: args.label.map(Cow::from),
- color_formats: Cow::from(args.color_formats),
- sample_count: args.sample_count,
- depth_stencil,
- multiview: None,
- };
-
- let res =
- wgpu_core::command::RenderBundleEncoder::new(&descriptor, device, None);
- let (render_bundle_encoder, maybe_err) = match res {
- Ok(encoder) => (encoder, None),
- Err(e) => (
- wgpu_core::command::RenderBundleEncoder::dummy(device),
- Some(e),
- ),
- };
-
- let rid = state
- .resource_table
- .add(WebGpuRenderBundleEncoder(RefCell::new(
- render_bundle_encoder,
- )));
-
- Ok(WebGpuResult::rid_err(rid, maybe_err))
-}
-
-#[op]
-pub fn op_webgpu_render_bundle_encoder_finish(
- state: &mut OpState,
- render_bundle_encoder_rid: ResourceId,
- label: Option<String>,
-) -> Result<WebGpuResult, AnyError> {
- let render_bundle_encoder_resource =
- state
- .resource_table
- .take::<WebGpuRenderBundleEncoder>(render_bundle_encoder_rid)?;
- let render_bundle_encoder = Rc::try_unwrap(render_bundle_encoder_resource)
- .ok()
- .expect("unwrapping render_bundle_encoder_resource should succeed")
- .0
- .into_inner();
- let instance = state.borrow::<super::Instance>();
-
- gfx_put!(render_bundle_encoder.parent() => instance.render_bundle_encoder_finish(
- render_bundle_encoder,
- &wgpu_core::command::RenderBundleDescriptor {
- label: label.map(Cow::from),
- },
- ()
- ) => state, WebGpuRenderBundle)
-}
-
-#[op]
-pub fn op_webgpu_render_bundle_encoder_set_bind_group(
- state: &mut OpState,
- render_bundle_encoder_rid: ResourceId,
- index: u32,
- bind_group: ResourceId,
- dynamic_offsets_data: ZeroCopyBuf,
- dynamic_offsets_data_start: usize,
- dynamic_offsets_data_length: usize,
-) -> Result<WebGpuResult, AnyError> {
- let bind_group_resource =
- state
- .resource_table
- .get::<super::binding::WebGpuBindGroup>(bind_group)?;
- let render_bundle_encoder_resource =
- state
- .resource_table
- .get::<WebGpuRenderBundleEncoder>(render_bundle_encoder_rid)?;
-
- // Align the data
- assert!(dynamic_offsets_data.len() % std::mem::size_of::<u32>() == 0);
- let (prefix, dynamic_offsets_data, suffix) =
- // SAFETY: A u8 to u32 cast is safe because we asserted that the length is a
- // multiple of 4.
- unsafe { dynamic_offsets_data.align_to::<u32>() };
- assert!(prefix.is_empty());
- assert!(suffix.is_empty());
-
- let start = dynamic_offsets_data_start;
- let len = dynamic_offsets_data_length;
-
- // Assert that length and start are both in bounds
- assert!(start <= dynamic_offsets_data.len());
- assert!(len <= dynamic_offsets_data.len() - start);
-
- let dynamic_offsets_data: &[u32] = &dynamic_offsets_data[start..start + len];
-
- // SAFETY: the raw pointer and length are of the same slice, and that slice
- // lives longer than the below function invocation.
- unsafe {
- wgpu_core::command::bundle_ffi::wgpu_render_bundle_set_bind_group(
- &mut render_bundle_encoder_resource.0.borrow_mut(),
- index,
- bind_group_resource.0,
- dynamic_offsets_data.as_ptr(),
- dynamic_offsets_data.len(),
- );
- }
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_render_bundle_encoder_push_debug_group(
- state: &mut OpState,
- render_bundle_encoder_rid: ResourceId,
- group_label: String,
-) -> Result<WebGpuResult, AnyError> {
- let render_bundle_encoder_resource =
- state
- .resource_table
- .get::<WebGpuRenderBundleEncoder>(render_bundle_encoder_rid)?;
-
- let label = std::ffi::CString::new(group_label).unwrap();
- // SAFETY: the string the raw pointer points to lives longer than the below
- // function invocation.
- unsafe {
- wgpu_core::command::bundle_ffi::wgpu_render_bundle_push_debug_group(
- &mut render_bundle_encoder_resource.0.borrow_mut(),
- label.as_ptr(),
- );
- }
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_render_bundle_encoder_pop_debug_group(
- state: &mut OpState,
- render_bundle_encoder_rid: ResourceId,
-) -> Result<WebGpuResult, AnyError> {
- let render_bundle_encoder_resource =
- state
- .resource_table
- .get::<WebGpuRenderBundleEncoder>(render_bundle_encoder_rid)?;
-
- wgpu_core::command::bundle_ffi::wgpu_render_bundle_pop_debug_group(
- &mut render_bundle_encoder_resource.0.borrow_mut(),
- );
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_render_bundle_encoder_insert_debug_marker(
- state: &mut OpState,
- render_bundle_encoder_rid: ResourceId,
- marker_label: String,
-) -> Result<WebGpuResult, AnyError> {
- let render_bundle_encoder_resource =
- state
- .resource_table
- .get::<WebGpuRenderBundleEncoder>(render_bundle_encoder_rid)?;
-
- let label = std::ffi::CString::new(marker_label).unwrap();
- // SAFETY: the string the raw pointer points to lives longer than the below
- // function invocation.
- unsafe {
- wgpu_core::command::bundle_ffi::wgpu_render_bundle_insert_debug_marker(
- &mut render_bundle_encoder_resource.0.borrow_mut(),
- label.as_ptr(),
- );
- }
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_render_bundle_encoder_set_pipeline(
- state: &mut OpState,
- render_bundle_encoder_rid: ResourceId,
- pipeline: ResourceId,
-) -> Result<WebGpuResult, AnyError> {
- let render_pipeline_resource =
- state
- .resource_table
- .get::<super::pipeline::WebGpuRenderPipeline>(pipeline)?;
- let render_bundle_encoder_resource =
- state
- .resource_table
- .get::<WebGpuRenderBundleEncoder>(render_bundle_encoder_rid)?;
-
- wgpu_core::command::bundle_ffi::wgpu_render_bundle_set_pipeline(
- &mut render_bundle_encoder_resource.0.borrow_mut(),
- render_pipeline_resource.0,
- );
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_render_bundle_encoder_set_index_buffer(
- state: &mut OpState,
- render_bundle_encoder_rid: ResourceId,
- buffer: ResourceId,
- index_format: wgpu_types::IndexFormat,
- offset: u64,
- size: u64,
-) -> Result<WebGpuResult, AnyError> {
- let buffer_resource = state
- .resource_table
- .get::<super::buffer::WebGpuBuffer>(buffer)?;
- let render_bundle_encoder_resource =
- state
- .resource_table
- .get::<WebGpuRenderBundleEncoder>(render_bundle_encoder_rid)?;
- let size = Some(
- std::num::NonZeroU64::new(size)
- .ok_or_else(|| type_error("size must be larger than 0"))?,
- );
-
- render_bundle_encoder_resource
- .0
- .borrow_mut()
- .set_index_buffer(buffer_resource.0, index_format, offset, size);
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_render_bundle_encoder_set_vertex_buffer(
- state: &mut OpState,
- render_bundle_encoder_rid: ResourceId,
- slot: u32,
- buffer: ResourceId,
- offset: u64,
- size: Option<u64>,
-) -> Result<WebGpuResult, AnyError> {
- let buffer_resource = state
- .resource_table
- .get::<super::buffer::WebGpuBuffer>(buffer)?;
- let render_bundle_encoder_resource =
- state
- .resource_table
- .get::<WebGpuRenderBundleEncoder>(render_bundle_encoder_rid)?;
- let size = if let Some(size) = size {
- Some(
- std::num::NonZeroU64::new(size)
- .ok_or_else(|| type_error("size must be larger than 0"))?,
- )
- } else {
- None
- };
-
- wgpu_core::command::bundle_ffi::wgpu_render_bundle_set_vertex_buffer(
- &mut render_bundle_encoder_resource.0.borrow_mut(),
- slot,
- buffer_resource.0,
- offset,
- size,
- );
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_render_bundle_encoder_draw(
- state: &mut OpState,
- render_bundle_encoder_rid: ResourceId,
- vertex_count: u32,
- instance_count: u32,
- first_vertex: u32,
- first_instance: u32,
-) -> Result<WebGpuResult, AnyError> {
- let render_bundle_encoder_resource =
- state
- .resource_table
- .get::<WebGpuRenderBundleEncoder>(render_bundle_encoder_rid)?;
-
- wgpu_core::command::bundle_ffi::wgpu_render_bundle_draw(
- &mut render_bundle_encoder_resource.0.borrow_mut(),
- vertex_count,
- instance_count,
- first_vertex,
- first_instance,
- );
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_render_bundle_encoder_draw_indexed(
- state: &mut OpState,
- render_bundle_encoder_rid: ResourceId,
- index_count: u32,
- instance_count: u32,
- first_index: u32,
- base_vertex: i32,
- first_instance: u32,
-) -> Result<WebGpuResult, AnyError> {
- let render_bundle_encoder_resource =
- state
- .resource_table
- .get::<WebGpuRenderBundleEncoder>(render_bundle_encoder_rid)?;
-
- wgpu_core::command::bundle_ffi::wgpu_render_bundle_draw_indexed(
- &mut render_bundle_encoder_resource.0.borrow_mut(),
- index_count,
- instance_count,
- first_index,
- base_vertex,
- first_instance,
- );
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_render_bundle_encoder_draw_indirect(
- state: &mut OpState,
- render_bundle_encoder_rid: ResourceId,
- indirect_buffer: ResourceId,
- indirect_offset: u64,
-) -> Result<WebGpuResult, AnyError> {
- let buffer_resource = state
- .resource_table
- .get::<super::buffer::WebGpuBuffer>(indirect_buffer)?;
- let render_bundle_encoder_resource =
- state
- .resource_table
- .get::<WebGpuRenderBundleEncoder>(render_bundle_encoder_rid)?;
-
- wgpu_core::command::bundle_ffi::wgpu_render_bundle_draw_indirect(
- &mut render_bundle_encoder_resource.0.borrow_mut(),
- buffer_resource.0,
- indirect_offset,
- );
-
- Ok(WebGpuResult::empty())
-}
diff --git a/ext/webgpu/command_encoder.rs b/ext/webgpu/command_encoder.rs
deleted file mode 100644
index eb534f6bc..000000000
--- a/ext/webgpu/command_encoder.rs
+++ /dev/null
@@ -1,540 +0,0 @@
-// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
-
-use deno_core::error::AnyError;
-use deno_core::op;
-use deno_core::OpState;
-use deno_core::Resource;
-use deno_core::ResourceId;
-use serde::Deserialize;
-use std::borrow::Cow;
-use std::cell::RefCell;
-use std::num::NonZeroU32;
-
-use super::error::WebGpuResult;
-
-pub(crate) struct WebGpuCommandEncoder(
- pub(crate) wgpu_core::id::CommandEncoderId,
-);
-impl Resource for WebGpuCommandEncoder {
- fn name(&self) -> Cow<str> {
- "webGPUCommandEncoder".into()
- }
-}
-
-pub(crate) struct WebGpuCommandBuffer(
- pub(crate) wgpu_core::id::CommandBufferId,
-);
-impl Resource for WebGpuCommandBuffer {
- fn name(&self) -> Cow<str> {
- "webGPUCommandBuffer".into()
- }
-}
-
-#[op]
-pub fn op_webgpu_create_command_encoder(
- state: &mut OpState,
- device_rid: ResourceId,
- label: Option<String>,
-) -> Result<WebGpuResult, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let device_resource = state
- .resource_table
- .get::<super::WebGpuDevice>(device_rid)?;
- let device = device_resource.0;
-
- let descriptor = wgpu_types::CommandEncoderDescriptor {
- label: label.map(Cow::from),
- };
-
- gfx_put!(device => instance.device_create_command_encoder(
- device,
- &descriptor,
- ()
- ) => state, WebGpuCommandEncoder)
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-pub struct GpuRenderPassColorAttachment {
- view: ResourceId,
- resolve_target: Option<ResourceId>,
- clear_value: Option<wgpu_types::Color>,
- load_op: wgpu_core::command::LoadOp,
- store_op: wgpu_core::command::StoreOp,
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-pub struct GpuRenderPassDepthStencilAttachment {
- view: ResourceId,
- depth_clear_value: f32,
- depth_load_op: Option<wgpu_core::command::LoadOp>,
- depth_store_op: Option<wgpu_core::command::StoreOp>,
- depth_read_only: bool,
- stencil_clear_value: u32,
- stencil_load_op: Option<wgpu_core::command::LoadOp>,
- stencil_store_op: Option<wgpu_core::command::StoreOp>,
- stencil_read_only: bool,
-}
-
-#[op]
-pub fn op_webgpu_command_encoder_begin_render_pass(
- state: &mut OpState,
- command_encoder_rid: ResourceId,
- label: Option<String>,
- color_attachments: Vec<Option<GpuRenderPassColorAttachment>>,
- depth_stencil_attachment: Option<GpuRenderPassDepthStencilAttachment>,
-) -> Result<WebGpuResult, AnyError> {
- let command_encoder_resource = state
- .resource_table
- .get::<WebGpuCommandEncoder>(command_encoder_rid)?;
-
- let color_attachments = color_attachments
- .into_iter()
- .map(|color_attachment| {
- let rp_at = if let Some(at) = color_attachment.as_ref() {
- let texture_view_resource =
- state
- .resource_table
- .get::<super::texture::WebGpuTextureView>(at.view)?;
-
- let resolve_target = at
- .resolve_target
- .map(|rid| {
- state
- .resource_table
- .get::<super::texture::WebGpuTextureView>(rid)
- })
- .transpose()?
- .map(|texture| texture.0);
-
- Some(wgpu_core::command::RenderPassColorAttachment {
- view: texture_view_resource.0,
- resolve_target,
- channel: wgpu_core::command::PassChannel {
- load_op: at.load_op,
- store_op: at.store_op,
- clear_value: at.clear_value.unwrap_or_default(),
- read_only: false,
- },
- })
- } else {
- None
- };
- Ok(rp_at)
- })
- .collect::<Result<Vec<_>, AnyError>>()?;
-
- let mut processed_depth_stencil_attachment = None;
-
- if let Some(attachment) = depth_stencil_attachment {
- let texture_view_resource =
- state
- .resource_table
- .get::<super::texture::WebGpuTextureView>(attachment.view)?;
-
- processed_depth_stencil_attachment =
- Some(wgpu_core::command::RenderPassDepthStencilAttachment {
- view: texture_view_resource.0,
- depth: wgpu_core::command::PassChannel {
- load_op: attachment
- .depth_load_op
- .unwrap_or(wgpu_core::command::LoadOp::Load),
- store_op: attachment
- .depth_store_op
- .unwrap_or(wgpu_core::command::StoreOp::Store),
- clear_value: attachment.depth_clear_value,
- read_only: attachment.depth_read_only,
- },
- stencil: wgpu_core::command::PassChannel {
- load_op: attachment
- .stencil_load_op
- .unwrap_or(wgpu_core::command::LoadOp::Load),
- store_op: attachment
- .stencil_store_op
- .unwrap_or(wgpu_core::command::StoreOp::Store),
- clear_value: attachment.stencil_clear_value,
- read_only: attachment.stencil_read_only,
- },
- });
- }
-
- let descriptor = wgpu_core::command::RenderPassDescriptor {
- label: label.map(Cow::from),
- color_attachments: Cow::from(color_attachments),
- depth_stencil_attachment: processed_depth_stencil_attachment.as_ref(),
- };
-
- let render_pass = wgpu_core::command::RenderPass::new(
- command_encoder_resource.0,
- &descriptor,
- );
-
- let rid = state
- .resource_table
- .add(super::render_pass::WebGpuRenderPass(RefCell::new(
- render_pass,
- )));
-
- Ok(WebGpuResult::rid(rid))
-}
-
-#[op]
-pub fn op_webgpu_command_encoder_begin_compute_pass(
- state: &mut OpState,
- command_encoder_rid: ResourceId,
- label: Option<String>,
-) -> Result<WebGpuResult, AnyError> {
- let command_encoder_resource = state
- .resource_table
- .get::<WebGpuCommandEncoder>(command_encoder_rid)?;
-
- let descriptor = wgpu_core::command::ComputePassDescriptor {
- label: label.map(Cow::from),
- };
-
- let compute_pass = wgpu_core::command::ComputePass::new(
- command_encoder_resource.0,
- &descriptor,
- );
-
- let rid = state
- .resource_table
- .add(super::compute_pass::WebGpuComputePass(RefCell::new(
- compute_pass,
- )));
-
- Ok(WebGpuResult::rid(rid))
-}
-
-#[op]
-pub fn op_webgpu_command_encoder_copy_buffer_to_buffer(
- state: &mut OpState,
- command_encoder_rid: ResourceId,
- source: ResourceId,
- source_offset: u64,
- destination: ResourceId,
- destination_offset: u64,
- size: u64,
-) -> Result<WebGpuResult, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let command_encoder_resource = state
- .resource_table
- .get::<WebGpuCommandEncoder>(command_encoder_rid)?;
- let command_encoder = command_encoder_resource.0;
- let source_buffer_resource = state
- .resource_table
- .get::<super::buffer::WebGpuBuffer>(source)?;
- let source_buffer = source_buffer_resource.0;
- let destination_buffer_resource =
- state
- .resource_table
- .get::<super::buffer::WebGpuBuffer>(destination)?;
- let destination_buffer = destination_buffer_resource.0;
-
- gfx_ok!(command_encoder => instance.command_encoder_copy_buffer_to_buffer(
- command_encoder,
- source_buffer,
- source_offset,
- destination_buffer,
- destination_offset,
- size
- ))
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-pub struct GpuImageCopyBuffer {
- buffer: ResourceId,
- offset: u64,
- bytes_per_row: Option<u32>,
- rows_per_image: Option<u32>,
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-pub struct GpuImageCopyTexture {
- pub texture: ResourceId,
- pub mip_level: u32,
- pub origin: wgpu_types::Origin3d,
- pub aspect: wgpu_types::TextureAspect,
-}
-
-#[op]
-pub fn op_webgpu_command_encoder_copy_buffer_to_texture(
- state: &mut OpState,
- command_encoder_rid: ResourceId,
- source: GpuImageCopyBuffer,
- destination: GpuImageCopyTexture,
- copy_size: wgpu_types::Extent3d,
-) -> Result<WebGpuResult, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let command_encoder_resource = state
- .resource_table
- .get::<WebGpuCommandEncoder>(command_encoder_rid)?;
- let command_encoder = command_encoder_resource.0;
- let source_buffer_resource =
- state
- .resource_table
- .get::<super::buffer::WebGpuBuffer>(source.buffer)?;
- let destination_texture_resource =
- state
- .resource_table
- .get::<super::texture::WebGpuTexture>(destination.texture)?;
-
- let source = wgpu_core::command::ImageCopyBuffer {
- buffer: source_buffer_resource.0,
- layout: wgpu_types::ImageDataLayout {
- offset: source.offset,
- bytes_per_row: NonZeroU32::new(source.bytes_per_row.unwrap_or(0)),
- rows_per_image: NonZeroU32::new(source.rows_per_image.unwrap_or(0)),
- },
- };
- let destination = wgpu_core::command::ImageCopyTexture {
- texture: destination_texture_resource.0,
- mip_level: destination.mip_level,
- origin: destination.origin,
- aspect: destination.aspect,
- };
- gfx_ok!(command_encoder => instance.command_encoder_copy_buffer_to_texture(
- command_encoder,
- &source,
- &destination,
- &copy_size
- ))
-}
-
-#[op]
-pub fn op_webgpu_command_encoder_copy_texture_to_buffer(
- state: &mut OpState,
- command_encoder_rid: ResourceId,
- source: GpuImageCopyTexture,
- destination: GpuImageCopyBuffer,
- copy_size: wgpu_types::Extent3d,
-) -> Result<WebGpuResult, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let command_encoder_resource = state
- .resource_table
- .get::<WebGpuCommandEncoder>(command_encoder_rid)?;
- let command_encoder = command_encoder_resource.0;
- let source_texture_resource =
- state
- .resource_table
- .get::<super::texture::WebGpuTexture>(source.texture)?;
- let destination_buffer_resource =
- state
- .resource_table
- .get::<super::buffer::WebGpuBuffer>(destination.buffer)?;
-
- let source = wgpu_core::command::ImageCopyTexture {
- texture: source_texture_resource.0,
- mip_level: source.mip_level,
- origin: source.origin,
- aspect: source.aspect,
- };
- let destination = wgpu_core::command::ImageCopyBuffer {
- buffer: destination_buffer_resource.0,
- layout: wgpu_types::ImageDataLayout {
- offset: destination.offset,
- bytes_per_row: NonZeroU32::new(destination.bytes_per_row.unwrap_or(0)),
- rows_per_image: NonZeroU32::new(destination.rows_per_image.unwrap_or(0)),
- },
- };
- gfx_ok!(command_encoder => instance.command_encoder_copy_texture_to_buffer(
- command_encoder,
- &source,
- &destination,
- &copy_size
- ))
-}
-
-#[op]
-pub fn op_webgpu_command_encoder_copy_texture_to_texture(
- state: &mut OpState,
- command_encoder_rid: ResourceId,
- source: GpuImageCopyTexture,
- destination: GpuImageCopyTexture,
- copy_size: wgpu_types::Extent3d,
-) -> Result<WebGpuResult, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let command_encoder_resource = state
- .resource_table
- .get::<WebGpuCommandEncoder>(command_encoder_rid)?;
- let command_encoder = command_encoder_resource.0;
- let source_texture_resource =
- state
- .resource_table
- .get::<super::texture::WebGpuTexture>(source.texture)?;
- let destination_texture_resource =
- state
- .resource_table
- .get::<super::texture::WebGpuTexture>(destination.texture)?;
-
- let source = wgpu_core::command::ImageCopyTexture {
- texture: source_texture_resource.0,
- mip_level: source.mip_level,
- origin: source.origin,
- aspect: source.aspect,
- };
- let destination = wgpu_core::command::ImageCopyTexture {
- texture: destination_texture_resource.0,
- mip_level: destination.mip_level,
- origin: destination.origin,
- aspect: destination.aspect,
- };
- gfx_ok!(command_encoder => instance.command_encoder_copy_texture_to_texture(
- command_encoder,
- &source,
- &destination,
- &copy_size
- ))
-}
-
-#[op]
-pub fn op_webgpu_command_encoder_clear_buffer(
- state: &mut OpState,
- command_encoder_rid: u32,
- buffer_rid: u32,
- offset: u64,
- size: u64,
-) -> Result<WebGpuResult, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let command_encoder_resource = state
- .resource_table
- .get::<WebGpuCommandEncoder>(command_encoder_rid)?;
- let command_encoder = command_encoder_resource.0;
- let destination_resource = state
- .resource_table
- .get::<super::buffer::WebGpuBuffer>(buffer_rid)?;
-
- gfx_ok!(command_encoder => instance.command_encoder_clear_buffer(
- command_encoder,
- destination_resource.0,
- offset,
- std::num::NonZeroU64::new(size)
- ))
-}
-
-#[op]
-pub fn op_webgpu_command_encoder_push_debug_group(
- state: &mut OpState,
- command_encoder_rid: ResourceId,
- group_label: String,
-) -> Result<WebGpuResult, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let command_encoder_resource = state
- .resource_table
- .get::<WebGpuCommandEncoder>(command_encoder_rid)?;
- let command_encoder = command_encoder_resource.0;
-
- gfx_ok!(command_encoder => instance.command_encoder_push_debug_group(command_encoder, &group_label))
-}
-
-#[op]
-pub fn op_webgpu_command_encoder_pop_debug_group(
- state: &mut OpState,
- command_encoder_rid: ResourceId,
-) -> Result<WebGpuResult, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let command_encoder_resource = state
- .resource_table
- .get::<WebGpuCommandEncoder>(command_encoder_rid)?;
- let command_encoder = command_encoder_resource.0;
-
- gfx_ok!(command_encoder => instance.command_encoder_pop_debug_group(command_encoder))
-}
-
-#[op]
-pub fn op_webgpu_command_encoder_insert_debug_marker(
- state: &mut OpState,
- command_encoder_rid: ResourceId,
- marker_label: String,
-) -> Result<WebGpuResult, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let command_encoder_resource = state
- .resource_table
- .get::<WebGpuCommandEncoder>(command_encoder_rid)?;
- let command_encoder = command_encoder_resource.0;
-
- gfx_ok!(command_encoder => instance.command_encoder_insert_debug_marker(
- command_encoder,
- &marker_label
- ))
-}
-
-#[op]
-pub fn op_webgpu_command_encoder_write_timestamp(
- state: &mut OpState,
- command_encoder_rid: ResourceId,
- query_set: ResourceId,
- query_index: u32,
-) -> Result<WebGpuResult, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let command_encoder_resource = state
- .resource_table
- .get::<WebGpuCommandEncoder>(command_encoder_rid)?;
- let command_encoder = command_encoder_resource.0;
- let query_set_resource = state
- .resource_table
- .get::<super::WebGpuQuerySet>(query_set)?;
-
- gfx_ok!(command_encoder => instance.command_encoder_write_timestamp(
- command_encoder,
- query_set_resource.0,
- query_index
- ))
-}
-
-#[op]
-pub fn op_webgpu_command_encoder_resolve_query_set(
- state: &mut OpState,
- command_encoder_rid: ResourceId,
- query_set: ResourceId,
- first_query: u32,
- query_count: u32,
- destination: ResourceId,
- destination_offset: u64,
-) -> Result<WebGpuResult, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let command_encoder_resource = state
- .resource_table
- .get::<WebGpuCommandEncoder>(command_encoder_rid)?;
- let command_encoder = command_encoder_resource.0;
- let query_set_resource = state
- .resource_table
- .get::<super::WebGpuQuerySet>(query_set)?;
- let destination_resource = state
- .resource_table
- .get::<super::buffer::WebGpuBuffer>(destination)?;
-
- gfx_ok!(command_encoder => instance.command_encoder_resolve_query_set(
- command_encoder,
- query_set_resource.0,
- first_query,
- query_count,
- destination_resource.0,
- destination_offset
- ))
-}
-
-#[op]
-pub fn op_webgpu_command_encoder_finish(
- state: &mut OpState,
- command_encoder_rid: ResourceId,
- label: Option<String>,
-) -> Result<WebGpuResult, AnyError> {
- let command_encoder_resource = state
- .resource_table
- .take::<WebGpuCommandEncoder>(command_encoder_rid)?;
- let command_encoder = command_encoder_resource.0;
- let instance = state.borrow::<super::Instance>();
-
- let descriptor = wgpu_types::CommandBufferDescriptor {
- label: label.map(Cow::from),
- };
-
- gfx_put!(command_encoder => instance.command_encoder_finish(
- command_encoder,
- &descriptor
- ) => state, WebGpuCommandBuffer)
-}
diff --git a/ext/webgpu/compute_pass.rs b/ext/webgpu/compute_pass.rs
deleted file mode 100644
index 8132b450c..000000000
--- a/ext/webgpu/compute_pass.rs
+++ /dev/null
@@ -1,289 +0,0 @@
-// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
-
-use deno_core::error::AnyError;
-use deno_core::op;
-use deno_core::OpState;
-use deno_core::Resource;
-use deno_core::ResourceId;
-use deno_core::ZeroCopyBuf;
-use std::borrow::Cow;
-use std::cell::RefCell;
-
-use super::error::WebGpuResult;
-
-pub(crate) struct WebGpuComputePass(
- pub(crate) RefCell<wgpu_core::command::ComputePass>,
-);
-impl Resource for WebGpuComputePass {
- fn name(&self) -> Cow<str> {
- "webGPUComputePass".into()
- }
-}
-
-#[op]
-pub fn op_webgpu_compute_pass_set_pipeline(
- state: &mut OpState,
- compute_pass_rid: ResourceId,
- pipeline: ResourceId,
-) -> Result<WebGpuResult, AnyError> {
- let compute_pipeline_resource =
- state
- .resource_table
- .get::<super::pipeline::WebGpuComputePipeline>(pipeline)?;
- let compute_pass_resource = state
- .resource_table
- .get::<WebGpuComputePass>(compute_pass_rid)?;
-
- wgpu_core::command::compute_ffi::wgpu_compute_pass_set_pipeline(
- &mut compute_pass_resource.0.borrow_mut(),
- compute_pipeline_resource.0,
- );
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_compute_pass_dispatch_workgroups(
- state: &mut OpState,
- compute_pass_rid: ResourceId,
- x: u32,
- y: u32,
- z: u32,
-) -> Result<WebGpuResult, AnyError> {
- let compute_pass_resource = state
- .resource_table
- .get::<WebGpuComputePass>(compute_pass_rid)?;
-
- wgpu_core::command::compute_ffi::wgpu_compute_pass_dispatch_workgroups(
- &mut compute_pass_resource.0.borrow_mut(),
- x,
- y,
- z,
- );
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_compute_pass_dispatch_workgroups_indirect(
- state: &mut OpState,
- compute_pass_rid: ResourceId,
- indirect_buffer: ResourceId,
- indirect_offset: u64,
-) -> Result<WebGpuResult, AnyError> {
- let buffer_resource = state
- .resource_table
- .get::<super::buffer::WebGpuBuffer>(indirect_buffer)?;
- let compute_pass_resource = state
- .resource_table
- .get::<WebGpuComputePass>(compute_pass_rid)?;
-
- wgpu_core::command::compute_ffi::wgpu_compute_pass_dispatch_workgroups_indirect(
- &mut compute_pass_resource.0.borrow_mut(),
- buffer_resource.0,
- indirect_offset,
- );
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_compute_pass_begin_pipeline_statistics_query(
- state: &mut OpState,
- compute_pass_rid: ResourceId,
- query_set: ResourceId,
- query_index: u32,
-) -> Result<WebGpuResult, AnyError> {
- let compute_pass_resource = state
- .resource_table
- .get::<WebGpuComputePass>(compute_pass_rid)?;
- let query_set_resource = state
- .resource_table
- .get::<super::WebGpuQuerySet>(query_set)?;
-
- wgpu_core::command::compute_ffi::wgpu_compute_pass_begin_pipeline_statistics_query(
- &mut compute_pass_resource.0.borrow_mut(),
- query_set_resource.0,
- query_index,
- );
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_compute_pass_end_pipeline_statistics_query(
- state: &mut OpState,
- compute_pass_rid: ResourceId,
-) -> Result<WebGpuResult, AnyError> {
- let compute_pass_resource = state
- .resource_table
- .get::<WebGpuComputePass>(compute_pass_rid)?;
-
- wgpu_core::command::compute_ffi::wgpu_compute_pass_end_pipeline_statistics_query(
- &mut compute_pass_resource.0.borrow_mut(),
- );
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_compute_pass_write_timestamp(
- state: &mut OpState,
- compute_pass_rid: ResourceId,
- query_set: ResourceId,
- query_index: u32,
-) -> Result<WebGpuResult, AnyError> {
- let compute_pass_resource = state
- .resource_table
- .get::<WebGpuComputePass>(compute_pass_rid)?;
- let query_set_resource = state
- .resource_table
- .get::<super::WebGpuQuerySet>(query_set)?;
-
- wgpu_core::command::compute_ffi::wgpu_compute_pass_write_timestamp(
- &mut compute_pass_resource.0.borrow_mut(),
- query_set_resource.0,
- query_index,
- );
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_compute_pass_end(
- state: &mut OpState,
- command_encoder_rid: ResourceId,
- compute_pass_rid: ResourceId,
-) -> Result<WebGpuResult, AnyError> {
- let command_encoder_resource = state
- .resource_table
- .get::<super::command_encoder::WebGpuCommandEncoder>(
- command_encoder_rid,
- )?;
- let command_encoder = command_encoder_resource.0;
- let compute_pass_resource = state
- .resource_table
- .take::<WebGpuComputePass>(compute_pass_rid)?;
- let compute_pass = &compute_pass_resource.0.borrow();
- let instance = state.borrow::<super::Instance>();
-
- gfx_ok!(command_encoder => instance.command_encoder_run_compute_pass(
- command_encoder,
- compute_pass
- ))
-}
-
-#[op]
-pub fn op_webgpu_compute_pass_set_bind_group(
- state: &mut OpState,
- compute_pass_rid: ResourceId,
- index: u32,
- bind_group: ResourceId,
- dynamic_offsets_data: ZeroCopyBuf,
- dynamic_offsets_data_start: usize,
- dynamic_offsets_data_length: usize,
-) -> Result<WebGpuResult, AnyError> {
- let bind_group_resource =
- state
- .resource_table
- .get::<super::binding::WebGpuBindGroup>(bind_group)?;
- let compute_pass_resource = state
- .resource_table
- .get::<WebGpuComputePass>(compute_pass_rid)?;
-
- // Align the data
- assert!(dynamic_offsets_data_start % std::mem::size_of::<u32>() == 0);
- let (prefix, dynamic_offsets_data, suffix) =
- // SAFETY: A u8 to u32 cast is safe because we asserted that the length is a
- // multiple of 4.
- unsafe { dynamic_offsets_data.align_to::<u32>() };
- assert!(prefix.is_empty());
- assert!(suffix.is_empty());
-
- let start = dynamic_offsets_data_start;
- let len = dynamic_offsets_data_length;
-
- // Assert that length and start are both in bounds
- assert!(start <= dynamic_offsets_data.len());
- assert!(len <= dynamic_offsets_data.len() - start);
-
- let dynamic_offsets_data: &[u32] = &dynamic_offsets_data[start..start + len];
-
- // SAFETY: the raw pointer and length are of the same slice, and that slice
- // lives longer than the below function invocation.
- unsafe {
- wgpu_core::command::compute_ffi::wgpu_compute_pass_set_bind_group(
- &mut compute_pass_resource.0.borrow_mut(),
- index,
- bind_group_resource.0,
- dynamic_offsets_data.as_ptr(),
- dynamic_offsets_data.len(),
- );
- }
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_compute_pass_push_debug_group(
- state: &mut OpState,
- compute_pass_rid: ResourceId,
- group_label: String,
-) -> Result<WebGpuResult, AnyError> {
- let compute_pass_resource = state
- .resource_table
- .get::<WebGpuComputePass>(compute_pass_rid)?;
-
- let label = std::ffi::CString::new(group_label).unwrap();
- // SAFETY: the string the raw pointer points to lives longer than the below
- // function invocation.
- unsafe {
- wgpu_core::command::compute_ffi::wgpu_compute_pass_push_debug_group(
- &mut compute_pass_resource.0.borrow_mut(),
- label.as_ptr(),
- 0, // wgpu#975
- );
- }
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_compute_pass_pop_debug_group(
- state: &mut OpState,
- compute_pass_rid: ResourceId,
-) -> Result<WebGpuResult, AnyError> {
- let compute_pass_resource = state
- .resource_table
- .get::<WebGpuComputePass>(compute_pass_rid)?;
-
- wgpu_core::command::compute_ffi::wgpu_compute_pass_pop_debug_group(
- &mut compute_pass_resource.0.borrow_mut(),
- );
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_compute_pass_insert_debug_marker(
- state: &mut OpState,
- compute_pass_rid: ResourceId,
- marker_label: String,
-) -> Result<WebGpuResult, AnyError> {
- let compute_pass_resource = state
- .resource_table
- .get::<WebGpuComputePass>(compute_pass_rid)?;
-
- let label = std::ffi::CString::new(marker_label).unwrap();
- // SAFETY: the string the raw pointer points to lives longer than the below
- // function invocation.
- unsafe {
- wgpu_core::command::compute_ffi::wgpu_compute_pass_insert_debug_marker(
- &mut compute_pass_resource.0.borrow_mut(),
- label.as_ptr(),
- 0, // wgpu#975
- );
- }
-
- Ok(WebGpuResult::empty())
-}
diff --git a/ext/webgpu/error.rs b/ext/webgpu/error.rs
deleted file mode 100644
index 41d7d6cf3..000000000
--- a/ext/webgpu/error.rs
+++ /dev/null
@@ -1,314 +0,0 @@
-// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
-use deno_core::error::AnyError;
-use deno_core::ResourceId;
-use serde::Serialize;
-use std::convert::From;
-use std::error::Error;
-use std::fmt;
-use wgpu_core::binding_model::CreateBindGroupError;
-use wgpu_core::binding_model::CreateBindGroupLayoutError;
-use wgpu_core::binding_model::CreatePipelineLayoutError;
-use wgpu_core::binding_model::GetBindGroupLayoutError;
-use wgpu_core::command::ClearError;
-use wgpu_core::command::CommandEncoderError;
-use wgpu_core::command::ComputePassError;
-use wgpu_core::command::CopyError;
-use wgpu_core::command::CreateRenderBundleError;
-use wgpu_core::command::QueryError;
-use wgpu_core::command::RenderBundleError;
-use wgpu_core::command::RenderPassError;
-use wgpu_core::device::queue::QueueSubmitError;
-use wgpu_core::device::queue::QueueWriteError;
-use wgpu_core::device::DeviceError;
-use wgpu_core::pipeline::CreateComputePipelineError;
-use wgpu_core::pipeline::CreateRenderPipelineError;
-use wgpu_core::pipeline::CreateShaderModuleError;
-#[cfg(feature = "surface")]
-use wgpu_core::present::ConfigureSurfaceError;
-use wgpu_core::resource::BufferAccessError;
-use wgpu_core::resource::CreateBufferError;
-use wgpu_core::resource::CreateQuerySetError;
-use wgpu_core::resource::CreateSamplerError;
-use wgpu_core::resource::CreateTextureError;
-use wgpu_core::resource::CreateTextureViewError;
-
-fn fmt_err(err: &(dyn Error + 'static)) -> String {
- let mut output = err.to_string();
-
- let mut e = err.source();
- while let Some(source) = e {
- output.push_str(&format!(": {source}"));
- e = source.source();
- }
-
- output
-}
-
-#[derive(Serialize)]
-pub struct WebGpuResult {
- pub rid: Option<ResourceId>,
- pub err: Option<WebGpuError>,
-}
-
-impl WebGpuResult {
- pub fn rid(rid: ResourceId) -> Self {
- Self {
- rid: Some(rid),
- err: None,
- }
- }
-
- pub fn rid_err<T: Into<WebGpuError>>(
- rid: ResourceId,
- err: Option<T>,
- ) -> Self {
- Self {
- rid: Some(rid),
- err: err.map(Into::into),
- }
- }
-
- pub fn maybe_err<T: Into<WebGpuError>>(err: Option<T>) -> Self {
- Self {
- rid: None,
- err: err.map(Into::into),
- }
- }
-
- pub fn empty() -> Self {
- Self {
- rid: None,
- err: None,
- }
- }
-}
-
-#[derive(Serialize)]
-#[serde(tag = "type", content = "value")]
-#[serde(rename_all = "kebab-case")]
-pub enum WebGpuError {
- Lost,
- OutOfMemory,
- Validation(String),
-}
-
-impl From<CreateBufferError> for WebGpuError {
- fn from(err: CreateBufferError) -> Self {
- match err {
- CreateBufferError::Device(err) => err.into(),
- CreateBufferError::AccessError(err) => err.into(),
- err => WebGpuError::Validation(fmt_err(&err)),
- }
- }
-}
-
-impl From<DeviceError> for WebGpuError {
- fn from(err: DeviceError) -> Self {
- match err {
- DeviceError::Lost => WebGpuError::Lost,
- DeviceError::OutOfMemory => WebGpuError::OutOfMemory,
- DeviceError::Invalid => WebGpuError::Validation(fmt_err(&err)),
- }
- }
-}
-
-impl From<BufferAccessError> for WebGpuError {
- fn from(err: BufferAccessError) -> Self {
- match err {
- BufferAccessError::Device(err) => err.into(),
- err => WebGpuError::Validation(fmt_err(&err)),
- }
- }
-}
-
-impl From<CreateBindGroupLayoutError> for WebGpuError {
- fn from(err: CreateBindGroupLayoutError) -> Self {
- match err {
- CreateBindGroupLayoutError::Device(err) => err.into(),
- err => WebGpuError::Validation(fmt_err(&err)),
- }
- }
-}
-
-impl From<CreatePipelineLayoutError> for WebGpuError {
- fn from(err: CreatePipelineLayoutError) -> Self {
- match err {
- CreatePipelineLayoutError::Device(err) => err.into(),
- err => WebGpuError::Validation(fmt_err(&err)),
- }
- }
-}
-
-impl From<CreateBindGroupError> for WebGpuError {
- fn from(err: CreateBindGroupError) -> Self {
- match err {
- CreateBindGroupError::Device(err) => err.into(),
- err => WebGpuError::Validation(fmt_err(&err)),
- }
- }
-}
-
-impl From<RenderBundleError> for WebGpuError {
- fn from(err: RenderBundleError) -> Self {
- WebGpuError::Validation(fmt_err(&err))
- }
-}
-
-impl From<CreateRenderBundleError> for WebGpuError {
- fn from(err: CreateRenderBundleError) -> Self {
- WebGpuError::Validation(fmt_err(&err))
- }
-}
-
-impl From<CopyError> for WebGpuError {
- fn from(err: CopyError) -> Self {
- WebGpuError::Validation(fmt_err(&err))
- }
-}
-
-impl From<CommandEncoderError> for WebGpuError {
- fn from(err: CommandEncoderError) -> Self {
- WebGpuError::Validation(fmt_err(&err))
- }
-}
-
-impl From<QueryError> for WebGpuError {
- fn from(err: QueryError) -> Self {
- WebGpuError::Validation(fmt_err(&err))
- }
-}
-
-impl From<ComputePassError> for WebGpuError {
- fn from(err: ComputePassError) -> Self {
- WebGpuError::Validation(fmt_err(&err))
- }
-}
-
-impl From<CreateComputePipelineError> for WebGpuError {
- fn from(err: CreateComputePipelineError) -> Self {
- match err {
- CreateComputePipelineError::Device(err) => err.into(),
- err => WebGpuError::Validation(fmt_err(&err)),
- }
- }
-}
-
-impl From<GetBindGroupLayoutError> for WebGpuError {
- fn from(err: GetBindGroupLayoutError) -> Self {
- WebGpuError::Validation(fmt_err(&err))
- }
-}
-
-impl From<CreateRenderPipelineError> for WebGpuError {
- fn from(err: CreateRenderPipelineError) -> Self {
- match err {
- CreateRenderPipelineError::Device(err) => err.into(),
- err => WebGpuError::Validation(fmt_err(&err)),
- }
- }
-}
-
-impl From<RenderPassError> for WebGpuError {
- fn from(err: RenderPassError) -> Self {
- WebGpuError::Validation(fmt_err(&err))
- }
-}
-
-impl From<CreateSamplerError> for WebGpuError {
- fn from(err: CreateSamplerError) -> Self {
- match err {
- CreateSamplerError::Device(err) => err.into(),
- err => WebGpuError::Validation(fmt_err(&err)),
- }
- }
-}
-
-impl From<CreateShaderModuleError> for WebGpuError {
- fn from(err: CreateShaderModuleError) -> Self {
- match err {
- CreateShaderModuleError::Device(err) => err.into(),
- err => WebGpuError::Validation(fmt_err(&err)),
- }
- }
-}
-
-impl From<CreateTextureError> for WebGpuError {
- fn from(err: CreateTextureError) -> Self {
- match err {
- CreateTextureError::Device(err) => err.into(),
- err => WebGpuError::Validation(fmt_err(&err)),
- }
- }
-}
-
-impl From<CreateTextureViewError> for WebGpuError {
- fn from(err: CreateTextureViewError) -> Self {
- WebGpuError::Validation(fmt_err(&err))
- }
-}
-
-impl From<CreateQuerySetError> for WebGpuError {
- fn from(err: CreateQuerySetError) -> Self {
- match err {
- CreateQuerySetError::Device(err) => err.into(),
- err => WebGpuError::Validation(fmt_err(&err)),
- }
- }
-}
-
-impl From<QueueSubmitError> for WebGpuError {
- fn from(err: QueueSubmitError) -> Self {
- match err {
- QueueSubmitError::Queue(err) => err.into(),
- err => WebGpuError::Validation(fmt_err(&err)),
- }
- }
-}
-
-impl From<QueueWriteError> for WebGpuError {
- fn from(err: QueueWriteError) -> Self {
- match err {
- QueueWriteError::Queue(err) => err.into(),
- err => WebGpuError::Validation(fmt_err(&err)),
- }
- }
-}
-
-impl From<ClearError> for WebGpuError {
- fn from(err: ClearError) -> Self {
- WebGpuError::Validation(fmt_err(&err))
- }
-}
-
-#[cfg(feature = "surface")]
-impl From<ConfigureSurfaceError> for WebGpuError {
- fn from(err: ConfigureSurfaceError) -> Self {
- WebGpuError::Validation(fmt_err(&err))
- }
-}
-
-#[derive(Debug)]
-pub struct DomExceptionOperationError {
- pub msg: String,
-}
-
-impl DomExceptionOperationError {
- pub fn new(msg: &str) -> Self {
- DomExceptionOperationError {
- msg: msg.to_string(),
- }
- }
-}
-
-impl fmt::Display for DomExceptionOperationError {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- f.pad(&self.msg)
- }
-}
-
-impl std::error::Error for DomExceptionOperationError {}
-
-pub fn get_error_class_name(e: &AnyError) -> Option<&'static str> {
- e.downcast_ref::<DomExceptionOperationError>()
- .map(|_| "DOMExceptionOperationError")
-}
diff --git a/ext/webgpu/lib.rs b/ext/webgpu/lib.rs
deleted file mode 100644
index 0cdcf6327..000000000
--- a/ext/webgpu/lib.rs
+++ /dev/null
@@ -1,674 +0,0 @@
-// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
-
-#![warn(unsafe_op_in_unsafe_fn)]
-
-use deno_core::error::AnyError;
-use deno_core::include_js_files;
-use deno_core::op;
-use deno_core::Extension;
-use deno_core::ExtensionBuilder;
-use deno_core::OpState;
-use deno_core::Resource;
-use deno_core::ResourceId;
-use serde::Deserialize;
-use serde::Serialize;
-use std::borrow::Cow;
-use std::cell::RefCell;
-use std::collections::HashSet;
-use std::convert::TryFrom;
-use std::rc::Rc;
-pub use wgpu_core;
-pub use wgpu_types;
-
-use error::DomExceptionOperationError;
-use error::WebGpuResult;
-
-#[macro_use]
-mod macros {
- macro_rules! gfx_select {
- ($id:expr => $global:ident.$method:ident( $($param:expr),* )) => {
- match $id.backend() {
- #[cfg(any(
- all(not(target_arch = "wasm32"), not(target_os = "ios"), not(target_os = "macos")),
- feature = "vulkan-portability"
- ))]
- wgpu_types::Backend::Vulkan => $global.$method::<wgpu_core::api::Vulkan>( $($param),* ),
- #[cfg(all(not(target_arch = "wasm32"), any(target_os = "ios", target_os = "macos")))]
- wgpu_types::Backend::Metal => $global.$method::<wgpu_core::api::Metal>( $($param),* ),
- #[cfg(all(not(target_arch = "wasm32"), windows))]
- wgpu_types::Backend::Dx12 => $global.$method::<wgpu_core::api::Dx12>( $($param),* ),
- #[cfg(all(not(target_arch = "wasm32"), windows))]
- wgpu_types::Backend::Dx11 => $global.$method::<wgpu_core::api::Dx11>( $($param),* ),
- #[cfg(any(
- all(unix, not(target_os = "macos"), not(target_os = "ios")),
- feature = "angle",
- target_arch = "wasm32"
- ))]
- wgpu_types::Backend::Gl => $global.$method::<wgpu_core::api::Gles>( $($param),+ ),
- other => panic!("Unexpected backend {:?}", other),
- }
- };
- }
-
- macro_rules! gfx_put {
- ($id:expr => $global:ident.$method:ident( $($param:expr),* ) => $state:expr, $rc:expr) => {{
- let (val, maybe_err) = gfx_select!($id => $global.$method($($param),*));
- let rid = $state.resource_table.add($rc(val));
- Ok(WebGpuResult::rid_err(rid, maybe_err))
- }};
- }
-
- macro_rules! gfx_ok {
- ($id:expr => $global:ident.$method:ident( $($param:expr),* )) => {{
- let maybe_err = gfx_select!($id => $global.$method($($param),*)).err();
- Ok(WebGpuResult::maybe_err(maybe_err))
- }};
- }
-}
-
-pub mod binding;
-pub mod buffer;
-pub mod bundle;
-pub mod command_encoder;
-pub mod compute_pass;
-pub mod error;
-pub mod pipeline;
-pub mod queue;
-pub mod render_pass;
-pub mod sampler;
-pub mod shader;
-#[cfg(feature = "surface")]
-pub mod surface;
-pub mod texture;
-
-pub struct Unstable(pub bool);
-
-fn check_unstable(state: &OpState, api_name: &str) {
- let unstable = state.borrow::<Unstable>();
- if !unstable.0 {
- eprintln!(
- "Unstable API '{api_name}'. The --unstable flag must be provided."
- );
- std::process::exit(70);
- }
-}
-
-pub type Instance =
- wgpu_core::hub::Global<wgpu_core::hub::IdentityManagerFactory>;
-
-struct WebGpuAdapter(wgpu_core::id::AdapterId);
-impl Resource for WebGpuAdapter {
- fn name(&self) -> Cow<str> {
- "webGPUAdapter".into()
- }
-}
-
-struct WebGpuDevice(wgpu_core::id::DeviceId);
-impl Resource for WebGpuDevice {
- fn name(&self) -> Cow<str> {
- "webGPUDevice".into()
- }
-}
-
-struct WebGpuQuerySet(wgpu_core::id::QuerySetId);
-impl Resource for WebGpuQuerySet {
- fn name(&self) -> Cow<str> {
- "webGPUQuerySet".into()
- }
-}
-
-fn ext() -> ExtensionBuilder {
- Extension::builder_with_deps(
- env!("CARGO_PKG_NAME"),
- &["deno_webidl", "deno_web"],
- )
-}
-
-fn ops(ext: &mut ExtensionBuilder, unstable: bool) -> &mut ExtensionBuilder {
- ext.ops(declare_webgpu_ops()).state(move |state| {
- // TODO: check & possibly streamline this
- // Unstable might be able to be OpMiddleware
- // let unstable_checker = state.borrow::<super::UnstableChecker>();
- // let unstable = unstable_checker.unstable;
- state.put(Unstable(unstable));
- })
-}
-
-pub fn init_ops_and_esm(unstable: bool) -> Extension {
- ops(&mut ext(), unstable)
- .esm(include_js_files!("01_webgpu.js", "02_idl_types.js",))
- .build()
-}
-
-pub fn init_ops(unstable: bool) -> Extension {
- ops(&mut ext(), unstable).build()
-}
-
-fn deserialize_features(features: &wgpu_types::Features) -> Vec<&'static str> {
- let mut return_features: Vec<&'static str> = vec![];
-
- if features.contains(wgpu_types::Features::DEPTH_CLIP_CONTROL) {
- return_features.push("depth-clip-control");
- }
- if features.contains(wgpu_types::Features::DEPTH32FLOAT_STENCIL8) {
- return_features.push("depth32float-stencil8");
- }
- if features.contains(wgpu_types::Features::PIPELINE_STATISTICS_QUERY) {
- return_features.push("pipeline-statistics-query");
- }
- if features.contains(wgpu_types::Features::TEXTURE_COMPRESSION_BC) {
- return_features.push("texture-compression-bc");
- }
- if features.contains(wgpu_types::Features::TEXTURE_COMPRESSION_ETC2) {
- return_features.push("texture-compression-etc2");
- }
- if features.contains(wgpu_types::Features::TEXTURE_COMPRESSION_ASTC_LDR) {
- return_features.push("texture-compression-astc");
- }
- if features.contains(wgpu_types::Features::TIMESTAMP_QUERY) {
- return_features.push("timestamp-query");
- }
- if features.contains(wgpu_types::Features::INDIRECT_FIRST_INSTANCE) {
- return_features.push("indirect-first-instance");
- }
- if features.contains(wgpu_types::Features::SHADER_FLOAT16) {
- return_features.push("shader-f16")
- }
-
- // extended from spec
- if features.contains(wgpu_types::Features::MAPPABLE_PRIMARY_BUFFERS) {
- return_features.push("mappable-primary-buffers");
- }
- if features.contains(wgpu_types::Features::TEXTURE_BINDING_ARRAY) {
- return_features.push("texture-binding-array");
- }
- if features.contains(wgpu_types::Features::BUFFER_BINDING_ARRAY) {
- return_features.push("buffer-binding-array");
- }
- if features.contains(wgpu_types::Features::STORAGE_RESOURCE_BINDING_ARRAY) {
- return_features.push("storage-resource-binding-array");
- }
- if features.contains(
- wgpu_types::Features::SAMPLED_TEXTURE_AND_STORAGE_BUFFER_ARRAY_NON_UNIFORM_INDEXING,
- ) {
- return_features.push("sampled-texture-and-storage-buffer-array-non-uniform-indexing");
- }
- if features.contains(
- wgpu_types::Features::UNIFORM_BUFFER_AND_STORAGE_TEXTURE_ARRAY_NON_UNIFORM_INDEXING,
- ) {
- return_features.push("uniform-buffer-and-storage-buffer-texture-non-uniform-indexing");
- }
- if features.contains(wgpu_types::Features::ADDRESS_MODE_CLAMP_TO_BORDER) {
- return_features.push("address-mode-clamp-to-border");
- }
- if features
- .contains(wgpu_types::Features::TEXTURE_ADAPTER_SPECIFIC_FORMAT_FEATURES)
- {
- return_features.push("texture-adapter-specific-format-features");
- }
- if features.contains(wgpu_types::Features::SHADER_FLOAT64) {
- return_features.push("shader-float64");
- }
- if features.contains(wgpu_types::Features::VERTEX_ATTRIBUTE_64BIT) {
- return_features.push("vertex-attribute-64bit");
- }
- if features.contains(wgpu_types::Features::VERTEX_WRITABLE_STORAGE) {
- return_features.push("vertex-writable-storage");
- }
- if features.contains(wgpu_types::Features::CLEAR_TEXTURE) {
- return_features.push("clear-texture");
- }
- if features.contains(wgpu_types::Features::SHADER_PRIMITIVE_INDEX) {
- return_features.push("shader-primitive-index");
- }
- if features.contains(wgpu_types::Features::PARTIALLY_BOUND_BINDING_ARRAY) {
- return_features.push("shader-primitive-index");
- }
-
- return_features
-}
-
-#[derive(Serialize)]
-#[serde(untagged)]
-pub enum GpuAdapterDeviceOrErr {
- Error { err: String },
- Features(GpuAdapterDevice),
-}
-
-#[derive(Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct GpuAdapterDevice {
- rid: ResourceId,
- limits: wgpu_types::Limits,
- features: Vec<&'static str>,
- is_software: bool,
-}
-
-#[op]
-pub async fn op_webgpu_request_adapter(
- state: Rc<RefCell<OpState>>,
- power_preference: Option<wgpu_types::PowerPreference>,
- force_fallback_adapter: bool,
-) -> Result<GpuAdapterDeviceOrErr, AnyError> {
- let mut state = state.borrow_mut();
- check_unstable(&state, "navigator.gpu.requestAdapter");
- let backends = std::env::var("DENO_WEBGPU_BACKEND")
- .map(|s| wgpu_core::instance::parse_backends_from_comma_list(&s))
- .unwrap_or_else(|_| wgpu_types::Backends::all());
- let instance = if let Some(instance) = state.try_borrow::<Instance>() {
- instance
- } else {
- state.put(wgpu_core::hub::Global::new(
- "webgpu",
- wgpu_core::hub::IdentityManagerFactory,
- wgpu_types::InstanceDescriptor {
- backends,
- dx12_shader_compiler: wgpu_types::Dx12Compiler::Fxc,
- },
- ));
- state.borrow::<Instance>()
- };
-
- let descriptor = wgpu_core::instance::RequestAdapterOptions {
- power_preference: power_preference.unwrap_or_default(),
- force_fallback_adapter,
- compatible_surface: None, // windowless
- };
- let res = instance.request_adapter(
- &descriptor,
- wgpu_core::instance::AdapterInputs::Mask(backends, |_| ()),
- );
-
- let adapter = match res {
- Ok(adapter) => adapter,
- Err(err) => {
- return Ok(GpuAdapterDeviceOrErr::Error {
- err: err.to_string(),
- })
- }
- };
- let adapter_features =
- gfx_select!(adapter => instance.adapter_features(adapter))?;
- let features = deserialize_features(&adapter_features);
- let adapter_limits =
- gfx_select!(adapter => instance.adapter_limits(adapter))?;
-
- let rid = state.resource_table.add(WebGpuAdapter(adapter));
-
- Ok(GpuAdapterDeviceOrErr::Features(GpuAdapterDevice {
- rid,
- features,
- limits: adapter_limits,
- is_software: false,
- }))
-}
-
-#[derive(Deserialize)]
-pub struct GpuRequiredFeatures(HashSet<String>);
-
-impl From<GpuRequiredFeatures> for wgpu_types::Features {
- fn from(required_features: GpuRequiredFeatures) -> wgpu_types::Features {
- let mut features: wgpu_types::Features = wgpu_types::Features::empty();
- features.set(
- wgpu_types::Features::DEPTH_CLIP_CONTROL,
- required_features.0.contains("depth-clip-control"),
- );
- features.set(
- wgpu_types::Features::DEPTH32FLOAT_STENCIL8,
- required_features.0.contains("depth32float-stencil8"),
- );
- features.set(
- wgpu_types::Features::PIPELINE_STATISTICS_QUERY,
- required_features.0.contains("pipeline-statistics-query"),
- );
- features.set(
- wgpu_types::Features::TEXTURE_COMPRESSION_BC,
- required_features.0.contains("texture-compression-bc"),
- );
- features.set(
- wgpu_types::Features::TEXTURE_COMPRESSION_ETC2,
- required_features.0.contains("texture-compression-etc2"),
- );
- features.set(
- wgpu_types::Features::TEXTURE_COMPRESSION_ASTC_LDR,
- required_features.0.contains("texture-compression-astc"),
- );
- features.set(
- wgpu_types::Features::TIMESTAMP_QUERY,
- required_features.0.contains("timestamp-query"),
- );
- features.set(
- wgpu_types::Features::INDIRECT_FIRST_INSTANCE,
- required_features.0.contains("indirect-first-instance"),
- );
- features.set(
- wgpu_types::Features::SHADER_FLOAT16,
- required_features.0.contains("shader-f16"),
- );
-
- // extended from spec
- features.set(
- wgpu_types::Features::MAPPABLE_PRIMARY_BUFFERS,
- required_features.0.contains("mappable-primary-buffers"),
- );
- features.set(
- wgpu_types::Features::TEXTURE_BINDING_ARRAY,
- required_features.0.contains("texture-binding-array"),
- );
- features.set(
- wgpu_types::Features::BUFFER_BINDING_ARRAY,
- required_features.0.contains("buffer-binding-array"),
- );
- features.set(
- wgpu_types::Features::STORAGE_RESOURCE_BINDING_ARRAY,
- required_features
- .0
- .contains("storage-resource-binding-array"),
- );
- features.set(
- wgpu_types::Features::SAMPLED_TEXTURE_AND_STORAGE_BUFFER_ARRAY_NON_UNIFORM_INDEXING,
- required_features
- .0
- .contains("sampled-texture-and-storage-buffer-array-non-uniform-indexing"),
- );
- features.set(
- wgpu_types::Features::UNIFORM_BUFFER_AND_STORAGE_TEXTURE_ARRAY_NON_UNIFORM_INDEXING,
- required_features
- .0
- .contains("uniform-buffer-and-storage-buffer-texture-non-uniform-indexing"),
- );
- features.set(
- wgpu_types::Features::ADDRESS_MODE_CLAMP_TO_BORDER,
- required_features.0.contains("address-mode-clamp-to-border"),
- );
- features.set(
- wgpu_types::Features::TEXTURE_ADAPTER_SPECIFIC_FORMAT_FEATURES,
- required_features
- .0
- .contains("texture-adapter-specific-format-features"),
- );
- features.set(
- wgpu_types::Features::SHADER_FLOAT64,
- required_features.0.contains("shader-float64"),
- );
- features.set(
- wgpu_types::Features::VERTEX_ATTRIBUTE_64BIT,
- required_features.0.contains("vertex-attribute-64bit"),
- );
- features.set(
- wgpu_types::Features::VERTEX_WRITABLE_STORAGE,
- required_features.0.contains("vertex-writable-storage"),
- );
- features.set(
- wgpu_types::Features::CLEAR_TEXTURE,
- required_features.0.contains("clear-commands"),
- );
- features.set(
- wgpu_types::Features::SHADER_PRIMITIVE_INDEX,
- required_features.0.contains("shader-primitive-index"),
- );
- features.set(
- wgpu_types::Features::PARTIALLY_BOUND_BINDING_ARRAY,
- required_features
- .0
- .contains("partially-bound-binding-array"),
- );
-
- features
- }
-}
-
-#[op]
-pub async fn op_webgpu_request_device(
- state: Rc<RefCell<OpState>>,
- adapter_rid: ResourceId,
- label: Option<String>,
- required_features: GpuRequiredFeatures,
- required_limits: Option<wgpu_types::Limits>,
-) -> Result<GpuAdapterDevice, AnyError> {
- let mut state = state.borrow_mut();
- let adapter_resource =
- state.resource_table.get::<WebGpuAdapter>(adapter_rid)?;
- let adapter = adapter_resource.0;
- let instance = state.borrow::<Instance>();
-
- let descriptor = wgpu_types::DeviceDescriptor {
- label: label.map(Cow::from),
- features: required_features.into(),
- limits: required_limits.unwrap_or_default(),
- };
-
- let (device, maybe_err) = gfx_select!(adapter => instance.adapter_request_device(
- adapter,
- &descriptor,
- std::env::var("DENO_WEBGPU_TRACE").ok().as_ref().map(std::path::Path::new),
- ()
- ));
- if let Some(err) = maybe_err {
- return Err(DomExceptionOperationError::new(&err.to_string()).into());
- }
-
- let device_features =
- gfx_select!(device => instance.device_features(device))?;
- let features = deserialize_features(&device_features);
- let limits = gfx_select!(device => instance.device_limits(device))?;
-
- let rid = state.resource_table.add(WebGpuDevice(device));
-
- Ok(GpuAdapterDevice {
- rid,
- features,
- limits,
- // TODO(lucacasonato): report correctly from wgpu
- is_software: false,
- })
-}
-
-#[derive(Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct GPUAdapterInfo {
- vendor: String,
- architecture: String,
- device: String,
- description: String,
-}
-
-#[op]
-pub async fn op_webgpu_request_adapter_info(
- state: Rc<RefCell<OpState>>,
- adapter_rid: ResourceId,
-) -> Result<GPUAdapterInfo, AnyError> {
- let state = state.borrow_mut();
- let adapter_resource =
- state.resource_table.get::<WebGpuAdapter>(adapter_rid)?;
- let adapter = adapter_resource.0;
- let instance = state.borrow::<Instance>();
-
- let info = gfx_select!(adapter => instance.adapter_get_info(adapter))?;
-
- Ok(GPUAdapterInfo {
- vendor: info.vendor.to_string(),
- architecture: String::new(), // TODO(#2170)
- device: info.device.to_string(),
- description: info.name,
- })
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-pub struct CreateQuerySetArgs {
- device_rid: ResourceId,
- label: Option<String>,
- #[serde(flatten)]
- r#type: GpuQueryType,
- count: u32,
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "kebab-case", tag = "type")]
-enum GpuQueryType {
- Occlusion,
- #[serde(rename_all = "camelCase")]
- PipelineStatistics {
- pipeline_statistics: HashSet<String>,
- },
- Timestamp,
-}
-
-impl From<GpuQueryType> for wgpu_types::QueryType {
- fn from(query_type: GpuQueryType) -> Self {
- match query_type {
- GpuQueryType::Occlusion => wgpu_types::QueryType::Occlusion,
- GpuQueryType::PipelineStatistics {
- pipeline_statistics,
- } => {
- use wgpu_types::PipelineStatisticsTypes;
-
- let mut types = PipelineStatisticsTypes::empty();
-
- if pipeline_statistics.contains("vertex-shader-invocations") {
- types.set(PipelineStatisticsTypes::VERTEX_SHADER_INVOCATIONS, true);
- }
- if pipeline_statistics.contains("clipper-invocations") {
- types.set(PipelineStatisticsTypes::CLIPPER_INVOCATIONS, true);
- }
- if pipeline_statistics.contains("clipper-primitives-out") {
- types.set(PipelineStatisticsTypes::CLIPPER_PRIMITIVES_OUT, true);
- }
- if pipeline_statistics.contains("fragment-shader-invocations") {
- types.set(PipelineStatisticsTypes::FRAGMENT_SHADER_INVOCATIONS, true);
- }
- if pipeline_statistics.contains("compute-shader-invocations") {
- types.set(PipelineStatisticsTypes::COMPUTE_SHADER_INVOCATIONS, true);
- }
-
- wgpu_types::QueryType::PipelineStatistics(types)
- }
- GpuQueryType::Timestamp => wgpu_types::QueryType::Timestamp,
- }
- }
-}
-
-#[op]
-pub fn op_webgpu_create_query_set(
- state: &mut OpState,
- args: CreateQuerySetArgs,
-) -> Result<WebGpuResult, AnyError> {
- let device_resource =
- state.resource_table.get::<WebGpuDevice>(args.device_rid)?;
- let device = device_resource.0;
- let instance = &state.borrow::<Instance>();
-
- let descriptor = wgpu_types::QuerySetDescriptor {
- label: args.label.map(Cow::from),
- ty: args.r#type.into(),
- count: args.count,
- };
-
- gfx_put!(device => instance.device_create_query_set(
- device,
- &descriptor,
- ()
- ) => state, WebGpuQuerySet)
-}
-
-fn declare_webgpu_ops() -> Vec<deno_core::OpDecl> {
- vec![
- // Request device/adapter
- op_webgpu_request_adapter::decl(),
- op_webgpu_request_device::decl(),
- op_webgpu_request_adapter_info::decl(),
- // Query Set
- op_webgpu_create_query_set::decl(),
- // buffer
- buffer::op_webgpu_create_buffer::decl(),
- buffer::op_webgpu_buffer_get_mapped_range::decl(),
- buffer::op_webgpu_buffer_unmap::decl(),
- // buffer async
- buffer::op_webgpu_buffer_get_map_async::decl(),
- // remaining sync ops
-
- // texture
- texture::op_webgpu_create_texture::decl(),
- texture::op_webgpu_create_texture_view::decl(),
- // sampler
- sampler::op_webgpu_create_sampler::decl(),
- // binding
- binding::op_webgpu_create_bind_group_layout::decl(),
- binding::op_webgpu_create_pipeline_layout::decl(),
- binding::op_webgpu_create_bind_group::decl(),
- // pipeline
- pipeline::op_webgpu_create_compute_pipeline::decl(),
- pipeline::op_webgpu_compute_pipeline_get_bind_group_layout::decl(),
- pipeline::op_webgpu_create_render_pipeline::decl(),
- pipeline::op_webgpu_render_pipeline_get_bind_group_layout::decl(),
- // command_encoder
- command_encoder::op_webgpu_create_command_encoder::decl(),
- command_encoder::op_webgpu_command_encoder_begin_render_pass::decl(),
- command_encoder::op_webgpu_command_encoder_begin_compute_pass::decl(),
- command_encoder::op_webgpu_command_encoder_copy_buffer_to_buffer::decl(),
- command_encoder::op_webgpu_command_encoder_copy_buffer_to_texture::decl(),
- command_encoder::op_webgpu_command_encoder_copy_texture_to_buffer::decl(),
- command_encoder::op_webgpu_command_encoder_copy_texture_to_texture::decl(),
- command_encoder::op_webgpu_command_encoder_clear_buffer::decl(),
- command_encoder::op_webgpu_command_encoder_push_debug_group::decl(),
- command_encoder::op_webgpu_command_encoder_pop_debug_group::decl(),
- command_encoder::op_webgpu_command_encoder_insert_debug_marker::decl(),
- command_encoder::op_webgpu_command_encoder_write_timestamp::decl(),
- command_encoder::op_webgpu_command_encoder_resolve_query_set::decl(),
- command_encoder::op_webgpu_command_encoder_finish::decl(),
- // render_pass
- render_pass::op_webgpu_render_pass_set_viewport::decl(),
- render_pass::op_webgpu_render_pass_set_scissor_rect::decl(),
- render_pass::op_webgpu_render_pass_set_blend_constant::decl(),
- render_pass::op_webgpu_render_pass_set_stencil_reference::decl(),
- render_pass::op_webgpu_render_pass_begin_pipeline_statistics_query::decl(),
- render_pass::op_webgpu_render_pass_end_pipeline_statistics_query::decl(),
- render_pass::op_webgpu_render_pass_write_timestamp::decl(),
- render_pass::op_webgpu_render_pass_execute_bundles::decl(),
- render_pass::op_webgpu_render_pass_end::decl(),
- render_pass::op_webgpu_render_pass_set_bind_group::decl(),
- render_pass::op_webgpu_render_pass_push_debug_group::decl(),
- render_pass::op_webgpu_render_pass_pop_debug_group::decl(),
- render_pass::op_webgpu_render_pass_insert_debug_marker::decl(),
- render_pass::op_webgpu_render_pass_set_pipeline::decl(),
- render_pass::op_webgpu_render_pass_set_index_buffer::decl(),
- render_pass::op_webgpu_render_pass_set_vertex_buffer::decl(),
- render_pass::op_webgpu_render_pass_draw::decl(),
- render_pass::op_webgpu_render_pass_draw_indexed::decl(),
- render_pass::op_webgpu_render_pass_draw_indirect::decl(),
- render_pass::op_webgpu_render_pass_draw_indexed_indirect::decl(),
- // compute_pass
- compute_pass::op_webgpu_compute_pass_set_pipeline::decl(),
- compute_pass::op_webgpu_compute_pass_dispatch_workgroups::decl(),
- compute_pass::op_webgpu_compute_pass_dispatch_workgroups_indirect::decl(),
- compute_pass::op_webgpu_compute_pass_begin_pipeline_statistics_query::decl(
- ),
- compute_pass::op_webgpu_compute_pass_end_pipeline_statistics_query::decl(),
- compute_pass::op_webgpu_compute_pass_write_timestamp::decl(),
- compute_pass::op_webgpu_compute_pass_end::decl(),
- compute_pass::op_webgpu_compute_pass_set_bind_group::decl(),
- compute_pass::op_webgpu_compute_pass_push_debug_group::decl(),
- compute_pass::op_webgpu_compute_pass_pop_debug_group::decl(),
- compute_pass::op_webgpu_compute_pass_insert_debug_marker::decl(),
- // bundle
- bundle::op_webgpu_create_render_bundle_encoder::decl(),
- bundle::op_webgpu_render_bundle_encoder_finish::decl(),
- bundle::op_webgpu_render_bundle_encoder_set_bind_group::decl(),
- bundle::op_webgpu_render_bundle_encoder_push_debug_group::decl(),
- bundle::op_webgpu_render_bundle_encoder_pop_debug_group::decl(),
- bundle::op_webgpu_render_bundle_encoder_insert_debug_marker::decl(),
- bundle::op_webgpu_render_bundle_encoder_set_pipeline::decl(),
- bundle::op_webgpu_render_bundle_encoder_set_index_buffer::decl(),
- bundle::op_webgpu_render_bundle_encoder_set_vertex_buffer::decl(),
- bundle::op_webgpu_render_bundle_encoder_draw::decl(),
- bundle::op_webgpu_render_bundle_encoder_draw_indexed::decl(),
- bundle::op_webgpu_render_bundle_encoder_draw_indirect::decl(),
- // queue
- queue::op_webgpu_queue_submit::decl(),
- queue::op_webgpu_write_buffer::decl(),
- queue::op_webgpu_write_texture::decl(),
- // shader
- shader::op_webgpu_create_shader_module::decl(),
- ]
-}
diff --git a/ext/webgpu/pipeline.rs b/ext/webgpu/pipeline.rs
deleted file mode 100644
index 2e728d8d9..000000000
--- a/ext/webgpu/pipeline.rs
+++ /dev/null
@@ -1,424 +0,0 @@
-// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
-
-use deno_core::error::AnyError;
-use deno_core::op;
-use deno_core::OpState;
-use deno_core::Resource;
-use deno_core::ResourceId;
-use serde::Deserialize;
-use serde::Serialize;
-use std::borrow::Cow;
-
-use super::error::WebGpuError;
-use super::error::WebGpuResult;
-
-const MAX_BIND_GROUPS: usize = 8;
-
-pub(crate) struct WebGpuPipelineLayout(
- pub(crate) wgpu_core::id::PipelineLayoutId,
-);
-impl Resource for WebGpuPipelineLayout {
- fn name(&self) -> Cow<str> {
- "webGPUPipelineLayout".into()
- }
-}
-
-pub(crate) struct WebGpuComputePipeline(
- pub(crate) wgpu_core::id::ComputePipelineId,
-);
-impl Resource for WebGpuComputePipeline {
- fn name(&self) -> Cow<str> {
- "webGPUComputePipeline".into()
- }
-}
-
-pub(crate) struct WebGpuRenderPipeline(
- pub(crate) wgpu_core::id::RenderPipelineId,
-);
-impl Resource for WebGpuRenderPipeline {
- fn name(&self) -> Cow<str> {
- "webGPURenderPipeline".into()
- }
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-pub enum GPUAutoLayoutMode {
- Auto,
-}
-
-#[derive(Deserialize)]
-#[serde(untagged)]
-pub enum GPUPipelineLayoutOrGPUAutoLayoutMode {
- Layout(ResourceId),
- Auto(GPUAutoLayoutMode),
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-pub struct GpuProgrammableStage {
- module: ResourceId,
- entry_point: String,
- // constants: HashMap<String, GPUPipelineConstantValue>
-}
-
-#[op]
-pub fn op_webgpu_create_compute_pipeline(
- state: &mut OpState,
- device_rid: ResourceId,
- label: Option<String>,
- layout: GPUPipelineLayoutOrGPUAutoLayoutMode,
- compute: GpuProgrammableStage,
-) -> Result<WebGpuResult, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let device_resource = state
- .resource_table
- .get::<super::WebGpuDevice>(device_rid)?;
- let device = device_resource.0;
-
- let pipeline_layout = match layout {
- GPUPipelineLayoutOrGPUAutoLayoutMode::Layout(rid) => {
- let id = state.resource_table.get::<WebGpuPipelineLayout>(rid)?;
- Some(id.0)
- }
- GPUPipelineLayoutOrGPUAutoLayoutMode::Auto(GPUAutoLayoutMode::Auto) => None,
- };
-
- let compute_shader_module_resource =
- state
- .resource_table
- .get::<super::shader::WebGpuShaderModule>(compute.module)?;
-
- let descriptor = wgpu_core::pipeline::ComputePipelineDescriptor {
- label: label.map(Cow::from),
- layout: pipeline_layout,
- stage: wgpu_core::pipeline::ProgrammableStageDescriptor {
- module: compute_shader_module_resource.0,
- entry_point: Cow::from(compute.entry_point),
- // TODO(lucacasonato): support args.compute.constants
- },
- };
- let implicit_pipelines = match layout {
- GPUPipelineLayoutOrGPUAutoLayoutMode::Layout(_) => None,
- GPUPipelineLayoutOrGPUAutoLayoutMode::Auto(GPUAutoLayoutMode::Auto) => {
- Some(wgpu_core::device::ImplicitPipelineIds {
- root_id: (),
- group_ids: &[(); MAX_BIND_GROUPS],
- })
- }
- };
-
- let (compute_pipeline, maybe_err) = gfx_select!(device => instance.device_create_compute_pipeline(
- device,
- &descriptor,
- (),
- implicit_pipelines
- ));
-
- let rid = state
- .resource_table
- .add(WebGpuComputePipeline(compute_pipeline));
-
- Ok(WebGpuResult::rid_err(rid, maybe_err))
-}
-
-#[derive(Serialize)]
-#[serde(rename_all = "camelCase")]
-pub struct PipelineLayout {
- rid: ResourceId,
- label: String,
- err: Option<WebGpuError>,
-}
-
-#[op]
-pub fn op_webgpu_compute_pipeline_get_bind_group_layout(
- state: &mut OpState,
- compute_pipeline_rid: ResourceId,
- index: u32,
-) -> Result<PipelineLayout, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let compute_pipeline_resource = state
- .resource_table
- .get::<WebGpuComputePipeline>(compute_pipeline_rid)?;
- let compute_pipeline = compute_pipeline_resource.0;
-
- let (bind_group_layout, maybe_err) = gfx_select!(compute_pipeline => instance.compute_pipeline_get_bind_group_layout(compute_pipeline, index, ()));
-
- let label = gfx_select!(bind_group_layout => instance.bind_group_layout_label(bind_group_layout));
-
- let rid = state
- .resource_table
- .add(super::binding::WebGpuBindGroupLayout(bind_group_layout));
-
- Ok(PipelineLayout {
- rid,
- label,
- err: maybe_err.map(WebGpuError::from),
- })
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "kebab-case")]
-pub enum GpuCullMode {
- None,
- Front,
- Back,
-}
-
-impl From<GpuCullMode> for Option<wgpu_types::Face> {
- fn from(value: GpuCullMode) -> Option<wgpu_types::Face> {
- match value {
- GpuCullMode::None => None,
- GpuCullMode::Front => Some(wgpu_types::Face::Front),
- GpuCullMode::Back => Some(wgpu_types::Face::Back),
- }
- }
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-struct GpuPrimitiveState {
- topology: wgpu_types::PrimitiveTopology,
- strip_index_format: Option<wgpu_types::IndexFormat>,
- front_face: wgpu_types::FrontFace,
- cull_mode: GpuCullMode,
- unclipped_depth: bool,
-}
-
-impl From<GpuPrimitiveState> for wgpu_types::PrimitiveState {
- fn from(value: GpuPrimitiveState) -> wgpu_types::PrimitiveState {
- wgpu_types::PrimitiveState {
- topology: value.topology,
- strip_index_format: value.strip_index_format,
- front_face: value.front_face,
- cull_mode: value.cull_mode.into(),
- unclipped_depth: value.unclipped_depth,
- polygon_mode: Default::default(), // native-only
- conservative: false, // native-only
- }
- }
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-struct GpuDepthStencilState {
- format: wgpu_types::TextureFormat,
- depth_write_enabled: bool,
- depth_compare: wgpu_types::CompareFunction,
- stencil_front: wgpu_types::StencilFaceState,
- stencil_back: wgpu_types::StencilFaceState,
- stencil_read_mask: u32,
- stencil_write_mask: u32,
- depth_bias: i32,
- depth_bias_slope_scale: f32,
- depth_bias_clamp: f32,
-}
-
-impl From<GpuDepthStencilState> for wgpu_types::DepthStencilState {
- fn from(state: GpuDepthStencilState) -> wgpu_types::DepthStencilState {
- wgpu_types::DepthStencilState {
- format: state.format,
- depth_write_enabled: state.depth_write_enabled,
- depth_compare: state.depth_compare,
- stencil: wgpu_types::StencilState {
- front: state.stencil_front,
- back: state.stencil_back,
- read_mask: state.stencil_read_mask,
- write_mask: state.stencil_write_mask,
- },
- bias: wgpu_types::DepthBiasState {
- constant: state.depth_bias,
- slope_scale: state.depth_bias_slope_scale,
- clamp: state.depth_bias_clamp,
- },
- }
- }
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-struct GpuVertexBufferLayout {
- array_stride: u64,
- step_mode: wgpu_types::VertexStepMode,
- attributes: Vec<wgpu_types::VertexAttribute>,
-}
-
-impl<'a> From<GpuVertexBufferLayout>
- for wgpu_core::pipeline::VertexBufferLayout<'a>
-{
- fn from(
- layout: GpuVertexBufferLayout,
- ) -> wgpu_core::pipeline::VertexBufferLayout<'a> {
- wgpu_core::pipeline::VertexBufferLayout {
- array_stride: layout.array_stride,
- step_mode: layout.step_mode,
- attributes: Cow::Owned(layout.attributes),
- }
- }
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-struct GpuVertexState {
- module: ResourceId,
- entry_point: String,
- buffers: Vec<Option<GpuVertexBufferLayout>>,
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-struct GpuMultisampleState {
- count: u32,
- mask: u64,
- alpha_to_coverage_enabled: bool,
-}
-
-impl From<GpuMultisampleState> for wgpu_types::MultisampleState {
- fn from(gms: GpuMultisampleState) -> wgpu_types::MultisampleState {
- wgpu_types::MultisampleState {
- count: gms.count,
- mask: gms.mask,
- alpha_to_coverage_enabled: gms.alpha_to_coverage_enabled,
- }
- }
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-struct GpuFragmentState {
- targets: Vec<Option<wgpu_types::ColorTargetState>>,
- module: u32,
- entry_point: String,
- // TODO(lucacasonato): constants
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-pub struct CreateRenderPipelineArgs {
- device_rid: ResourceId,
- label: Option<String>,
- layout: GPUPipelineLayoutOrGPUAutoLayoutMode,
- vertex: GpuVertexState,
- primitive: GpuPrimitiveState,
- depth_stencil: Option<GpuDepthStencilState>,
- multisample: wgpu_types::MultisampleState,
- fragment: Option<GpuFragmentState>,
-}
-
-#[op]
-pub fn op_webgpu_create_render_pipeline(
- state: &mut OpState,
- args: CreateRenderPipelineArgs,
-) -> Result<WebGpuResult, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let device_resource = state
- .resource_table
- .get::<super::WebGpuDevice>(args.device_rid)?;
- let device = device_resource.0;
-
- let layout = match args.layout {
- GPUPipelineLayoutOrGPUAutoLayoutMode::Layout(rid) => {
- let pipeline_layout_resource =
- state.resource_table.get::<WebGpuPipelineLayout>(rid)?;
- Some(pipeline_layout_resource.0)
- }
- GPUPipelineLayoutOrGPUAutoLayoutMode::Auto(GPUAutoLayoutMode::Auto) => None,
- };
-
- let vertex_shader_module_resource =
- state
- .resource_table
- .get::<super::shader::WebGpuShaderModule>(args.vertex.module)?;
-
- let fragment = if let Some(fragment) = args.fragment {
- let fragment_shader_module_resource =
- state
- .resource_table
- .get::<super::shader::WebGpuShaderModule>(fragment.module)?;
-
- Some(wgpu_core::pipeline::FragmentState {
- stage: wgpu_core::pipeline::ProgrammableStageDescriptor {
- module: fragment_shader_module_resource.0,
- entry_point: Cow::from(fragment.entry_point),
- },
- targets: Cow::from(fragment.targets),
- })
- } else {
- None
- };
-
- let vertex_buffers = args
- .vertex
- .buffers
- .into_iter()
- .flatten()
- .map(Into::into)
- .collect();
-
- let descriptor = wgpu_core::pipeline::RenderPipelineDescriptor {
- label: args.label.map(Cow::Owned),
- layout,
- vertex: wgpu_core::pipeline::VertexState {
- stage: wgpu_core::pipeline::ProgrammableStageDescriptor {
- module: vertex_shader_module_resource.0,
- entry_point: Cow::Owned(args.vertex.entry_point),
- },
- buffers: Cow::Owned(vertex_buffers),
- },
- primitive: args.primitive.into(),
- depth_stencil: args.depth_stencil.map(Into::into),
- multisample: args.multisample,
- fragment,
- multiview: None,
- };
-
- let implicit_pipelines = match args.layout {
- GPUPipelineLayoutOrGPUAutoLayoutMode::Layout(_) => None,
- GPUPipelineLayoutOrGPUAutoLayoutMode::Auto(GPUAutoLayoutMode::Auto) => {
- Some(wgpu_core::device::ImplicitPipelineIds {
- root_id: (),
- group_ids: &[(); MAX_BIND_GROUPS],
- })
- }
- };
-
- let (render_pipeline, maybe_err) = gfx_select!(device => instance.device_create_render_pipeline(
- device,
- &descriptor,
- (),
- implicit_pipelines
- ));
-
- let rid = state
- .resource_table
- .add(WebGpuRenderPipeline(render_pipeline));
-
- Ok(WebGpuResult::rid_err(rid, maybe_err))
-}
-
-#[op]
-pub fn op_webgpu_render_pipeline_get_bind_group_layout(
- state: &mut OpState,
- render_pipeline_rid: ResourceId,
- index: u32,
-) -> Result<PipelineLayout, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let render_pipeline_resource = state
- .resource_table
- .get::<WebGpuRenderPipeline>(render_pipeline_rid)?;
- let render_pipeline = render_pipeline_resource.0;
-
- let (bind_group_layout, maybe_err) = gfx_select!(render_pipeline => instance.render_pipeline_get_bind_group_layout(render_pipeline, index, ()));
-
- let label = gfx_select!(bind_group_layout => instance.bind_group_layout_label(bind_group_layout));
-
- let rid = state
- .resource_table
- .add(super::binding::WebGpuBindGroupLayout(bind_group_layout));
-
- Ok(PipelineLayout {
- rid,
- label,
- err: maybe_err.map(WebGpuError::from),
- })
-}
diff --git a/ext/webgpu/queue.rs b/ext/webgpu/queue.rs
deleted file mode 100644
index dd78899e3..000000000
--- a/ext/webgpu/queue.rs
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
-
-use std::num::NonZeroU32;
-
-use deno_core::error::AnyError;
-use deno_core::op;
-use deno_core::OpState;
-use deno_core::ResourceId;
-use deno_core::ZeroCopyBuf;
-use serde::Deserialize;
-
-use super::error::WebGpuResult;
-
-type WebGpuQueue = super::WebGpuDevice;
-
-#[op]
-pub fn op_webgpu_queue_submit(
- state: &mut OpState,
- queue_rid: ResourceId,
- command_buffers: Vec<ResourceId>,
-) -> Result<WebGpuResult, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let queue_resource = state.resource_table.get::<WebGpuQueue>(queue_rid)?;
- let queue = queue_resource.0;
-
- let ids = command_buffers
- .iter()
- .map(|rid| {
- let buffer_resource =
- state
- .resource_table
- .get::<super::command_encoder::WebGpuCommandBuffer>(*rid)?;
- Ok(buffer_resource.0)
- })
- .collect::<Result<Vec<_>, AnyError>>()?;
-
- let maybe_err =
- gfx_select!(queue => instance.queue_submit(queue, &ids)).err();
-
- for rid in command_buffers {
- state.resource_table.close(rid)?;
- }
-
- Ok(WebGpuResult::maybe_err(maybe_err))
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-pub struct GpuImageDataLayout {
- offset: u64,
- bytes_per_row: Option<u32>,
- rows_per_image: Option<u32>,
-}
-
-impl From<GpuImageDataLayout> for wgpu_types::ImageDataLayout {
- fn from(layout: GpuImageDataLayout) -> Self {
- wgpu_types::ImageDataLayout {
- offset: layout.offset,
- bytes_per_row: NonZeroU32::new(layout.bytes_per_row.unwrap_or(0)),
- rows_per_image: NonZeroU32::new(layout.rows_per_image.unwrap_or(0)),
- }
- }
-}
-
-#[op]
-pub fn op_webgpu_write_buffer(
- state: &mut OpState,
- queue_rid: ResourceId,
- buffer: ResourceId,
- buffer_offset: u64,
- data_offset: usize,
- size: Option<usize>,
- buf: ZeroCopyBuf,
-) -> Result<WebGpuResult, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let buffer_resource = state
- .resource_table
- .get::<super::buffer::WebGpuBuffer>(buffer)?;
- let buffer = buffer_resource.0;
- let queue_resource = state.resource_table.get::<WebGpuQueue>(queue_rid)?;
- let queue = queue_resource.0;
-
- let data = match size {
- Some(size) => &buf[data_offset..(data_offset + size)],
- None => &buf[data_offset..],
- };
- let maybe_err = gfx_select!(queue => instance.queue_write_buffer(
- queue,
- buffer,
- buffer_offset,
- data
- ))
- .err();
-
- Ok(WebGpuResult::maybe_err(maybe_err))
-}
-
-#[op]
-pub fn op_webgpu_write_texture(
- state: &mut OpState,
- queue_rid: ResourceId,
- destination: super::command_encoder::GpuImageCopyTexture,
- data_layout: GpuImageDataLayout,
- size: wgpu_types::Extent3d,
- buf: ZeroCopyBuf,
-) -> Result<WebGpuResult, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let texture_resource = state
- .resource_table
- .get::<super::texture::WebGpuTexture>(destination.texture)?;
- let queue_resource = state.resource_table.get::<WebGpuQueue>(queue_rid)?;
- let queue = queue_resource.0;
-
- let destination = wgpu_core::command::ImageCopyTexture {
- texture: texture_resource.0,
- mip_level: destination.mip_level,
- origin: destination.origin,
- aspect: destination.aspect,
- };
- let data_layout = data_layout.into();
-
- gfx_ok!(queue => instance.queue_write_texture(
- queue,
- &destination,
- &*buf,
- &data_layout,
- &size
- ))
-}
diff --git a/ext/webgpu/render_pass.rs b/ext/webgpu/render_pass.rs
deleted file mode 100644
index ee38091bc..000000000
--- a/ext/webgpu/render_pass.rs
+++ /dev/null
@@ -1,538 +0,0 @@
-// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
-
-use deno_core::error::type_error;
-use deno_core::error::AnyError;
-use deno_core::op;
-use deno_core::OpState;
-use deno_core::Resource;
-use deno_core::ResourceId;
-use deno_core::ZeroCopyBuf;
-use serde::Deserialize;
-use std::borrow::Cow;
-use std::cell::RefCell;
-
-use super::error::WebGpuResult;
-
-pub(crate) struct WebGpuRenderPass(
- pub(crate) RefCell<wgpu_core::command::RenderPass>,
-);
-impl Resource for WebGpuRenderPass {
- fn name(&self) -> Cow<str> {
- "webGPURenderPass".into()
- }
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-pub struct RenderPassSetViewportArgs {
- render_pass_rid: ResourceId,
- x: f32,
- y: f32,
- width: f32,
- height: f32,
- min_depth: f32,
- max_depth: f32,
-}
-
-#[op]
-pub fn op_webgpu_render_pass_set_viewport(
- state: &mut OpState,
- args: RenderPassSetViewportArgs,
-) -> Result<WebGpuResult, AnyError> {
- let render_pass_resource = state
- .resource_table
- .get::<WebGpuRenderPass>(args.render_pass_rid)?;
-
- wgpu_core::command::render_ffi::wgpu_render_pass_set_viewport(
- &mut render_pass_resource.0.borrow_mut(),
- args.x,
- args.y,
- args.width,
- args.height,
- args.min_depth,
- args.max_depth,
- );
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_render_pass_set_scissor_rect(
- state: &mut OpState,
- render_pass_rid: ResourceId,
- x: u32,
- y: u32,
- width: u32,
- height: u32,
-) -> Result<WebGpuResult, AnyError> {
- let render_pass_resource = state
- .resource_table
- .get::<WebGpuRenderPass>(render_pass_rid)?;
-
- wgpu_core::command::render_ffi::wgpu_render_pass_set_scissor_rect(
- &mut render_pass_resource.0.borrow_mut(),
- x,
- y,
- width,
- height,
- );
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_render_pass_set_blend_constant(
- state: &mut OpState,
- render_pass_rid: ResourceId,
- color: wgpu_types::Color,
-) -> Result<WebGpuResult, AnyError> {
- let render_pass_resource = state
- .resource_table
- .get::<WebGpuRenderPass>(render_pass_rid)?;
-
- wgpu_core::command::render_ffi::wgpu_render_pass_set_blend_constant(
- &mut render_pass_resource.0.borrow_mut(),
- &color,
- );
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_render_pass_set_stencil_reference(
- state: &mut OpState,
- render_pass_rid: ResourceId,
- reference: u32,
-) -> Result<WebGpuResult, AnyError> {
- let render_pass_resource = state
- .resource_table
- .get::<WebGpuRenderPass>(render_pass_rid)?;
-
- wgpu_core::command::render_ffi::wgpu_render_pass_set_stencil_reference(
- &mut render_pass_resource.0.borrow_mut(),
- reference,
- );
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_render_pass_begin_pipeline_statistics_query(
- state: &mut OpState,
- render_pass_rid: ResourceId,
- query_set: u32,
- query_index: u32,
-) -> Result<WebGpuResult, AnyError> {
- let render_pass_resource = state
- .resource_table
- .get::<WebGpuRenderPass>(render_pass_rid)?;
- let query_set_resource = state
- .resource_table
- .get::<super::WebGpuQuerySet>(query_set)?;
-
- wgpu_core::command::render_ffi::wgpu_render_pass_begin_pipeline_statistics_query(
- &mut render_pass_resource.0.borrow_mut(),
- query_set_resource.0,
- query_index,
- );
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_render_pass_end_pipeline_statistics_query(
- state: &mut OpState,
- render_pass_rid: ResourceId,
-) -> Result<WebGpuResult, AnyError> {
- let render_pass_resource = state
- .resource_table
- .get::<WebGpuRenderPass>(render_pass_rid)?;
-
- wgpu_core::command::render_ffi::wgpu_render_pass_end_pipeline_statistics_query(
- &mut render_pass_resource.0.borrow_mut(),
- );
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_render_pass_write_timestamp(
- state: &mut OpState,
- render_pass_rid: ResourceId,
- query_set: u32,
- query_index: u32,
-) -> Result<WebGpuResult, AnyError> {
- let render_pass_resource = state
- .resource_table
- .get::<WebGpuRenderPass>(render_pass_rid)?;
- let query_set_resource = state
- .resource_table
- .get::<super::WebGpuQuerySet>(query_set)?;
-
- wgpu_core::command::render_ffi::wgpu_render_pass_write_timestamp(
- &mut render_pass_resource.0.borrow_mut(),
- query_set_resource.0,
- query_index,
- );
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_render_pass_execute_bundles(
- state: &mut OpState,
- render_pass_rid: ResourceId,
- bundles: Vec<u32>,
-) -> Result<WebGpuResult, AnyError> {
- let bundles = bundles
- .iter()
- .map(|rid| {
- let render_bundle_resource =
- state
- .resource_table
- .get::<super::bundle::WebGpuRenderBundle>(*rid)?;
- Ok(render_bundle_resource.0)
- })
- .collect::<Result<Vec<_>, AnyError>>()?;
-
- let render_pass_resource = state
- .resource_table
- .get::<WebGpuRenderPass>(render_pass_rid)?;
-
- // SAFETY: the raw pointer and length are of the same slice, and that slice
- // lives longer than the below function invocation.
- unsafe {
- wgpu_core::command::render_ffi::wgpu_render_pass_execute_bundles(
- &mut render_pass_resource.0.borrow_mut(),
- bundles.as_ptr(),
- bundles.len(),
- );
- }
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_render_pass_end(
- state: &mut OpState,
- command_encoder_rid: ResourceId,
- render_pass_rid: ResourceId,
-) -> Result<WebGpuResult, AnyError> {
- let command_encoder_resource = state
- .resource_table
- .get::<super::command_encoder::WebGpuCommandEncoder>(
- command_encoder_rid,
- )?;
- let command_encoder = command_encoder_resource.0;
- let render_pass_resource = state
- .resource_table
- .take::<WebGpuRenderPass>(render_pass_rid)?;
- let render_pass = &render_pass_resource.0.borrow();
- let instance = state.borrow::<super::Instance>();
-
- gfx_ok!(command_encoder => instance.command_encoder_run_render_pass(command_encoder, render_pass))
-}
-
-#[op]
-pub fn op_webgpu_render_pass_set_bind_group(
- state: &mut OpState,
- render_pass_rid: ResourceId,
- index: u32,
- bind_group: u32,
- dynamic_offsets_data: ZeroCopyBuf,
- dynamic_offsets_data_start: usize,
- dynamic_offsets_data_length: usize,
-) -> Result<WebGpuResult, AnyError> {
- let bind_group_resource =
- state
- .resource_table
- .get::<super::binding::WebGpuBindGroup>(bind_group)?;
- let render_pass_resource = state
- .resource_table
- .get::<WebGpuRenderPass>(render_pass_rid)?;
-
- // Align the data
- assert_eq!(dynamic_offsets_data_start % std::mem::size_of::<u32>(), 0);
- let (prefix, dynamic_offsets_data, suffix) =
- // SAFETY: A u8 to u32 cast is safe because we asserted that the length is a
- // multiple of 4.
- unsafe { dynamic_offsets_data.align_to::<u32>() };
- assert!(prefix.is_empty());
- assert!(suffix.is_empty());
-
- let start = dynamic_offsets_data_start;
- let len = dynamic_offsets_data_length;
-
- // Assert that length and start are both in bounds
- assert!(start <= dynamic_offsets_data.len());
- assert!(len <= dynamic_offsets_data.len() - start);
-
- let dynamic_offsets_data: &[u32] = &dynamic_offsets_data[start..start + len];
-
- // SAFETY: the raw pointer and length are of the same slice, and that slice
- // lives longer than the below function invocation.
- unsafe {
- wgpu_core::command::render_ffi::wgpu_render_pass_set_bind_group(
- &mut render_pass_resource.0.borrow_mut(),
- index,
- bind_group_resource.0,
- dynamic_offsets_data.as_ptr(),
- dynamic_offsets_data.len(),
- );
- }
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_render_pass_push_debug_group(
- state: &mut OpState,
- render_pass_rid: ResourceId,
- group_label: String,
-) -> Result<WebGpuResult, AnyError> {
- let render_pass_resource = state
- .resource_table
- .get::<WebGpuRenderPass>(render_pass_rid)?;
-
- let label = std::ffi::CString::new(group_label).unwrap();
- // SAFETY: the string the raw pointer points to lives longer than the below
- // function invocation.
- unsafe {
- wgpu_core::command::render_ffi::wgpu_render_pass_push_debug_group(
- &mut render_pass_resource.0.borrow_mut(),
- label.as_ptr(),
- 0, // wgpu#975
- );
- }
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_render_pass_pop_debug_group(
- state: &mut OpState,
- render_pass_rid: ResourceId,
-) -> Result<WebGpuResult, AnyError> {
- let render_pass_resource = state
- .resource_table
- .get::<WebGpuRenderPass>(render_pass_rid)?;
-
- wgpu_core::command::render_ffi::wgpu_render_pass_pop_debug_group(
- &mut render_pass_resource.0.borrow_mut(),
- );
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_render_pass_insert_debug_marker(
- state: &mut OpState,
- render_pass_rid: ResourceId,
- marker_label: String,
-) -> Result<WebGpuResult, AnyError> {
- let render_pass_resource = state
- .resource_table
- .get::<WebGpuRenderPass>(render_pass_rid)?;
-
- let label = std::ffi::CString::new(marker_label).unwrap();
- // SAFETY: the string the raw pointer points to lives longer than the below
- // function invocation.
- unsafe {
- wgpu_core::command::render_ffi::wgpu_render_pass_insert_debug_marker(
- &mut render_pass_resource.0.borrow_mut(),
- label.as_ptr(),
- 0, // wgpu#975
- );
- }
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_render_pass_set_pipeline(
- state: &mut OpState,
- render_pass_rid: ResourceId,
- pipeline: u32,
-) -> Result<WebGpuResult, AnyError> {
- let render_pipeline_resource =
- state
- .resource_table
- .get::<super::pipeline::WebGpuRenderPipeline>(pipeline)?;
- let render_pass_resource = state
- .resource_table
- .get::<WebGpuRenderPass>(render_pass_rid)?;
-
- wgpu_core::command::render_ffi::wgpu_render_pass_set_pipeline(
- &mut render_pass_resource.0.borrow_mut(),
- render_pipeline_resource.0,
- );
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_render_pass_set_index_buffer(
- state: &mut OpState,
- render_pass_rid: ResourceId,
- buffer: u32,
- index_format: wgpu_types::IndexFormat,
- offset: u64,
- size: Option<u64>,
-) -> Result<WebGpuResult, AnyError> {
- let buffer_resource = state
- .resource_table
- .get::<super::buffer::WebGpuBuffer>(buffer)?;
- let render_pass_resource = state
- .resource_table
- .get::<WebGpuRenderPass>(render_pass_rid)?;
-
- let size = if let Some(size) = size {
- Some(
- std::num::NonZeroU64::new(size)
- .ok_or_else(|| type_error("size must be larger than 0"))?,
- )
- } else {
- None
- };
-
- render_pass_resource.0.borrow_mut().set_index_buffer(
- buffer_resource.0,
- index_format,
- offset,
- size,
- );
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_render_pass_set_vertex_buffer(
- state: &mut OpState,
- render_pass_rid: ResourceId,
- slot: u32,
- buffer: u32,
- offset: u64,
- size: Option<u64>,
-) -> Result<WebGpuResult, AnyError> {
- let buffer_resource = state
- .resource_table
- .get::<super::buffer::WebGpuBuffer>(buffer)?;
- let render_pass_resource = state
- .resource_table
- .get::<WebGpuRenderPass>(render_pass_rid)?;
-
- let size = if let Some(size) = size {
- Some(
- std::num::NonZeroU64::new(size)
- .ok_or_else(|| type_error("size must be larger than 0"))?,
- )
- } else {
- None
- };
-
- wgpu_core::command::render_ffi::wgpu_render_pass_set_vertex_buffer(
- &mut render_pass_resource.0.borrow_mut(),
- slot,
- buffer_resource.0,
- offset,
- size,
- );
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_render_pass_draw(
- state: &mut OpState,
- render_pass_rid: ResourceId,
- vertex_count: u32,
- instance_count: u32,
- first_vertex: u32,
- first_instance: u32,
-) -> Result<WebGpuResult, AnyError> {
- let render_pass_resource = state
- .resource_table
- .get::<WebGpuRenderPass>(render_pass_rid)?;
-
- wgpu_core::command::render_ffi::wgpu_render_pass_draw(
- &mut render_pass_resource.0.borrow_mut(),
- vertex_count,
- instance_count,
- first_vertex,
- first_instance,
- );
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_render_pass_draw_indexed(
- state: &mut OpState,
- render_pass_rid: ResourceId,
- index_count: u32,
- instance_count: u32,
- first_index: u32,
- base_vertex: i32,
- first_instance: u32,
-) -> Result<WebGpuResult, AnyError> {
- let render_pass_resource = state
- .resource_table
- .get::<WebGpuRenderPass>(render_pass_rid)?;
-
- wgpu_core::command::render_ffi::wgpu_render_pass_draw_indexed(
- &mut render_pass_resource.0.borrow_mut(),
- index_count,
- instance_count,
- first_index,
- base_vertex,
- first_instance,
- );
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_render_pass_draw_indirect(
- state: &mut OpState,
- render_pass_rid: ResourceId,
- indirect_buffer: u32,
- indirect_offset: u64,
-) -> Result<WebGpuResult, AnyError> {
- let buffer_resource = state
- .resource_table
- .get::<super::buffer::WebGpuBuffer>(indirect_buffer)?;
- let render_pass_resource = state
- .resource_table
- .get::<WebGpuRenderPass>(render_pass_rid)?;
-
- wgpu_core::command::render_ffi::wgpu_render_pass_draw_indirect(
- &mut render_pass_resource.0.borrow_mut(),
- buffer_resource.0,
- indirect_offset,
- );
-
- Ok(WebGpuResult::empty())
-}
-
-#[op]
-pub fn op_webgpu_render_pass_draw_indexed_indirect(
- state: &mut OpState,
- render_pass_rid: ResourceId,
- indirect_buffer: u32,
- indirect_offset: u64,
-) -> Result<WebGpuResult, AnyError> {
- let buffer_resource = state
- .resource_table
- .get::<super::buffer::WebGpuBuffer>(indirect_buffer)?;
- let render_pass_resource = state
- .resource_table
- .get::<WebGpuRenderPass>(render_pass_rid)?;
-
- wgpu_core::command::render_ffi::wgpu_render_pass_draw_indexed_indirect(
- &mut render_pass_resource.0.borrow_mut(),
- buffer_resource.0,
- indirect_offset,
- );
-
- Ok(WebGpuResult::empty())
-}
diff --git a/ext/webgpu/sampler.rs b/ext/webgpu/sampler.rs
deleted file mode 100644
index b377f6835..000000000
--- a/ext/webgpu/sampler.rs
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
-
-use deno_core::error::AnyError;
-use deno_core::op;
-use deno_core::OpState;
-use deno_core::Resource;
-use deno_core::ResourceId;
-use serde::Deserialize;
-use std::borrow::Cow;
-
-use super::error::WebGpuResult;
-
-pub(crate) struct WebGpuSampler(pub(crate) wgpu_core::id::SamplerId);
-impl Resource for WebGpuSampler {
- fn name(&self) -> Cow<str> {
- "webGPUSampler".into()
- }
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-pub struct CreateSamplerArgs {
- device_rid: ResourceId,
- label: Option<String>,
- address_mode_u: wgpu_types::AddressMode,
- address_mode_v: wgpu_types::AddressMode,
- address_mode_w: wgpu_types::AddressMode,
- mag_filter: wgpu_types::FilterMode,
- min_filter: wgpu_types::FilterMode,
- mipmap_filter: wgpu_types::FilterMode, // TODO: GPUMipmapFilterMode
- lod_min_clamp: f32,
- lod_max_clamp: f32,
- compare: Option<wgpu_types::CompareFunction>,
- max_anisotropy: u8,
-}
-
-#[op]
-pub fn op_webgpu_create_sampler(
- state: &mut OpState,
- args: CreateSamplerArgs,
-) -> Result<WebGpuResult, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let device_resource = state
- .resource_table
- .get::<super::WebGpuDevice>(args.device_rid)?;
- let device = device_resource.0;
-
- let descriptor = wgpu_core::resource::SamplerDescriptor {
- label: args.label.map(Cow::from),
- address_modes: [
- args.address_mode_u,
- args.address_mode_v,
- args.address_mode_w,
- ],
- mag_filter: args.mag_filter,
- min_filter: args.min_filter,
- mipmap_filter: args.mipmap_filter,
- lod_min_clamp: args.lod_min_clamp,
- lod_max_clamp: args.lod_max_clamp,
- compare: args.compare,
- anisotropy_clamp: std::num::NonZeroU8::new(args.max_anisotropy),
- border_color: None, // native-only
- };
-
- gfx_put!(device => instance.device_create_sampler(
- device,
- &descriptor,
- ()
- ) => state, WebGpuSampler)
-}
diff --git a/ext/webgpu/shader.rs b/ext/webgpu/shader.rs
deleted file mode 100644
index 242cb85ba..000000000
--- a/ext/webgpu/shader.rs
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
-
-use deno_core::error::AnyError;
-use deno_core::op;
-use deno_core::OpState;
-use deno_core::Resource;
-use deno_core::ResourceId;
-use std::borrow::Cow;
-
-use super::error::WebGpuResult;
-
-pub(crate) struct WebGpuShaderModule(pub(crate) wgpu_core::id::ShaderModuleId);
-impl Resource for WebGpuShaderModule {
- fn name(&self) -> Cow<str> {
- "webGPUShaderModule".into()
- }
-}
-
-#[op]
-pub fn op_webgpu_create_shader_module(
- state: &mut OpState,
- device_rid: ResourceId,
- label: Option<String>,
- code: String,
-) -> Result<WebGpuResult, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let device_resource = state
- .resource_table
- .get::<super::WebGpuDevice>(device_rid)?;
- let device = device_resource.0;
-
- let source = wgpu_core::pipeline::ShaderModuleSource::Wgsl(Cow::from(code));
-
- let descriptor = wgpu_core::pipeline::ShaderModuleDescriptor {
- label: label.map(Cow::from),
- shader_bound_checks: wgpu_types::ShaderBoundChecks::default(),
- };
-
- gfx_put!(device => instance.device_create_shader_module(
- device,
- &descriptor,
- source,
- ()
- ) => state, WebGpuShaderModule)
-}
diff --git a/ext/webgpu/surface.rs b/ext/webgpu/surface.rs
deleted file mode 100644
index 45ac44d03..000000000
--- a/ext/webgpu/surface.rs
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
-
-use super::WebGpuResult;
-use deno_core::error::AnyError;
-use deno_core::include_js_files;
-use deno_core::op;
-use deno_core::Extension;
-use deno_core::OpState;
-use deno_core::Resource;
-use deno_core::ResourceId;
-use serde::Deserialize;
-use std::borrow::Cow;
-use wgpu_types::SurfaceStatus;
-
-pub fn init_surface(unstable: bool) -> Extension {
- Extension::builder_with_deps(
- "deno_webgpu_surface",
- &["deno_webidl", "deno_web", "deno_webgpu"],
- )
- .esm(include_js_files!(
- "03_surface.js",
- "04_surface_idl_types.js",
- ))
- .ops(vec![
- op_webgpu_surface_configure::decl(),
- op_webgpu_surface_get_current_texture::decl(),
- op_webgpu_surface_present::decl(),
- ])
- .state(move |state| {
- // TODO: check & possibly streamline this
- // Unstable might be able to be OpMiddleware
- // let unstable_checker = state.borrow::<super::UnstableChecker>();
- // let unstable = unstable_checker.unstable;
- state.put(super::Unstable(unstable));
- })
- .build()
-}
-
-pub struct WebGpuSurface(pub wgpu_core::id::SurfaceId);
-impl Resource for WebGpuSurface {
- fn name(&self) -> Cow<str> {
- "webGPUSurface".into()
- }
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-pub struct SurfaceConfigureArgs {
- surface_rid: ResourceId,
- device_rid: ResourceId,
- format: wgpu_types::TextureFormat,
- usage: u32,
- width: u32,
- height: u32,
- present_mode: Option<wgpu_types::PresentMode>,
- alpha_mode: wgpu_types::CompositeAlphaMode,
- view_formats: Vec<wgpu_types::TextureFormat>,
-}
-
-#[op]
-pub fn op_webgpu_surface_configure(
- state: &mut OpState,
- args: SurfaceConfigureArgs,
-) -> Result<WebGpuResult, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let device_resource = state
- .resource_table
- .get::<super::WebGpuDevice>(args.device_rid)?;
- let device = device_resource.0;
- let surface_resource = state
- .resource_table
- .get::<WebGpuSurface>(args.surface_rid)?;
- let surface = surface_resource.0;
-
- let conf = wgpu_types::SurfaceConfiguration::<Vec<wgpu_types::TextureFormat>> {
- usage: wgpu_types::TextureUsages::from_bits_truncate(args.usage),
- format: args.format,
- width: args.width,
- height: args.height,
- present_mode: args.present_mode.unwrap_or_default(),
- alpha_mode: args.alpha_mode,
- view_formats: args.view_formats,
- };
-
- let err =
- gfx_select!(device => instance.surface_configure(surface, device, &conf));
-
- Ok(WebGpuResult::maybe_err(err))
-}
-
-#[op]
-pub fn op_webgpu_surface_get_current_texture(
- state: &mut OpState,
- device_rid: ResourceId,
- surface_rid: ResourceId,
-) -> Result<WebGpuResult, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let device_resource = state
- .resource_table
- .get::<super::WebGpuDevice>(device_rid)?;
- let device = device_resource.0;
- let surface_resource =
- state.resource_table.get::<WebGpuSurface>(surface_rid)?;
- let surface = surface_resource.0;
-
- let output =
- gfx_select!(device => instance.surface_get_current_texture(surface, ()))?;
-
- match output.status {
- SurfaceStatus::Good | SurfaceStatus::Suboptimal => {
- let id = output.texture_id.unwrap();
- let rid = state.resource_table.add(crate::texture::WebGpuTexture(id));
- Ok(WebGpuResult::rid(rid))
- }
- _ => Err(AnyError::msg("Invalid Surface Status")),
- }
-}
-
-#[op]
-pub fn op_webgpu_surface_present(
- state: &mut OpState,
- device_rid: ResourceId,
- surface_rid: ResourceId,
-) -> Result<(), AnyError> {
- let instance = state.borrow::<super::Instance>();
- let device_resource = state
- .resource_table
- .get::<super::WebGpuDevice>(device_rid)?;
- let device = device_resource.0;
- let surface_resource =
- state.resource_table.get::<WebGpuSurface>(surface_rid)?;
- let surface = surface_resource.0;
-
- let _ = gfx_select!(device => instance.surface_present(surface))?;
-
- Ok(())
-}
diff --git a/ext/webgpu/texture.rs b/ext/webgpu/texture.rs
deleted file mode 100644
index c4b36c288..000000000
--- a/ext/webgpu/texture.rs
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
-
-use deno_core::error::AnyError;
-use deno_core::op;
-use deno_core::OpState;
-use deno_core::Resource;
-use deno_core::ResourceId;
-use serde::Deserialize;
-use std::borrow::Cow;
-
-use super::error::WebGpuResult;
-pub(crate) struct WebGpuTexture(pub(crate) wgpu_core::id::TextureId);
-impl Resource for WebGpuTexture {
- fn name(&self) -> Cow<str> {
- "webGPUTexture".into()
- }
-}
-
-pub(crate) struct WebGpuTextureView(pub(crate) wgpu_core::id::TextureViewId);
-impl Resource for WebGpuTextureView {
- fn name(&self) -> Cow<str> {
- "webGPUTextureView".into()
- }
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-pub struct CreateTextureArgs {
- device_rid: ResourceId,
- label: Option<String>,
- size: wgpu_types::Extent3d,
- mip_level_count: u32,
- sample_count: u32,
- dimension: wgpu_types::TextureDimension,
- format: wgpu_types::TextureFormat,
- usage: u32,
- view_formats: Vec<wgpu_types::TextureFormat>,
-}
-
-#[op]
-pub fn op_webgpu_create_texture(
- state: &mut OpState,
- args: CreateTextureArgs,
-) -> Result<WebGpuResult, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let device_resource = state
- .resource_table
- .get::<super::WebGpuDevice>(args.device_rid)?;
- let device = device_resource.0;
-
- let descriptor = wgpu_core::resource::TextureDescriptor {
- label: args.label.map(Cow::from),
- size: args.size,
- mip_level_count: args.mip_level_count,
- sample_count: args.sample_count,
- dimension: args.dimension,
- format: args.format,
- usage: wgpu_types::TextureUsages::from_bits_truncate(args.usage),
- view_formats: args.view_formats,
- };
-
- gfx_put!(device => instance.device_create_texture(
- device,
- &descriptor,
- ()
- ) => state, WebGpuTexture)
-}
-
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-pub struct CreateTextureViewArgs {
- texture_rid: ResourceId,
- label: Option<String>,
- format: Option<wgpu_types::TextureFormat>,
- dimension: Option<wgpu_types::TextureViewDimension>,
- aspect: wgpu_types::TextureAspect,
- base_mip_level: u32,
- mip_level_count: Option<u32>,
- base_array_layer: u32,
- array_layer_count: Option<u32>,
-}
-
-#[op]
-pub fn op_webgpu_create_texture_view(
- state: &mut OpState,
- args: CreateTextureViewArgs,
-) -> Result<WebGpuResult, AnyError> {
- let instance = state.borrow::<super::Instance>();
- let texture_resource = state
- .resource_table
- .get::<WebGpuTexture>(args.texture_rid)?;
- let texture = texture_resource.0;
-
- let descriptor = wgpu_core::resource::TextureViewDescriptor {
- label: args.label.map(Cow::from),
- format: args.format,
- dimension: args.dimension,
- range: wgpu_types::ImageSubresourceRange {
- aspect: args.aspect,
- base_mip_level: args.base_mip_level,
- mip_level_count: std::num::NonZeroU32::new(
- args.mip_level_count.unwrap_or(0),
- ),
- base_array_layer: args.base_array_layer,
- array_layer_count: std::num::NonZeroU32::new(
- args.array_layer_count.unwrap_or(0),
- ),
- },
- };
-
- gfx_put!(texture => instance.texture_create_view(
- texture,
- &descriptor,
- ()
- ) => state, WebGpuTextureView)
-}
diff --git a/ext/webgpu/webgpu.idl b/ext/webgpu/webgpu.idl
deleted file mode 100644
index 4b8865e30..000000000
--- a/ext/webgpu/webgpu.idl
+++ /dev/null
@@ -1,1168 +0,0 @@
-interface mixin GPUObjectBase {
- attribute USVString label;
-};
-
-dictionary GPUObjectDescriptorBase {
- USVString label;
-};
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPUSupportedLimits {
- readonly attribute unsigned long maxTextureDimension1D;
- readonly attribute unsigned long maxTextureDimension2D;
- readonly attribute unsigned long maxTextureDimension3D;
- readonly attribute unsigned long maxTextureArrayLayers;
- readonly attribute unsigned long maxBindGroups;
- readonly attribute unsigned long maxBindingsPerBindGroup;
- readonly attribute unsigned long maxDynamicUniformBuffersPerPipelineLayout;
- readonly attribute unsigned long maxDynamicStorageBuffersPerPipelineLayout;
- readonly attribute unsigned long maxSampledTexturesPerShaderStage;
- readonly attribute unsigned long maxSamplersPerShaderStage;
- readonly attribute unsigned long maxStorageBuffersPerShaderStage;
- readonly attribute unsigned long maxStorageTexturesPerShaderStage;
- readonly attribute unsigned long maxUniformBuffersPerShaderStage;
- readonly attribute unsigned long long maxUniformBufferBindingSize;
- readonly attribute unsigned long long maxStorageBufferBindingSize;
- readonly attribute unsigned long minUniformBufferOffsetAlignment;
- readonly attribute unsigned long minStorageBufferOffsetAlignment;
- readonly attribute unsigned long maxVertexBuffers;
- readonly attribute unsigned long long maxBufferSize;
- readonly attribute unsigned long maxVertexAttributes;
- readonly attribute unsigned long maxVertexBufferArrayStride;
- readonly attribute unsigned long maxInterStageShaderComponents;
- readonly attribute unsigned long maxComputeWorkgroupStorageSize;
- readonly attribute unsigned long maxComputeInvocationsPerWorkgroup;
- readonly attribute unsigned long maxComputeWorkgroupSizeX;
- readonly attribute unsigned long maxComputeWorkgroupSizeY;
- readonly attribute unsigned long maxComputeWorkgroupSizeZ;
- readonly attribute unsigned long maxComputeWorkgroupsPerDimension;
-};
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPUSupportedFeatures {
- readonly setlike<DOMString>;
-};
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPUAdapterInfo {
- readonly attribute DOMString vendor;
- readonly attribute DOMString architecture;
- readonly attribute DOMString device;
- readonly attribute DOMString description;
-};
-
-interface mixin NavigatorGPU {
- [SameObject, SecureContext] readonly attribute GPU gpu;
-};
-Navigator includes NavigatorGPU;
-WorkerNavigator includes NavigatorGPU;
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPU {
- Promise<GPUAdapter?> requestAdapter(optional GPURequestAdapterOptions options = {});
-};
-
-dictionary GPURequestAdapterOptions {
- GPUPowerPreference powerPreference;
- boolean forceFallbackAdapter = false;
-};
-
-enum GPUPowerPreference {
- "low-power",
- "high-performance"
-};
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPUAdapter {
- [SameObject] readonly attribute GPUSupportedFeatures features;
- [SameObject] readonly attribute GPUSupportedLimits limits;
- readonly attribute boolean isFallbackAdapter;
-
- Promise<GPUDevice> requestDevice(optional GPUDeviceDescriptor descriptor = {});
- Promise<GPUAdapterInfo> requestAdapterInfo(optional sequence<DOMString> unmaskHints = []);
-};
-
-dictionary GPUDeviceDescriptor : GPUObjectDescriptorBase {
- sequence<GPUFeatureName> requiredFeatures = [];
- record<DOMString, GPUSize64> requiredLimits = {};
-};
-
-enum GPUFeatureName {
- "depth-clip-control",
- "depth32float-stencil8",
- "texture-compression-bc",
- "texture-compression-etc2",
- "texture-compression-astc",
- "timestamp-query",
- "indirect-first-instance",
- "shader-f16",
-};
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPUDevice : EventTarget {
- [SameObject] readonly attribute GPUSupportedFeatures features;
- [SameObject] readonly attribute GPUSupportedLimits limits;
-
- [SameObject] readonly attribute GPUQueue queue;
-
- undefined destroy();
-
- GPUBuffer createBuffer(GPUBufferDescriptor descriptor);
- GPUTexture createTexture(GPUTextureDescriptor descriptor);
- GPUSampler createSampler(optional GPUSamplerDescriptor descriptor = {});
-
- GPUBindGroupLayout createBindGroupLayout(GPUBindGroupLayoutDescriptor descriptor);
- GPUPipelineLayout createPipelineLayout(GPUPipelineLayoutDescriptor descriptor);
- GPUBindGroup createBindGroup(GPUBindGroupDescriptor descriptor);
-
- GPUShaderModule createShaderModule(GPUShaderModuleDescriptor descriptor);
- GPUComputePipeline createComputePipeline(GPUComputePipelineDescriptor descriptor);
- GPURenderPipeline createRenderPipeline(GPURenderPipelineDescriptor descriptor);
- Promise<GPUComputePipeline> createComputePipelineAsync(GPUComputePipelineDescriptor descriptor);
- Promise<GPURenderPipeline> createRenderPipelineAsync(GPURenderPipelineDescriptor descriptor);
-
- GPUCommandEncoder createCommandEncoder(optional GPUCommandEncoderDescriptor descriptor = {});
- GPURenderBundleEncoder createRenderBundleEncoder(GPURenderBundleEncoderDescriptor descriptor);
-
- GPUQuerySet createQuerySet(GPUQuerySetDescriptor descriptor);
-};
-GPUDevice includes GPUObjectBase;
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPUBuffer {
- readonly attribute GPUSize64 size;
- readonly attribute GPUBufferUsageFlags usage;
-
- readonly attribute GPUBufferMapState mapState;
-
- Promise<undefined> mapAsync(GPUMapModeFlags mode, optional GPUSize64 offset = 0, optional GPUSize64 size);
- ArrayBuffer getMappedRange(optional GPUSize64 offset = 0, optional GPUSize64 size);
- undefined unmap();
-
- undefined destroy();
-};
-GPUBuffer includes GPUObjectBase;
-
-enum GPUBufferMapState {
- "unmapped",
- "pending",
- "mapped"
-};
-
-dictionary GPUBufferDescriptor : GPUObjectDescriptorBase {
- required GPUSize64 size;
- required GPUBufferUsageFlags usage;
- boolean mappedAtCreation = false;
-};
-
-typedef [EnforceRange] unsigned long GPUBufferUsageFlags;
-[Exposed=(Window, DedicatedWorker)]
-namespace GPUBufferUsage {
- const GPUFlagsConstant MAP_READ = 0x0001;
- const GPUFlagsConstant MAP_WRITE = 0x0002;
- const GPUFlagsConstant COPY_SRC = 0x0004;
- const GPUFlagsConstant COPY_DST = 0x0008;
- const GPUFlagsConstant INDEX = 0x0010;
- const GPUFlagsConstant VERTEX = 0x0020;
- const GPUFlagsConstant UNIFORM = 0x0040;
- const GPUFlagsConstant STORAGE = 0x0080;
- const GPUFlagsConstant INDIRECT = 0x0100;
- const GPUFlagsConstant QUERY_RESOLVE = 0x0200;
-};
-
-typedef [EnforceRange] unsigned long GPUMapModeFlags;
-[Exposed=(Window, DedicatedWorker)]
-namespace GPUMapMode {
- const GPUFlagsConstant READ = 0x0001;
- const GPUFlagsConstant WRITE = 0x0002;
-};
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPUTexture {
- GPUTextureView createView(optional GPUTextureViewDescriptor descriptor = {});
-
- undefined destroy();
-
- readonly attribute GPUIntegerCoordinate width;
- readonly attribute GPUIntegerCoordinate height;
- readonly attribute GPUIntegerCoordinate depthOrArrayLayers;
- readonly attribute GPUIntegerCoordinate mipLevelCount;
- readonly attribute GPUSize32 sampleCount;
- readonly attribute GPUTextureDimension dimension;
- readonly attribute GPUTextureFormat format;
- readonly attribute GPUTextureUsageFlags usage;
-};
-GPUTexture includes GPUObjectBase;
-
-dictionary GPUTextureDescriptor : GPUObjectDescriptorBase {
- required GPUExtent3D size;
- GPUIntegerCoordinate mipLevelCount = 1;
- GPUSize32 sampleCount = 1;
- GPUTextureDimension dimension = "2d";
- required GPUTextureFormat format;
- required GPUTextureUsageFlags usage;
- sequence<GPUTextureFormat> viewFormats = [];
-};
-
-enum GPUTextureDimension {
- "1d",
- "2d",
- "3d"
-};
-
-typedef [EnforceRange] unsigned long GPUTextureUsageFlags;
-[Exposed=(Window, DedicatedWorker)]
-namespace GPUTextureUsage {
- const GPUFlagsConstant COPY_SRC = 0x01;
- const GPUFlagsConstant COPY_DST = 0x02;
- const GPUFlagsConstant TEXTURE_BINDING = 0x04;
- const GPUFlagsConstant STORAGE_BINDING = 0x08;
- const GPUFlagsConstant RENDER_ATTACHMENT = 0x10;
-};
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPUTextureView {
-};
-GPUTextureView includes GPUObjectBase;
-
-dictionary GPUTextureViewDescriptor : GPUObjectDescriptorBase {
- GPUTextureFormat format;
- GPUTextureViewDimension dimension;
- GPUTextureAspect aspect = "all";
- GPUIntegerCoordinate baseMipLevel = 0;
- GPUIntegerCoordinate mipLevelCount;
- GPUIntegerCoordinate baseArrayLayer = 0;
- GPUIntegerCoordinate arrayLayerCount;
-};
-
-enum GPUTextureViewDimension {
- "1d",
- "2d",
- "2d-array",
- "cube",
- "cube-array",
- "3d"
-};
-
-enum GPUTextureAspect {
- "all",
- "stencil-only",
- "depth-only"
-};
-
-enum GPUTextureFormat {
- // 8-bit formats
- "r8unorm",
- "r8snorm",
- "r8uint",
- "r8sint",
-
- // 16-bit formats
- "r16uint",
- "r16sint",
- "r16float",
- "rg8unorm",
- "rg8snorm",
- "rg8uint",
- "rg8sint",
-
- // 32-bit formats
- "r32uint",
- "r32sint",
- "r32float",
- "rg16uint",
- "rg16sint",
- "rg16float",
- "rgba8unorm",
- "rgba8unorm-srgb",
- "rgba8snorm",
- "rgba8uint",
- "rgba8sint",
- "bgra8unorm",
- "bgra8unorm-srgb",
- // Packed 32-bit formats
- "rgb9e5ufloat",
- "rgb10a2unorm",
- "rg11b10ufloat",
-
- // 64-bit formats
- "rg32uint",
- "rg32sint",
- "rg32float",
- "rgba16uint",
- "rgba16sint",
- "rgba16float",
-
- // 128-bit formats
- "rgba32uint",
- "rgba32sint",
- "rgba32float",
-
- // Depth/stencil formats
- "stencil8",
- "depth16unorm",
- "depth24plus",
- "depth24plus-stencil8",
- "depth32float",
-
- // "depth32float-stencil8" feature
- "depth32float-stencil8",
-
- // BC compressed formats usable if "texture-compression-bc" is both
- // supported by the device/user agent and enabled in requestDevice.
- "bc1-rgba-unorm",
- "bc1-rgba-unorm-srgb",
- "bc2-rgba-unorm",
- "bc2-rgba-unorm-srgb",
- "bc3-rgba-unorm",
- "bc3-rgba-unorm-srgb",
- "bc4-r-unorm",
- "bc4-r-snorm",
- "bc5-rg-unorm",
- "bc5-rg-snorm",
- "bc6h-rgb-ufloat",
- "bc6h-rgb-float",
- "bc7-rgba-unorm",
- "bc7-rgba-unorm-srgb",
-
- // ETC2 compressed formats usable if "texture-compression-etc2" is both
- // supported by the device/user agent and enabled in requestDevice.
- "etc2-rgb8unorm",
- "etc2-rgb8unorm-srgb",
- "etc2-rgb8a1unorm",
- "etc2-rgb8a1unorm-srgb",
- "etc2-rgba8unorm",
- "etc2-rgba8unorm-srgb",
- "eac-r11unorm",
- "eac-r11snorm",
- "eac-rg11unorm",
- "eac-rg11snorm",
-
- // ASTC compressed formats usable if "texture-compression-astc" is both
- // supported by the device/user agent and enabled in requestDevice.
- "astc-4x4-unorm",
- "astc-4x4-unorm-srgb",
- "astc-5x4-unorm",
- "astc-5x4-unorm-srgb",
- "astc-5x5-unorm",
- "astc-5x5-unorm-srgb",
- "astc-6x5-unorm",
- "astc-6x5-unorm-srgb",
- "astc-6x6-unorm",
- "astc-6x6-unorm-srgb",
- "astc-8x5-unorm",
- "astc-8x5-unorm-srgb",
- "astc-8x6-unorm",
- "astc-8x6-unorm-srgb",
- "astc-8x8-unorm",
- "astc-8x8-unorm-srgb",
- "astc-10x5-unorm",
- "astc-10x5-unorm-srgb",
- "astc-10x6-unorm",
- "astc-10x6-unorm-srgb",
- "astc-10x8-unorm",
- "astc-10x8-unorm-srgb",
- "astc-10x10-unorm",
- "astc-10x10-unorm-srgb",
- "astc-12x10-unorm",
- "astc-12x10-unorm-srgb",
- "astc-12x12-unorm",
- "astc-12x12-unorm-srgb"
-};
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPUSampler {
-};
-GPUSampler includes GPUObjectBase;
-
-dictionary GPUSamplerDescriptor : GPUObjectDescriptorBase {
- GPUAddressMode addressModeU = "clamp-to-edge";
- GPUAddressMode addressModeV = "clamp-to-edge";
- GPUAddressMode addressModeW = "clamp-to-edge";
- GPUFilterMode magFilter = "nearest";
- GPUFilterMode minFilter = "nearest";
- GPUMipmapFilterMode mipmapFilter = "nearest";
- float lodMinClamp = 0;
- float lodMaxClamp = 32;
- GPUCompareFunction compare;
- [Clamp] unsigned short maxAnisotropy = 1;
-};
-
-enum GPUAddressMode {
- "clamp-to-edge",
- "repeat",
- "mirror-repeat"
-};
-
-enum GPUFilterMode {
- "nearest",
- "linear"
-};
-
-enum GPUMipmapFilterMode {
- "nearest",
- "linear"
-};
-
-enum GPUCompareFunction {
- "never",
- "less",
- "equal",
- "less-equal",
- "greater",
- "not-equal",
- "greater-equal",
- "always"
-};
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPUBindGroupLayout {
-};
-GPUBindGroupLayout includes GPUObjectBase;
-
-dictionary GPUBindGroupLayoutDescriptor : GPUObjectDescriptorBase {
- required sequence<GPUBindGroupLayoutEntry> entries;
-};
-
-dictionary GPUBindGroupLayoutEntry {
- required GPUIndex32 binding;
- required GPUShaderStageFlags visibility;
-
- GPUBufferBindingLayout buffer;
- GPUSamplerBindingLayout sampler;
- GPUTextureBindingLayout texture;
- GPUStorageTextureBindingLayout storageTexture;
-};
-
-typedef [EnforceRange] unsigned long GPUShaderStageFlags;
-[Exposed=(Window, DedicatedWorker)]
-namespace GPUShaderStage {
- const GPUFlagsConstant VERTEX = 0x1;
- const GPUFlagsConstant FRAGMENT = 0x2;
- const GPUFlagsConstant COMPUTE = 0x4;
-};
-
-enum GPUBufferBindingType {
- "uniform",
- "storage",
- "read-only-storage"
-};
-
-dictionary GPUBufferBindingLayout {
- GPUBufferBindingType type = "uniform";
- boolean hasDynamicOffset = false;
- GPUSize64 minBindingSize = 0;
-};
-
-enum GPUSamplerBindingType {
- "filtering",
- "non-filtering",
- "comparison"
-};
-
-dictionary GPUSamplerBindingLayout {
- GPUSamplerBindingType type = "filtering";
-};
-
-enum GPUTextureSampleType {
- "float",
- "unfilterable-float",
- "depth",
- "sint",
- "uint"
-};
-
-dictionary GPUTextureBindingLayout {
- GPUTextureSampleType sampleType = "float";
- GPUTextureViewDimension viewDimension = "2d";
- boolean multisampled = false;
-};
-
-enum GPUStorageTextureAccess {
- "write-only"
-};
-
-dictionary GPUStorageTextureBindingLayout {
- GPUStorageTextureAccess access = "write-only";
- required GPUTextureFormat format;
- GPUTextureViewDimension viewDimension = "2d";
-};
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPUBindGroup {
-};
-GPUBindGroup includes GPUObjectBase;
-
-dictionary GPUBindGroupDescriptor : GPUObjectDescriptorBase {
- required GPUBindGroupLayout layout;
- required sequence<GPUBindGroupEntry> entries;
-};
-
-typedef (GPUSampler or GPUTextureView or GPUBufferBinding) GPUBindingResource;
-
-dictionary GPUBindGroupEntry {
- required GPUIndex32 binding;
- required GPUBindingResource resource;
-};
-
-dictionary GPUBufferBinding {
- required GPUBuffer buffer;
- GPUSize64 offset = 0;
- GPUSize64 size;
-};
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPUPipelineLayout {
-};
-GPUPipelineLayout includes GPUObjectBase;
-
-dictionary GPUPipelineLayoutDescriptor : GPUObjectDescriptorBase {
- required sequence<GPUBindGroupLayout> bindGroupLayouts;
-};
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPUShaderModule {
- Promise<GPUCompilationInfo> compilationInfo();
-};
-GPUShaderModule includes GPUObjectBase;
-
-dictionary GPUShaderModuleDescriptor : GPUObjectDescriptorBase {
- required USVString code;
-};
-
-enum GPUCompilationMessageType {
- "error",
- "warning",
- "info"
-};
-
-[Exposed=(Window, DedicatedWorker), Serializable, SecureContext]
-interface GPUCompilationMessage {
- readonly attribute DOMString message;
- readonly attribute GPUCompilationMessageType type;
- readonly attribute unsigned long long lineNum;
- readonly attribute unsigned long long linePos;
- readonly attribute unsigned long long offset;
- readonly attribute unsigned long long length;
-};
-
-[Exposed=(Window, DedicatedWorker), Serializable, SecureContext]
-interface GPUCompilationInfo {
- readonly attribute FrozenArray<GPUCompilationMessage> messages;
-};
-
-enum GPUAutoLayoutMode {
- "auto"
-};
-
-dictionary GPUPipelineDescriptorBase : GPUObjectDescriptorBase {
- required (GPUPipelineLayout or GPUAutoLayoutMode) layout;
-};
-
-interface mixin GPUPipelineBase {
- [NewObject] GPUBindGroupLayout getBindGroupLayout(unsigned long index);
-};
-
-dictionary GPUProgrammableStage {
- required GPUShaderModule module;
- required USVString entryPoint;
- record<USVString, GPUPipelineConstantValue> constants;
-};
-
-typedef double GPUPipelineConstantValue; // May represent WGSL’s bool, f32, i32, u32, and f16 if enabled.
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPUComputePipeline {
-};
-GPUComputePipeline includes GPUObjectBase;
-GPUComputePipeline includes GPUPipelineBase;
-
-dictionary GPUComputePipelineDescriptor : GPUPipelineDescriptorBase {
- required GPUProgrammableStage compute;
-};
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPURenderPipeline {
-};
-GPURenderPipeline includes GPUObjectBase;
-GPURenderPipeline includes GPUPipelineBase;
-
-dictionary GPURenderPipelineDescriptor : GPUPipelineDescriptorBase {
- required GPUVertexState vertex;
- GPUPrimitiveState primitive = {};
- GPUDepthStencilState depthStencil;
- GPUMultisampleState multisample = {};
- GPUFragmentState fragment;
-};
-
-dictionary GPUPrimitiveState {
- GPUPrimitiveTopology topology = "triangle-list";
- GPUIndexFormat stripIndexFormat;
- GPUFrontFace frontFace = "ccw";
- GPUCullMode cullMode = "none";
-
- // Requires "depth-clip-control" feature.
- boolean unclippedDepth = false;
-};
-
-enum GPUPrimitiveTopology {
- "point-list",
- "line-list",
- "line-strip",
- "triangle-list",
- "triangle-strip"
-};
-
-enum GPUFrontFace {
- "ccw",
- "cw"
-};
-
-enum GPUCullMode {
- "none",
- "front",
- "back"
-};
-
-dictionary GPUMultisampleState {
- GPUSize32 count = 1;
- GPUSampleMask mask = 0xFFFFFFFF;
- boolean alphaToCoverageEnabled = false;
-};
-
-dictionary GPUFragmentState : GPUProgrammableStage {
- required sequence<GPUColorTargetState?> targets;
-};
-
-dictionary GPUColorTargetState {
- required GPUTextureFormat format;
-
- GPUBlendState blend;
- GPUColorWriteFlags writeMask = 0xF; // GPUColorWrite.ALL
-};
-
-dictionary GPUBlendState {
- required GPUBlendComponent color;
- required GPUBlendComponent alpha;
-};
-
-typedef [EnforceRange] unsigned long GPUColorWriteFlags;
-[Exposed=(Window, DedicatedWorker)]
-namespace GPUColorWrite {
- const GPUFlagsConstant RED = 0x1;
- const GPUFlagsConstant GREEN = 0x2;
- const GPUFlagsConstant BLUE = 0x4;
- const GPUFlagsConstant ALPHA = 0x8;
- const GPUFlagsConstant ALL = 0xF;
-};
-
-dictionary GPUBlendComponent {
- GPUBlendOperation operation = "add";
- GPUBlendFactor srcFactor = "one";
- GPUBlendFactor dstFactor = "zero";
-};
-
-enum GPUBlendFactor {
- "zero",
- "one",
- "src",
- "one-minus-src",
- "src-alpha",
- "one-minus-src-alpha",
- "dst",
- "one-minus-dst",
- "dst-alpha",
- "one-minus-dst-alpha",
- "src-alpha-saturated",
- "constant",
- "one-minus-constant"
-};
-
-enum GPUBlendOperation {
- "add",
- "subtract",
- "reverse-subtract",
- "min",
- "max"
-};
-
-dictionary GPUDepthStencilState {
- required GPUTextureFormat format;
-
- boolean depthWriteEnabled = false;
- GPUCompareFunction depthCompare = "always";
-
- GPUStencilFaceState stencilFront = {};
- GPUStencilFaceState stencilBack = {};
-
- GPUStencilValue stencilReadMask = 0xFFFFFFFF;
- GPUStencilValue stencilWriteMask = 0xFFFFFFFF;
-
- GPUDepthBias depthBias = 0;
- float depthBiasSlopeScale = 0;
- float depthBiasClamp = 0;
-};
-
-dictionary GPUStencilFaceState {
- GPUCompareFunction compare = "always";
- GPUStencilOperation failOp = "keep";
- GPUStencilOperation depthFailOp = "keep";
- GPUStencilOperation passOp = "keep";
-};
-
-enum GPUStencilOperation {
- "keep",
- "zero",
- "replace",
- "invert",
- "increment-clamp",
- "decrement-clamp",
- "increment-wrap",
- "decrement-wrap"
-};
-
-enum GPUIndexFormat {
- "uint16",
- "uint32"
-};
-
-enum GPUVertexFormat {
- "uint8x2",
- "uint8x4",
- "sint8x2",
- "sint8x4",
- "unorm8x2",
- "unorm8x4",
- "snorm8x2",
- "snorm8x4",
- "uint16x2",
- "uint16x4",
- "sint16x2",
- "sint16x4",
- "unorm16x2",
- "unorm16x4",
- "snorm16x2",
- "snorm16x4",
- "float16x2",
- "float16x4",
- "float32",
- "float32x2",
- "float32x3",
- "float32x4",
- "uint32",
- "uint32x2",
- "uint32x3",
- "uint32x4",
- "sint32",
- "sint32x2",
- "sint32x3",
- "sint32x4"
-};
-
-enum GPUVertexStepMode {
- "vertex",
- "instance"
-};
-
-dictionary GPUVertexState : GPUProgrammableStage {
- sequence<GPUVertexBufferLayout?> buffers = [];
-};
-
-dictionary GPUVertexBufferLayout {
- required GPUSize64 arrayStride;
- GPUVertexStepMode stepMode = "vertex";
- required sequence<GPUVertexAttribute> attributes;
-};
-
-dictionary GPUVertexAttribute {
- required GPUVertexFormat format;
- required GPUSize64 offset;
-
- required GPUIndex32 shaderLocation;
-};
-
-dictionary GPUImageDataLayout {
- GPUSize64 offset = 0;
- GPUSize32 bytesPerRow;
- GPUSize32 rowsPerImage;
-};
-
-dictionary GPUImageCopyBuffer : GPUImageDataLayout {
- required GPUBuffer buffer;
-};
-
-dictionary GPUImageCopyTexture {
- required GPUTexture texture;
- GPUIntegerCoordinate mipLevel = 0;
- GPUOrigin3D origin = {};
- GPUTextureAspect aspect = "all";
-};
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPUCommandBuffer {
-};
-GPUCommandBuffer includes GPUObjectBase;
-
-dictionary GPUCommandBufferDescriptor : GPUObjectDescriptorBase {
-};
-
-interface mixin GPUCommandsMixin {
-};
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPUCommandEncoder {
- GPURenderPassEncoder beginRenderPass(GPURenderPassDescriptor descriptor);
- GPUComputePassEncoder beginComputePass(optional GPUComputePassDescriptor descriptor = {});
-
- undefined copyBufferToBuffer(
- GPUBuffer source,
- GPUSize64 sourceOffset,
- GPUBuffer destination,
- GPUSize64 destinationOffset,
- GPUSize64 size);
-
- undefined copyBufferToTexture(
- GPUImageCopyBuffer source,
- GPUImageCopyTexture destination,
- GPUExtent3D copySize);
-
- undefined copyTextureToBuffer(
- GPUImageCopyTexture source,
- GPUImageCopyBuffer destination,
- GPUExtent3D copySize);
-
- undefined copyTextureToTexture(
- GPUImageCopyTexture source,
- GPUImageCopyTexture destination,
- GPUExtent3D copySize);
-
- undefined clearBuffer(
- GPUBuffer buffer,
- optional GPUSize64 offset = 0,
- optional GPUSize64 size);
-
- undefined writeTimestamp(GPUQuerySet querySet, GPUSize32 queryIndex);
-
- undefined resolveQuerySet(
- GPUQuerySet querySet,
- GPUSize32 firstQuery,
- GPUSize32 queryCount,
- GPUBuffer destination,
- GPUSize64 destinationOffset);
-
- GPUCommandBuffer finish(optional GPUCommandBufferDescriptor descriptor = {});
-};
-GPUCommandEncoder includes GPUObjectBase;
-GPUCommandEncoder includes GPUCommandsMixin;
-GPUCommandEncoder includes GPUDebugCommandsMixin;
-
-dictionary GPUCommandEncoderDescriptor : GPUObjectDescriptorBase {
-};
-
-interface mixin GPUBindingCommandsMixin {
- undefined setBindGroup(GPUIndex32 index, GPUBindGroup bindGroup,
- optional sequence<GPUBufferDynamicOffset> dynamicOffsets = []);
-
- undefined setBindGroup(GPUIndex32 index, GPUBindGroup bindGroup,
- Uint32Array dynamicOffsetsData,
- GPUSize64 dynamicOffsetsDataStart,
- GPUSize32 dynamicOffsetsDataLength);
-};
-
-interface mixin GPUDebugCommandsMixin {
- undefined pushDebugGroup(USVString groupLabel);
- undefined popDebugGroup();
- undefined insertDebugMarker(USVString markerLabel);
-};
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPUComputePassEncoder {
- undefined setPipeline(GPUComputePipeline pipeline);
- undefined dispatchWorkgroups(GPUSize32 workgroupCountX, optional GPUSize32 workgroupCountY = 1, optional GPUSize32 workgroupCountZ = 1);
- undefined dispatchWorkgroupsIndirect(GPUBuffer indirectBuffer, GPUSize64 indirectOffset);
-
- undefined beginPipelineStatisticsQuery(GPUQuerySet querySet, GPUSize32 queryIndex);
- undefined endPipelineStatisticsQuery();
-
- undefined writeTimestamp(GPUQuerySet querySet, GPUSize32 queryIndex);
-
- undefined end();
-};
-GPUComputePassEncoder includes GPUObjectBase;
-GPUComputePassEncoder includes GPUCommandsMixin;
-GPUComputePassEncoder includes GPUDebugCommandsMixin;
-GPUComputePassEncoder includes GPUBindingCommandsMixin;
-
-dictionary GPUComputePassDescriptor : GPUObjectDescriptorBase {
-};
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPURenderPassEncoder {
- undefined setViewport(float x, float y,
- float width, float height,
- float minDepth, float maxDepth);
-
- undefined setScissorRect(GPUIntegerCoordinate x, GPUIntegerCoordinate y,
- GPUIntegerCoordinate width, GPUIntegerCoordinate height);
-
- undefined setBlendConstant(GPUColor color);
- undefined setStencilReference(GPUStencilValue reference);
-
- undefined beginOcclusionQuery(GPUSize32 queryIndex);
- undefined endOcclusionQuery();
-
- undefined beginPipelineStatisticsQuery(GPUQuerySet querySet, GPUSize32 queryIndex);
- undefined endPipelineStatisticsQuery();
-
- undefined writeTimestamp(GPUQuerySet querySet, GPUSize32 queryIndex);
-
- undefined executeBundles(sequence<GPURenderBundle> bundles);
- undefined end();
-};
-GPURenderPassEncoder includes GPUObjectBase;
-GPURenderPassEncoder includes GPUCommandsMixin;
-GPURenderPassEncoder includes GPUDebugCommandsMixin;
-GPURenderPassEncoder includes GPUBindingCommandsMixin;
-GPURenderPassEncoder includes GPURenderCommandsMixin;
-
-dictionary GPURenderPassDescriptor : GPUObjectDescriptorBase {
- required sequence<GPURenderPassColorAttachment?> colorAttachments;
- GPURenderPassDepthStencilAttachment depthStencilAttachment;
-};
-
-dictionary GPURenderPassColorAttachment {
- required GPUTextureView view;
- GPUTextureView resolveTarget;
-
- GPUColor clearValue;
- required GPULoadOp loadOp;
- required GPUStoreOp storeOp;
-};
-
-dictionary GPURenderPassDepthStencilAttachment {
- required GPUTextureView view;
-
- float depthClearValue = 0;
- GPULoadOp depthLoadOp;
- GPUStoreOp depthStoreOp;
- boolean depthReadOnly = false;
-
- GPUStencilValue stencilClearValue = 0;
- GPULoadOp stencilLoadOp;
- GPUStoreOp stencilStoreOp;
- boolean stencilReadOnly = false;
-};
-
-enum GPULoadOp {
- "load",
- "clear"
-};
-
-enum GPUStoreOp {
- "store",
- "discard"
-};
-
-dictionary GPURenderPassLayout : GPUObjectDescriptorBase {
- required sequence<GPUTextureFormat?> colorFormats;
- GPUTextureFormat depthStencilFormat;
- GPUSize32 sampleCount = 1;
-};
-
-interface mixin GPURenderCommandsMixin {
- undefined setPipeline(GPURenderPipeline pipeline);
-
- undefined setIndexBuffer(GPUBuffer buffer, GPUIndexFormat indexFormat, optional GPUSize64 offset = 0, optional GPUSize64 size);
- undefined setVertexBuffer(GPUIndex32 slot, GPUBuffer buffer, optional GPUSize64 offset = 0, optional GPUSize64 size);
-
- undefined draw(GPUSize32 vertexCount, optional GPUSize32 instanceCount = 1,
- optional GPUSize32 firstVertex = 0, optional GPUSize32 firstInstance = 0);
- undefined drawIndexed(GPUSize32 indexCount, optional GPUSize32 instanceCount = 1,
- optional GPUSize32 firstIndex = 0,
- optional GPUSignedOffset32 baseVertex = 0,
- optional GPUSize32 firstInstance = 0);
-
- undefined drawIndirect(GPUBuffer indirectBuffer, GPUSize64 indirectOffset);
- undefined drawIndexedIndirect(GPUBuffer indirectBuffer, GPUSize64 indirectOffset);
-};
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPURenderBundle {
-};
-GPURenderBundle includes GPUObjectBase;
-
-dictionary GPURenderBundleDescriptor : GPUObjectDescriptorBase {
-};
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPURenderBundleEncoder {
- GPURenderBundle finish(optional GPURenderBundleDescriptor descriptor = {});
-};
-GPURenderBundleEncoder includes GPUObjectBase;
-GPURenderBundleEncoder includes GPUCommandsMixin;
-GPURenderBundleEncoder includes GPUDebugCommandsMixin;
-GPURenderBundleEncoder includes GPUBindingCommandsMixin;
-GPURenderBundleEncoder includes GPURenderCommandsMixin;
-
-dictionary GPURenderBundleEncoderDescriptor : GPURenderPassLayout {
- boolean depthReadOnly = false;
- boolean stencilReadOnly = false;
-};
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPUQueue {
- undefined submit(sequence<GPUCommandBuffer> commandBuffers);
-
- Promise<undefined> onSubmittedWorkDone();
-
- undefined writeBuffer(
- GPUBuffer buffer,
- GPUSize64 bufferOffset,
- [AllowShared] BufferSource data,
- optional GPUSize64 dataOffset = 0,
- optional GPUSize64 size);
-
- undefined writeTexture(
- GPUImageCopyTexture destination,
- [AllowShared] BufferSource data,
- GPUImageDataLayout dataLayout,
- GPUExtent3D size);
-};
-GPUQueue includes GPUObjectBase;
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPUQuerySet {
- undefined destroy();
-
- readonly attribute GPUQueryType type;
- readonly attribute GPUSize32 count;
-};
-GPUQuerySet includes GPUObjectBase;
-
-dictionary GPUQuerySetDescriptor : GPUObjectDescriptorBase {
- required GPUQueryType type;
- required GPUSize32 count;
- sequence<GPUPipelineStatisticName> pipelineStatistics = [];
-};
-
-enum GPUQueryType {
- "occlusion",
- "pipeline-statistics",
- "timestamp"
-};
-
-enum GPUPipelineStatisticName {
- "vertex-shader-invocations",
- "clipper-invocations",
- "clipper-primitives-out",
- "fragment-shader-invocations",
- "compute-shader-invocations",
-};
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPUCanvasContext {
- readonly attribute (HTMLCanvasElement or OffscreenCanvas) canvas;
-
- undefined configure(GPUCanvasConfiguration configuration);
- undefined unconfigure();
-
- GPUTexture getCurrentTexture();
-};
-
-enum GPUCanvasAlphaMode {
- "opaque",
- "premultiplied"
-};
-
-dictionary GPUCanvasConfiguration {
- required GPUDevice device;
- required GPUTextureFormat format;
- GPUTextureUsageFlags usage = 0x10; // GPUTextureUsage.RENDER_ATTACHMENT
- GPUCanvasAlphaMode alphaMode = "opaque";
- sequence<GPUTextureFormat> viewFormats = [];
-};
-
-enum GPUDeviceLostReason {
- "destroyed"
-};
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPUDeviceLostInfo {
- readonly attribute (GPUDeviceLostReason or undefined) reason;
- readonly attribute DOMString message;
-};
-
-partial interface GPUDevice {
- readonly attribute Promise<GPUDeviceLostInfo> lost;
-};
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPUError {
- readonly attribute DOMString message;
-};
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPUValidationError : GPUError {
- constructor(DOMString message);
-};
-
-[Exposed=(Window, DedicatedWorker), SecureContext]
-interface GPUOutOfMemoryError : GPUError {
- constructor(DOMString message);
-};
-
-enum GPUErrorFilter {
- "validation",
- "out-of-memory"
-};
-
-partial interface GPUDevice {
- undefined pushErrorScope(GPUErrorFilter filter);
- Promise<GPUError?> popErrorScope();
-};
-
-partial interface GPUDevice {
- [Exposed=(Window, DedicatedWorker)]
- attribute EventHandler onuncapturederror;
-};
-
-typedef [EnforceRange] unsigned long GPUBufferDynamicOffset;
-typedef [EnforceRange] unsigned long GPUStencilValue;
-typedef [EnforceRange] unsigned long GPUSampleMask;
-typedef [EnforceRange] long GPUDepthBias;
-
-typedef [EnforceRange] unsigned long long GPUSize64;
-typedef [EnforceRange] unsigned long GPUIntegerCoordinate;
-typedef [EnforceRange] unsigned long GPUIndex32;
-typedef [EnforceRange] unsigned long GPUSize32;
-typedef [EnforceRange] long GPUSignedOffset32;
-
-typedef unsigned long GPUFlagsConstant;
-
-dictionary GPUColorDict {
- required double r;
- required double g;
- required double b;
- required double a;
-};
-typedef (sequence<double> or GPUColorDict) GPUColor;
-
-dictionary GPUOrigin2DDict {
- GPUIntegerCoordinate x = 0;
- GPUIntegerCoordinate y = 0;
-};
-typedef (sequence<GPUIntegerCoordinate> or GPUOrigin2DDict) GPUOrigin2D;
-
-dictionary GPUOrigin3DDict {
- GPUIntegerCoordinate x = 0;
- GPUIntegerCoordinate y = 0;
- GPUIntegerCoordinate z = 0;
-};
-typedef (sequence<GPUIntegerCoordinate> or GPUOrigin3DDict) GPUOrigin3D;
-
-dictionary GPUExtent3DDict {
- required GPUIntegerCoordinate width;
- GPUIntegerCoordinate height = 1;
- GPUIntegerCoordinate depthOrArrayLayers = 1;
-};
-typedef (sequence<GPUIntegerCoordinate> or GPUExtent3DDict) GPUExtent3D;
diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml
index 8fa71cd47..eeee6dad6 100644
--- a/runtime/Cargo.toml
+++ b/runtime/Cargo.toml
@@ -50,7 +50,6 @@ deno_node.workspace = true
deno_tls.workspace = true
deno_url.workspace = true
deno_web.workspace = true
-deno_webgpu.workspace = true
deno_webidl.workspace = true
deno_websocket.workspace = true
deno_webstorage.workspace = true
@@ -80,7 +79,6 @@ deno_node.workspace = true
deno_tls.workspace = true
deno_url.workspace = true
deno_web.workspace = true
-deno_webgpu.workspace = true
deno_webidl.workspace = true
deno_websocket.workspace = true
deno_webstorage.workspace = true
diff --git a/runtime/build.rs b/runtime/build.rs
index 978fdda51..1e79eaf8a 100644
--- a/runtime/build.rs
+++ b/runtime/build.rs
@@ -217,7 +217,6 @@ mod startup_snapshot {
"deno_websocket",
"deno_webstorage",
"deno_crypto",
- "deno_webgpu",
"deno_broadcast_channel",
// FIXME(bartlomieju): this should be reenabled
// "deno_node",
@@ -269,7 +268,6 @@ mod startup_snapshot {
),
deno_webstorage::init_ops_and_esm(None),
deno_crypto::init_ops_and_esm(None),
- deno_webgpu::init_ops_and_esm(false),
deno_broadcast_channel::init_ops_and_esm(
deno_broadcast_channel::InMemoryBroadcastChannel::default(),
false, // No --unstable.
diff --git a/runtime/errors.rs b/runtime/errors.rs
index b26fd9fe3..5618c07ed 100644
--- a/runtime/errors.rs
+++ b/runtime/errors.rs
@@ -154,7 +154,6 @@ pub fn get_nix_error_class(error: &nix::Error) -> &'static str {
pub fn get_error_class_name(e: &AnyError) -> Option<&'static str> {
deno_core::error::get_custom_error_class(e)
- .or_else(|| deno_webgpu::error::get_error_class_name(e))
.or_else(|| deno_web::get_error_class_name(e))
.or_else(|| deno_webstorage::get_not_supported_error_class_name(e))
.or_else(|| deno_websocket::get_network_error_class_name(e))
diff --git a/runtime/js/98_global_scope.js b/runtime/js/98_global_scope.js
index 67ec9d26a..911db65cb 100644
--- a/runtime/js/98_global_scope.js
+++ b/runtime/js/98_global_scope.js
@@ -24,7 +24,6 @@ import * as urlPattern from "ext:deno_url/01_urlpattern.js";
import * as headers from "ext:deno_fetch/20_headers.js";
import * as streams from "ext:deno_web/06_streams.js";
import * as fileReader from "ext:deno_web/10_filereader.js";
-import * as webgpu from "ext:deno_webgpu/01_webgpu.js";
import * as webSocket from "ext:deno_websocket/01_websocket.js";
import * as webSocketStream from "ext:deno_websocket/02_websocketstream.js";
import * as broadcastChannel from "ext:deno_broadcast_channel/01_broadcast_channel.js";
@@ -142,40 +141,6 @@ const windowOrWorkerGlobalScope = {
const unstableWindowOrWorkerGlobalScope = {
BroadcastChannel: util.nonEnumerable(broadcastChannel.BroadcastChannel),
WebSocketStream: util.nonEnumerable(webSocketStream.WebSocketStream),
-
- GPU: util.nonEnumerable(webgpu.GPU),
- GPUAdapter: util.nonEnumerable(webgpu.GPUAdapter),
- GPUAdapterInfo: util.nonEnumerable(webgpu.GPUAdapterInfo),
- GPUSupportedLimits: util.nonEnumerable(webgpu.GPUSupportedLimits),
- GPUSupportedFeatures: util.nonEnumerable(webgpu.GPUSupportedFeatures),
- GPUDeviceLostInfo: util.nonEnumerable(webgpu.GPUDeviceLostInfo),
- GPUDevice: util.nonEnumerable(webgpu.GPUDevice),
- GPUQueue: util.nonEnumerable(webgpu.GPUQueue),
- GPUBuffer: util.nonEnumerable(webgpu.GPUBuffer),
- GPUBufferUsage: util.nonEnumerable(webgpu.GPUBufferUsage),
- GPUMapMode: util.nonEnumerable(webgpu.GPUMapMode),
- GPUTexture: util.nonEnumerable(webgpu.GPUTexture),
- GPUTextureUsage: util.nonEnumerable(webgpu.GPUTextureUsage),
- GPUTextureView: util.nonEnumerable(webgpu.GPUTextureView),
- GPUSampler: util.nonEnumerable(webgpu.GPUSampler),
- GPUBindGroupLayout: util.nonEnumerable(webgpu.GPUBindGroupLayout),
- GPUPipelineLayout: util.nonEnumerable(webgpu.GPUPipelineLayout),
- GPUBindGroup: util.nonEnumerable(webgpu.GPUBindGroup),
- GPUShaderModule: util.nonEnumerable(webgpu.GPUShaderModule),
- GPUShaderStage: util.nonEnumerable(webgpu.GPUShaderStage),
- GPUComputePipeline: util.nonEnumerable(webgpu.GPUComputePipeline),
- GPURenderPipeline: util.nonEnumerable(webgpu.GPURenderPipeline),
- GPUColorWrite: util.nonEnumerable(webgpu.GPUColorWrite),
- GPUCommandEncoder: util.nonEnumerable(webgpu.GPUCommandEncoder),
- GPURenderPassEncoder: util.nonEnumerable(webgpu.GPURenderPassEncoder),
- GPUComputePassEncoder: util.nonEnumerable(webgpu.GPUComputePassEncoder),
- GPUCommandBuffer: util.nonEnumerable(webgpu.GPUCommandBuffer),
- GPURenderBundleEncoder: util.nonEnumerable(webgpu.GPURenderBundleEncoder),
- GPURenderBundle: util.nonEnumerable(webgpu.GPURenderBundle),
- GPUQuerySet: util.nonEnumerable(webgpu.GPUQuerySet),
- GPUError: util.nonEnumerable(webgpu.GPUError),
- GPUOutOfMemoryError: util.nonEnumerable(webgpu.GPUOutOfMemoryError),
- GPUValidationError: util.nonEnumerable(webgpu.GPUValidationError),
};
class Navigator {
@@ -205,14 +170,6 @@ function setLanguage(val) {
}
ObjectDefineProperties(Navigator.prototype, {
- gpu: {
- configurable: true,
- enumerable: true,
- get() {
- webidl.assertBranded(this, NavigatorPrototype);
- return webgpu.gpu;
- },
- },
hardwareConcurrency: {
configurable: true,
enumerable: true,
@@ -261,14 +218,6 @@ class WorkerNavigator {
const workerNavigator = webidl.createBranded(WorkerNavigator);
ObjectDefineProperties(WorkerNavigator.prototype, {
- gpu: {
- configurable: true,
- enumerable: true,
- get() {
- webidl.assertBranded(this, WorkerNavigatorPrototype);
- return webgpu.gpu;
- },
- },
hardwareConcurrency: {
configurable: true,
enumerable: true,
diff --git a/runtime/lib.rs b/runtime/lib.rs
index 97034bca9..f55833831 100644
--- a/runtime/lib.rs
+++ b/runtime/lib.rs
@@ -17,7 +17,6 @@ pub use deno_node;
pub use deno_tls;
pub use deno_url;
pub use deno_web;
-pub use deno_webgpu;
pub use deno_webidl;
pub use deno_websocket;
pub use deno_webstorage;
diff --git a/runtime/web_worker.rs b/runtime/web_worker.rs
index 5874d2aac..b6caba194 100644
--- a/runtime/web_worker.rs
+++ b/runtime/web_worker.rs
@@ -411,7 +411,6 @@ impl WebWorker {
),
deno_webstorage::init_ops(None).disable(),
deno_crypto::init_ops(options.seed),
- deno_webgpu::init_ops(unstable),
deno_broadcast_channel::init_ops(
options.broadcast_channel.clone(),
unstable,
diff --git a/runtime/worker.rs b/runtime/worker.rs
index f5289ca35..b7c05f7e1 100644
--- a/runtime/worker.rs
+++ b/runtime/worker.rs
@@ -231,7 +231,6 @@ impl MainWorker {
),
deno_webstorage::init_ops(options.origin_storage_dir.clone()),
deno_crypto::init_ops(options.seed),
- deno_webgpu::init_ops(unstable),
deno_broadcast_channel::init_ops(
options.broadcast_channel.clone(),
unstable,
diff --git a/test_util/src/lib.rs b/test_util/src/lib.rs
index 23cf6a026..7b88b0a69 100644
--- a/test_util/src/lib.rs
+++ b/test_util/src/lib.rs
@@ -1474,7 +1474,7 @@ async fn wrap_client_auth_https_server() {
}
Err(e) => {
- eprintln!("https-client-auth accept error: {:?}", e);
+ eprintln!("https-client-auth accept error: {e:?}");
yield Err(e);
}
}
diff --git a/tools/README.md b/tools/README.md
index e88f8d892..0c9607380 100644
--- a/tools/README.md
+++ b/tools/README.md
@@ -60,19 +60,6 @@ Tip: the `[bench_filter]` argument doesn't have to be an exact bench name, you
can use a shorthand or a partial match to profile a group of benches, e.g:
`./tools/flamebench.js de v8`
-## wgpu_sync.js
-
-`wgpu_sync.js` streamlines updating `deno_webgpu` from
-[gfx-rs/wgpu](https://github.com/gfx-rs/wgpu/).
-
-It essentially vendors the `deno_webgpu` tree with a few minor patches applied
-on top, somewhat similar to `git subtree`.
-
-1. Update `COMMIT` or `V_WGPU` in `./tools/wgpu_sync.js`
-2. Run `./tools/wgpu_sync.js`
-3. Double check changes, possibly patch
-4. Commit & send a PR with the updates
-
## copyright_checker.js
`copyright_checker.js` is used to check copyright headers in the codebase.
diff --git a/tools/wgpu_sync.js b/tools/wgpu_sync.js
deleted file mode 100755
index 31475bb37..000000000
--- a/tools/wgpu_sync.js
+++ /dev/null
@@ -1,115 +0,0 @@
-#!/usr/bin/env -S deno run --unstable --allow-read --allow-write --allow-run
-// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
-
-import { join, ROOT_PATH } from "./util.js";
-
-const COMMIT = "659f6977051345e4e06ab4832c6f7d268f25a1ad";
-const REPO = "gfx-rs/wgpu";
-const V_WGPU = "0.15";
-const TARGET_DIR = join(ROOT_PATH, "ext", "webgpu");
-
-async function bash(subcmd, opts = {}) {
- const { success, code } = await new Deno.Command("bash", {
- ...opts,
- args: ["-c", subcmd],
- stdout: "inherit",
- sdterr: "inherit",
- }).output();
-
- // Exit process on failure
- if (!success) {
- Deno.exit(code);
- }
-}
-
-async function clearTargetDir() {
- await bash(`rm -r ${TARGET_DIR}/*`);
-}
-
-async function checkoutUpstream() {
- // Path of deno_webgpu inside the TAR
- const tarPrefix = `${REPO.replace("/", "-")}-${
- COMMIT.slice(0, 7)
- }/deno_webgpu/`;
- const cmd =
- `curl -L https://api.github.com/repos/${REPO}/tarball/${COMMIT} | tar -C '${TARGET_DIR}' -xzvf - --strip=2 '${tarPrefix}'`;
- // console.log(cmd);
- await bash(cmd);
-}
-
-async function denoWebgpuVersion() {
- const coreCargo = join(ROOT_PATH, "Cargo.toml");
- const contents = await Deno.readTextFile(coreCargo);
- return contents.match(
- /^deno_webgpu = { version = "(\d+\.\d+\.\d+)", path = ".\/ext\/webgpu" }$/m,
- )[1];
-}
-
-async function patchFile(path, patcher) {
- const data = await Deno.readTextFile(path);
- const patched = patcher(data);
- await Deno.writeTextFile(path, patched);
-}
-
-async function patchCargo() {
- const vDenoWebgpu = await denoWebgpuVersion();
- await patchFile(
- join(TARGET_DIR, "Cargo.toml"),
- (data) =>
- data
- .replace(/^version = .*/m, `version = "${vDenoWebgpu}"`)
- .replace(
- /^repository.workspace = true/m,
- `repository = "https://github.com/gfx-rs/wgpu"`,
- )
- .replace(
- /^serde = { workspace = true, features = ["derive"] }/m,
- `serde.workspace = true`,
- )
- .replace(
- /^tokio = { workspace = true, features = ["full"] }/m,
- `tokio.workspace = true`,
- ),
- );
-
- await patchFile(
- join(ROOT_PATH, "Cargo.toml"),
- (data) =>
- data
- .replace(/^wgpu-core = .*/m, `wgpu-core = "${V_WGPU}"`)
- .replace(/^wgpu-types = .*/m, `wgpu-types = "${V_WGPU}"`),
- );
-}
-
-async function patchSrcLib() {
- await patchFile(
- join(TARGET_DIR, "src", "lib.rs"),
- (data) =>
- data.replace(
- `prefix "ext:deno_webgpu",`,
- `prefix "ext:deno_webgpu",`,
- ),
- );
-}
-
-async function patchSurface() {
- await patchFile(
- join(TARGET_DIR, "src", "surface.rs"),
- (data) =>
- data.replace(
- `prefix "ext:deno_webgpu",`,
- `prefix "ext:deno_webgpu",`,
- ),
- );
-}
-
-async function main() {
- await clearTargetDir();
- await checkoutUpstream();
- await patchCargo();
- await patchSrcLib();
- await patchSurface();
- await bash(join(ROOT_PATH, "tools", "format.js"));
-}
-
-await main();