Copy disabled (too large)
Download .txt
Showing preview only (16,149K chars total). Download the full file to get everything.
Repository: gfx-rs/wgpu
Branch: trunk
Commit: 0ca8ba04acbc
Files: 2164
Total size: 17.7 MB
Directory structure:
gitextract_6vnxf1s_/
├── .cargo/
│ └── config.toml
├── .claude/
│ └── skills/
│ ├── cts-triage/
│ │ └── SKILL.md
│ └── webgpu-specs/
│ ├── SKILL.md
│ └── download.sh
├── .config/
│ └── nextest.toml
├── .deny.toml
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── config.yml
│ │ ├── feature_request.md
│ │ └── other.md
│ ├── actions/
│ │ ├── install-agility-sdk/
│ │ │ └── action.yml
│ │ ├── install-dxc/
│ │ │ └── action.yml
│ │ ├── install-mesa/
│ │ │ └── action.yml
│ │ ├── install-vulkan-sdk/
│ │ │ └── action.yml
│ │ └── install-warp/
│ │ └── action.yml
│ ├── pull_request_template.md
│ └── workflows/
│ ├── changelog.yml
│ ├── ci.yml
│ ├── cts.yml
│ ├── docs.yml
│ ├── generate.yml
│ ├── lazy.yml
│ ├── publish.yml
│ └── shaders.yml
├── .gitignore
├── .prettierignore
├── AGENTS.md
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Cargo.toml
├── GOVERNANCE.md
├── LICENSE.APACHE
├── LICENSE.MIT
├── README.md
├── SECURITY.md
├── benches/
│ ├── Cargo.toml
│ ├── README.md
│ ├── benches/
│ │ └── wgpu-benchmark/
│ │ ├── bind_groups.rs
│ │ ├── computepass-bindless.wgsl
│ │ ├── computepass.rs
│ │ ├── computepass.wgsl
│ │ ├── main.rs
│ │ ├── renderpass-bindless.wgsl
│ │ ├── renderpass.rs
│ │ ├── renderpass.wgsl
│ │ ├── resource_creation.rs
│ │ └── shader.rs
│ └── src/
│ ├── context.rs
│ ├── file.rs
│ ├── iter.rs
│ ├── lib.rs
│ └── print.rs
├── clippy.toml
├── codecov.yml
├── cts_runner/
│ ├── Cargo.toml
│ ├── README.md
│ ├── examples/
│ │ └── hello-compute.js
│ ├── fail.lst
│ ├── revision.txt
│ ├── skip.lst
│ ├── src/
│ │ ├── bootstrap.js
│ │ └── main.rs
│ ├── test.lst
│ └── tests/
│ └── integration.rs
├── deno_webgpu/
│ ├── 00_init.js
│ ├── 01_webgpu.js
│ ├── 02_surface.js
│ ├── Cargo.toml
│ ├── LICENSE.md
│ ├── README.md
│ ├── adapter.rs
│ ├── bind_group.rs
│ ├── bind_group_layout.rs
│ ├── buffer.rs
│ ├── byow.rs
│ ├── command_buffer.rs
│ ├── command_encoder.rs
│ ├── compute_pass.rs
│ ├── compute_pipeline.rs
│ ├── device.rs
│ ├── error.rs
│ ├── lib.rs
│ ├── pipeline_layout.rs
│ ├── query_set.rs
│ ├── queue.rs
│ ├── render_bundle.rs
│ ├── render_pass.rs
│ ├── render_pipeline.rs
│ ├── rustfmt.toml
│ ├── sampler.rs
│ ├── shader.rs
│ ├── surface.rs
│ ├── texture.rs
│ └── webidl.rs
├── docs/
│ ├── api-specs/
│ │ ├── cooperative_matrix.md
│ │ ├── mesh_shading.md
│ │ └── ray_tracing.md
│ ├── big-picture.xml
│ ├── broadcast_license.nu
│ ├── release-checklist.md
│ ├── review-checklist.md
│ └── testing.md
├── examples/
│ ├── README.md
│ ├── bug-repro/
│ │ └── 01_texture_atomic_bug/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── main.rs
│ │ └── shader.wgsl
│ ├── features/
│ │ ├── Cargo.toml
│ │ ├── src/
│ │ │ ├── big_compute_buffers/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ ├── shader.wgsl
│ │ │ │ └── tests.rs
│ │ │ ├── boids/
│ │ │ │ ├── README.md
│ │ │ │ ├── compute.wgsl
│ │ │ │ ├── draw.wgsl
│ │ │ │ └── mod.rs
│ │ │ ├── bunnymark/
│ │ │ │ ├── README.md
│ │ │ │ └── mod.rs
│ │ │ ├── conservative_raster/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ ├── triangle_and_lines.wgsl
│ │ │ │ └── upscale.wgsl
│ │ │ ├── cooperative_matrix/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ ├── shader.wgsl
│ │ │ │ ├── shader_f16_16x16.wgsl
│ │ │ │ └── tests.rs
│ │ │ ├── cube/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── framework.rs
│ │ │ ├── hello_synchronization/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ ├── shaders.wgsl
│ │ │ │ └── tests.rs
│ │ │ ├── hello_triangle/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── hello_windows/
│ │ │ │ ├── README.md
│ │ │ │ └── mod.rs
│ │ │ ├── hello_workgroups/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── lib.rs
│ │ │ ├── main.rs
│ │ │ ├── mesh_shader/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ ├── shader.hlsl
│ │ │ │ ├── shader.metal
│ │ │ │ └── shader.wgsl
│ │ │ ├── mipmap/
│ │ │ │ ├── README.md
│ │ │ │ ├── blit.wgsl
│ │ │ │ ├── draw.wgsl
│ │ │ │ └── mod.rs
│ │ │ ├── msaa_line/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── multiple_render_targets/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── multiview/
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── ray_cube_compute/
│ │ │ │ ├── README.md
│ │ │ │ ├── blit.wgsl
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── ray_cube_fragment/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── ray_cube_normals/
│ │ │ │ ├── README.md
│ │ │ │ ├── blit.wgsl
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── ray_scene/
│ │ │ │ ├── cube.mtl
│ │ │ │ ├── cube.obj
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── ray_shadows/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── ray_traced_triangle/
│ │ │ │ ├── README.md
│ │ │ │ ├── blit.wgsl
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── render_to_texture/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── render_with_compute/
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── repeated_compute/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── shadow/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── skybox/
│ │ │ │ ├── README.md
│ │ │ │ ├── images/
│ │ │ │ │ ├── astc.ktx2
│ │ │ │ │ ├── bc7.ktx2
│ │ │ │ │ ├── etc2.ktx2
│ │ │ │ │ ├── generation.bash
│ │ │ │ │ └── rgba8.ktx2
│ │ │ │ ├── mod.rs
│ │ │ │ ├── models/
│ │ │ │ │ ├── rustacean-3d.mtl
│ │ │ │ │ └── rustacean-3d.obj
│ │ │ │ └── shader.wgsl
│ │ │ ├── srgb_blend/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── stencil_triangles/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── storage_texture/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── texture_arrays/
│ │ │ │ ├── README.md
│ │ │ │ ├── indexing.wgsl
│ │ │ │ ├── mod.rs
│ │ │ │ └── non_uniform_indexing.wgsl
│ │ │ ├── timestamp_queries/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── uniform_values/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── utils.rs
│ │ │ └── water/
│ │ │ ├── README.md
│ │ │ ├── mod.rs
│ │ │ ├── point_gen.rs
│ │ │ ├── terrain.wgsl
│ │ │ └── water.wgsl
│ │ └── web-static/
│ │ └── index.html
│ └── standalone/
│ ├── 01_hello_compute/
│ │ ├── Cargo.toml
│ │ ├── cargo-generate.toml
│ │ └── src/
│ │ ├── main.rs
│ │ └── shader.wgsl
│ ├── 02_hello_window/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ └── main.rs
│ └── custom_backend/
│ ├── Cargo.toml
│ └── src/
│ ├── custom.rs
│ └── main.rs
├── lock-analyzer/
│ ├── Cargo.toml
│ └── src/
│ └── main.rs
├── naga/
│ ├── .cargo/
│ │ └── config.toml
│ ├── .gitattributes
│ ├── .gitignore
│ ├── CHANGELOG.md
│ ├── Cargo.toml
│ ├── LICENSE.APACHE
│ ├── LICENSE.MIT
│ ├── README.md
│ ├── build.rs
│ ├── fuzz/
│ │ ├── .gitignore
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── fuzz_targets/
│ │ ├── glsl_parser.rs
│ │ ├── ir.rs
│ │ ├── spv_parser.rs
│ │ └── wgsl_parser.rs
│ ├── hlsl-snapshots/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ └── lib.rs
│ ├── src/
│ │ ├── arena/
│ │ │ ├── handle.rs
│ │ │ ├── handle_set.rs
│ │ │ ├── handlevec.rs
│ │ │ ├── mod.rs
│ │ │ ├── range.rs
│ │ │ └── unique_arena.rs
│ │ ├── back/
│ │ │ ├── continue_forward.rs
│ │ │ ├── dot/
│ │ │ │ └── mod.rs
│ │ │ ├── glsl/
│ │ │ │ ├── conv.rs
│ │ │ │ ├── features.rs
│ │ │ │ ├── keywords.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── writer.rs
│ │ │ ├── hlsl/
│ │ │ │ ├── conv.rs
│ │ │ │ ├── help.rs
│ │ │ │ ├── keywords.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── ray.rs
│ │ │ │ ├── storage.rs
│ │ │ │ └── writer.rs
│ │ │ ├── mod.rs
│ │ │ ├── msl/
│ │ │ │ ├── keywords.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── sampler.rs
│ │ │ │ └── writer.rs
│ │ │ ├── pipeline_constants.rs
│ │ │ ├── spv/
│ │ │ │ ├── block.rs
│ │ │ │ ├── f16_polyfill.rs
│ │ │ │ ├── helpers.rs
│ │ │ │ ├── image.rs
│ │ │ │ ├── index.rs
│ │ │ │ ├── instructions.rs
│ │ │ │ ├── layout.rs
│ │ │ │ ├── mesh_shader.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── ray/
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ └── query.rs
│ │ │ │ ├── reclaimable.rs
│ │ │ │ ├── selection.rs
│ │ │ │ ├── subgroup.rs
│ │ │ │ └── writer.rs
│ │ │ └── wgsl/
│ │ │ ├── mod.rs
│ │ │ ├── polyfill/
│ │ │ │ ├── inverse/
│ │ │ │ │ ├── inverse_2x2_f16.wgsl
│ │ │ │ │ ├── inverse_2x2_f32.wgsl
│ │ │ │ │ ├── inverse_3x3_f16.wgsl
│ │ │ │ │ ├── inverse_3x3_f32.wgsl
│ │ │ │ │ ├── inverse_4x4_f16.wgsl
│ │ │ │ │ └── inverse_4x4_f32.wgsl
│ │ │ │ └── mod.rs
│ │ │ └── writer.rs
│ │ ├── common/
│ │ │ ├── diagnostic_debug.rs
│ │ │ ├── diagnostic_display.rs
│ │ │ ├── mod.rs
│ │ │ ├── predeclared.rs
│ │ │ └── wgsl/
│ │ │ ├── diagnostics.rs
│ │ │ ├── mod.rs
│ │ │ ├── to_wgsl.rs
│ │ │ └── types.rs
│ │ ├── compact/
│ │ │ ├── expressions.rs
│ │ │ ├── functions.rs
│ │ │ ├── handle_set_map.rs
│ │ │ ├── mod.rs
│ │ │ ├── statements.rs
│ │ │ └── types.rs
│ │ ├── diagnostic_filter.rs
│ │ ├── error.rs
│ │ ├── front/
│ │ │ ├── atomic_upgrade.rs
│ │ │ ├── glsl/
│ │ │ │ ├── ast.rs
│ │ │ │ ├── builtins.rs
│ │ │ │ ├── context.rs
│ │ │ │ ├── error.rs
│ │ │ │ ├── functions.rs
│ │ │ │ ├── lex.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── offset.rs
│ │ │ │ ├── parser/
│ │ │ │ │ ├── declarations.rs
│ │ │ │ │ ├── expressions.rs
│ │ │ │ │ ├── functions.rs
│ │ │ │ │ └── types.rs
│ │ │ │ ├── parser.rs
│ │ │ │ ├── parser_tests.rs
│ │ │ │ ├── token.rs
│ │ │ │ ├── types.rs
│ │ │ │ └── variables.rs
│ │ │ ├── interpolator.rs
│ │ │ ├── mod.rs
│ │ │ ├── spv/
│ │ │ │ ├── convert.rs
│ │ │ │ ├── error.rs
│ │ │ │ ├── function.rs
│ │ │ │ ├── image.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── next_block.rs
│ │ │ │ └── null.rs
│ │ │ ├── type_gen.rs
│ │ │ └── wgsl/
│ │ │ ├── error.rs
│ │ │ ├── index.rs
│ │ │ ├── lower/
│ │ │ │ ├── construction.rs
│ │ │ │ ├── conversion.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── template_list.rs
│ │ │ ├── mod.rs
│ │ │ ├── parse/
│ │ │ │ ├── ast.rs
│ │ │ │ ├── conv.rs
│ │ │ │ ├── directive/
│ │ │ │ │ ├── enable_extension.rs
│ │ │ │ │ └── language_extension.rs
│ │ │ │ ├── directive.rs
│ │ │ │ ├── lexer.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── number.rs
│ │ │ └── tests.rs
│ │ ├── ir/
│ │ │ ├── block.rs
│ │ │ └── mod.rs
│ │ ├── keywords/
│ │ │ ├── mod.rs
│ │ │ └── wgsl.rs
│ │ ├── lib.rs
│ │ ├── non_max_u32.rs
│ │ ├── proc/
│ │ │ ├── constant_evaluator.rs
│ │ │ ├── emitter.rs
│ │ │ ├── index.rs
│ │ │ ├── keyword_set.rs
│ │ │ ├── layouter.rs
│ │ │ ├── mod.rs
│ │ │ ├── namer.rs
│ │ │ ├── overloads/
│ │ │ │ ├── any_overload_set.rs
│ │ │ │ ├── constructor_set.rs
│ │ │ │ ├── list.rs
│ │ │ │ ├── mathfunction.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── one_bits_iter.rs
│ │ │ │ ├── regular.rs
│ │ │ │ ├── rule.rs
│ │ │ │ ├── scalar_set.rs
│ │ │ │ └── utils.rs
│ │ │ ├── terminator.rs
│ │ │ ├── type_methods.rs
│ │ │ └── typifier.rs
│ │ ├── racy_lock.rs
│ │ ├── span.rs
│ │ └── valid/
│ │ ├── analyzer.rs
│ │ ├── compose.rs
│ │ ├── expression.rs
│ │ ├── function.rs
│ │ ├── handles.rs
│ │ ├── interface.rs
│ │ ├── mod.rs
│ │ └── type.rs
│ ├── tests/
│ │ ├── in/
│ │ │ ├── glsl/
│ │ │ │ ├── 210-bevy-2d-shader.frag
│ │ │ │ ├── 210-bevy-2d-shader.vert
│ │ │ │ ├── 210-bevy-shader.vert
│ │ │ │ ├── 246-collatz.comp
│ │ │ │ ├── 277-casting.frag
│ │ │ │ ├── 280-matrix-cast.frag
│ │ │ │ ├── 484-preprocessor-if.frag
│ │ │ │ ├── 5246-dual-iteration.frag
│ │ │ │ ├── 800-out-of-bounds-panic.toml
│ │ │ │ ├── 800-out-of-bounds-panic.vert
│ │ │ │ ├── 896-push-constant.frag
│ │ │ │ ├── 896-push-constant.toml
│ │ │ │ ├── 900-implicit-conversions.frag
│ │ │ │ ├── 901-lhs-field-select.frag
│ │ │ │ ├── 931-constant-emitting.frag
│ │ │ │ ├── 932-for-loop-if.frag
│ │ │ │ ├── anonymous-entry-point-type.frag
│ │ │ │ ├── bevy-pbr.frag
│ │ │ │ ├── bevy-pbr.vert
│ │ │ │ ├── bits.frag
│ │ │ │ ├── bits.toml
│ │ │ │ ├── bool-select.frag
│ │ │ │ ├── buffer.frag
│ │ │ │ ├── clamp-splat.vert
│ │ │ │ ├── const-global-swizzle.frag
│ │ │ │ ├── constant-array-size.frag
│ │ │ │ ├── declarations.frag
│ │ │ │ ├── double-math-functions.frag
│ │ │ │ ├── double-math-functions.toml
│ │ │ │ ├── dual-source-blending.frag
│ │ │ │ ├── dual-source-blending.toml
│ │ │ │ ├── expressions.frag
│ │ │ │ ├── f16-glsl.comp
│ │ │ │ ├── f16-glsl.toml
│ │ │ │ ├── fma.frag
│ │ │ │ ├── functions_call.frag
│ │ │ │ ├── global-constant-array.frag
│ │ │ │ ├── images.frag
│ │ │ │ ├── inverse-polyfill.frag
│ │ │ │ ├── local-var-init-in-loop.comp
│ │ │ │ ├── long-form-matrix.frag
│ │ │ │ ├── math-functions.frag
│ │ │ │ ├── multipart-for-loop.frag
│ │ │ │ ├── prepostfix.frag
│ │ │ │ ├── quad_glsl.frag
│ │ │ │ ├── quad_glsl.vert
│ │ │ │ ├── sampler-functions.frag
│ │ │ │ ├── samplers.frag
│ │ │ │ ├── spec-constant.frag
│ │ │ │ ├── spec-constant.toml
│ │ │ │ ├── statements.frag
│ │ │ │ ├── variations.frag
│ │ │ │ ├── variations.toml
│ │ │ │ ├── vector-functions.frag
│ │ │ │ └── vector-functions.toml
│ │ │ ├── spv/
│ │ │ │ ├── 8151-barrier-reorder.spvasm
│ │ │ │ ├── atomic_compare_exchange.spvasm
│ │ │ │ ├── atomic_exchange.spvasm
│ │ │ │ ├── atomic_global_struct_field_vertex.spvasm
│ │ │ │ ├── atomic_i_add_sub.spvasm
│ │ │ │ ├── atomic_i_decrement.spvasm
│ │ │ │ ├── atomic_i_increment.spvasm
│ │ │ │ ├── atomic_load_and_store.spvasm
│ │ │ │ ├── barrier.spvasm
│ │ │ │ ├── barrier.toml
│ │ │ │ ├── binding-arrays.dynamic.spvasm
│ │ │ │ ├── binding-arrays.dynamic.toml
│ │ │ │ ├── binding-arrays.runtime.slang
│ │ │ │ ├── binding-arrays.runtime.spvasm
│ │ │ │ ├── binding-arrays.runtime.toml
│ │ │ │ ├── binding-arrays.static.spvasm
│ │ │ │ ├── binding-arrays.static.toml
│ │ │ │ ├── builtin-accessed-outside-entrypoint.spvasm
│ │ │ │ ├── builtin-accessed-outside-entrypoint.toml
│ │ │ │ ├── degrees.spvasm
│ │ │ │ ├── degrees.toml
│ │ │ │ ├── do-while.spvasm
│ │ │ │ ├── do-while.toml
│ │ │ │ ├── dual-source-blending.spvasm
│ │ │ │ ├── dual-source-blending.toml
│ │ │ │ ├── empty-global-name.spvasm
│ │ │ │ ├── empty-global-name.toml
│ │ │ │ ├── f16-spv.comp
│ │ │ │ ├── f16-spv.spvasm
│ │ │ │ ├── f16-spv.toml
│ │ │ │ ├── fetch_depth.spvasm
│ │ │ │ ├── fetch_depth.toml
│ │ │ │ ├── gather-cmp.slang
│ │ │ │ ├── gather-cmp.spvasm
│ │ │ │ ├── gather-cmp.toml
│ │ │ │ ├── gather.slang
│ │ │ │ ├── gather.spvasm
│ │ │ │ ├── gather.toml
│ │ │ │ ├── inv-hyperbolic-trig-functions.spvasm
│ │ │ │ ├── inv-hyperbolic-trig-functions.toml
│ │ │ │ ├── load-ms-texture.slang
│ │ │ │ ├── load-ms-texture.spvasm
│ │ │ │ ├── load-ms-texture.toml
│ │ │ │ ├── non-semantic-debug.spvasm
│ │ │ │ ├── per-vertex.spvasm
│ │ │ │ ├── per-vertex.toml
│ │ │ │ ├── quad-vert.spvasm
│ │ │ │ ├── quad-vert.toml
│ │ │ │ ├── shadow.spvasm
│ │ │ │ ├── shadow.toml
│ │ │ │ ├── spec-constants-issue-5598.spvasm
│ │ │ │ ├── spec-constants-issue-5598.toml
│ │ │ │ ├── spec-constants.spvasm
│ │ │ │ ├── spec-constants.toml
│ │ │ │ ├── spec-constants.vert
│ │ │ │ ├── subgroup-barrier.spvasm
│ │ │ │ ├── subgroup-barrier.toml
│ │ │ │ ├── subgroup-operations-s.spvasm
│ │ │ │ ├── subgroup-operations-s.toml
│ │ │ │ ├── unnamed-gl-per-vertex.spvasm
│ │ │ │ └── unnamed-gl-per-vertex.toml
│ │ │ └── wgsl/
│ │ │ ├── 6220-break-from-loop.toml
│ │ │ ├── 6220-break-from-loop.wgsl
│ │ │ ├── 6438-conflicting-idents.wgsl
│ │ │ ├── 6772-unpack-expr-accesses.wgsl
│ │ │ ├── 7048-multiple-dynamic-1.toml
│ │ │ ├── 7048-multiple-dynamic-1.wgsl
│ │ │ ├── 7048-multiple-dynamic-2.toml
│ │ │ ├── 7048-multiple-dynamic-2.wgsl
│ │ │ ├── 7048-multiple-dynamic-3.toml
│ │ │ ├── 7048-multiple-dynamic-3.wgsl
│ │ │ ├── 7995-unicode-idents.wgsl
│ │ │ ├── 8820-multiple-local-invocation-index-id.wgsl
│ │ │ ├── 9105-primitive-index-ordering.toml
│ │ │ ├── 9105-primitive-index-ordering.wgsl
│ │ │ ├── abstract-types-atomic.toml
│ │ │ ├── abstract-types-atomic.wgsl
│ │ │ ├── abstract-types-builtins.toml
│ │ │ ├── abstract-types-builtins.wgsl
│ │ │ ├── abstract-types-const.toml
│ │ │ ├── abstract-types-const.wgsl
│ │ │ ├── abstract-types-function-calls.toml
│ │ │ ├── abstract-types-function-calls.wgsl
│ │ │ ├── abstract-types-let.toml
│ │ │ ├── abstract-types-let.wgsl
│ │ │ ├── abstract-types-operators.toml
│ │ │ ├── abstract-types-operators.wgsl
│ │ │ ├── abstract-types-return.wgsl
│ │ │ ├── abstract-types-texture.toml
│ │ │ ├── abstract-types-texture.wgsl
│ │ │ ├── abstract-types-var.toml
│ │ │ ├── abstract-types-var.wgsl
│ │ │ ├── access.toml
│ │ │ ├── access.wgsl
│ │ │ ├── aliased-ray-query.toml
│ │ │ ├── aliased-ray-query.wgsl
│ │ │ ├── array-in-ctor.wgsl
│ │ │ ├── array-in-function-return-type.wgsl
│ │ │ ├── atomicCompareExchange-int64.toml
│ │ │ ├── atomicCompareExchange-int64.wgsl
│ │ │ ├── atomicCompareExchange.toml
│ │ │ ├── atomicCompareExchange.wgsl
│ │ │ ├── atomicOps-float32.toml
│ │ │ ├── atomicOps-float32.wgsl
│ │ │ ├── atomicOps-int64-min-max.toml
│ │ │ ├── atomicOps-int64-min-max.wgsl
│ │ │ ├── atomicOps-int64.toml
│ │ │ ├── atomicOps-int64.wgsl
│ │ │ ├── atomicOps.wgsl
│ │ │ ├── atomicTexture-int64.toml
│ │ │ ├── atomicTexture-int64.wgsl
│ │ │ ├── atomicTexture.toml
│ │ │ ├── atomicTexture.wgsl
│ │ │ ├── barycentrics.toml
│ │ │ ├── barycentrics.wgsl
│ │ │ ├── binding-arrays.toml
│ │ │ ├── binding-arrays.wgsl
│ │ │ ├── binding-buffer-arrays.toml
│ │ │ ├── binding-buffer-arrays.wgsl
│ │ │ ├── bitcast.wgsl
│ │ │ ├── bits-optimized-msl.toml
│ │ │ ├── bits-optimized-msl.wgsl
│ │ │ ├── bits.toml
│ │ │ ├── bits.wgsl
│ │ │ ├── bits_downlevel.toml
│ │ │ ├── bits_downlevel.wgsl
│ │ │ ├── bits_downlevel_webgl.toml
│ │ │ ├── bits_downlevel_webgl.wgsl
│ │ │ ├── boids.toml
│ │ │ ├── boids.wgsl
│ │ │ ├── bounds-check-dynamic-buffer.toml
│ │ │ ├── bounds-check-dynamic-buffer.wgsl
│ │ │ ├── bounds-check-image-restrict-depth.toml
│ │ │ ├── bounds-check-image-restrict-depth.wgsl
│ │ │ ├── bounds-check-image-restrict.toml
│ │ │ ├── bounds-check-image-restrict.wgsl
│ │ │ ├── bounds-check-image-rzsw-depth.toml
│ │ │ ├── bounds-check-image-rzsw-depth.wgsl
│ │ │ ├── bounds-check-image-rzsw.toml
│ │ │ ├── bounds-check-image-rzsw.wgsl
│ │ │ ├── bounds-check-restrict.toml
│ │ │ ├── bounds-check-restrict.wgsl
│ │ │ ├── bounds-check-zero-atomic.toml
│ │ │ ├── bounds-check-zero-atomic.wgsl
│ │ │ ├── bounds-check-zero.toml
│ │ │ ├── bounds-check-zero.wgsl
│ │ │ ├── break-if.wgsl
│ │ │ ├── clip-distances.toml
│ │ │ ├── clip-distances.wgsl
│ │ │ ├── collatz.toml
│ │ │ ├── collatz.wgsl
│ │ │ ├── const-exprs.wgsl
│ │ │ ├── const_assert.toml
│ │ │ ├── const_assert.wgsl
│ │ │ ├── constructors.wgsl
│ │ │ ├── control-flow.toml
│ │ │ ├── control-flow.wgsl
│ │ │ ├── conversion-float-to-int-no-f64.toml
│ │ │ ├── conversion-float-to-int-no-f64.wgsl
│ │ │ ├── conversion-float-to-int.toml
│ │ │ ├── conversion-float-to-int.wgsl
│ │ │ ├── conversions.wgsl
│ │ │ ├── cooperative-matrix.toml
│ │ │ ├── cooperative-matrix.wgsl
│ │ │ ├── cross.wgsl
│ │ │ ├── cubeArrayShadow.toml
│ │ │ ├── cubeArrayShadow.wgsl
│ │ │ ├── debug-symbol-large-source.toml
│ │ │ ├── debug-symbol-large-source.wgsl
│ │ │ ├── debug-symbol-simple.toml
│ │ │ ├── debug-symbol-simple.wgsl
│ │ │ ├── debug-symbol-terrain.toml
│ │ │ ├── debug-symbol-terrain.wgsl
│ │ │ ├── diagnostic-filter.toml
│ │ │ ├── diagnostic-filter.wgsl
│ │ │ ├── draw-index.toml
│ │ │ ├── draw-index.wgsl
│ │ │ ├── dualsource.toml
│ │ │ ├── dualsource.wgsl
│ │ │ ├── early-depth-test-conservative.toml
│ │ │ ├── early-depth-test-conservative.wgsl
│ │ │ ├── early-depth-test-force.toml
│ │ │ ├── early-depth-test-force.wgsl
│ │ │ ├── empty-if.toml
│ │ │ ├── empty-if.wgsl
│ │ │ ├── empty.wgsl
│ │ │ ├── extra.toml
│ │ │ ├── extra.wgsl
│ │ │ ├── f16-native.toml
│ │ │ ├── f16-native.wgsl
│ │ │ ├── f16-polyfill.toml
│ │ │ ├── f16-polyfill.wgsl
│ │ │ ├── f16.toml
│ │ │ ├── f16.wgsl
│ │ │ ├── f64.toml
│ │ │ ├── f64.wgsl
│ │ │ ├── force_point_size_vertex_shader_webgl.toml
│ │ │ ├── force_point_size_vertex_shader_webgl.wgsl
│ │ │ ├── fragment-output.wgsl
│ │ │ ├── functions-optimized-by-capability.toml
│ │ │ ├── functions-optimized-by-capability.wgsl
│ │ │ ├── functions-optimized-by-version.toml
│ │ │ ├── functions-optimized-by-version.wgsl
│ │ │ ├── functions-unoptimized.toml
│ │ │ ├── functions-unoptimized.wgsl
│ │ │ ├── functions-webgl.toml
│ │ │ ├── functions-webgl.wgsl
│ │ │ ├── functions.wgsl
│ │ │ ├── globals.wgsl
│ │ │ ├── hlsl-keyword.toml
│ │ │ ├── hlsl-keyword.wgsl
│ │ │ ├── image.toml
│ │ │ ├── image.wgsl
│ │ │ ├── index-by-value.toml
│ │ │ ├── index-by-value.wgsl
│ │ │ ├── int64.toml
│ │ │ ├── int64.wgsl
│ │ │ ├── interface.toml
│ │ │ ├── interface.wgsl
│ │ │ ├── interpolate.toml
│ │ │ ├── interpolate.wgsl
│ │ │ ├── interpolate_compat.toml
│ │ │ ├── interpolate_compat.wgsl
│ │ │ ├── invariant.toml
│ │ │ ├── invariant.wgsl
│ │ │ ├── lexical-scopes.toml
│ │ │ ├── lexical-scopes.wgsl
│ │ │ ├── local-const.toml
│ │ │ ├── local-const.wgsl
│ │ │ ├── mat_cx2.toml
│ │ │ ├── mat_cx2.wgsl
│ │ │ ├── mat_cx3.toml
│ │ │ ├── mat_cx3.wgsl
│ │ │ ├── math-functions.toml
│ │ │ ├── math-functions.wgsl
│ │ │ ├── memory-decorations-coherent.toml
│ │ │ ├── memory-decorations-coherent.wgsl
│ │ │ ├── memory-decorations.toml
│ │ │ ├── memory-decorations.wgsl
│ │ │ ├── mesh-shader-empty.toml
│ │ │ ├── mesh-shader-empty.wgsl
│ │ │ ├── mesh-shader-lines.toml
│ │ │ ├── mesh-shader-lines.wgsl
│ │ │ ├── mesh-shader-points.toml
│ │ │ ├── mesh-shader-points.wgsl
│ │ │ ├── mesh-shader.toml
│ │ │ ├── mesh-shader.wgsl
│ │ │ ├── module-scope.toml
│ │ │ ├── module-scope.wgsl
│ │ │ ├── msl-varyings.toml
│ │ │ ├── msl-varyings.wgsl
│ │ │ ├── msl-vpt-formats-x1.toml
│ │ │ ├── msl-vpt-formats-x1.wgsl
│ │ │ ├── msl-vpt-formats-x2.toml
│ │ │ ├── msl-vpt-formats-x2.wgsl
│ │ │ ├── msl-vpt-formats-x3.toml
│ │ │ ├── msl-vpt-formats-x3.wgsl
│ │ │ ├── msl-vpt-formats-x4.toml
│ │ │ ├── msl-vpt-formats-x4.wgsl
│ │ │ ├── msl-vpt.toml
│ │ │ ├── msl-vpt.wgsl
│ │ │ ├── multiview.toml
│ │ │ ├── multiview.wgsl
│ │ │ ├── multiview_webgl.toml
│ │ │ ├── multiview_webgl.wgsl
│ │ │ ├── must-use.toml
│ │ │ ├── must-use.wgsl
│ │ │ ├── operators.wgsl
│ │ │ ├── overrides-atomicCompareExchangeWeak.toml
│ │ │ ├── overrides-atomicCompareExchangeWeak.wgsl
│ │ │ ├── overrides-ray-query.toml
│ │ │ ├── overrides-ray-query.wgsl
│ │ │ ├── overrides.toml
│ │ │ ├── overrides.wgsl
│ │ │ ├── padding.toml
│ │ │ ├── padding.wgsl
│ │ │ ├── per-vertex.toml
│ │ │ ├── per-vertex.wgsl
│ │ │ ├── phony_assignment.wgsl
│ │ │ ├── pointer-function-arg-restrict.toml
│ │ │ ├── pointer-function-arg-restrict.wgsl
│ │ │ ├── pointer-function-arg-rzsw.toml
│ │ │ ├── pointer-function-arg-rzsw.wgsl
│ │ │ ├── pointer-function-arg.toml
│ │ │ ├── pointer-function-arg.wgsl
│ │ │ ├── pointers.toml
│ │ │ ├── pointers.wgsl
│ │ │ ├── policy-mix.toml
│ │ │ ├── policy-mix.wgsl
│ │ │ ├── primitive-index-mesh.toml
│ │ │ ├── primitive-index-mesh.wgsl
│ │ │ ├── primitive-index.toml
│ │ │ ├── primitive-index.wgsl
│ │ │ ├── push-constants.toml
│ │ │ ├── push-constants.wgsl
│ │ │ ├── quad.toml
│ │ │ ├── quad.wgsl
│ │ │ ├── ray-query-no-init-tracking.toml
│ │ │ ├── ray-query-no-init-tracking.wgsl
│ │ │ ├── ray-query.toml
│ │ │ ├── ray-query.wgsl
│ │ │ ├── ray-tracing-pipeline.toml
│ │ │ ├── ray-tracing-pipeline.wgsl
│ │ │ ├── resource-binding-map.toml
│ │ │ ├── resource-binding-map.wgsl
│ │ │ ├── sample-cube-array-depth-lod.toml
│ │ │ ├── sample-cube-array-depth-lod.wgsl
│ │ │ ├── select.wgsl
│ │ │ ├── separate-entry-points.toml
│ │ │ ├── separate-entry-points.wgsl
│ │ │ ├── shadow.toml
│ │ │ ├── shadow.wgsl
│ │ │ ├── skybox.toml
│ │ │ ├── skybox.wgsl
│ │ │ ├── sprite.toml
│ │ │ ├── sprite.wgsl
│ │ │ ├── standard.wgsl
│ │ │ ├── storage-textures.toml
│ │ │ ├── storage-textures.wgsl
│ │ │ ├── struct-layout.wgsl
│ │ │ ├── subgroup-barrier.toml
│ │ │ ├── subgroup-barrier.wgsl
│ │ │ ├── subgroup-operations.toml
│ │ │ ├── subgroup-operations.wgsl
│ │ │ ├── template-list-ge.toml
│ │ │ ├── template-list-ge.wgsl
│ │ │ ├── template-list-trailing-comma.toml
│ │ │ ├── template-list-trailing-comma.wgsl
│ │ │ ├── texture-arg.toml
│ │ │ ├── texture-arg.wgsl
│ │ │ ├── texture-external.toml
│ │ │ ├── texture-external.wgsl
│ │ │ ├── type-alias.toml
│ │ │ ├── type-alias.wgsl
│ │ │ ├── type-inference.wgsl
│ │ │ ├── types_with_comments.toml
│ │ │ ├── types_with_comments.wgsl
│ │ │ ├── unconsumed_vertex_outputs_frag.toml
│ │ │ ├── unconsumed_vertex_outputs_frag.wgsl
│ │ │ ├── unconsumed_vertex_outputs_vert.toml
│ │ │ ├── unconsumed_vertex_outputs_vert.wgsl
│ │ │ ├── use-gl-ext-over-grad-workaround-if-instructed.toml
│ │ │ ├── use-gl-ext-over-grad-workaround-if-instructed.wgsl
│ │ │ ├── workgroup-uniform-load-atomic.wgsl
│ │ │ ├── workgroup-uniform-load.wgsl
│ │ │ ├── workgroup-var-init.toml
│ │ │ └── workgroup-var-init.wgsl
│ │ ├── naga/
│ │ │ ├── example_wgsl.rs
│ │ │ ├── main.rs
│ │ │ ├── snapshots.rs
│ │ │ ├── spirv_capabilities.rs
│ │ │ ├── validation.rs
│ │ │ └── wgsl_errors.rs
│ │ └── out/
│ │ ├── analysis/
│ │ │ ├── spv-shadow.info.ron
│ │ │ ├── wgsl-access.info.ron
│ │ │ ├── wgsl-collatz.info.ron
│ │ │ ├── wgsl-overrides.info.ron
│ │ │ └── wgsl-storage-textures.info.ron
│ │ ├── dot/
│ │ │ └── wgsl-quad.dot
│ │ ├── glsl/
│ │ │ ├── glsl-variations.frag.main.Fragment.glsl
│ │ │ ├── spv-barrier.main.Compute.glsl
│ │ │ ├── spv-do-while.main.Fragment.glsl
│ │ │ ├── spv-quad-vert.main.Vertex.glsl
│ │ │ ├── spv-spec-constants-issue-5598.fragment.Fragment.glsl
│ │ │ ├── spv-spec-constants-issue-5598.vertex.Vertex.glsl
│ │ │ ├── spv-subgroup-barrier.main.Compute.glsl
│ │ │ ├── spv-subgroup-operations-s.main.Compute.glsl
│ │ │ ├── spv-unnamed-gl-per-vertex.main.Vertex.glsl
│ │ │ ├── wgsl-6438-conflicting-idents.fs.Fragment.glsl
│ │ │ ├── wgsl-6438-conflicting-idents.vs.Vertex.glsl
│ │ │ ├── wgsl-6772-unpack-expr-accesses.main.Compute.glsl
│ │ │ ├── wgsl-7995-unicode-idents.main.Compute.glsl
│ │ │ ├── wgsl-8820-multiple-local-invocation-index-id.compute1.Compute.glsl
│ │ │ ├── wgsl-abstract-types-builtins.f.Compute.glsl
│ │ │ ├── wgsl-abstract-types-function-calls.main.Compute.glsl
│ │ │ ├── wgsl-abstract-types-let.main.Compute.glsl
│ │ │ ├── wgsl-abstract-types-operators.main.Compute.glsl
│ │ │ ├── wgsl-abstract-types-return.main.Compute.glsl
│ │ │ ├── wgsl-abstract-types-var.main.Compute.glsl
│ │ │ ├── wgsl-access.foo_compute.Compute.glsl
│ │ │ ├── wgsl-access.foo_frag.Fragment.glsl
│ │ │ ├── wgsl-access.foo_vert.Vertex.glsl
│ │ │ ├── wgsl-array-in-ctor.cs_main.Compute.glsl
│ │ │ ├── wgsl-array-in-function-return-type.main.Fragment.glsl
│ │ │ ├── wgsl-atomicCompareExchange.test_atomic_compare_exchange_i32.Compute.glsl
│ │ │ ├── wgsl-atomicCompareExchange.test_atomic_compare_exchange_u32.Compute.glsl
│ │ │ ├── wgsl-atomicOps.cs_main.Compute.glsl
│ │ │ ├── wgsl-atomicTexture.cs_main.Compute.glsl
│ │ │ ├── wgsl-barycentrics.fs_main.Fragment.glsl
│ │ │ ├── wgsl-barycentrics.fs_main_no_perspective.Fragment.glsl
│ │ │ ├── wgsl-bitcast.main.Compute.glsl
│ │ │ ├── wgsl-bits.main.Compute.glsl
│ │ │ ├── wgsl-bits_downlevel.main.Fragment.glsl
│ │ │ ├── wgsl-bits_downlevel_webgl.main.Fragment.glsl
│ │ │ ├── wgsl-boids.main.Compute.glsl
│ │ │ ├── wgsl-bounds-check-image-restrict.fragment_shader.Fragment.glsl
│ │ │ ├── wgsl-bounds-check-image-rzsw.fragment_shader.Fragment.glsl
│ │ │ ├── wgsl-break-if.main.Compute.glsl
│ │ │ ├── wgsl-clip-distances.main.Vertex.glsl
│ │ │ ├── wgsl-const-exprs.main.Compute.glsl
│ │ │ ├── wgsl-constructors.main.Compute.glsl
│ │ │ ├── wgsl-control-flow.main.Compute.glsl
│ │ │ ├── wgsl-conversions.main.Compute.glsl
│ │ │ ├── wgsl-cross.main.Compute.glsl
│ │ │ ├── wgsl-cubeArrayShadow.fragment.Fragment.glsl
│ │ │ ├── wgsl-dualsource.main.Fragment.glsl
│ │ │ ├── wgsl-early-depth-test-conservative.main.Fragment.glsl
│ │ │ ├── wgsl-early-depth-test-force.main.Fragment.glsl
│ │ │ ├── wgsl-empty-if.comp.Compute.glsl
│ │ │ ├── wgsl-empty.main.Compute.glsl
│ │ │ ├── wgsl-f64.main.Compute.glsl
│ │ │ ├── wgsl-force_point_size_vertex_shader_webgl.fs_main.Fragment.glsl
│ │ │ ├── wgsl-force_point_size_vertex_shader_webgl.vs_main.Vertex.glsl
│ │ │ ├── wgsl-fragment-output.main_vec2scalar.Fragment.glsl
│ │ │ ├── wgsl-fragment-output.main_vec4vec3.Fragment.glsl
│ │ │ ├── wgsl-functions-webgl.main.Fragment.glsl
│ │ │ ├── wgsl-functions.main.Compute.glsl
│ │ │ ├── wgsl-globals.main.Compute.glsl
│ │ │ ├── wgsl-image.gather.Fragment.glsl
│ │ │ ├── wgsl-image.levels_queries.Vertex.glsl
│ │ │ ├── wgsl-image.main.Compute.glsl
│ │ │ ├── wgsl-image.queries.Vertex.glsl
│ │ │ ├── wgsl-image.texture_sample.Fragment.glsl
│ │ │ ├── wgsl-image.texture_sample_comparison.Fragment.glsl
│ │ │ ├── wgsl-interpolate_compat.frag_main.Fragment.glsl
│ │ │ ├── wgsl-interpolate_compat.vert_main.Vertex.glsl
│ │ │ ├── wgsl-invariant.fs.Fragment.glsl
│ │ │ ├── wgsl-invariant.vs.Vertex.glsl
│ │ │ ├── wgsl-math-functions.main.Fragment.glsl
│ │ │ ├── wgsl-memory-decorations-coherent.main.Compute.glsl
│ │ │ ├── wgsl-memory-decorations.main.Compute.glsl
│ │ │ ├── wgsl-multiview.main.Fragment.glsl
│ │ │ ├── wgsl-multiview_webgl.main.Fragment.glsl
│ │ │ ├── wgsl-operators.main.Compute.glsl
│ │ │ ├── wgsl-overrides.main.Compute.glsl
│ │ │ ├── wgsl-padding.vertex.Vertex.glsl
│ │ │ ├── wgsl-phony_assignment.main.Compute.glsl
│ │ │ ├── wgsl-pointer-function-arg.main.Compute.glsl
│ │ │ ├── wgsl-primitive-index-mesh.func.Fragment.glsl
│ │ │ ├── wgsl-primitive-index.func.Fragment.glsl
│ │ │ ├── wgsl-push-constants.main.Fragment.glsl
│ │ │ ├── wgsl-push-constants.vert_main.Vertex.glsl
│ │ │ ├── wgsl-quad.frag_main.Fragment.glsl
│ │ │ ├── wgsl-quad.fs_extra.Fragment.glsl
│ │ │ ├── wgsl-quad.vert_main.Vertex.glsl
│ │ │ ├── wgsl-sample-cube-array-depth-lod.main.Fragment.glsl
│ │ │ ├── wgsl-select.main.Compute.glsl
│ │ │ ├── wgsl-separate-entry-points.compute.Compute.glsl
│ │ │ ├── wgsl-separate-entry-points.fragment.Fragment.glsl
│ │ │ ├── wgsl-shadow.fs_main.Fragment.glsl
│ │ │ ├── wgsl-shadow.fs_main_without_storage.Fragment.glsl
│ │ │ ├── wgsl-shadow.vs_main.Vertex.glsl
│ │ │ ├── wgsl-skybox.fs_main.Fragment.glsl
│ │ │ ├── wgsl-skybox.vs_main.Vertex.glsl
│ │ │ ├── wgsl-standard.derivatives.Fragment.glsl
│ │ │ ├── wgsl-struct-layout.needs_padding_comp.Compute.glsl
│ │ │ ├── wgsl-struct-layout.needs_padding_frag.Fragment.glsl
│ │ │ ├── wgsl-struct-layout.needs_padding_vert.Vertex.glsl
│ │ │ ├── wgsl-struct-layout.no_padding_comp.Compute.glsl
│ │ │ ├── wgsl-struct-layout.no_padding_frag.Fragment.glsl
│ │ │ ├── wgsl-struct-layout.no_padding_vert.Vertex.glsl
│ │ │ ├── wgsl-subgroup-operations.main.Compute.glsl
│ │ │ ├── wgsl-texture-arg.main.Fragment.glsl
│ │ │ ├── wgsl-type-inference.main.Compute.glsl
│ │ │ ├── wgsl-use-gl-ext-over-grad-workaround-if-instructed.main.Fragment.glsl
│ │ │ ├── wgsl-workgroup-uniform-load-atomic.test_atomic_workgroup_uniform_load.Compute.glsl
│ │ │ ├── wgsl-workgroup-uniform-load.test_workgroupUniformLoad.Compute.glsl
│ │ │ └── wgsl-workgroup-var-init.main.Compute.glsl
│ │ ├── hlsl/
│ │ │ ├── spv-barrier.hlsl
│ │ │ ├── spv-barrier.ron
│ │ │ ├── spv-do-while.hlsl
│ │ │ ├── spv-do-while.ron
│ │ │ ├── spv-empty-global-name.hlsl
│ │ │ ├── spv-empty-global-name.ron
│ │ │ ├── spv-fetch_depth.hlsl
│ │ │ ├── spv-fetch_depth.ron
│ │ │ ├── spv-inv-hyperbolic-trig-functions.hlsl
│ │ │ ├── spv-inv-hyperbolic-trig-functions.ron
│ │ │ ├── spv-quad-vert.hlsl
│ │ │ ├── spv-quad-vert.ron
│ │ │ ├── spv-subgroup-operations-s.hlsl
│ │ │ ├── spv-subgroup-operations-s.ron
│ │ │ ├── spv-unnamed-gl-per-vertex.hlsl
│ │ │ ├── spv-unnamed-gl-per-vertex.ron
│ │ │ ├── wgsl-6438-conflicting-idents.hlsl
│ │ │ ├── wgsl-6438-conflicting-idents.ron
│ │ │ ├── wgsl-6772-unpack-expr-accesses.hlsl
│ │ │ ├── wgsl-6772-unpack-expr-accesses.ron
│ │ │ ├── wgsl-7995-unicode-idents.hlsl
│ │ │ ├── wgsl-7995-unicode-idents.ron
│ │ │ ├── wgsl-8820-multiple-local-invocation-index-id.hlsl
│ │ │ ├── wgsl-8820-multiple-local-invocation-index-id.ron
│ │ │ ├── wgsl-9105-primitive-index-ordering.hlsl
│ │ │ ├── wgsl-9105-primitive-index-ordering.ron
│ │ │ ├── wgsl-abstract-types-return.hlsl
│ │ │ ├── wgsl-abstract-types-return.ron
│ │ │ ├── wgsl-access.hlsl
│ │ │ ├── wgsl-access.ron
│ │ │ ├── wgsl-aliased-ray-query.hlsl
│ │ │ ├── wgsl-aliased-ray-query.ron
│ │ │ ├── wgsl-array-in-ctor.hlsl
│ │ │ ├── wgsl-array-in-ctor.ron
│ │ │ ├── wgsl-array-in-function-return-type.hlsl
│ │ │ ├── wgsl-array-in-function-return-type.ron
│ │ │ ├── wgsl-atomicCompareExchange-int64.hlsl
│ │ │ ├── wgsl-atomicCompareExchange-int64.ron
│ │ │ ├── wgsl-atomicCompareExchange.hlsl
│ │ │ ├── wgsl-atomicCompareExchange.ron
│ │ │ ├── wgsl-atomicOps-int64-min-max.hlsl
│ │ │ ├── wgsl-atomicOps-int64-min-max.ron
│ │ │ ├── wgsl-atomicOps-int64.hlsl
│ │ │ ├── wgsl-atomicOps-int64.ron
│ │ │ ├── wgsl-atomicOps.hlsl
│ │ │ ├── wgsl-atomicOps.ron
│ │ │ ├── wgsl-atomicTexture-int64.hlsl
│ │ │ ├── wgsl-atomicTexture-int64.ron
│ │ │ ├── wgsl-atomicTexture.hlsl
│ │ │ ├── wgsl-atomicTexture.ron
│ │ │ ├── wgsl-barycentrics.hlsl
│ │ │ ├── wgsl-barycentrics.ron
│ │ │ ├── wgsl-binding-arrays.hlsl
│ │ │ ├── wgsl-binding-arrays.ron
│ │ │ ├── wgsl-bitcast.hlsl
│ │ │ ├── wgsl-bitcast.ron
│ │ │ ├── wgsl-bits.hlsl
│ │ │ ├── wgsl-bits.ron
│ │ │ ├── wgsl-boids.hlsl
│ │ │ ├── wgsl-boids.ron
│ │ │ ├── wgsl-bounds-check-dynamic-buffer.hlsl
│ │ │ ├── wgsl-bounds-check-dynamic-buffer.ron
│ │ │ ├── wgsl-break-if.hlsl
│ │ │ ├── wgsl-break-if.ron
│ │ │ ├── wgsl-collatz.hlsl
│ │ │ ├── wgsl-collatz.ron
│ │ │ ├── wgsl-const-exprs.hlsl
│ │ │ ├── wgsl-const-exprs.ron
│ │ │ ├── wgsl-constructors.hlsl
│ │ │ ├── wgsl-constructors.ron
│ │ │ ├── wgsl-control-flow.hlsl
│ │ │ ├── wgsl-control-flow.ron
│ │ │ ├── wgsl-conversion-float-to-int.hlsl
│ │ │ ├── wgsl-conversion-float-to-int.ron
│ │ │ ├── wgsl-conversions.hlsl
│ │ │ ├── wgsl-conversions.ron
│ │ │ ├── wgsl-cross.hlsl
│ │ │ ├── wgsl-cross.ron
│ │ │ ├── wgsl-dualsource.hlsl
│ │ │ ├── wgsl-dualsource.ron
│ │ │ ├── wgsl-empty-if.hlsl
│ │ │ ├── wgsl-empty-if.ron
│ │ │ ├── wgsl-empty.hlsl
│ │ │ ├── wgsl-empty.ron
│ │ │ ├── wgsl-f16.hlsl
│ │ │ ├── wgsl-f16.ron
│ │ │ ├── wgsl-f64.hlsl
│ │ │ ├── wgsl-f64.ron
│ │ │ ├── wgsl-fragment-output.hlsl
│ │ │ ├── wgsl-fragment-output.ron
│ │ │ ├── wgsl-functions-optimized-by-version.hlsl
│ │ │ ├── wgsl-functions-optimized-by-version.ron
│ │ │ ├── wgsl-functions-unoptimized.hlsl
│ │ │ ├── wgsl-functions-unoptimized.ron
│ │ │ ├── wgsl-functions.hlsl
│ │ │ ├── wgsl-functions.ron
│ │ │ ├── wgsl-globals.hlsl
│ │ │ ├── wgsl-globals.ron
│ │ │ ├── wgsl-hlsl-keyword.hlsl
│ │ │ ├── wgsl-hlsl-keyword.ron
│ │ │ ├── wgsl-image.hlsl
│ │ │ ├── wgsl-image.ron
│ │ │ ├── wgsl-int64.hlsl
│ │ │ ├── wgsl-int64.ron
│ │ │ ├── wgsl-interface.hlsl
│ │ │ ├── wgsl-interface.ron
│ │ │ ├── wgsl-interpolate.hlsl
│ │ │ ├── wgsl-interpolate.ron
│ │ │ ├── wgsl-interpolate_compat.hlsl
│ │ │ ├── wgsl-interpolate_compat.ron
│ │ │ ├── wgsl-mat_cx2.hlsl
│ │ │ ├── wgsl-mat_cx2.ron
│ │ │ ├── wgsl-mat_cx3.hlsl
│ │ │ ├── wgsl-mat_cx3.ron
│ │ │ ├── wgsl-math-functions.hlsl
│ │ │ ├── wgsl-math-functions.ron
│ │ │ ├── wgsl-memory-decorations-coherent.hlsl
│ │ │ ├── wgsl-memory-decorations-coherent.ron
│ │ │ ├── wgsl-multiview.hlsl
│ │ │ ├── wgsl-multiview.ron
│ │ │ ├── wgsl-operators.hlsl
│ │ │ ├── wgsl-operators.ron
│ │ │ ├── wgsl-overrides.hlsl
│ │ │ ├── wgsl-overrides.ron
│ │ │ ├── wgsl-padding.hlsl
│ │ │ ├── wgsl-padding.ron
│ │ │ ├── wgsl-phony_assignment.hlsl
│ │ │ ├── wgsl-phony_assignment.ron
│ │ │ ├── wgsl-pointer-function-arg.hlsl
│ │ │ ├── wgsl-pointer-function-arg.ron
│ │ │ ├── wgsl-primitive-index.hlsl
│ │ │ ├── wgsl-primitive-index.ron
│ │ │ ├── wgsl-push-constants.hlsl
│ │ │ ├── wgsl-push-constants.ron
│ │ │ ├── wgsl-quad.hlsl
│ │ │ ├── wgsl-quad.ron
│ │ │ ├── wgsl-ray-query-no-init-tracking.hlsl
│ │ │ ├── wgsl-ray-query-no-init-tracking.ron
│ │ │ ├── wgsl-ray-query.hlsl
│ │ │ ├── wgsl-ray-query.ron
│ │ │ ├── wgsl-select.hlsl
│ │ │ ├── wgsl-select.ron
│ │ │ ├── wgsl-shadow.hlsl
│ │ │ ├── wgsl-shadow.ron
│ │ │ ├── wgsl-skybox.hlsl
│ │ │ ├── wgsl-skybox.ron
│ │ │ ├── wgsl-standard.hlsl
│ │ │ ├── wgsl-standard.ron
│ │ │ ├── wgsl-storage-textures.hlsl
│ │ │ ├── wgsl-storage-textures.ron
│ │ │ ├── wgsl-struct-layout.hlsl
│ │ │ ├── wgsl-struct-layout.ron
│ │ │ ├── wgsl-subgroup-operations.hlsl
│ │ │ ├── wgsl-subgroup-operations.ron
│ │ │ ├── wgsl-texture-arg.hlsl
│ │ │ ├── wgsl-texture-arg.ron
│ │ │ ├── wgsl-texture-external.hlsl
│ │ │ ├── wgsl-texture-external.ron
│ │ │ ├── wgsl-type-inference.hlsl
│ │ │ ├── wgsl-type-inference.ron
│ │ │ ├── wgsl-unconsumed_vertex_outputs_frag.hlsl
│ │ │ ├── wgsl-unconsumed_vertex_outputs_frag.ron
│ │ │ ├── wgsl-unconsumed_vertex_outputs_vert.hlsl
│ │ │ ├── wgsl-unconsumed_vertex_outputs_vert.ron
│ │ │ ├── wgsl-workgroup-uniform-load-atomic.hlsl
│ │ │ ├── wgsl-workgroup-uniform-load-atomic.ron
│ │ │ ├── wgsl-workgroup-uniform-load.hlsl
│ │ │ ├── wgsl-workgroup-uniform-load.ron
│ │ │ ├── wgsl-workgroup-var-init.hlsl
│ │ │ └── wgsl-workgroup-var-init.ron
│ │ ├── ir/
│ │ │ ├── spv-fetch_depth.compact.ron
│ │ │ ├── spv-fetch_depth.ron
│ │ │ ├── spv-shadow.compact.ron
│ │ │ ├── spv-shadow.ron
│ │ │ ├── spv-spec-constants.compact.ron
│ │ │ ├── spv-spec-constants.ron
│ │ │ ├── wgsl-access.compact.ron
│ │ │ ├── wgsl-access.ron
│ │ │ ├── wgsl-collatz.compact.ron
│ │ │ ├── wgsl-collatz.ron
│ │ │ ├── wgsl-const_assert.compact.ron
│ │ │ ├── wgsl-const_assert.ron
│ │ │ ├── wgsl-diagnostic-filter.compact.ron
│ │ │ ├── wgsl-diagnostic-filter.ron
│ │ │ ├── wgsl-index-by-value.compact.ron
│ │ │ ├── wgsl-index-by-value.ron
│ │ │ ├── wgsl-local-const.compact.ron
│ │ │ ├── wgsl-local-const.ron
│ │ │ ├── wgsl-must-use.compact.ron
│ │ │ ├── wgsl-must-use.ron
│ │ │ ├── wgsl-overrides-atomicCompareExchangeWeak.compact.ron
│ │ │ ├── wgsl-overrides-atomicCompareExchangeWeak.ron
│ │ │ ├── wgsl-overrides-ray-query.compact.ron
│ │ │ ├── wgsl-overrides-ray-query.ron
│ │ │ ├── wgsl-overrides.compact.ron
│ │ │ ├── wgsl-overrides.ron
│ │ │ ├── wgsl-storage-textures.compact.ron
│ │ │ ├── wgsl-storage-textures.ron
│ │ │ ├── wgsl-template-list-trailing-comma.compact.ron
│ │ │ ├── wgsl-template-list-trailing-comma.ron
│ │ │ ├── wgsl-texture-external.compact.ron
│ │ │ ├── wgsl-texture-external.ron
│ │ │ ├── wgsl-types_with_comments.compact.ron
│ │ │ └── wgsl-types_with_comments.ron
│ │ ├── msl/
│ │ │ ├── spv-barrier.metal
│ │ │ ├── spv-do-while.metal
│ │ │ ├── spv-empty-global-name.metal
│ │ │ ├── spv-fetch_depth.metal
│ │ │ ├── spv-quad-vert.metal
│ │ │ ├── spv-subgroup-barrier.metal
│ │ │ ├── spv-subgroup-operations-s.metal
│ │ │ ├── spv-unnamed-gl-per-vertex.metal
│ │ │ ├── wgsl-6438-conflicting-idents.metal
│ │ │ ├── wgsl-6772-unpack-expr-accesses.metal
│ │ │ ├── wgsl-7995-unicode-idents.metal
│ │ │ ├── wgsl-8820-multiple-local-invocation-index-id.metal
│ │ │ ├── wgsl-abstract-types-builtins.metal
│ │ │ ├── wgsl-abstract-types-const.metal
│ │ │ ├── wgsl-abstract-types-function-calls.metal
│ │ │ ├── wgsl-abstract-types-let.metal
│ │ │ ├── wgsl-abstract-types-operators.metal
│ │ │ ├── wgsl-abstract-types-return.metal
│ │ │ ├── wgsl-abstract-types-texture.metal
│ │ │ ├── wgsl-abstract-types-var.metal
│ │ │ ├── wgsl-access.metal
│ │ │ ├── wgsl-aliased-ray-query.metal
│ │ │ ├── wgsl-array-in-ctor.metal
│ │ │ ├── wgsl-array-in-function-return-type.metal
│ │ │ ├── wgsl-atomicCompareExchange.metal
│ │ │ ├── wgsl-atomicOps-float32.metal
│ │ │ ├── wgsl-atomicOps-int64-min-max.metal
│ │ │ ├── wgsl-atomicOps.metal
│ │ │ ├── wgsl-atomicTexture-int64.metal
│ │ │ ├── wgsl-atomicTexture.metal
│ │ │ ├── wgsl-barycentrics.metal
│ │ │ ├── wgsl-binding-arrays.metal
│ │ │ ├── wgsl-bitcast.metal
│ │ │ ├── wgsl-bits-optimized-msl.metal
│ │ │ ├── wgsl-bits.metal
│ │ │ ├── wgsl-boids.metal
│ │ │ ├── wgsl-bounds-check-image-restrict-depth.metal
│ │ │ ├── wgsl-bounds-check-image-restrict.metal
│ │ │ ├── wgsl-bounds-check-image-rzsw-depth.metal
│ │ │ ├── wgsl-bounds-check-image-rzsw.metal
│ │ │ ├── wgsl-bounds-check-restrict.metal
│ │ │ ├── wgsl-bounds-check-zero-atomic.metal
│ │ │ ├── wgsl-bounds-check-zero.metal
│ │ │ ├── wgsl-break-if.metal
│ │ │ ├── wgsl-collatz.metal
│ │ │ ├── wgsl-const-exprs.metal
│ │ │ ├── wgsl-constructors.metal
│ │ │ ├── wgsl-control-flow.metal
│ │ │ ├── wgsl-conversion-float-to-int-no-f64.metal
│ │ │ ├── wgsl-conversions.metal
│ │ │ ├── wgsl-cooperative-matrix.metal
│ │ │ ├── wgsl-cross.metal
│ │ │ ├── wgsl-dualsource.metal
│ │ │ ├── wgsl-empty-if.metal
│ │ │ ├── wgsl-empty.metal
│ │ │ ├── wgsl-extra.metal
│ │ │ ├── wgsl-f16.metal
│ │ │ ├── wgsl-fragment-output.metal
│ │ │ ├── wgsl-functions-optimized-by-version.metal
│ │ │ ├── wgsl-functions-unoptimized.metal
│ │ │ ├── wgsl-functions.metal
│ │ │ ├── wgsl-globals.metal
│ │ │ ├── wgsl-image.metal
│ │ │ ├── wgsl-int64.metal
│ │ │ ├── wgsl-interface.metal
│ │ │ ├── wgsl-interpolate.metal
│ │ │ ├── wgsl-interpolate_compat.metal
│ │ │ ├── wgsl-math-functions.metal
│ │ │ ├── wgsl-memory-decorations-coherent.metal
│ │ │ ├── wgsl-msl-varyings.metal
│ │ │ ├── wgsl-msl-vpt-formats-x1.metal
│ │ │ ├── wgsl-msl-vpt-formats-x2.metal
│ │ │ ├── wgsl-msl-vpt-formats-x3.metal
│ │ │ ├── wgsl-msl-vpt-formats-x4.metal
│ │ │ ├── wgsl-msl-vpt.metal
│ │ │ ├── wgsl-multiview.metal
│ │ │ ├── wgsl-operators.metal
│ │ │ ├── wgsl-overrides-atomicCompareExchangeWeak.metal
│ │ │ ├── wgsl-overrides-ray-query.metal
│ │ │ ├── wgsl-overrides.metal
│ │ │ ├── wgsl-padding.metal
│ │ │ ├── wgsl-phony_assignment.metal
│ │ │ ├── wgsl-pointer-function-arg-restrict.metal
│ │ │ ├── wgsl-pointer-function-arg-rzsw.metal
│ │ │ ├── wgsl-pointer-function-arg.metal
│ │ │ ├── wgsl-policy-mix.metal
│ │ │ ├── wgsl-primitive-index.metal
│ │ │ ├── wgsl-quad.metal
│ │ │ ├── wgsl-ray-query-no-init-tracking.metal
│ │ │ ├── wgsl-ray-query.metal
│ │ │ ├── wgsl-resource-binding-map.metal
│ │ │ ├── wgsl-select.metal
│ │ │ ├── wgsl-shadow.metal
│ │ │ ├── wgsl-skybox.metal
│ │ │ ├── wgsl-standard.metal
│ │ │ ├── wgsl-storage-textures.metal
│ │ │ ├── wgsl-struct-layout.metal
│ │ │ ├── wgsl-subgroup-barrier.metal
│ │ │ ├── wgsl-subgroup-operations.metal
│ │ │ ├── wgsl-texture-arg.metal
│ │ │ ├── wgsl-texture-external.metal
│ │ │ ├── wgsl-type-inference.metal
│ │ │ ├── wgsl-workgroup-uniform-load-atomic.metal
│ │ │ ├── wgsl-workgroup-uniform-load.metal
│ │ │ └── wgsl-workgroup-var-init.metal
│ │ ├── spv/
│ │ │ ├── spv-barrier.spvasm
│ │ │ ├── spv-fetch_depth.spvasm
│ │ │ ├── spv-per-vertex.spvasm
│ │ │ ├── spv-subgroup-barrier.spvasm
│ │ │ ├── wgsl-6220-break-from-loop.spvasm
│ │ │ ├── wgsl-6438-conflicting-idents.spvasm
│ │ │ ├── wgsl-6772-unpack-expr-accesses.spvasm
│ │ │ ├── wgsl-7048-multiple-dynamic-1.spvasm
│ │ │ ├── wgsl-7048-multiple-dynamic-2.spvasm
│ │ │ ├── wgsl-7048-multiple-dynamic-3.spvasm
│ │ │ ├── wgsl-7995-unicode-idents.spvasm
│ │ │ ├── wgsl-8820-multiple-local-invocation-index-id.spvasm
│ │ │ ├── wgsl-abstract-types-builtins.spvasm
│ │ │ ├── wgsl-abstract-types-const.spvasm
│ │ │ ├── wgsl-abstract-types-function-calls.spvasm
│ │ │ ├── wgsl-abstract-types-let.spvasm
│ │ │ ├── wgsl-abstract-types-operators.spvasm
│ │ │ ├── wgsl-abstract-types-return.spvasm
│ │ │ ├── wgsl-abstract-types-var.spvasm
│ │ │ ├── wgsl-access.spvasm
│ │ │ ├── wgsl-aliased-ray-query.spvasm
│ │ │ ├── wgsl-array-in-ctor.spvasm
│ │ │ ├── wgsl-array-in-function-return-type.spvasm
│ │ │ ├── wgsl-atomicCompareExchange-int64.spvasm
│ │ │ ├── wgsl-atomicCompareExchange.spvasm
│ │ │ ├── wgsl-atomicOps-float32.spvasm
│ │ │ ├── wgsl-atomicOps-int64-min-max.spvasm
│ │ │ ├── wgsl-atomicOps-int64.spvasm
│ │ │ ├── wgsl-atomicOps.spvasm
│ │ │ ├── wgsl-atomicTexture-int64.spvasm
│ │ │ ├── wgsl-atomicTexture.spvasm
│ │ │ ├── wgsl-barycentrics.spvasm
│ │ │ ├── wgsl-binding-arrays.spvasm
│ │ │ ├── wgsl-binding-buffer-arrays.spvasm
│ │ │ ├── wgsl-bitcast.spvasm
│ │ │ ├── wgsl-bits.spvasm
│ │ │ ├── wgsl-boids.spvasm
│ │ │ ├── wgsl-bounds-check-image-restrict-depth.spvasm
│ │ │ ├── wgsl-bounds-check-image-restrict.spvasm
│ │ │ ├── wgsl-bounds-check-image-rzsw-depth.spvasm
│ │ │ ├── wgsl-bounds-check-image-rzsw.spvasm
│ │ │ ├── wgsl-bounds-check-restrict.spvasm
│ │ │ ├── wgsl-bounds-check-zero.spvasm
│ │ │ ├── wgsl-break-if.spvasm
│ │ │ ├── wgsl-clip-distances.spvasm
│ │ │ ├── wgsl-collatz.spvasm
│ │ │ ├── wgsl-const-exprs.spvasm
│ │ │ ├── wgsl-constructors.spvasm
│ │ │ ├── wgsl-control-flow.spvasm
│ │ │ ├── wgsl-conversion-float-to-int.spvasm
│ │ │ ├── wgsl-conversions.spvasm
│ │ │ ├── wgsl-cooperative-matrix.spvasm
│ │ │ ├── wgsl-cross.spvasm
│ │ │ ├── wgsl-debug-symbol-large-source.spvasm
│ │ │ ├── wgsl-debug-symbol-simple.spvasm
│ │ │ ├── wgsl-debug-symbol-terrain.spvasm
│ │ │ ├── wgsl-draw-index.spvasm
│ │ │ ├── wgsl-dualsource.spvasm
│ │ │ ├── wgsl-early-depth-test-conservative.spvasm
│ │ │ ├── wgsl-early-depth-test-force.spvasm
│ │ │ ├── wgsl-empty-if.spvasm
│ │ │ ├── wgsl-empty.spvasm
│ │ │ ├── wgsl-extra.spvasm
│ │ │ ├── wgsl-f16-native.spvasm
│ │ │ ├── wgsl-f16-polyfill.spvasm
│ │ │ ├── wgsl-f16.spvasm
│ │ │ ├── wgsl-f64.spvasm
│ │ │ ├── wgsl-fragment-output.spvasm
│ │ │ ├── wgsl-functions-optimized-by-capability.spvasm
│ │ │ ├── wgsl-functions-optimized-by-version.spvasm
│ │ │ ├── wgsl-functions-unoptimized.spvasm
│ │ │ ├── wgsl-functions.spvasm
│ │ │ ├── wgsl-globals.spvasm
│ │ │ ├── wgsl-image.spvasm
│ │ │ ├── wgsl-index-by-value.spvasm
│ │ │ ├── wgsl-int64.spvasm
│ │ │ ├── wgsl-interface.compute.spvasm
│ │ │ ├── wgsl-interface.fragment.spvasm
│ │ │ ├── wgsl-interface.vertex.spvasm
│ │ │ ├── wgsl-interface.vertex_two_structs.spvasm
│ │ │ ├── wgsl-interpolate.spvasm
│ │ │ ├── wgsl-interpolate_compat.spvasm
│ │ │ ├── wgsl-mat_cx2.spvasm
│ │ │ ├── wgsl-mat_cx3.spvasm
│ │ │ ├── wgsl-math-functions.spvasm
│ │ │ ├── wgsl-memory-decorations-coherent.spvasm
│ │ │ ├── wgsl-memory-decorations.spvasm
│ │ │ ├── wgsl-mesh-shader-empty.spvasm
│ │ │ ├── wgsl-mesh-shader-lines.spvasm
│ │ │ ├── wgsl-mesh-shader-points.spvasm
│ │ │ ├── wgsl-mesh-shader.spvasm
│ │ │ ├── wgsl-multiview.spvasm
│ │ │ ├── wgsl-operators.spvasm
│ │ │ ├── wgsl-overrides-atomicCompareExchangeWeak.f.spvasm
│ │ │ ├── wgsl-overrides-ray-query.main.spvasm
│ │ │ ├── wgsl-overrides.main.spvasm
│ │ │ ├── wgsl-padding.spvasm
│ │ │ ├── wgsl-per-vertex.spvasm
│ │ │ ├── wgsl-phony_assignment.spvasm
│ │ │ ├── wgsl-pointers.spvasm
│ │ │ ├── wgsl-policy-mix.spvasm
│ │ │ ├── wgsl-primitive-index.spvasm
│ │ │ ├── wgsl-quad.spvasm
│ │ │ ├── wgsl-ray-query-no-init-tracking.spvasm
│ │ │ ├── wgsl-ray-query.spvasm
│ │ │ ├── wgsl-select.spvasm
│ │ │ ├── wgsl-separate-entry-points.compute.spvasm
│ │ │ ├── wgsl-separate-entry-points.fragment.spvasm
│ │ │ ├── wgsl-shadow.spvasm
│ │ │ ├── wgsl-skybox.spvasm
│ │ │ ├── wgsl-sprite.spvasm
│ │ │ ├── wgsl-standard.spvasm
│ │ │ ├── wgsl-storage-textures.spvasm
│ │ │ ├── wgsl-struct-layout.spvasm
│ │ │ ├── wgsl-subgroup-barrier.spvasm
│ │ │ ├── wgsl-subgroup-operations.spvasm
│ │ │ ├── wgsl-texture-arg.spvasm
│ │ │ ├── wgsl-type-inference.spvasm
│ │ │ ├── wgsl-workgroup-uniform-load-atomic.spvasm
│ │ │ ├── wgsl-workgroup-uniform-load.spvasm
│ │ │ └── wgsl-workgroup-var-init.spvasm
│ │ └── wgsl/
│ │ ├── glsl-210-bevy-2d-shader.frag.wgsl
│ │ ├── glsl-210-bevy-2d-shader.vert.wgsl
│ │ ├── glsl-210-bevy-shader.vert.wgsl
│ │ ├── glsl-246-collatz.comp.wgsl
│ │ ├── glsl-277-casting.frag.wgsl
│ │ ├── glsl-280-matrix-cast.frag.wgsl
│ │ ├── glsl-484-preprocessor-if.frag.wgsl
│ │ ├── glsl-5246-dual-iteration.frag.wgsl
│ │ ├── glsl-800-out-of-bounds-panic.vert.wgsl
│ │ ├── glsl-896-push-constant.frag.wgsl
│ │ ├── glsl-900-implicit-conversions.frag.wgsl
│ │ ├── glsl-901-lhs-field-select.frag.wgsl
│ │ ├── glsl-931-constant-emitting.frag.wgsl
│ │ ├── glsl-932-for-loop-if.frag.wgsl
│ │ ├── glsl-anonymous-entry-point-type.frag.wgsl
│ │ ├── glsl-bevy-pbr.frag.wgsl
│ │ ├── glsl-bevy-pbr.vert.wgsl
│ │ ├── glsl-bits.frag.wgsl
│ │ ├── glsl-bool-select.frag.wgsl
│ │ ├── glsl-buffer.frag.wgsl
│ │ ├── glsl-clamp-splat.vert.wgsl
│ │ ├── glsl-const-global-swizzle.frag.wgsl
│ │ ├── glsl-constant-array-size.frag.wgsl
│ │ ├── glsl-declarations.frag.wgsl
│ │ ├── glsl-double-math-functions.frag.wgsl
│ │ ├── glsl-dual-source-blending.frag.wgsl
│ │ ├── glsl-expressions.frag.wgsl
│ │ ├── glsl-f16-glsl.comp.wgsl
│ │ ├── glsl-fma.frag.wgsl
│ │ ├── glsl-functions_call.frag.wgsl
│ │ ├── glsl-global-constant-array.frag.wgsl
│ │ ├── glsl-images.frag.wgsl
│ │ ├── glsl-inverse-polyfill.frag.wgsl
│ │ ├── glsl-local-var-init-in-loop.comp.wgsl
│ │ ├── glsl-long-form-matrix.frag.wgsl
│ │ ├── glsl-math-functions.frag.wgsl
│ │ ├── glsl-multipart-for-loop.frag.wgsl
│ │ ├── glsl-prepostfix.frag.wgsl
│ │ ├── glsl-quad_glsl.frag.wgsl
│ │ ├── glsl-quad_glsl.vert.wgsl
│ │ ├── glsl-sampler-functions.frag.wgsl
│ │ ├── glsl-samplers.frag.wgsl
│ │ ├── glsl-spec-constant.frag.wgsl
│ │ ├── glsl-statements.frag.wgsl
│ │ ├── glsl-vector-functions.frag.wgsl
│ │ ├── spv-8151-barrier-reorder.wgsl
│ │ ├── spv-atomic_compare_exchange.wgsl
│ │ ├── spv-atomic_exchange.wgsl
│ │ ├── spv-atomic_global_struct_field_vertex.wgsl
│ │ ├── spv-atomic_i_add_sub.wgsl
│ │ ├── spv-atomic_i_decrement.wgsl
│ │ ├── spv-atomic_i_increment.wgsl
│ │ ├── spv-atomic_load_and_store.wgsl
│ │ ├── spv-barrier.wgsl
│ │ ├── spv-binding-arrays.dynamic.wgsl
│ │ ├── spv-binding-arrays.runtime.wgsl
│ │ ├── spv-binding-arrays.static.wgsl
│ │ ├── spv-builtin-accessed-outside-entrypoint.wgsl
│ │ ├── spv-do-while.wgsl
│ │ ├── spv-dual-source-blending.wgsl
│ │ ├── spv-empty-global-name.wgsl
│ │ ├── spv-f16-spv.wgsl
│ │ ├── spv-fetch_depth.wgsl
│ │ ├── spv-gather-cmp.wgsl
│ │ ├── spv-gather.wgsl
│ │ ├── spv-inv-hyperbolic-trig-functions.wgsl
│ │ ├── spv-load-ms-texture.wgsl
│ │ ├── spv-non-semantic-debug.wgsl
│ │ ├── spv-per-vertex.wgsl
│ │ ├── spv-quad-vert.wgsl
│ │ ├── spv-subgroup-barrier.wgsl
│ │ ├── spv-subgroup-operations-s.wgsl
│ │ ├── spv-unnamed-gl-per-vertex.wgsl
│ │ ├── wgsl-6438-conflicting-idents.wgsl
│ │ ├── wgsl-6772-unpack-expr-accesses.wgsl
│ │ ├── wgsl-7995-unicode-idents.wgsl
│ │ ├── wgsl-8820-multiple-local-invocation-index-id.wgsl
│ │ ├── wgsl-abstract-types-atomic.wgsl
│ │ ├── wgsl-abstract-types-builtins.wgsl
│ │ ├── wgsl-abstract-types-const.wgsl
│ │ ├── wgsl-abstract-types-function-calls.wgsl
│ │ ├── wgsl-abstract-types-let.wgsl
│ │ ├── wgsl-abstract-types-operators.wgsl
│ │ ├── wgsl-abstract-types-return.wgsl
│ │ ├── wgsl-abstract-types-var.wgsl
│ │ ├── wgsl-access.wgsl
│ │ ├── wgsl-array-in-ctor.wgsl
│ │ ├── wgsl-array-in-function-return-type.wgsl
│ │ ├── wgsl-atomicCompareExchange-int64.wgsl
│ │ ├── wgsl-atomicCompareExchange.wgsl
│ │ ├── wgsl-atomicOps-float32.wgsl
│ │ ├── wgsl-atomicOps-int64-min-max.wgsl
│ │ ├── wgsl-atomicOps-int64.wgsl
│ │ ├── wgsl-atomicOps.wgsl
│ │ ├── wgsl-atomicTexture-int64.wgsl
│ │ ├── wgsl-atomicTexture.wgsl
│ │ ├── wgsl-barycentrics.wgsl
│ │ ├── wgsl-binding-arrays.wgsl
│ │ ├── wgsl-binding-buffer-arrays.wgsl
│ │ ├── wgsl-bitcast.wgsl
│ │ ├── wgsl-bits.wgsl
│ │ ├── wgsl-boids.wgsl
│ │ ├── wgsl-break-if.wgsl
│ │ ├── wgsl-clip-distances.wgsl
│ │ ├── wgsl-collatz.wgsl
│ │ ├── wgsl-const-exprs.wgsl
│ │ ├── wgsl-const_assert.wgsl
│ │ ├── wgsl-constructors.wgsl
│ │ ├── wgsl-control-flow.wgsl
│ │ ├── wgsl-conversion-float-to-int.wgsl
│ │ ├── wgsl-conversions.wgsl
│ │ ├── wgsl-cooperative-matrix.wgsl
│ │ ├── wgsl-cross.wgsl
│ │ ├── wgsl-draw-index.wgsl
│ │ ├── wgsl-dualsource.wgsl
│ │ ├── wgsl-empty-if.wgsl
│ │ ├── wgsl-empty.wgsl
│ │ ├── wgsl-extra.wgsl
│ │ ├── wgsl-f16.wgsl
│ │ ├── wgsl-f64.wgsl
│ │ ├── wgsl-fragment-output.wgsl
│ │ ├── wgsl-functions.wgsl
│ │ ├── wgsl-globals.wgsl
│ │ ├── wgsl-image.wgsl
│ │ ├── wgsl-int64.wgsl
│ │ ├── wgsl-interface.wgsl
│ │ ├── wgsl-interpolate.wgsl
│ │ ├── wgsl-interpolate_compat.wgsl
│ │ ├── wgsl-lexical-scopes.wgsl
│ │ ├── wgsl-local-const.wgsl
│ │ ├── wgsl-math-functions.wgsl
│ │ ├── wgsl-memory-decorations-coherent.wgsl
│ │ ├── wgsl-memory-decorations.wgsl
│ │ ├── wgsl-mesh-shader-empty.wgsl
│ │ ├── wgsl-mesh-shader-lines.wgsl
│ │ ├── wgsl-mesh-shader-points.wgsl
│ │ ├── wgsl-mesh-shader.wgsl
│ │ ├── wgsl-module-scope.wgsl
│ │ ├── wgsl-multiview.wgsl
│ │ ├── wgsl-operators.wgsl
│ │ ├── wgsl-padding.wgsl
│ │ ├── wgsl-per-vertex.wgsl
│ │ ├── wgsl-phony_assignment.wgsl
│ │ ├── wgsl-pointer-function-arg.wgsl
│ │ ├── wgsl-pointers.wgsl
│ │ ├── wgsl-primitive-index.wgsl
│ │ ├── wgsl-quad.wgsl
│ │ ├── wgsl-ray-tracing-pipeline.wgsl
│ │ ├── wgsl-select.wgsl
│ │ ├── wgsl-shadow.wgsl
│ │ ├── wgsl-skybox.wgsl
│ │ ├── wgsl-standard.wgsl
│ │ ├── wgsl-struct-layout.wgsl
│ │ ├── wgsl-subgroup-barrier.wgsl
│ │ ├── wgsl-subgroup-operations.wgsl
│ │ ├── wgsl-texture-arg.wgsl
│ │ ├── wgsl-texture-external.wgsl
│ │ ├── wgsl-type-alias.wgsl
│ │ ├── wgsl-type-inference.wgsl
│ │ ├── wgsl-workgroup-uniform-load-atomic.wgsl
│ │ ├── wgsl-workgroup-uniform-load.wgsl
│ │ └── wgsl-workgroup-var-init.wgsl
│ └── xtask/
│ ├── .gitignore
│ ├── Cargo.toml
│ └── src/
│ ├── cli.rs
│ ├── fs.rs
│ ├── glob.rs
│ ├── jobserver.rs
│ ├── main.rs
│ ├── path.rs
│ ├── process.rs
│ └── validate.rs
├── naga-cli/
│ ├── Cargo.toml
│ ├── LICENSE.APACHE
│ ├── LICENSE.MIT
│ └── src/
│ └── bin/
│ └── naga.rs
├── naga-test/
│ ├── Cargo.toml
│ └── src/
│ └── lib.rs
├── player/
│ ├── Cargo.toml
│ ├── README.md
│ ├── src/
│ │ ├── bin/
│ │ │ └── play.rs
│ │ └── lib.rs
│ └── tests/
│ └── player/
│ ├── data/
│ │ ├── all.ron
│ │ ├── bind-group.ron
│ │ ├── buffer-copy.ron
│ │ ├── clear-buffer-texture.ron
│ │ ├── empty.wgsl
│ │ ├── pipeline-statistics-query.ron
│ │ ├── quad.ron
│ │ ├── quad.wgsl
│ │ ├── zero-init-buffer-for-binding.wgsl
│ │ ├── zero-init-buffer.ron
│ │ ├── zero-init-texture-binding.ron
│ │ ├── zero-init-texture-binding.wgsl
│ │ ├── zero-init-texture-copytobuffer.ron
│ │ └── zero-init-texture-rendertarget.ron
│ └── main.rs
├── renovate.json
├── rust-toolchain.toml
├── rustfmt.toml
├── taplo.toml
├── tests/
│ ├── Cargo.toml
│ ├── src/
│ │ ├── config.rs
│ │ ├── copy_texture_to_buffer.wgsl
│ │ ├── expectations.rs
│ │ ├── image.rs
│ │ ├── init.rs
│ │ ├── isolation.rs
│ │ ├── lib.rs
│ │ ├── native.rs
│ │ ├── params.rs
│ │ ├── poll.rs
│ │ ├── report.rs
│ │ └── run.rs
│ └── tests/
│ ├── wgpu-compile/
│ │ ├── fail/
│ │ │ ├── cpass_lifetime.rs
│ │ │ ├── cpass_lifetime.stderr
│ │ │ ├── rpass_lifetime.rs
│ │ │ └── rpass_lifetime.stderr
│ │ └── main.rs
│ ├── wgpu-dependency/
│ │ └── main.rs
│ ├── wgpu-gpu/
│ │ ├── bgra8unorm_storage.rs
│ │ ├── bind_group_layout_dedup.rs
│ │ ├── bind_groups.rs
│ │ ├── binding_array/
│ │ │ ├── buffers.rs
│ │ │ ├── mod.rs
│ │ │ ├── sampled_textures.rs
│ │ │ ├── samplers.rs
│ │ │ ├── storage_textures.rs
│ │ │ └── tlas.rs
│ │ ├── buffer.rs
│ │ ├── buffer_copy.rs
│ │ ├── buffer_usages.rs
│ │ ├── clear_texture.rs
│ │ ├── clip_distances.rs
│ │ ├── cloneable_types.rs
│ │ ├── compute_pass_ownership.rs
│ │ ├── create_surface_error.rs
│ │ ├── device.rs
│ │ ├── dispatch_workgroups_indirect.rs
│ │ ├── draw_index.rs
│ │ ├── draw_indirect.rs
│ │ ├── dual_source_blending.rs
│ │ ├── encoder.rs
│ │ ├── external_image_copy.rs
│ │ ├── external_texture/
│ │ │ ├── dimensions.wgsl
│ │ │ ├── load.wgsl
│ │ │ ├── mod.rs
│ │ │ └── sample.wgsl
│ │ ├── float32_filterable.rs
│ │ ├── image_atomics/
│ │ │ ├── image_32_atomics.wgsl
│ │ │ ├── image_64_atomics.wgsl
│ │ │ └── mod.rs
│ │ ├── immediates.rs
│ │ ├── instance.rs
│ │ ├── life_cycle.rs
│ │ ├── main.rs
│ │ ├── mem_leaks.rs
│ │ ├── mesh_shader/
│ │ │ ├── basic.hlsl
│ │ │ ├── mod.rs
│ │ │ ├── shader.metal
│ │ │ └── shader.wgsl
│ │ ├── multiview/
│ │ │ ├── mod.rs
│ │ │ └── shader.wgsl
│ │ ├── naga_capabilities.rs
│ │ ├── occlusion_query/
│ │ │ ├── mod.rs
│ │ │ └── shader.wgsl
│ │ ├── oob_indexing.rs
│ │ ├── oom.rs
│ │ ├── pass_ops/
│ │ │ └── mod.rs
│ │ ├── passthrough/
│ │ │ ├── mod.rs
│ │ │ ├── shader.frag
│ │ │ ├── shader.hlsl
│ │ │ ├── shader.metal
│ │ │ ├── shader.vert
│ │ │ └── shader.wgsl
│ │ ├── per_vertex/
│ │ │ ├── mod.rs
│ │ │ └── per_vertex.wgsl
│ │ ├── pipeline.rs
│ │ ├── pipeline_cache.rs
│ │ ├── planar_texture/
│ │ │ ├── mod.rs
│ │ │ ├── planar_texture_rendering.wgsl
│ │ │ └── planar_texture_sampling.wgsl
│ │ ├── poll.rs
│ │ ├── primitive_index.rs
│ │ ├── query_set.rs
│ │ ├── queue_transfer.rs
│ │ ├── ray_tracing/
│ │ │ ├── as_build.rs
│ │ │ ├── as_create.rs
│ │ │ ├── as_use_after_free.rs
│ │ │ ├── limits.rs
│ │ │ ├── mod.rs
│ │ │ ├── scene/
│ │ │ │ ├── mesh_gen.rs
│ │ │ │ └── mod.rs
│ │ │ ├── shader.rs
│ │ │ └── shader.wgsl
│ │ ├── regression/
│ │ │ ├── issue_3349.fs.wgsl
│ │ │ ├── issue_3349.rs
│ │ │ ├── issue_3349.vs.wgsl
│ │ │ ├── issue_3457.rs
│ │ │ ├── issue_3457.wgsl
│ │ │ ├── issue_4024.rs
│ │ │ ├── issue_4122.rs
│ │ │ ├── issue_4485.rs
│ │ │ ├── issue_4485.wgsl
│ │ │ ├── issue_4514.rs
│ │ │ ├── issue_4514.wgsl
│ │ │ ├── issue_5553.rs
│ │ │ ├── issue_5553.wgsl
│ │ │ ├── issue_6317.rs
│ │ │ ├── issue_6467.rs
│ │ │ └── issue_6827.rs
│ │ ├── render_pass_ownership.rs
│ │ ├── render_target.rs
│ │ ├── resource_descriptor_accessor.rs
│ │ ├── resource_error.rs
│ │ ├── samplers.rs
│ │ ├── scissor_tests/
│ │ │ ├── mod.rs
│ │ │ └── solid_white.wgsl
│ │ ├── shader/
│ │ │ ├── array_size_overrides.rs
│ │ │ ├── compilation_messages/
│ │ │ │ ├── error_shader.wgsl
│ │ │ │ ├── mod.rs
│ │ │ │ └── successful_shader.wgsl
│ │ │ ├── data_builtins.rs
│ │ │ ├── mod.rs
│ │ │ ├── numeric_builtins.rs
│ │ │ ├── shader_test.wgsl
│ │ │ ├── struct_layout.rs
│ │ │ ├── workgroup_size_overrides.rs
│ │ │ ├── zero_init_workgroup_mem.rs
│ │ │ └── zero_init_workgroup_mem.wgsl
│ │ ├── shader_barycentric/
│ │ │ ├── barycentric.wgsl
│ │ │ └── mod.rs
│ │ ├── shader_primitive_index/
│ │ │ ├── mod.rs
│ │ │ └── primitive_index.wgsl
│ │ ├── shader_view_format/
│ │ │ ├── mod.rs
│ │ │ └── view_format.wgsl
│ │ ├── subgroup_operations/
│ │ │ ├── mod.rs
│ │ │ └── shader.wgsl
│ │ ├── texture_binding/
│ │ │ ├── mod.rs
│ │ │ ├── shader.wgsl
│ │ │ └── single_scalar.wgsl
│ │ ├── texture_blit.rs
│ │ ├── texture_bounds.rs
│ │ ├── texture_view_creation.rs
│ │ ├── timestamp_normalization/
│ │ │ ├── mod.rs
│ │ │ ├── shift_right_u96.wgsl
│ │ │ ├── u64_mul_u32.wgsl
│ │ │ └── utils.rs
│ │ ├── timestamp_query.rs
│ │ ├── transfer.rs
│ │ ├── transient.rs
│ │ ├── transition_resources.rs
│ │ ├── vertex_formats/
│ │ │ ├── draw.vert.wgsl
│ │ │ └── mod.rs
│ │ ├── vertex_indices/
│ │ │ ├── draw.vert.wgsl
│ │ │ └── mod.rs
│ │ ├── vertex_state.rs
│ │ ├── write_texture.rs
│ │ └── zero_init_texture_after_discard.rs
│ ├── wgpu-validation/
│ │ ├── api/
│ │ │ ├── binding_arrays.rs
│ │ │ ├── buffer.rs
│ │ │ ├── buffer_mapping.rs
│ │ │ ├── buffer_slice.rs
│ │ │ ├── command_buffer_actions.rs
│ │ │ ├── device.rs
│ │ │ ├── encoding.rs
│ │ │ ├── error_scopes.rs
│ │ │ ├── experimental.rs
│ │ │ ├── external_texture.rs
│ │ │ ├── instance.rs
│ │ │ ├── mod.rs
│ │ │ ├── render_pipeline.rs
│ │ │ └── texture.rs
│ │ ├── main.rs
│ │ ├── noop.rs
│ │ └── util.rs
│ └── wgpu_trace.rs
├── typos.toml
├── wgpu/
│ ├── Cargo.toml
│ ├── LICENSE.APACHE
│ ├── LICENSE.MIT
│ ├── build.rs
│ └── src/
│ ├── api/
│ │ ├── adapter.rs
│ │ ├── bind_group.rs
│ │ ├── bind_group_layout.rs
│ │ ├── blas.rs
│ │ ├── buffer.rs
│ │ ├── command_buffer.rs
│ │ ├── command_buffer_actions.rs
│ │ ├── command_encoder.rs
│ │ ├── common_pipeline.rs
│ │ ├── compute_pass.rs
│ │ ├── compute_pipeline.rs
│ │ ├── device.rs
│ │ ├── external_texture.rs
│ │ ├── instance.rs
│ │ ├── mod.rs
│ │ ├── pipeline_cache.rs
│ │ ├── pipeline_layout.rs
│ │ ├── query_set.rs
│ │ ├── queue.rs
│ │ ├── render_bundle.rs
│ │ ├── render_bundle_encoder.rs
│ │ ├── render_pass.rs
│ │ ├── render_pipeline.rs
│ │ ├── sampler.rs
│ │ ├── shader_module.rs
│ │ ├── surface.rs
│ │ ├── surface_texture.rs
│ │ ├── texture.rs
│ │ ├── texture_view.rs
│ │ └── tlas.rs
│ ├── backend/
│ │ ├── custom.rs
│ │ ├── mod.rs
│ │ ├── webgpu/
│ │ │ ├── defined_non_null_js_value.rs
│ │ │ ├── ext_bindings.rs
│ │ │ └── webgpu_sys/
│ │ │ ├── gen_Gpu.rs
│ │ │ ├── gen_GpuAdapter.rs
│ │ │ ├── gen_GpuAdapterInfo.rs
│ │ │ ├── gen_GpuAddressMode.rs
│ │ │ ├── gen_GpuAutoLayoutMode.rs
│ │ │ ├── gen_GpuBindGroup.rs
│ │ │ ├── gen_GpuBindGroupDescriptor.rs
│ │ │ ├── gen_GpuBindGroupEntry.rs
│ │ │ ├── gen_GpuBindGroupLayout.rs
│ │ │ ├── gen_GpuBindGroupLayoutDescriptor.rs
│ │ │ ├── gen_GpuBindGroupLayoutEntry.rs
│ │ │ ├── gen_GpuBlendComponent.rs
│ │ │ ├── gen_GpuBlendFactor.rs
│ │ │ ├── gen_GpuBlendOperation.rs
│ │ │ ├── gen_GpuBlendState.rs
│ │ │ ├── gen_GpuBuffer.rs
│ │ │ ├── gen_GpuBufferBinding.rs
│ │ │ ├── gen_GpuBufferBindingLayout.rs
│ │ │ ├── gen_GpuBufferBindingType.rs
│ │ │ ├── gen_GpuBufferDescriptor.rs
│ │ │ ├── gen_GpuBufferMapState.rs
│ │ │ ├── gen_GpuCanvasAlphaMode.rs
│ │ │ ├── gen_GpuCanvasConfiguration.rs
│ │ │ ├── gen_GpuCanvasContext.rs
│ │ │ ├── gen_GpuCanvasToneMapping.rs
│ │ │ ├── gen_GpuCanvasToneMappingMode.rs
│ │ │ ├── gen_GpuColorDict.rs
│ │ │ ├── gen_GpuColorTargetState.rs
│ │ │ ├── gen_GpuCommandBuffer.rs
│ │ │ ├── gen_GpuCommandBufferDescriptor.rs
│ │ │ ├── gen_GpuCommandEncoder.rs
│ │ │ ├── gen_GpuCommandEncoderDescriptor.rs
│ │ │ ├── gen_GpuCompareFunction.rs
│ │ │ ├── gen_GpuCompilationInfo.rs
│ │ │ ├── gen_GpuCompilationMessage.rs
│ │ │ ├── gen_GpuCompilationMessageType.rs
│ │ │ ├── gen_GpuComputePassDescriptor.rs
│ │ │ ├── gen_GpuComputePassEncoder.rs
│ │ │ ├── gen_GpuComputePassTimestampWrites.rs
│ │ │ ├── gen_GpuComputePipeline.rs
│ │ │ ├── gen_GpuComputePipelineDescriptor.rs
│ │ │ ├── gen_GpuCopyExternalImageDestInfo.rs
│ │ │ ├── gen_GpuCopyExternalImageSourceInfo.rs
│ │ │ ├── gen_GpuCullMode.rs
│ │ │ ├── gen_GpuDepthStencilState.rs
│ │ │ ├── gen_GpuDevice.rs
│ │ │ ├── gen_GpuDeviceDescriptor.rs
│ │ │ ├── gen_GpuDeviceLostInfo.rs
│ │ │ ├── gen_GpuDeviceLostReason.rs
│ │ │ ├── gen_GpuError.rs
│ │ │ ├── gen_GpuErrorFilter.rs
│ │ │ ├── gen_GpuExtent3dDict.rs
│ │ │ ├── gen_GpuExternalTexture.rs
│ │ │ ├── gen_GpuExternalTextureBindingLayout.rs
│ │ │ ├── gen_GpuExternalTextureDescriptor.rs
│ │ │ ├── gen_GpuFeatureName.rs
│ │ │ ├── gen_GpuFilterMode.rs
│ │ │ ├── gen_GpuFragmentState.rs
│ │ │ ├── gen_GpuFrontFace.rs
│ │ │ ├── gen_GpuIndexFormat.rs
│ │ │ ├── gen_GpuLoadOp.rs
│ │ │ ├── gen_GpuMipmapFilterMode.rs
│ │ │ ├── gen_GpuMultisampleState.rs
│ │ │ ├── gen_GpuObjectDescriptorBase.rs
│ │ │ ├── gen_GpuOrigin2dDict.rs
│ │ │ ├── gen_GpuOrigin3dDict.rs
│ │ │ ├── gen_GpuOutOfMemoryError.rs
│ │ │ ├── gen_GpuPipelineDescriptorBase.rs
│ │ │ ├── gen_GpuPipelineLayout.rs
│ │ │ ├── gen_GpuPipelineLayoutDescriptor.rs
│ │ │ ├── gen_GpuPowerPreference.rs
│ │ │ ├── gen_GpuPrimitiveState.rs
│ │ │ ├── gen_GpuPrimitiveTopology.rs
│ │ │ ├── gen_GpuProgrammableStage.rs
│ │ │ ├── gen_GpuQuerySet.rs
│ │ │ ├── gen_GpuQuerySetDescriptor.rs
│ │ │ ├── gen_GpuQueryType.rs
│ │ │ ├── gen_GpuQueue.rs
│ │ │ ├── gen_GpuQueueDescriptor.rs
│ │ │ ├── gen_GpuRenderBundle.rs
│ │ │ ├── gen_GpuRenderBundleDescriptor.rs
│ │ │ ├── gen_GpuRenderBundleEncoder.rs
│ │ │ ├── gen_GpuRenderBundleEncoderDescriptor.rs
│ │ │ ├── gen_GpuRenderPassColorAttachment.rs
│ │ │ ├── gen_GpuRenderPassDepthStencilAttachment.rs
│ │ │ ├── gen_GpuRenderPassDescriptor.rs
│ │ │ ├── gen_GpuRenderPassEncoder.rs
│ │ │ ├── gen_GpuRenderPassTimestampWrites.rs
│ │ │ ├── gen_GpuRenderPipeline.rs
│ │ │ ├── gen_GpuRenderPipelineDescriptor.rs
│ │ │ ├── gen_GpuRequestAdapterOptions.rs
│ │ │ ├── gen_GpuSampler.rs
│ │ │ ├── gen_GpuSamplerBindingLayout.rs
│ │ │ ├── gen_GpuSamplerBindingType.rs
│ │ │ ├── gen_GpuSamplerDescriptor.rs
│ │ │ ├── gen_GpuShaderModule.rs
│ │ │ ├── gen_GpuShaderModuleDescriptor.rs
│ │ │ ├── gen_GpuStencilFaceState.rs
│ │ │ ├── gen_GpuStencilOperation.rs
│ │ │ ├── gen_GpuStorageTextureAccess.rs
│ │ │ ├── gen_GpuStorageTextureBindingLayout.rs
│ │ │ ├── gen_GpuStoreOp.rs
│ │ │ ├── gen_GpuSupportedFeatures.rs
│ │ │ ├── gen_GpuSupportedLimits.rs
│ │ │ ├── gen_GpuTexelCopyBufferInfo.rs
│ │ │ ├── gen_GpuTexelCopyBufferLayout.rs
│ │ │ ├── gen_GpuTexelCopyTextureInfo.rs
│ │ │ ├── gen_GpuTexture.rs
│ │ │ ├── gen_GpuTextureAspect.rs
│ │ │ ├── gen_GpuTextureBindingLayout.rs
│ │ │ ├── gen_GpuTextureDescriptor.rs
│ │ │ ├── gen_GpuTextureDimension.rs
│ │ │ ├── gen_GpuTextureFormat.rs
│ │ │ ├── gen_GpuTextureSampleType.rs
│ │ │ ├── gen_GpuTextureView.rs
│ │ │ ├── gen_GpuTextureViewDescriptor.rs
│ │ │ ├── gen_GpuTextureViewDimension.rs
│ │ │ ├── gen_GpuUncapturedErrorEvent.rs
│ │ │ ├── gen_GpuUncapturedErrorEventInit.rs
│ │ │ ├── gen_GpuValidationError.rs
│ │ │ ├── gen_GpuVertexAttribute.rs
│ │ │ ├── gen_GpuVertexBufferLayout.rs
│ │ │ ├── gen_GpuVertexFormat.rs
│ │ │ ├── gen_GpuVertexState.rs
│ │ │ ├── gen_GpuVertexStepMode.rs
│ │ │ ├── gen_WgslLanguageFeatures.rs
│ │ │ ├── gen_gpu_map_mode.rs
│ │ │ └── mod.rs
│ │ ├── webgpu.rs
│ │ ├── wgpu_core/
│ │ │ └── thread_id.rs
│ │ └── wgpu_core.rs
│ ├── cmp.rs
│ ├── dispatch.rs
│ ├── lib.rs
│ ├── macros/
│ │ ├── be-aligned.spv
│ │ ├── le-aligned.spv
│ │ └── mod.rs
│ └── util/
│ ├── belt.rs
│ ├── blit.wgsl
│ ├── device.rs
│ ├── encoder.rs
│ ├── init.rs
│ ├── mod.rs
│ ├── mutex.rs
│ ├── panicking.rs
│ ├── spirv.rs
│ └── texture_blitter.rs
├── wgpu-core/
│ ├── Cargo.toml
│ ├── LICENSE.APACHE
│ ├── LICENSE.MIT
│ ├── build.rs
│ ├── platform-deps/
│ │ ├── apple/
│ │ │ ├── Cargo.toml
│ │ │ ├── LICENSE.APACHE
│ │ │ ├── LICENSE.MIT
│ │ │ ├── README.md
│ │ │ └── src/
│ │ │ └── lib.rs
│ │ ├── emscripten/
│ │ │ ├── Cargo.toml
│ │ │ ├── LICENSE.APACHE
│ │ │ ├── LICENSE.MIT
│ │ │ ├── README.md
│ │ │ └── src/
│ │ │ └── lib.rs
│ │ ├── wasm/
│ │ │ ├── Cargo.toml
│ │ │ ├── LICENSE.APACHE
│ │ │ ├── LICENSE.MIT
│ │ │ ├── README.md
│ │ │ └── src/
│ │ │ └── lib.rs
│ │ └── windows-linux-android/
│ │ ├── Cargo.toml
│ │ ├── LICENSE.APACHE
│ │ ├── LICENSE.MIT
│ │ ├── README.md
│ │ └── src/
│ │ └── lib.rs
│ └── src/
│ ├── as_hal.rs
│ ├── binding_model.rs
│ ├── command/
│ │ ├── allocator.rs
│ │ ├── bind.rs
│ │ ├── bundle.rs
│ │ ├── clear.rs
│ │ ├── compute.rs
│ │ ├── compute_command.rs
│ │ ├── draw.rs
│ │ ├── encoder.rs
│ │ ├── encoder_command.rs
│ │ ├── ffi.rs
│ │ ├── memory_init.rs
│ │ ├── mod.rs
│ │ ├── pass.rs
│ │ ├── query.rs
│ │ ├── ray_tracing.rs
│ │ ├── render.rs
│ │ ├── render_command.rs
│ │ ├── timestamp_writes.rs
│ │ ├── transfer.rs
│ │ └── transition_resources.rs
│ ├── conv.rs
│ ├── device/
│ │ ├── bgl.rs
│ │ ├── global.rs
│ │ ├── life.rs
│ │ ├── mod.rs
│ │ ├── queue.rs
│ │ ├── ray_tracing.rs
│ │ ├── resource.rs
│ │ ├── trace/
│ │ │ ├── record.rs
│ │ │ └── replay.rs
│ │ └── trace.rs
│ ├── error.rs
│ ├── global.rs
│ ├── hash_utils.rs
│ ├── hub.rs
│ ├── id.rs
│ ├── identity.rs
│ ├── indirect_validation/
│ │ ├── dispatch.rs
│ │ ├── draw.rs
│ │ ├── mod.rs
│ │ ├── utils.rs
│ │ └── validate_draw.wgsl
│ ├── init_tracker/
│ │ ├── buffer.rs
│ │ ├── mod.rs
│ │ └── texture.rs
│ ├── instance.rs
│ ├── lib.rs
│ ├── lock/
│ │ ├── mod.rs
│ │ ├── observing.rs
│ │ ├── rank.rs
│ │ ├── ranked.rs
│ │ └── vanilla.rs
│ ├── pipeline.rs
│ ├── pipeline_cache.rs
│ ├── pool.rs
│ ├── present.rs
│ ├── ray_tracing.rs
│ ├── registry.rs
│ ├── resource.rs
│ ├── scratch.rs
│ ├── snatch.rs
│ ├── storage.rs
│ ├── timestamp_normalization/
│ │ ├── common.wgsl
│ │ ├── mod.rs
│ │ └── timestamp_normalization.wgsl
│ ├── track/
│ │ ├── blas.rs
│ │ ├── buffer.rs
│ │ ├── metadata.rs
│ │ ├── mod.rs
│ │ ├── range.rs
│ │ ├── stateless.rs
│ │ └── texture.rs
│ ├── validation/
│ │ └── shader_io_deductions.rs
│ ├── validation.rs
│ └── weak_vec.rs
├── wgpu-hal/
│ ├── Cargo.toml
│ ├── LICENSE.APACHE
│ ├── LICENSE.MIT
│ ├── README.md
│ ├── build.rs
│ ├── examples/
│ │ ├── halmark/
│ │ │ ├── main.rs
│ │ │ └── shader.wgsl
│ │ ├── raw-gles.em.html
│ │ ├── raw-gles.rs
│ │ └── ray-traced-triangle/
│ │ ├── main.rs
│ │ └── shader.wgsl
│ └── src/
│ ├── auxil/
│ │ ├── dxgi/
│ │ │ ├── conv.rs
│ │ │ ├── exception.rs
│ │ │ ├── factory.rs
│ │ │ ├── mod.rs
│ │ │ ├── name.rs
│ │ │ ├── result.rs
│ │ │ └── time.rs
│ │ ├── mod.rs
│ │ └── renderdoc.rs
│ ├── dx12/
│ │ ├── adapter.rs
│ │ ├── command.rs
│ │ ├── conv.rs
│ │ ├── dcomp.rs
│ │ ├── descriptor.rs
│ │ ├── device.rs
│ │ ├── device_creation.rs
│ │ ├── instance.rs
│ │ ├── mod.rs
│ │ ├── pipeline_desc.rs
│ │ ├── sampler.rs
│ │ ├── shader_compilation.rs
│ │ ├── suballocation.rs
│ │ ├── types.rs
│ │ └── view.rs
│ ├── dynamic/
│ │ ├── adapter.rs
│ │ ├── command.rs
│ │ ├── device.rs
│ │ ├── instance.rs
│ │ ├── mod.rs
│ │ ├── queue.rs
│ │ └── surface.rs
│ ├── gles/
│ │ ├── adapter.rs
│ │ ├── command.rs
│ │ ├── conv.rs
│ │ ├── device.rs
│ │ ├── egl.rs
│ │ ├── emscripten.rs
│ │ ├── fence.rs
│ │ ├── mod.rs
│ │ ├── queue.rs
│ │ ├── shaders/
│ │ │ ├── clear.frag
│ │ │ ├── clear.vert
│ │ │ ├── srgb_present.frag
│ │ │ └── srgb_present.vert
│ │ ├── web.rs
│ │ └── wgl.rs
│ ├── lib.rs
│ ├── metal/
│ │ ├── adapter.rs
│ │ ├── command.rs
│ │ ├── conv.rs
│ │ ├── device.rs
│ │ ├── library_from_metallib.rs
│ │ ├── mod.rs
│ │ ├── surface.rs
│ │ └── time.rs
│ ├── noop/
│ │ ├── buffer.rs
│ │ ├── command.rs
│ │ └── mod.rs
│ ├── validation_canary.rs
│ └── vulkan/
│ ├── adapter.rs
│ ├── command.rs
│ ├── conv.rs
│ ├── device.rs
│ ├── drm.rs
│ ├── instance.rs
│ ├── mod.rs
│ ├── sampler.rs
│ ├── semaphore_list.rs
│ └── swapchain/
│ ├── mod.rs
│ └── native.rs
├── wgpu-info/
│ ├── Cargo.toml
│ ├── LICENSE.APACHE
│ ├── LICENSE.MIT
│ ├── README.md
│ └── src/
│ ├── cli.rs
│ ├── human.rs
│ ├── main.rs
│ ├── report.rs
│ ├── tests.rs
│ └── texture.rs
├── wgpu-macros/
│ ├── Cargo.toml
│ └── src/
│ └── lib.rs
├── wgpu-naga-bridge/
│ ├── Cargo.toml
│ ├── LICENSE.APACHE
│ ├── LICENSE.MIT
│ └── src/
│ └── lib.rs
├── wgpu-types/
│ ├── Cargo.toml
│ ├── LICENSE.APACHE
│ ├── LICENSE.MIT
│ └── src/
│ ├── adapter.rs
│ ├── assertions.rs
│ ├── backend.rs
│ ├── binding.rs
│ ├── buffer.rs
│ ├── cast_utils.rs
│ ├── counters.rs
│ ├── device.rs
│ ├── env.rs
│ ├── error.rs
│ ├── features.rs
│ ├── instance.rs
│ ├── lib.rs
│ ├── limits.rs
│ ├── math.rs
│ ├── origin_extent.rs
│ ├── ray_tracing.rs
│ ├── render.rs
│ ├── send_sync.rs
│ ├── shader.rs
│ ├── surface.rs
│ ├── texture/
│ │ ├── external_image.rs
│ │ ├── external_texture.rs
│ │ └── format.rs
│ ├── texture.rs
│ ├── tokens.rs
│ ├── transfers.rs
│ ├── vertex.rs
│ └── write_only.rs
└── xtask/
├── Cargo.toml
└── src/
├── changelog.rs
├── cts.rs
├── install_agility_sdk.rs
├── install_warp.rs
├── main.rs
├── miri.rs
├── run_wasm.rs
├── test.rs
├── util.rs
└── vendor_web_sys.rs
================================================
FILE CONTENTS
================================================
================================================
FILE: .cargo/config.toml
================================================
[alias]
xtask = "run -p wgpu-xtask --"
================================================
FILE: .claude/skills/cts-triage/SKILL.md
================================================
---
name: cts-triage
description: Run CTS test suites and investigate failures
---
# Triage Process
When working on a category of CTS tests, follow this systematic process to identify issues, prioritize fixes, and document findings.
## Step 0: Divide Into Manageable Chunks
List all the tests matching a selector:
```bash
cargo xtask cts -- --list 'webgpu:api,validation,*' 2>&1 | wc -l
```
If there is a reasonable number of tests matching the selector (less than a
couple hundred or so, but this isn't a hard cutoff), then you can proceed with
triage. Otherwise, make a list of more detailed wildcards that match fewer
tests, verify that each wildcard matches a reasonable number of tests, and
triage each wildcard separately.
## Step 1: Get Overall Statistics
Run the full test suite for the category to understand the scope:
```bash
cargo xtask cts 'webgpu:api,validation,category:*' 2>&1 | grep -E "(Summary|Passed|Failed)" | tail -5
```
This gives you the pass rate and number of failures. Document this as your baseline.
## Step 2: Identify Test Subcategories
Review the output from the running the CTS (with or without `--list`) to
identify any subcategories that may exist within the suite being analyzed.
Subcategories typically have an additional `:`- or `,`-delimited word in the
test name. Running tests by subcategory may be more manageable than running
with the entire suite at once or running individual tests.
## Step 3: Run Each Subcategory
Test each subcategory individually to identify which ones are passing vs failing:
```bash
cargo xtask cts 'webgpu:api,validation,category:subcategory:*' 2>&1 | grep -E "(Passed|Failed|Skipped)" | tail -3
```
Track the pass rate for each subcategory. This helps you identify:
- What's already working (don't break it!)
- Where the failures are concentrated
- Which issues affect multiple categories
## Step 4: Analyze Failure Patterns
For failing subcategories, look at what tests are failing:
```bash
cargo xtask cts 'webgpu:api,validation,category:subcategory:*' 2>&1 | grep "\[fail\]" | head -20
```
Look for patterns:
- **Format-specific failures**: May indicate missing format capability checks
- **Parameter-specific failures**: Validation missing for specific parameter combinations
## Step 5: Examine Specific Failures
Pick a representative failing test and run it individually to see the error:
```bash
cargo xtask cts 'webgpu:api,validation,category:subcategory:specific_test' 2>&1 | tail -30
```
Look for:
- **"EXPECTATION FAILED: DID NOT REJECT"**: wgpu is accepting invalid input (validation gap)
- **"Validation succeeded unexpectedly"**: Similar to above
- **"Unexpected validation error occurred"**: wgpu is rejecting valid input
- **Error message content**: Tells you what validation is triggering or missing
## Step 6: Check CTS Test Source
To understand what the test expects, read the TypeScript source:
```bash
grep -A 40 "test_name" cts/src/webgpu/api/validation/path/file.spec.ts
```
The test source shows:
- What configurations are being tested
- What the expected behavior is (pass/fail)
- The validation rules from the WebGPU spec
- Comments explaining the rationale
## Step 7: Categorize Issues
Group failures into categories:
**High Priority - Validation Gaps:**
- wgpu accepts invalid configurations that should fail
- Security or correctness implications
- Example: Accepting wrong texture formats, missing aspect checks
**Medium Priority - Spec Compliance:**
- Edge cases not handled correctly
- Optional field validation issues
- Example: depthCompare optional field handling
**Low Priority - Minor Gaps:**
- Less common scenarios
- Limited real-world impact
- Example: Depth bias with non-triangle topologies
**Known Issues - Skip:**
- Known failure patterns (documented in AGENTS.md)
- Track count but don't try to fix
## Step 8: Identify Root Causes
For validation gaps, find where validation should happen:
1. **Search for existing validation:**
```bash
grep -n "relevant_keyword" wgpu-core/src/device/resource.rs
```
2. **Look for render/compute pipeline creation:**
- Render pipeline: `wgpu-core/src/device/resource.rs` around `create_render_pipeline`
- Compute pipeline: Similar location
- Look for existing validation patterns you can follow
3. **Check for helper functions:**
```bash
grep "fn is_" wgpu-types/src/texture/format.rs
```
4. **Find error enums:**
```bash
grep "pub enum.*Error" wgpu-core/src/pipeline.rs
```
## Step 9: Implement Fixes
When implementing fixes:
1. **Add error variants if needed** (in `wgpu-core/src/pipeline.rs`)
2. **Add helper methods** (in `wgpu-types` if checking properties)
3. **Add validation checks** (in `wgpu-core/src/device/resource.rs`)
4. **Test the fix** with specific failing tests
5. **Run full subcategory** to verify all related tests pass
6. **Check you didn't break passing tests**
## Step 10: Document Findings
Create or update a triage document (e.g., `category_triage.md`).
Do not write information about changes you have made to the triage document. Only capture the state of the tests and any investigation into open issues.
````markdown
# Category CTS Tests - Triage Report
**Overall Status:** XP/YF/ZS (%/%/%)
## Passing Sub-suites ✅
[List sub-suites that have no failures (all pass or skip)]
## Remaining Issues ⚠️
[List sub-suites that have failures and if it can be stated concisely, a summary of the issue]
## Issue Detail
[List detail of any investigation into failures. Do not go into detail about passed suites, just list the failures.]
### 1. title, e.g. a distinguishing word from the test selector
**Test selector:** `webgpu:api,validation,render_pipeline,depth_stencil_state:format:*`
**What it tests:** [Description]
**Example failure:**
[a selector for a single failing test, e.g.:]
```
webgpu:api,validation,render_pipeline,depth_stencil_state:depthCompare_optional:isAsync=false;format="stencil8"
```
**Error:**
[error message from the failing tests, e.g.:]
```
Unexpected validation error occurred: Depth/stencil state is invalid:
Format Stencil8 does not have a depth aspect, but depth test/write is enabled
```
**Root cause:**
[Your analysis of the root cause. Do not speculate. Only include the results of specific investigation you have done.]
The validation is triggering incorrectly. When `depthCompare` is undefined/missing in JavaScript, it's getting translated to a default value that makes `is_depth_enabled()` return true, even for stencil-only formats.
**Fix needed:**
[Your proposed fix. Again, do not speculate. Only state the fix if it is obvious from the root cause analysis, or if you have done specific investigation into how to fix it.]
### 2. title
[repeat as needed for additional issues]
````
## Step 11: Update test.lst
For fixed tests that are now passing, add them to `cts_runner/test.lst`:
1. **Use wildcards** to minimize lines:
```
webgpu:api,validation,category:subcategory:isAsync=false;*
```
2. **Group related tests** when possible:
- If multiple subcategories all pass, use a higher-level wildcard
- Example: `webgpu:api,validation,category:*` if all subcategories pass
3. **Maintain alphabetical order** roughly in the file
## Step 12: Verify and Build
Before finishing:
```bash
# Format code
cargo fmt
# Check for errors
cargo clippy --tests
# Build to ensure no compilation errors
cargo build
# Run the tests you added to test.lst
cargo xtask cts 'webgpu:api,validation,category:subcategory:isAsync=false;*'
```
# Common Patterns
If the user asked to investigate a failure, and the cause of the failure is
noted here with "do not attempt to fix", then stop and ask the user before
attempting to fix.
**Pattern: Format-specific failures**
- Check if format validation is missing
- Look for `is_depth_stencil_format()`, `is_color_format()` etc.
- May need to add format capability checks
**Pattern: Aspect-related failures**
- Check if code validates format aspects (DEPTH, STENCIL, COLOR)
- Use `hal::FormatAspects::from(format)` to check
- Validate operations match available aspects
**Pattern: Optional field failures**
- May be WebGPU optional field semantics issue
- Check if undefined in JS becomes a default value in Rust
- May need to distinguish "not set" from "set to default"
**Pattern: Atomics accepted incorrectly**
- Naga allows referencing an atomic directly in an expression
- Should only allow accessing via `atomicLoad`, `atomicStore`, etc.
- Only investigate as necessary to confirm this is the issue. Do not attempt to fix. Refer user to https://github.com/gfx-rs/wgpu/issues/5474.
**Pattern: Error reporting for destroyed resources**
- Tests that check for validation errors when a destroyed resource is used. `wgpu` often reports these errors later than WebGPU requires, causing the tests to fail.
- `wgpu` may report these errors earlier than it should, causing the test to fail with an unexpected validation error.
- Look for:
- Tests with `state="destroyed"` parameter
- Tests checking that operations on destroyed buffers or textures should fail
- Example failing tests:
- `webgpu:api,validation,encoding,cmds,compute_pass:indirect_dispatch_buffer_state:` with `state="destroyed"` subcases
- Only investigate as necessary to confirm this is the issue. Do not attempt to fix. Refer user to https://github.com/gfx-rs/wgpu/issues/7881.
# Tips
- **Start with high-impact fixes**: Validation gaps with security implications
- **Look for existing patterns**: Other validation code shows the style
- **Test incrementally**: Fix one category at a time, verify it works
- **Document as you go**: Don't wait until the end to write the triage
- **Ask for clarification**: If test expectations are unclear, check the WebGPU spec or test source
- **Track your progress**: Update pass rates as you fix issues
================================================
FILE: .claude/skills/webgpu-specs/SKILL.md
================================================
---
name: webgpu-specs
description: Download WebGPU and WGSL specifications for use as a reference
allowed-tools: "Bash(sh .claude/skills/webgpu-specs/download.sh)"
---
Run `sh .claude/skills/webgpu-specs/download.sh` to download the
WebGPU and WGSL specifications if they are not present or if they have
been updated. You do not need to change directory before running the script.
After the specs are downloaded, you can search in `target/claude/webgpu-spec.bs`
and `target/claude/wgsl-spec.bs` for relevant sections of the specification.
When referencing the specifications, prefer to use named anchors rather than
line numbers. For example, to reference the "Object Descriptors" section, which has the
following header:
```
### Object Descriptors ### {#object-descriptors}
```
Use the URL <https://gpuweb.github.io/gpuweb/#object-descriptors> so the user
can click to navigate directly to that section.
For the WGSL specification, the base URL is <https://gpuweb.github.io/gpuweb/wgsl/>.
If necessary, read additional content from the file to find the header preceding
the text you want to reference. You may provide line numbers as additional
context, but always make every effort to provide the user with a clickable link.
================================================
FILE: .claude/skills/webgpu-specs/download.sh
================================================
#!/bin/sh
set -e
TARGET_DIR="$(cargo metadata --format-version 1 | jq -r ".target_directory")"
WEBGPU="$TARGET_DIR/claude/webgpu-spec"
WGSL="$TARGET_DIR/claude/wgsl-spec"
mkdir -p "$TARGET_DIR/claude"
if [ -f "$WEBGPU.etag" ]; then
curl --etag-save "$WEBGPU.etag.new" --etag-compare "$WEBGPU.etag" -fsSL https://raw.githubusercontent.com/gpuweb/gpuweb/main/spec/index.bs -o "$WEBGPU.bs"
[ -s "$WEBGPU.etag.new" ] && mv "$WEBGPU.etag.new" "$WEBGPU.etag" || rm "$WEBGPU.etag.new"
else
curl --etag-save "$WEBGPU.etag" https://raw.githubusercontent.com/gpuweb/gpuweb/main/spec/index.bs -o "$WEBGPU.bs"
fi
if [ -f "$WGSL.etag" ]; then
curl --etag-save "$WGSL.etag.new" --etag-compare "$WGSL.etag" -fsSL https://raw.githubusercontent.com/gpuweb/gpuweb/main/wgsl/index.bs -o "$WGSL.bs"
[ -s "$WGSL.etag.new" ] && mv "$WGSL.etag.new" "$WGSL.etag" || rm "$WGSL.etag.new"
else
curl --etag-save "$WGSL.etag" https://raw.githubusercontent.com/gpuweb/gpuweb/main/wgsl/index.bs -o "$WGSL.bs"
fi
================================================
FILE: .config/nextest.toml
================================================
# None of our tests should take longer than 45s, and if they've gone 2x that,
# terminate them to prevent infinite run-on.
[profile.default]
default-filter = "!test(~oom_test)"
slow-timeout = { period = "45s", terminate-after = 2 }
fail-fast = false
retries = 0
[profile.default-miri]
# Miri is very very slow, so give it a much longer timeout.
slow-timeout = { period = "120s", terminate-after = 4 }
# Use two threads for tests with "2 threads" in their name
[[profile.default.overrides]]
filter = 'test(~2_threads) | test(~2 threads)'
threads-required = 2
# Use four threads for tests with "4 threads" in their name
[[profile.default.overrides]]
filter = 'test(~4_threads) | test(~4 threads)'
threads-required = 4
# Use eight threads for tests with "8 threads" in their name
[[profile.default.overrides]]
filter = 'test(~8_threads) | test(~8 threads)'
threads-required = 8
#
# Workarounds for flaky tests
#
# https://github.com/gfx-rs/wgpu/issues/7200
[[profile.default.overrides]]
filter = 'test(wgpu_gpu::image_atomics::image_32_atomics)'
platform = 'cfg(target_vendor = "apple")'
retries = 1
[[profile.default.overrides]]
filter = 'test(compile_fail)'
slow-timeout = { period = "3m", terminate-after = 2 }
[[profile.default.overrides]]
filter = 'test(~oom_test)'
threads-required = "num-test-threads"
#
# Priorities for slow tests so that they run first, increasing overall test suite speed.
# On software renderers, they can take 10-60 seconds. Compile fail can easily take 30+
# seconds as it has to compile wgpu.
#
[[profile.default.overrides]]
priority = 1
filter = 'test(clear_texture) | test(clear_buffer_range_respected) | test(compile_fail) | test(test_api)'
================================================
FILE: .deny.toml
================================================
[bans]
multiple-versions = "deny"
skip-tree = [
{ name = "rustc-hash", version = "1.1.0" },
# introduced by Deno, to be investigated
{ name = "petgraph", version = "0.6.5" },
# Winit 0.30 uses an older objc2
{ name = "objc2-foundation", version = "0.2" },
# glutin and tracy-client-sys use windows-sys 0.52, pulling older windows-targets
{ name = "windows-targets", version = "0.52" },
# winit uses an old version via android-activity → jni
{ name = "windows-targets", version = "0.42" },
]
skip = [
# flume -> fastrand uses an old version only on wasm32
{ name = "getrandom", version = "0.2.17" },
# the ecosystem is migrating from getrandom 0.3 to 0.4, so this captures many stragglers
{ name = "getrandom", version = "0.3.4" },
# Deno uses an old version
{ name = "bincode", version = "1.3.3" },
{ name = "which", version = "6.0.3" },
# Winit uses an old version via android-activity → jni
{ name = "windows-sys", version = "0.45" },
# Winit uses an old version via calloop → rustix 0.38
{ name = "linux-raw-sys", version = "0.4" },
{ name = "rustix", version = "0.38" },
{ name = "windows-sys", version = "0.59" },
# Winit uses an old version via android-activity
{ name = "thiserror", version = "1" },
{ name = "thiserror-impl", version = "1" },
# glutin uses an old version
{ name = "windows-sys", version = "0.52" },
# getrandom 0.3 uses an old version
{ name = "r-efi", version = "5" },
# parking-lot uses an old version
{ name = "redox_syscall", version = "0.5.18" },
# deno uses an old version
{ name = "bit-vec", version = "0.8.0" },
{ name = "bit-set", version = "0.8.0" },
]
wildcards = "deny"
allow-wildcard-paths = true
[advisories]
ignore = [
# `paste` crate is no longer maintained https://rustsec.org/advisories/RUSTSEC-2024-0436
# It's a dependency of `metal` (which is to be replaced with `objc2-metal`), and a
# transitive dependency of `deno`. https://github.com/gfx-rs/wgpu/issues/7873
"RUSTSEC-2024-0436",
# `unic-*` crates are no longer maintained https://rustsec.org/advisories/RUSTSEC-2025-0100
# These are used via `deno`. https://github.com/gfx-rs/wgpu/issues/8393
"RUSTSEC-2025-0075",
"RUSTSEC-2025-0080",
"RUSTSEC-2025-0081",
"RUSTSEC-2025-0098",
"RUSTSEC-2025-0100",
# `bincode` is no longer maintained https://rustsec.org/advisories/RUSTSEC-2025-0141
# We only use it directly for tests and tools. It is also used indirectly via deno.
"RUSTSEC-2025-0141",
]
[licenses]
allow = [
"Apache-2.0",
"Apache-2.0 WITH LLVM-exception",
"BSD-2-Clause",
"BSD-3-Clause",
"CC0-1.0",
"ISC",
"MPL-2.0",
"MIT",
"MIT-0",
"Unicode-3.0",
"Zlib",
]
private = { ignore = true }
[sources]
allow-git = [
# Waiting on releases; used in examples/tests only
# Pending a release for https://github.com/rust-cli/env_logger/commit/143fa647ab33ed3acc9f160dfa3cb075cc62b5a3
"https://github.com/rust-cli/env_logger",
# Pending merge/release for https://github.com/LukasKalbertodt/libtest-mimic/pull/58
"https://github.com/cwfitzgerald/libtest-mimic",
]
unknown-registry = "deny"
unknown-git = "deny"
required-git-spec = "rev"
[sources.allow-org]
github = []
================================================
FILE: .gitattributes
================================================
*.mtl binary
*.obj binary
wgpu/src/backend/webgpu/webgpu_sys/** linguist-generated=true
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: bug
assignees: ''
---
<!-- Thank you for filing this! Please read the [debugging tips](https://github.com/gfx-rs/wgpu/wiki/Debugging-wgpu-Applications).
That may let you investigate on your own, or provide additional information that helps us to assist.-->
**Description**
A clear and concise description of what the bug is.
**Repro steps**
Ideally, a runnable example we can check out.
**Expected vs observed behavior**
Clearly describe what you get, and how it goes across your expectations.
**Extra materials**
Screenshots to help explain your problem.
Validation logs can be attached in case there are warnings and errors.
Zip-compressed API traces and GPU captures can also land here.
**Platform**
Information about your OS, version of `wgpu`, your tech stack, etc.
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: Question about wgpu
url: https://github.com/gfx-rs/wgpu/discussions/new/choose
about: Any questions about how to use wgpu should go here.
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
================================================
FILE: .github/ISSUE_TEMPLATE/other.md
================================================
---
name: Other
about: Strange things you want to tell us
title: ''
labels: question
assignees: ''
---
================================================
FILE: .github/actions/install-agility-sdk/action.yml
================================================
name: "Install Agility SDK"
description: "Install the D3D12 Agility SDK and export its environment variables"
runs:
using: "composite"
steps:
- shell: bash
run: |
set -e
cargo xtask install-agility-sdk >> "$GITHUB_ENV"
echo WGPU_DX12_AGILITY_SDK_REQUIRE=1 >> "$GITHUB_ENV"
================================================
FILE: .github/actions/install-dxc/action.yml
================================================
name: "Install DXC"
description: "Install DXC"
runs:
using: "composite"
steps:
- shell: bash
run: |
set -e
export DXC_RELEASE="v1.8.2505.1"
export DXC_FILENAME="dxc_2025_07_14.zip"
curl.exe -L --retry 5 https://github.com/microsoft/DirectXShaderCompiler/releases/download/$DXC_RELEASE/$DXC_FILENAME -o dxc.zip
7z.exe e dxc.zip -odxc bin/x64/{dxc.exe,dxcompiler.dll}
# We need to use cygpath to convert PWD to a windows path as we're using bash.
cygpath --windows "$PWD/dxc" >> "$GITHUB_PATH"
================================================
FILE: .github/actions/install-mesa/action.yml
================================================
name: "Install Mesa"
description: "Install Mesa"
inputs:
# Sourced from https://archive.mesa3d.org/. Bumping this requires
# updating the mesa build in https://github.com/gfx-rs/ci-build and creating a new release.
version:
default: "25.2.7"
# Corresponds to https://github.com/gfx-rs/ci-build/releases
ci-binary-build:
default: "build26"
target-dir:
description: "The directory into which to install the Mesa libraries."
default: "target/llvm-cov-target/debug"
runs:
using: "composite"
steps:
- name: (Linux) Install Mesa
if: runner.os == 'Linux'
shell: bash
env:
MESA_VERSION: ${{ inputs.version }}
CI_BINARY_BUILD: ${{ inputs.ci-binary-build }}
run: |
set -e
curl -L --retry 5 https://github.com/gfx-rs/ci-build/releases/download/$CI_BINARY_BUILD/mesa-$MESA_VERSION-linux-x86_64.tar.xz -o mesa.tar.xz
mkdir mesa
tar xpf mesa.tar.xz -C mesa
# The ICD provided by the mesa build is hardcoded to the build environment.
#
# We write out our own ICD file to point to the mesa vulkan
cat <<- EOF > icd.json
{
"ICD": {
"api_version": "1.1.255",
"library_path": "$PWD/mesa/lib/x86_64-linux-gnu/libvulkan_lvp.so"
},
"file_format_version": "1.0.0"
}
EOF
echo "VK_DRIVER_FILES=$PWD/icd.json" >> "$GITHUB_ENV"
echo "LD_LIBRARY_PATH=$PWD/mesa/lib/x86_64-linux-gnu/:$LD_LIBRARY_PATH" >> "$GITHUB_ENV"
echo "LIBGL_DRIVERS_PATH=$PWD/mesa/lib/x86_64-linux-gnu/dri" >> "$GITHUB_ENV"
- name: (Windows) Install Mesa
if: runner.os == 'Windows'
shell: bash
env:
MESA_VERSION: ${{ inputs.version }}
CI_BINARY_BUILD: ${{ inputs.ci-binary-build }}
run: |
set -e
curl.exe -L --retry 5 https://github.com/pal1000/mesa-dist-win/releases/download/$MESA_VERSION/mesa3d-$MESA_VERSION-release-msvc.7z -o mesa.7z
7z.exe e mesa.7z -omesa x64/{opengl32.dll,libgallium_wgl.dll,libglapi.dll,vulkan_lvp.dll,lvp_icd.x86_64.json}
cp -v mesa/* ${{ inputs.target-dir }}/
cp -v mesa/* ${{ inputs.target-dir }}/deps
# We need to use cygpath to convert PWD to a windows path as we're using bash.
echo "VK_DRIVER_FILES=`cygpath --windows $PWD/mesa/lvp_icd.x86_64.json`" >> "$GITHUB_ENV"
echo "GALLIUM_DRIVER=llvmpipe" >> "$GITHUB_ENV"
================================================
FILE: .github/actions/install-vulkan-sdk/action.yml
================================================
name: "Install Vulkan SDK"
description: "Install Vulkan SDK"
inputs:
# Sourced from https://vulkan.lunarg.com/sdk/home#linux
version:
default: "1.4.328"
full-version:
default: "1.4.328.1"
runs:
using: "composite"
steps:
- name: (Linux) Install Vulkan SDK
if: runner.os == 'Linux'
shell: bash
env:
VULKAN_SDK_VERSION: ${{ inputs.version }}
VULKAN_FULL_SDK_VERSION: ${{ inputs.full-version }}
run: |
set -e
curl -L --retry 5 https://sdk.lunarg.com/sdk/download/${{ env.VULKAN_FULL_SDK_VERSION }}/linux/vulkansdk-linux-x86_64-${{ env.VULKAN_FULL_SDK_VERSION }}.tar.xz -o vulkan-sdk.tar.xz
mkdir vulkan-sdk
tar xpf vulkan-sdk.tar.xz -C vulkan-sdk
mv ./vulkan-sdk/${{ env.VULKAN_FULL_SDK_VERSION }} $HOME/VulkanSDK
echo "$HOME/VulkanSDK/x86_64/bin" >> "$GITHUB_PATH"
echo "LD_LIBRARY_PATH=$HOME/VulkanSDK/x86_64/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" >> "$GITHUB_ENV"
echo "VK_ADD_LAYER_PATH=$HOME/VulkanSDK/x86_64/share/vulkan/explicit_layer.d" >> "$GITHUB_ENV"
- name: (Windows) Install Vulkan SDK
if: runner.os == 'Windows'
shell: bash
env:
VULKAN_SDK_VERSION: ${{ inputs.version }}
VULKAN_FULL_SDK_VERSION: ${{ inputs.full-version }}
run: |
set -e
curl.exe -L --retry 5 https://sdk.lunarg.com/sdk/download/${{ env.VULKAN_FULL_SDK_VERSION }}/windows/vulkansdk-windows-X64-${{ env.VULKAN_FULL_SDK_VERSION }}.exe -o vulkan-sdk-installer.exe
./vulkan-sdk-installer.exe --accept-licenses --default-answer --confirm-command install
echo "C:/VulkanSDK/${{ env.VULKAN_FULL_SDK_VERSION }}/Bin" >> "$GITHUB_PATH"
- name: (Mac) Install Vulkan SDK
if: runner.os == 'macOS'
shell: bash
env:
VULKAN_SDK_VERSION: ${{ inputs.version }}
VULKAN_FULL_SDK_VERSION: ${{ inputs.full-version }}
run: |
set -e
curl -L --retry 5 https://sdk.lunarg.com/sdk/download/${{ env.VULKAN_FULL_SDK_VERSION }}/mac/vulkansdk-macos-${{ env.VULKAN_FULL_SDK_VERSION }}.zip -o vulkan-sdk.zip
unzip vulkan-sdk.zip -d vulkan-sdk
ls -l vulkan-sdk
sudo ./vulkan-sdk/vulkansdk-macOS-${{ env.VULKAN_FULL_SDK_VERSION }}.app/Contents/MacOS/vulkansdk-macOS-${{ env.VULKAN_FULL_SDK_VERSION }} --root "$HOME/VulkanSDK" --accept-licenses --default-answer --confirm-command install
echo "$HOME/VulkanSDK/macOS/bin" >> "$GITHUB_PATH"
================================================
FILE: .github/actions/install-warp/action.yml
================================================
name: "Install WARP"
description: "Install WARP"
inputs:
target-dir:
description: "The directory into which to install the WARP DLL."
required: true
runs:
using: "composite"
steps:
- shell: bash
run: |
set -e
cargo xtask install-warp --target-dir ${{ inputs.target-dir }}
================================================
FILE: .github/pull_request_template.md
================================================
**Connections**
_Link to the issues addressed by this PR, or dependent PRs in other repositories_
_When one pull request builds on another, please put "Depends on
#NNNN" towards the top of its description. This helps maintainers
notice that they shouldn't merge it until its ancestor has been
approved. Don't use draft PR status to indicate this._
**Description**
_Describe what problem this is solving, and how it's solved._
**Testing**
_Explain how this change is tested._
**Squash or Rebase?**
_If your pull request contains multiple commits, please indicate whether
they need to be squashed into a single commit before they're merged,
or if they're ready to rebase onto `trunk` as they stand. In the
latter case, please ensure that each commit passes all CI tests, so
that we can continue to bisect along `trunk` to isolate bugs._
<!--
Thanks for filing! Reviewers are assigned for non-draft PRs in the weekly wgpu maintainers meetings.
After you get a review and have addressed any comments, please explicitly re-request a review from the
person(s) who reviewed your changes. This will make sure it gets re-added to their review queue - you're not bothering us!
-->
**Checklist**
- [ ] Run `cargo fmt`.
- [ ] Run `taplo format`.
- [ ] Run `cargo clippy --tests`. If applicable, add:
- [ ] `--target wasm32-unknown-unknown`
- [ ] Run `cargo xtask test` to run tests.
- [ ] If this contains user-facing changes, add a `CHANGELOG.md` entry. <!-- See instructions at the top of `CHANGELOG.md`. -->
================================================
FILE: .github/workflows/changelog.yml
================================================
name: changelog
on:
pull_request:
paths:
- ".github/workflows/changelog.yml"
- "CHANGELOG.md"
- "xtask/**/*"
types:
- opened
- synchronize
- reopened
- labeled
- unlabeled
env:
#
# Dependency versioning
#
# This is the MSRV used by all repository infrastructure.
REPO_MSRV: "1.93"
#
# Environment variables
#
CARGO_INCREMENTAL: false
CARGO_TERM_COLOR: always
RUST_LOG: info
RUST_BACKTRACE: "1"
CACHE_SUFFIX: c # cache busting
jobs:
changelog:
timeout-minutes: 2
name: Check changelog for errors
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v6
with:
fetch-depth: 0
# NOTE: Keep label name(s) in sync. with `xtask`'s implementation.
- name: Run `cargo xtask changelog …`
run: |
cargo xtask changelog "origin/${{ github.event.pull_request.base.ref }}" ${{ contains(github.event.pull_request.labels.*.name, 'changelog: released entry changed') && '--allow-released-changes' || '' }}
================================================
FILE: .github/workflows/ci.yml
================================================
name: CI
on:
push:
branches-ignore: [
# Renovate branches are always PRs, so they will be covered
# by the pull_request event.
"renovate/**",
# Branches with the `gh-readonly-queue` prefix are used by the
# merge queue, so they are already covered by the `merge_group` event.
"gh-readonly-queue/**",
]
pull_request:
merge_group:
env:
#
# Dependency versioning
#
# This is the MSRV used by all repository infrastructure.
REPO_MSRV: "1.93"
# This is the MSRV used by `wgpu` itself.
WGPU_MSRV: "1.87"
# This is the MSRV used by the `wgpu-core`, `wgpu-hal`, and `wgpu-types` crates,
# to ensure that they can be used with firefox.
CORE_MSRV: "1.87"
#
# Environment variables
#
CARGO_INCREMENTAL: false
CARGO_TERM_COLOR: always
WGPU_DX12_COMPILER: dxc
RUST_LOG: debug,wasm_bindgen_wasm_interpreter=warn,wasm_bindgen_cli_support=warn,walrus=warn,naga=info
RUST_BACKTRACE: full
PKG_CONFIG_ALLOW_CROSS: 1 # allow android to work
RUSTFLAGS: -D warnings
RUSTDOCFLAGS: -D warnings
WASM_BINDGEN_TEST_TIMEOUT: 300 # 5 minutes
CACHE_SUFFIX: e # cache busting
WGPU_CI: true
# Every time a PR is pushed to, cancel any previous jobs. This
# makes us behave nicer to github and get faster turnaround times
# on PRs that are pushed to multiple times in rapid succession.
concurrency:
group: ${{github.workflow}}-${{github.ref}}
cancel-in-progress: ${{github.event_name == 'pull_request'}}
# We distinguish the following kinds of builds:
# - native: build for the same target as we compile on
# - web: build for the Web
# - em: build for the Emscripten
# For build time and size optimization we disable debug symbols
# entirely on clippy jobs and reduce it to line-numbers
# only for ones where we run tests.
#
# Additionally, we disable incremental builds entirely
# as our caching system doesn't actually cache our crates.
# It adds overhead to the build and another point of failure.
jobs:
check:
# runtime is normally 2-8 minutes
#
# currently high due to documentation time problems on mac.
# https://github.com/rust-lang/rust/issues/114891
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
include:
# Windows
- name: Windows x86_64
os: windows-2022
target: x86_64-pc-windows-msvc
tier: 1
kind: native
# Windows
- name: Windows aarch64
os: windows-2022
target: aarch64-pc-windows-msvc
tier: 2
kind: native
# MacOS
- name: MacOS x86_64
os: macos-14
target: x86_64-apple-darwin
tier: 1
kind: native
- name: MacOS aarch64
os: macos-14
target: aarch64-apple-darwin
tier: 1
kind: native
# IOS
- name: IOS aarch64
os: macos-14
target: aarch64-apple-ios
tier: 2
kind: native
# VisionOS
- name: VisionOS aarch64
os: macos-14
target: aarch64-apple-visionos
kind: wgpu-only
tier: 3
extra-flags: -Zbuild-std
# Linux
- name: Linux x86_64
os: ubuntu-24.04
target: x86_64-unknown-linux-gnu
tier: 1
kind: native
- name: Linux aarch64
os: ubuntu-24.04
target: aarch64-unknown-linux-gnu
tier: 1
kind: native
# FreeBSD
- name: FreeBSD x86_64
os: ubuntu-24.04
target: x86_64-unknown-freebsd
tier: 2
kind: wgpu-only
# NetBSD
- name: NetBSD x86_64
os: ubuntu-24.04
target: x86_64-unknown-netbsd
tier: 2
kind: wgpu-only
# Android
- name: Android aarch64
os: ubuntu-24.04
target: aarch64-linux-android
tier: 2
kind: native
# Android
- name: Android ARMv7
os: ubuntu-24.04
target: armv7-linux-androideabi
tier: 2
kind: wgpu-only
# Android
- name: Android x86_64
os: ubuntu-24.04
target: x86_64-linux-android
tier: 2
kind: wgpu-only
# OpenHarmony
- name: OpenHarmony aarch64
os: ubuntu-24.04
target: aarch64-unknown-linux-ohos
tier: 2
kind: native
# WebGPU/WebGL
- name: WebAssembly
os: ubuntu-24.04
target: wasm32-unknown-unknown
tier: 2
kind: web
- name: Emscripten
os: ubuntu-24.04
target: wasm32-unknown-emscripten
tier: 2
kind: wgpu-only
- name: WebAssembly Core 1.0
os: ubuntu-24.04
target: wasm32v1-none
tier: 2
kind: no_std
# 32-bit PowerPC Linux
# Included to test support for `portable-atomic`
- name: Linux ppc32
os: ubuntu-24.04
target: powerpc-unknown-linux-gnu
tier: 2
kind: wgpu-only
name: Clippy ${{ matrix.name }}
runs-on: ${{ matrix.os }}
steps:
- name: Checkout repo
uses: actions/checkout@v6
- name: Install toolchain (repo MSRV - tier 1 or 2)
if: matrix.tier == 1 || matrix.tier == 2
run: |
rustup toolchain install ${{ env.REPO_MSRV }} --no-self-update --profile=minimal --component clippy
rustup target add ${{ matrix.target }} --toolchain ${{ env.REPO_MSRV }}
rustup override set ${{ env.REPO_MSRV }}
cargo -V
# In order to build on platforms that require a nightly toolchain, we install stable as expected,
# add the rust-src component, then tell stable to consider itself nightly by setting RUSTC_BOOTSTRAP=1.
#
# This is not formally "correct" thing to do, but it saves significant maintainer burden. If we were to
# use a proper nightly toolchain we would have to manually find a date that works. Even with a date that is
# carefully coordinated with the version of stable we are using, there are often mismatches of clippy lints
# between nightly and stable. This is a real mess. By using RUSTC_BOOTSTRAP=1, we get access to all the nice
# nightly features without needing to go through the hassle of maintaining a nightly toolchain.
#
# RUSTC_BOOTSTRAP=1 is how the rust project builds itself when bootstrapping the compiler, so while not "stable"
# it has been around for many years and don't anticipate it going away any time soon.
- name: Install toolchain (repo MSRV - tier 3)
if: matrix.tier == 3
run: |
rustup toolchain install ${{ env.REPO_MSRV }} --no-self-update --profile=minimal --component clippy,rust-src
echo "RUSTC_BOOTSTRAP=1" >> "$GITHUB_ENV"
- name: Disable debug symbols
shell: bash
run: |
mkdir -p .cargo
cat <<EOF >> .cargo/config.toml
[profile.dev]
debug = false
EOF
- name: Caching
uses: Swatinem/rust-cache@v2
with:
key: clippy-${{ matrix.target }}-${{ matrix.kind }}-${{ env.CACHE_SUFFIX }}
- name: (Linux `aarch64`) Install `aarch64-linux-gnu` `g++`
if: matrix.target == 'aarch64-unknown-linux-gnu'
run: |
set -e
sudo apt-get update -y -qq
sudo apt-get install g++-aarch64-linux-gnu
- name: (Android) Add Android APK to `PATH`
if: matrix.target == 'aarch64-linux-android'
run: |
# clang++ will be detected correctly by CC from path
echo "$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin" >> $GITHUB_PATH
# the android sdk doesn't use the conventional name for ar, so explicitly set it.
echo "AR_aarch64_linux_android=llvm-ar" >> "$GITHUB_ENV"
# Building for wasm32 requires a series of specific tests for the WebGPU backend.
- name: Check web
if: matrix.kind == 'web'
shell: bash
run: |
set -e
# build for WebGPU
cargo --locked clippy --target ${{ matrix.target }} ${{ matrix.extra-flags }} --tests --features glsl,spirv,fragile-send-sync-non-atomic-wasm
cargo --locked clippy --target ${{ matrix.target }} ${{ matrix.extra-flags }} --tests --features glsl,spirv
cargo --locked doc --target ${{ matrix.target }} ${{ matrix.extra-flags }} --no-deps --features glsl,spirv
# check with only the web feature
cargo --locked clippy --target ${{ matrix.target }} ${{ matrix.extra-flags }} --no-default-features --features=web
# all features
cargo --locked clippy --target ${{ matrix.target }} ${{ matrix.extra-flags }} --tests --all-features
cargo --locked doc --target ${{ matrix.target }} ${{ matrix.extra-flags }} --no-deps --all-features
# Building for platforms where the tests do not compile.
- name: Check `wgpu` only
if: matrix.kind == 'wgpu-only'
shell: bash
run: |
set -e
# check with no features
cargo --locked clippy --target ${{ matrix.target }} ${{ matrix.extra-flags }} -p wgpu -p wgpu-hal --no-default-features
# Don't check samples since we use winit in our samples which has dropped support for Emscripten.
# Check with all features.
cargo --locked clippy --target ${{ matrix.target }} ${{ matrix.extra-flags }} -p wgpu-hal --all-features
cargo --locked clippy --target ${{ matrix.target }} ${{ matrix.extra-flags }} -p wgpu --all-features
# Building for no_std platforms.
- name: Check `no_std`
if: matrix.kind == 'no_std'
shell: bash
run: |
set -e
# check with no features
cargo --locked clippy --target ${{ matrix.target }} ${{ matrix.extra-flags }} -p wgpu-types --no-default-features
cargo --locked clippy --target ${{ matrix.target }} ${{ matrix.extra-flags }} -p naga --no-default-features
cargo --locked clippy --target ${{ matrix.target }} ${{ matrix.extra-flags }} -p wgpu-hal --no-default-features
cargo --locked clippy --target ${{ matrix.target }} ${{ matrix.extra-flags }} -p wgpu --no-default-features
# Check with all compatible features
cargo --locked clippy --target ${{ matrix.target }} ${{ matrix.extra-flags }} -p wgpu-types --no-default-features --features strict_asserts,fragile-send-sync-non-atomic-wasm,serde,counters
cargo --locked clippy --target ${{ matrix.target }} ${{ matrix.extra-flags }} -p naga --no-default-features --features dot-out,spv-in,spv-out
cargo --locked clippy --target ${{ matrix.target }} ${{ matrix.extra-flags }} -p wgpu-hal --no-default-features --features fragile-send-sync-non-atomic-wasm
cargo --locked clippy --target ${{ matrix.target }} ${{ matrix.extra-flags }} -p wgpu --no-default-features --features serde
# Building for native platforms with standard tests.
- name: Check native
if: matrix.kind == 'native'
shell: bash
run: |
set -e
# check with no features
cargo --locked clippy --target ${{ matrix.target }} ${{ matrix.extra-flags }} --no-default-features
# Check with all features.
cargo --locked clippy --target ${{ matrix.target }} ${{ matrix.extra-flags }} --tests --benches --all-features
# Check with all features and profiling macro code.
# If we don't check this then errors inside `profiling::scope!()` will not be caught.
cargo --locked clippy --target ${{ matrix.target }} ${{ matrix.extra-flags }} --tests --benches --all-features --features test-build-with-profiling
# build docs
cargo --locked doc --target ${{ matrix.target }} ${{ matrix.extra-flags }} --all-features --no-deps
- name: Check private item docs
if: matrix.kind == 'native'
shell: bash
run: |
set -e
cargo --locked doc --target ${{ matrix.target }} ${{ matrix.extra-flags }} \
--package wgpu-core \
--package wgpu-hal \
--package naga \
--package wgpu \
--all-features --no-deps --document-private-items
# We run minimal checks on the MSRV of the `wgpu` crate, ensuring that
# its dependency tree does not cause issues for servo or other users.
#
# We don't test all platforms, just ones with different dependency stacks.
check-wgpu-msrv:
# runtime is normally 1-3 minutes
timeout-minutes: 10
strategy:
fail-fast: false
matrix:
include:
# Windows
- name: Windows x86_64
os: windows-2022
target: x86_64-pc-windows-msvc
# MacOS
- name: MacOS x86_64
os: macos-14
target: x86_64-apple-darwin
# Linux
- name: Linux x86_64
os: ubuntu-24.04
target: x86_64-unknown-linux-gnu
# WebGPU
- name: WebAssembly
os: ubuntu-24.04
target: wasm32-unknown-unknown
name: wgpu MSRV Check ${{ matrix.name }}
runs-on: ${{ matrix.os }}
steps:
- name: Checkout repo
uses: actions/checkout@v6
- name: Install core MSRV toolchain
run: |
rustup toolchain install ${{ env.WGPU_MSRV }} --no-self-update --profile=minimal --component clippy --target ${{ matrix.target }}
rustup override set ${{ env.WGPU_MSRV }}
cargo -V
- name: Disable debug symbols
shell: bash
run: |
mkdir -p .cargo
cat <<EOF >> .cargo/config.toml
[profile.dev]
debug = false
EOF
- name: Caching
uses: Swatinem/rust-cache@v2
with:
key: wgpu-msrv-check-${{ matrix.target }}-${{ env.CACHE_SUFFIX }}
- name: Reduce MSRV on dependencies
shell: bash
run: |
set -e
# No needed operations currently.
# If we find a dependency that needs to be downgraded to achieve
# the MSRV, we can do it here with `cargo update -p <crate> --precise <version>`
- name: Check native
shell: bash
run: |
set -e
# check `wgpu` with all features.
cargo check --target ${{ matrix.target }} --all-features -p wgpu
# We run minimal checks on the MSRV of the core crates, ensuring that
# its dependency tree does not cause issues for firefox.
#
# We don't test all platforms, just ones with different dependency stacks.
check-core-msrv:
# runtime is normally 1-3 minutes
timeout-minutes: 10
strategy:
fail-fast: false
matrix:
include:
# Windows
- name: Windows x86_64
os: windows-2022
target: x86_64-pc-windows-msvc
# MacOS
- name: MacOS x86_64
os: macos-14
target: x86_64-apple-darwin
# Linux
- name: Linux x86_64
os: ubuntu-24.04
target: x86_64-unknown-linux-gnu
name: Core MSRV Check ${{ matrix.name }}
runs-on: ${{ matrix.os }}
steps:
- name: Checkout repo
uses: actions/checkout@v6
- name: Install core MSRV toolchain
run: |
rustup toolchain install ${{ env.CORE_MSRV }} --no-self-update --profile=minimal --component clippy --target ${{ matrix.target }}
rustup override set ${{ env.CORE_MSRV }}
cargo -V
- name: Disable debug symbols
shell: bash
run: |
mkdir -p .cargo
cat <<EOF >> .cargo/config.toml
[profile.dev]
debug = false
EOF
- name: Caching
uses: Swatinem/rust-cache@v2
with:
key: core-msrv-check-${{ matrix.target }}-${{ env.CACHE_SUFFIX }}
- name: Reduce MSRV on dependencies
shell: bash
run: |
set -e
# No needed operations currently.
# If we find a dependency that needs to be downgraded to achieve
# the MSRV, we can do it here with `cargo update -p <crate> --precise <version>`
- name: Check native
shell: bash
run: |
set -e
# check `wgpu-core` with all features. This will also get `wgpu-hal` and `wgpu-types`.
cargo check --target ${{ matrix.target }} --all-features -p wgpu-core
# Check that the libraries build — but not that there are no warnings or that tests pass -
# with `-Zdirect-minimal-versions` which lowers all dependencies from the workspace packages
# to non-workspace packages to their minimum allowed version.
check-minimal-versions:
# runtime is normally 2 minutes
timeout-minutes: 10
name: MSRV Minimal Versions
runs-on: ubuntu-24.04
env:
# Override flags to NOT include `-D warnings`, because warnings may be due to harmless problems in deps.
# Also, allow unexpected_cfgs because it is very common and spammy when using old deps.
RUSTFLAGS: -A unexpected_cfgs
steps:
- name: Checkout repo
uses: actions/checkout@v6
- name: Install toolchain
run: |
rustup toolchain install ${{ env.REPO_MSRV }} --no-self-update --profile=minimal
rustup override set ${{ env.REPO_MSRV }}
cargo -V
- name: Disable debug symbols
shell: bash
run: |
mkdir -p .cargo
echo """
[profile.dev]
debug = false" >> .cargo/config.toml
- name: Set minimal versions
shell: bash
run: |
set -e
cargo +${{ env.REPO_MSRV }} update -Zdirect-minimal-versions
env:
RUSTC_BOOTSTRAP: 1
- name: Run cargo check
shell: bash
run: |
set -e
cargo check --all-targets --all-features
wasm-test:
# runtime is normally 2 minutes
timeout-minutes: 10
name: Test WebAssembly
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v6
- name: Install repo MSRV toolchain
run: |
rustup toolchain install ${{ env.REPO_MSRV }} --no-self-update --profile=minimal --component clippy --target wasm32-unknown-unknown
rustup override set ${{ env.REPO_MSRV }}
cargo -V
- name: Install `wasm-pack`
uses: taiki-e/install-action@v2
with:
tool: wasm-pack
- name: Execute tests
run: |
cd wgpu
wasm-pack test --headless --chrome --no-default-features --features wgsl,webgl,web --workspace
gpu-test:
# runtime is normally 5-15 minutes
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
include:
# Windows
- name: Windows x86_64
os: windows-2022
# Mac
- name: Mac aarch64
os: macos-14
# Linux
- name: Linux x86_64
os: ubuntu-24.04
name: Test ${{ matrix.name }}
runs-on: ${{ matrix.os }}
steps:
- name: Checkout repo
uses: actions/checkout@v6
- name: Install repo MSRV toolchain
run: |
rustup toolchain install ${{ env.REPO_MSRV }} --no-self-update --profile=minimal -c llvm-tools
cargo -V
- name: Install `cargo-nextest` and `cargo-llvm-cov`
uses: taiki-e/install-action@v2
with:
tool: cargo-nextest,cargo-llvm-cov
- name: Debug symbols to line-tables-only
shell: bash
run: |
mkdir -p .cargo
cat <<EOF >> .cargo/config.toml
[profile.dev]
debug = "line-tables-only"
EOF
# Cache step must go before warp and mesa install on windows as they write into the
# target directory, and rust-cache will overwrite the entirety of the target directory.
- name: Caching
uses: Swatinem/rust-cache@v2
with:
key: test-${{ matrix.os }}-${{ env.CACHE_SUFFIX }}
workspaces: |
. -> target
- name: (Windows) Install DXC
if: matrix.os == 'windows-2022'
uses: ./.github/actions/install-dxc
- name: (Windows) Install WARP
if: matrix.os == 'windows-2022'
uses: ./.github/actions/install-warp
with:
target-dir: "target/llvm-cov-target/debug"
- name: (Windows) Install Agility SDK
if: matrix.os == 'windows-2022'
uses: ./.github/actions/install-agility-sdk
- name: (Windows) Install Mesa
if: matrix.os == 'windows-2022'
uses: ./.github/actions/install-mesa
- name: (Windows) Install Vulkan SDK
if: matrix.os == 'windows-2022'
uses: ./.github/actions/install-vulkan-sdk
- name: (Mac) Install Vulkan SDK
if: matrix.os == 'macos-14'
uses: ./.github/actions/install-vulkan-sdk
- name: (Linux) Install Vulkan SDK
if: matrix.os == 'ubuntu-24.04'
uses: ./.github/actions/install-vulkan-sdk
- name: (Linux) Install Mesa
if: matrix.os == 'ubuntu-24.04'
uses: ./.github/actions/install-mesa
- name: Delete Naga snapshots
shell: bash
run: |
set -e
# Delete snapshots so we can ensure there aren't any excess output files.
rm -r naga/tests/out
- name: Run tests
shell: bash
run: |
set -e
cargo --locked xtask test --llvm-cov
- name: Check Naga snapshots
# git diff doesn't check untracked files, we need to stage those then compare with HEAD.
run: git add . && git diff --exit-code HEAD naga/tests/out
- uses: actions/upload-artifact@v7
name: Upload comparison images
if: always() # We want artifacts even if the tests fail.
with:
name: comparison-images-${{ matrix.os }}
path: |
**/*-actual.png
**/*-difference.png
# Print GPU configuration so we can see what features were available during the test.
- name: Print GPU configurations
if: always() # We want this information even if the tests fail.
shell: bash
run: |
set -e
cat .gpuconfig
- name: Generate coverage report
id: coverage
shell: bash
continue-on-error: true
run: |
set -e
cargo --locked llvm-cov report --lcov --output-path lcov.info
- name: Upload coverage report to Codecov
uses: codecov/codecov-action@v5
if: steps.coverage.outcome == 'success'
with:
files: lcov.info
token: ${{ secrets.CODECOV_TOKEN }}
doctest:
# runtime is normally 2 minutes
timeout-minutes: 10
name: Doctest
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v6
- name: Install repo MSRV toolchain
run: |
rustup toolchain install ${{ env.REPO_MSRV }} --no-self-update --profile=minimal --component rustfmt
rustup override set ${{ env.REPO_MSRV }}
cargo -V
- name: Caching
uses: Swatinem/rust-cache@v2
with:
key: doctests-${{ env.CACHE_SUFFIX }}
- name: Run doctests
shell: bash
run: |
set -e
cargo --locked test --doc
miri:
# runtime is normally 2 minutes
timeout-minutes: 10
name: Miri (limited scope)
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v6
# Miri is *only* available on nightly.
- name: Install nightly toolchain
run: |
rustup toolchain install nightly --no-self-update --profile=minimal --component miri
rustup override set nightly
cargo -V
- name: Caching
uses: Swatinem/rust-cache@v2
with:
key: miri-${{ env.CACHE_SUFFIX }}
- name: Run Miri on selected tests
shell: bash
run: |
set -e
# Note: this is a *smaller* set of tests than `cargo xtask miri` runs;
# it is ones that are both important and cheap.
# Consider expanding it to include some API tests with the noop backend.
cargo miri test --package=wgpu --no-default-features -- write_only
fmt:
# runtime is normally 15 seconds
timeout-minutes: 2
name: Format & Typos
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v6
- name: Install repo MSRV toolchain
run: |
rustup toolchain install ${{ env.REPO_MSRV }} --no-self-update --profile=minimal --component rustfmt
rustup override set ${{ env.REPO_MSRV }}
cargo -V
- name: Run `cargo fmt`
run: |
cargo --locked fmt -- --check
- name: Install Taplo
uses: uncenter/setup-taplo@v1
with:
version: "0.9.3"
- name: Run `taplo fmt`
run: taplo format --check --diff
- name: Check for typos
uses: crate-ci/typos@v1.44.0
check-cts-runner:
# runtime is normally 2 minutes
timeout-minutes: 10
name: Clippy cts_runner
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v6
- name: Install MSRV toolchain
run: |
rustup toolchain install ${{ env.REPO_MSRV }} --no-self-update --profile=minimal --component clippy
rustup override set ${{ env.REPO_MSRV }}
cargo -V
- name: Disable debug symbols
shell: bash
run: |
mkdir -p .cargo
cat <<EOF >> .cargo/config.toml
[profile.dev]
debug = false
EOF
- name: Caching
uses: Swatinem/rust-cache@v2
with:
key: cts-runner-${{ env.CACHE_SUFFIX }}
- name: Build Deno
run: |
cargo --locked clippy --manifest-path cts_runner/Cargo.toml
# Separate job so that new advisories don't block CI.
#
# This job is not required to pass for PRs to be merged.
cargo-deny-check-advisories:
# runtime is normally 1 minute
timeout-minutes: 5
name: "cargo-deny advisories"
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v6
- name: Run `cargo deny check`
uses: EmbarkStudios/cargo-deny-action@v2
with:
command: check advisories
arguments: --all-features --workspace
command-arguments: -Dwarnings -Aunmatched-organization
rust-version: ${{ env.REPO_MSRV }}
cargo-deny-check-rest:
# runtime is normally 1 minute
timeout-minutes: 5
name: "cargo-deny"
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v6
- name: Run `cargo deny check`
uses: EmbarkStudios/cargo-deny-action@v2
with:
command: check bans licenses sources
arguments: --all-features --workspace
command-arguments: -Dwarnings -Aunmatched-organization
rust-version: ${{ env.REPO_MSRV }}
================================================
FILE: .github/workflows/cts.yml
================================================
name: CTS
on:
push:
branches-ignore: [
# Renovate branches are always PRs, so they will be covered
# by the pull_request event.
"renovate/**",
# Branches with the `gh-readonly-queue` prefix are used by the
# merge queue, so they are already covered by the `merge_group` event.
"gh-readonly-queue/**",
]
pull_request:
merge_group:
env:
REPO_MSRV: "1.93"
CARGO_INCREMENTAL: false
CARGO_TERM_COLOR: always
DENO_WEBGPU_DX12_COMPILER: dynamicdxc
RUST_BACKTRACE: full
RUSTFLAGS: -D warnings
RUSTDOCFLAGS: -D warnings
# Every time a PR is pushed to, cancel any previous jobs. This
# makes us behave nicer to github and get faster turnaround times
# on PRs that are pushed to multiple times in rapid succession.
concurrency:
group: ${{github.workflow}}-${{github.ref}}
cancel-in-progress: ${{github.event_name == 'pull_request'}}
jobs:
cts:
strategy:
fail-fast: false
matrix:
suite: ["API Operation", "API Validation", "Other"]
platform: ["Windows x86_64", "Mac aarch64", "Linux x86_64"]
include:
# When an `include` item matches existing matrix entries, the additional items are
# added only to the matching entries. The two lines above define the matrix, and
# the items below attach the rest of the configuration values that apply to suites
# and platforms.
- suite: API Operation
filter: "^webgpu:api,operation,"
- suite: API Validation
filter: "^webgpu:api,validation,"
- suite: Other
filter: "!^webgpu:api,operation,|^webgpu:api,validation,"
# Windows
- platform: Windows x86_64
os: windows-2022
target: x86_64-pc-windows-msvc
backend: dx12
shell: bash
# Mac
# Need to use `zsh` for `source <(cmd)` because it doesn't work in
# ancient MacOS bash. `zsh` is a non-standard shell in GitHub
# actions, so must be specified as a command string.
- platform: Mac aarch64
os: macos-14
target: x86_64-apple-darwin
backend: metal
shell: zsh {0}
# Linux
- platform: Linux x86_64
os: ubuntu-24.04
target: x86_64-unknown-linux-gnu
backend: vulkan
shell: bash
name: ${{ matrix.suite }} ${{ matrix.platform }}
runs-on: ${{ matrix.os }}
defaults:
run:
# Substitution of ${{ matrix.shell }} appears not to work in per-step configuration
shell: ${{ matrix.shell }}
steps:
- name: checkout repo
uses: actions/checkout@v6
- name: Install Repo MSRV toolchain
run: |
rustup toolchain install ${{ env.REPO_MSRV }} --no-self-update --profile=minimal --target ${{ matrix.target }} --component llvm-tools
rustup override set ${{ env.REPO_MSRV }}
cargo -V
- name: Install `cargo-llvm-cov`
uses: taiki-e/install-action@v2
with:
tool: cargo-llvm-cov
- name: caching
uses: Swatinem/rust-cache@v2
with:
# The version number can be incremented for cache busting.
prefix-key: v2-rust-${{ hashFiles('cts_runner/revision.txt') }}
cache-directories: cts
# We enable line numbers for panics, but that's it
- name: disable debug
shell: bash
run: |
mkdir -p .cargo
cat <<EOF >> .cargo/config.toml
[profile.dev]
debug = "line-tables-only"
EOF
- name: (Windows) Install DXC
if: matrix.os == 'windows-2022'
uses: ./.github/actions/install-dxc
# Note: `target-dir` is intentionally different from other jobs.
# See note in xtask about `llvm-cov show-env`.
- name: (Windows) Install WARP
if: matrix.os == 'windows-2022'
uses: ./.github/actions/install-warp
with:
target-dir: "target/debug"
- name: (Linux) Install Mesa
if: matrix.os == 'ubuntu-24.04'
uses: ./.github/actions/install-mesa
with:
target-dir: "target/debug"
# Some of these tests check stdout, so we explicitly set the backend
# to avoid getting EGL messages in the output.
- name: Test cts_runner
if: matrix.suite == 'other'
shell: bash
run: |
export LLVM_PROFILE_FILE=${{ github.workspace }}/target/wgpu-%p-%m.profraw
export DENO_WEBGPU_BACKEND=${{ matrix.backend }}
cargo --locked llvm-cov --no-cfg-coverage --no-report test -p cts_runner
- name: Run CTS
shell: bash
run: cargo --locked xtask cts --llvm-cov --backend ${{ matrix.backend }} --filter '${{matrix.filter }}'
- name: Generate coverage report
id: coverage
continue-on-error: true
run: |
set -e
source <(cargo llvm-cov --no-cfg-coverage show-env --sh)
cargo --locked llvm-cov report --lcov --output-path lcov.info
- name: Upload coverage report to Codecov
uses: codecov/codecov-action@v5
if: steps.coverage.outcome == 'success'
with:
files: lcov.info
token: ${{ secrets.CODECOV_TOKEN }}
================================================
FILE: .github/workflows/docs.yml
================================================
name: Docs
on:
push:
branches-ignore: [
# Renovate branches are always PRs, so they will be covered
# by the pull_request event.
"renovate/**",
# Branches with the `gh-readonly-queue` prefix are used by the
# merge queue, so they are already covered by the `merge_group` event.
"gh-readonly-queue/**",
]
pull_request:
merge_group:
env:
# This is the MSRV used by all repository infrastructure.
REPO_MSRV: "1.93"
CARGO_INCREMENTAL: false
CARGO_TERM_COLOR: always
RUST_BACKTRACE: full
# Every time a PR is pushed to, cancel any previous jobs. This
# makes us behave nicer to github and get faster turnaround times
# on PRs that are pushed to multiple times in rapid succession.
concurrency:
group: ${{github.workflow}}-${{github.ref}}
cancel-in-progress: ${{github.event_name == 'pull_request'}}
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Install documentation toolchain
run: |
rustup toolchain install ${{ env.REPO_MSRV }} --no-self-update --profile=minimal
rustup override set ${{ env.REPO_MSRV }}
- name: Disable debug symbols
shell: bash
run: |
mkdir -p .cargo
cat <<EOF >> .cargo/config.toml
[profile.dev]
debug = false
EOF
- name: Caching
uses: Swatinem/rust-cache@v2
with:
key: doc-build
- name: Build the docs
run: |
cargo doc --no-deps --lib --document-private-items
env:
RUSTDOCFLAGS: --cfg docsrs
RUSTC_BOOTSTRAP: 1
- name: Deploy the docs
uses: JamesIves/github-pages-deploy-action@v4.8.0
if: github.ref == 'refs/heads/trunk'
with:
token: ${{ secrets.WEB_DEPLOY }}
folder: target/doc
repository-name: gfx-rs/wgpu-rs.github.io
branch: master
target-folder: doc
================================================
FILE: .github/workflows/generate.yml
================================================
name: cargo-generate
on:
push:
branches-ignore: [
# Renovate branches are always PRs, so they will be covered
# by the pull_request event.
"renovate/**",
# Branches with the `gh-readonly-queue` prefix are used by the
# merge queue, so they are already covered by the `merge_group` event.
"gh-readonly-queue/**",
]
pull_request:
merge_group:
env:
#
# Dependency versioning
#
# This is the MSRV used by `wgpu` itself.
WGPU_MSRV: "1.87"
RUSTFLAGS: -D warnings
# Every time a PR is pushed to, cancel any previous jobs. This
# makes us behave nicer to github and get faster turnaround times
# on PRs that are pushed to multiple times in rapid succession.
concurrency:
group: ${{github.workflow}}-${{github.ref}}
cancel-in-progress: ${{github.event_name == 'pull_request'}}
jobs:
cargo-generate:
timeout-minutes: 5
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- name: "01-hello-compute"
path: "examples/standalone/01_hello_compute"
- name: "02-hello-window"
path: "examples/standalone/02_hello_window"
- name: "custom_backend"
path: "examples/standalone/custom_backend"
name: "${{ matrix.name }}"
steps:
- uses: actions/checkout@v6
# We can't rely on an override here, as that would only set
# the toolchain for the current directory, not the newly generated project.
- name: Install repo MSRV toolchain
run: |
rustup toolchain install ${{ env.WGPU_MSRV }} --no-self-update --profile=minimal
cargo -V
- name: Disable debug symbols
shell: bash
run: |
mkdir -p .cargo
cat <<EOF >> .cargo/config.toml
[profile.dev]
debug = false
EOF
- name: Caching
uses: Swatinem/rust-cache@v2
with:
key: cargo-generate-${{ matrix.name }}
- name: Install `cargo-generate`
uses: taiki-e/install-action@v2
with:
tool: cargo-generate
- name: Run `cargo-generate`
run: |
cd ..
cargo generate --path wgpu --name ${{ matrix.name }} ${{ matrix.path }}
- name: Check generated files
run: |
cd ../${{ matrix.name }}/
cat <<EOF >> Cargo.toml
[patch.crates-io]
wgpu = { path = "../wgpu/wgpu" }
EOF
cargo +${{ env.WGPU_MSRV }} check
================================================
FILE: .github/workflows/lazy.yml
================================================
# Non-critical jobs
name: Lazy
on:
push:
branches-ignore: [
# Renovate branches are always PRs, so they will be covered
# by the pull_request event.
"renovate/**",
# Branches with the `gh-readonly-queue` prefix are used by the
# merge queue, so they are already covered by the `merge_group` event.
"gh-readonly-queue/**",
]
pull_request:
merge_group:
env:
CARGO_INCREMENTAL: false
CARGO_TERM_COLOR: always
RUST_BACKTRACE: full
# Every time a PR is pushed to, cancel any previous jobs. This
# makes us behave nicer to github and get faster turnaround times
# on PRs that are pushed to multiple times in rapid succession.
concurrency:
group: ${{github.workflow}}-${{github.ref}}
cancel-in-progress: ${{github.event_name == 'pull_request'}}
jobs:
parse-dota2:
name: "Validate Shaders: Dota2"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- run: mkdir naga/data
- name: Download shaders
run: curl https://user.fm/files/v2-5573e18b9f03f42c6ae53c392083da35/dota2-shaders.zip -o naga/data/all.zip
- name: Unpack shaders
run: |
cd naga/data
unzip all.zip
- name: Build Naga
run: |
cd naga
cargo build --release -p naga-cli
- name: Convert shaders
run: |
cd naga
for file in data/*.spv ; do echo "Translating" ${file} && ../target/release/naga --validate 27 ${file} ${file}.metal; done
parse-vulkan-tutorial-shaders:
name: "Validate Shaders: Sascha Willems Vulkan Tutorial"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Download shaders
run: cd naga && git clone https://github.com/SaschaWillems/Vulkan.git
- name: Build Naga
run: |
cd naga
cargo build --release -p naga-cli
- name: Convert Metal shaders
run: |
# No needed to stop workflow if we can't validate one file
set +e
cd naga
touch counter
SUCCESS_RESULT_COUNT=0
FILE_COUNT=0
mkdir -p out
find "Vulkan/data/shaders/glsl/" -name '*.spv' | while read fname;
do
echo "Convert: $fname"
FILE_COUNT=$((FILE_COUNT+1))
../target/release/naga --validate 27 $(realpath ${fname}) out/$(basename ${fname}).metal
if [[ $? -eq 0 ]]; then
SUCCESS_RESULT_COUNT=$((SUCCESS_RESULT_COUNT + 1))
fi
echo "Result: $(expr $FILE_COUNT - $SUCCESS_RESULT_COUNT) / $FILE_COUNT" > counter
done
cat counter
dneto0_spirv-samples:
name: "Validate Shaders: dneto0 spirv-samples"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Download shaders
run: |
cd naga
git clone https://github.com/dneto0/spirv-samples.git
- name: Build Naga
run: |
cargo build --release -p naga-cli
- name: Install Vulkan SDK
uses: ./.github/actions/install-vulkan-sdk
- name: Compile `spv` from `spvasm`
run: |
cd naga/spirv-samples
mkdir -p spv
find "./spvasm" -name '*.spvasm' | while read fname;
do
echo "Convert to spv with spirv-as: $fname"
spirv-as --target-env spv1.3 $(realpath ${fname}) -o ./spv/$(basename ${fname}).spv
done;
- name: Validate `spv` and generate `wgsl`
run: |
set +e
cd naga/spirv-samples
SUCCESS_RESULT_COUNT=0
FILE_COUNT=0
mkdir -p spv
mkdir -p wgsl
echo "==== Validate spv and generate wgsl ===="
rm -f counter
touch counter
find "./spv" -name '*.spv' | while read fname;
do
echo "Convert: $fname"
FILE_COUNT=$((FILE_COUNT+1))
../../target/release/naga --validate 27 $(realpath ${fname}) ./wgsl/$(basename ${fname}).wgsl
if [[ $? -eq 0 ]]; then
SUCCESS_RESULT_COUNT=$((SUCCESS_RESULT_COUNT + 1))
fi
echo "Result: $(expr $FILE_COUNT - $SUCCESS_RESULT_COUNT) / $FILE_COUNT" > counter
done
cat counter
- name: Validate output `wgsl`
run: |
set +e
cd naga/spirv-samples
SUCCESS_RESULT_COUNT=0
FILE_COUNT=0
rm -f counter
touch counter
find "./wgsl" -name '*.wgsl' | while read fname;
do
echo "Validate: $fname"
FILE_COUNT=$((FILE_COUNT+1))
../../target/release/naga --validate 27 $(realpath ${fname})
if [[ $? -eq 0 ]]; then
SUCCESS_RESULT_COUNT=$((SUCCESS_RESULT_COUNT + 1))
fi
echo "Result: $(expr $FILE_COUNT - $SUCCESS_RESULT_COUNT) / $FILE_COUNT" > counter
done
cat counter
================================================
FILE: .github/workflows/publish.yml
================================================
name: Publish
on:
push:
branches-ignore: [
# Renovate branches are always PRs, so they will be covered
# by the pull_request event.
"renovate/**",
# Branches with the `gh-readonly-queue` prefix are used by the
# merge queue, so they are already covered by the `merge_group` event.
"gh-readonly-queue/**",
]
pull_request:
merge_group:
env:
CARGO_INCREMENTAL: false
CARGO_TERM_COLOR: always
RUST_BACKTRACE: full
# Every time a PR is pushed to, cancel any previous jobs. This
# makes us behave nicer to github and get faster turnaround times
# on PRs that are pushed to multiple times in rapid succession.
concurrency:
group: ${{github.workflow}}-${{github.ref}}
cancel-in-progress: ${{github.event_name == 'pull_request'}}
jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Install Rust WASM target
run: rustup target add wasm32-unknown-unknown
- name: Get `wasm-bindgen` version
run: |
WASM_BINDGEN_VERSION=$(cargo metadata --format-version 1 --all-features | jq '.packages[] | select(.name == "wasm-bindgen") | .version' | tr -d '"')
echo $WASM_BINDGEN_VERSION
echo "WASM_BINDGEN_VERSION=$WASM_BINDGEN_VERSION" >> "$GITHUB_ENV"
- name: Install `wasm-bindgen`
run: cargo +stable install wasm-bindgen-cli --version=$WASM_BINDGEN_VERSION
- name: Debug symbols to line-tables-only
shell: bash
run: |
mkdir -p .cargo
cat <<EOF >> .cargo/config.toml
[profile.dev]
debug = "line-tables-only"
EOF
- name: Caching
uses: Swatinem/rust-cache@v2
with:
key: publish-build
- name: Build examples
run: cargo xtask run-wasm --no-serve
- name: Deploy WebGPU examples
uses: JamesIves/github-pages-deploy-action@v4.8.0
if: github.ref == 'refs/heads/trunk'
with:
token: ${{ secrets.WEB_DEPLOY }}
folder: target/generated
repository-name: gfx-rs/wgpu-rs.github.io
branch: master
target-folder: examples/
================================================
FILE: .github/workflows/shaders.yml
================================================
name: Shaders
on:
push:
branches-ignore: [
# Renovate branches are always PRs, so they will be covered
# by the pull_request event.
"renovate/**",
# Branches with the `gh-readonly-queue` prefix are used by the
# merge queue, so they are already covered by the `merge_group` event.
"gh-readonly-queue/**",
]
pull_request:
merge_group:
# Every time a PR is pushed to, cancel any previous jobs. This
# makes us behave nicer to github and get faster turnaround times
# on PRs that are pushed to multiple times in rapid succession.
concurrency:
group: ${{github.workflow}}-${{github.ref}}
cancel-in-progress: ${{github.event_name == 'pull_request'}}
jobs:
naga-validate-windows:
name: "Validate: HLSL"
runs-on: windows-latest
steps:
- uses: actions/checkout@v6
- name: Debug symbols to `line-tables-only`
shell: bash
run: |
mkdir -p .cargo
cat <<EOF >> .cargo/config.toml
[profile.dev]
debug = "line-tables-only"
EOF
- uses: Swatinem/rust-cache@v2
# We must have the FXC job before the DXC job, so the DXC PATH has priority
# over the FXC PATH. This is because the windows kits also include an older
# version of DXC, which we don't want to use.
- name: Setup FXC
run: |
Get-Childitem -Path "C:\Program Files (x86)\Windows Kits\10\bin\**\x64\fxc.exe" `
| Sort-Object -Property LastWriteTime -Descending `
| Select-Object -First 1 `
| Split-Path -Parent `
| Out-File -FilePath $Env:GITHUB_PATH -Encoding utf8 -Append
shell: powershell
- name: Setup DXC
uses: ./.github/actions/install-dxc
- name: Validate
shell: bash
run: |
set -e
dxc --version
cd naga
cargo xtask validate hlsl dxc
cargo xtask validate hlsl fxc
naga-validate-macos:
name: "Validate: MSL"
runs-on: macos-15
steps:
- uses: actions/checkout@v6
- name: Debug symbols to line-tables-only
shell: bash
run: |
mkdir -p .cargo
cat <<EOF >> .cargo/config.toml
[profile.dev]
debug = "line-tables-only"
EOF
- uses: Swatinem/rust-cache@v2
- run: |
cd naga
cargo xtask validate msl
naga-validate-linux:
name: "Validate: SPIR-V/GLSL/DOT/WGSL"
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v6
- name: Install Vulkan SDK
uses: ./.github/actions/install-vulkan-sdk
- name: Install Graphviz
run: sudo apt-get install graphviz
- name: Debug symbols to `line-tables-only`
shell: bash
run: |
mkdir -p .cargo
cat <<EOF >> .cargo/config.toml
[profile.dev]
debug = "line-tables-only"
EOF
- uses: Swatinem/rust-cache@v2
- run: cd naga; cargo xtask validate spv
- run: cd naga; cargo xtask validate glsl
- run: cd naga; cargo xtask validate dot
- run: cd naga; cargo xtask validate wgsl
================================================
FILE: .gitignore
================================================
# Jujutsu
#
# When using the wgpu repository through [Jujutsu](https://github.com/martinvonz/jj), `.jj/` dirs.
# are ignored because Jujutsu writes a `.jj/.gitignore` file containing `/*`. Some tools, like
# `prettier`, don't handle nested `.gitgnore` properly, but they _do_ handle top-level `.gitignore`
# patterns properly. So, include it here, even though we shouldn't need it. :cry:
.jj/
# Generated by Cargo
# will have compiled files and executables
/target
# Include the root lockfile but not the others
*/Cargo.lock
# These are backup files generated by rustfmt
**/*.rs.bk
# Other
.fuse_hidden*
.DS_Store
# IDE/Editor configuration files
.vscode
.idea
# Output from capture example
wgpu/red.png
# Output from render_to_texture example
**/please_don't_git_push_me.png
# Output from invalid comparison tests
**/*-actual.png
**/*-difference.png
# Readme says to check out CTS here
/cts
# Readme says to put angle in working directory
*.dll
# Cached GPU config
.gpuconfig
# Temporary clone location for wasm-bindgen mirroring
wgpu/src/backend/webgpu/webgpu_sys/wasm_bindgen_clone_tmp
# LLM-related
.claude/settings.local.json
================================================
FILE: .prettierignore
================================================
**/*.frag
**/*.vert
naga/tests/in/
naga/tests/out/
================================================
FILE: AGENTS.md
================================================
# Global instructions
## Code Style
- Limit the amount of comments you put in the code to a strict minimum. You should almost never add comments, except sometimes on non-trivial code, function definitions if the arguments aren't self-explanatory, and class definitions and their members.
- Do not use emoji.
## Workflow
- You can test that the code builds by running `cargo build`. Don't pass `--release` unless there's a specific need to test a release build, it's much slower.
- After making code changes, ensure the code is formatted by using `cargo fmt`, linted by using `cargo clippy --tests`. If there are no errors, you can use `cargo xtask test` and `cargo xtask cts --backend <backend>` to run tests (to fully validate a change, run both). On MacOS, the backend is `metal`. On Windows, the backend is `dx12`. On Linux, the backend is `vulkan`.
- Do not perform commits yourself, ever.
- Use the WebGPU and WGSL specifications as a reference to determine the correct behavior. Do not assume that a behavior is correct just because the CTS expects it.
## Changelog
We maintain a changelog in CHANGELOG.md. Changes should be noted in the
changelog if they are user-visible (changes to documented public APIs,
significant bug fixes, or new functionality). Changelog descriptions should be
concise. If you are not sure whether something should be in the CHANGELOG or
you are not sure how to describe the change, ask the user for guidance.
## More information about tests
There is some more detailed information about tests in @docs/testing.md.
# CTS
## Listing and Running Individual Tests
Each line is a selector that will run multiple subtests. You can run a test with:
```bash
cargo xtask cts 'webgpu:selector/path:test:*'
```
For fixing problems, it may be useful to run specific cases. You can get a list of the subtests with:
```bash
cargo xtask cts -- --list 'webgpu:selector,path:test:*'
```
Then you can pass individual subtests on the command line as the selector.
## Running Suites
To run a suite of CTS tests and keep just the summary at the end:
```bash
cargo xtask cts 'webgpu:selector,path:test:*' 2>&1 | grep -E "(Summary|Passed|Failed)" | tail -5
```
To run a suite of tests and keep just the failing tests:
```bash
cargo xtask cts 'webgpu:selector,path:test:*' 2>&1 | grep "\[fail\]"
```
## Keeping Track of Results
We maintain three files listing CTS test selectors that are expected to pass,
not pass, or to be entirely skipped. These files are respectively
cts_runner/test.lst, cts_runner/fail.lst, and cts_runner/skip.lst.
If you fix a CTS test, add the selector to test.lst. Be aware that the file is
not an exhaustive list of passing tests.
CI expects every test in test.lst to pass, so only add suites that have zero
failures to test.lst. Do not add any suites that are not 100% pass/skip, even
if they are ≥99% passing.
List suites with failures in fail.lst. You can put a comment `// xx%`
noting the pass rate, especially in cases where the pass rate is high.
List suites that are ≥90% skips in skip.lst
When adding to a lst file, use wildcards to identify the tests with as few lines
as possible. In some cases when adding tests it may be possible to combine with
existing lines to use a higher level wildcard. Only use a higher level wildcard
when all the tests it will match go in the same file. Do not use a higher level
wildcard if it would match tests that belong in a different file.
## Source for the CTS Tests
The TypeScript sources for the CTS are under cts/src. There is also generated JavaScript in cts/out.
Do not assume that a behavior is correct just because a CTS test expects it. Verify the correct
behavior in the WebGPU or WGSL specification.
# Overview of the Code
See `docs/big-picture.png` for an overview of the system.
The major components are:
* `wgpu-hal` implements a backend for each supported graphics API (Vulkan, DX12, Metal, GLES).
* `wgpu-core` implements the WebGPU API, including resource management and validation.
It calls the platform graphics APIs via `wgpu-hal`, and uses `naga` for shader translation.
* `wgpu` is the native Rust API. In addition to providing bindings to `wgpu-core`, the `wgpu`
crate can also be compiled to WASM and built against the "WebGPU" backend, where it uses
whatever WebGPU implementation is provided by the WASM environment. `wgpu` is not used
by Deno and Firefox.
* `naga` is the shader translator. It reads shaders in WGSL, GLSL, or SPIR-V,
translates to Naga IR, and then writes shaders in GLSL, HLSL, MSL (Metal Shading Language), SPIR-V, or WGSL.
It is responsible for validating that WGSL shaders are valid according to the WGSL language specification.
* `wgpu-types` contains some type definitions that are applicable both to `wgpu-core` and to
the `wgpu` "WebGPU" backend.
* `deno_webgpu` contains WebGPU bindings for the Deno Javascript runtime.
We also use Deno as a test environment for running the WebGPU CTS.
Only make a change in the Deno bindings if you are sure that the issue
doesn't apply to other clients (Firefox or `wgpu` Rust API). If it does
apply to other clients, the issue should probably be fixed in `wgpu-core`.
For a more detailed discussion of the `wgpu` architecture, refer to
<https://github.com/gfx-rs/wgpu/wiki/Architecture>.
## Naga
### Constant Evaluator (`naga/src/proc/constant_evaluator.rs`)
The constant evaluator is responsible for evaluating constant expressions at compile time in WGSL/GLSL shaders.
**Key Components:**
1. **Expression Handling** (~line 1228): The `try_eval_and_append_impl` method handles different expression types and evaluates them if possible.
2. **Type Conversions**:
- `cast()` (~line 2256): Handles type conversions with `Expression::As` where `convert` is `Some(width)`
- `bitcast()` (~line 2449): Handles bit reinterpretation with `Expression::As` where `convert` is `None`
- Key insight: For bitcast, the target width equals the source width (bit-preserving operation)
3. **Helper Macros**:
- `gen_component_wise_extractor!`: Generates functions for component-wise operations on scalars/vectors
- `component_wise_scalar!`, `component_wise_float!`: Convenience macros for applying operations to each component
4. **Borrow Checker Patterns**:
- When implementing methods that need to call themselves recursively or make multiple mutable borrows, extract all needed data from `self` fields before the recursive calls
- Clone vectors before iterating if you need to mutably borrow `self` during iteration
## Expression Types and Type Inference
- `Expression::As` with `convert: None` represents bitcast operations
- The validator (`naga/src/valid/expression.rs` ~line 1132) determines result types by:
- Getting source type's scalar
- Updating the `kind` to target kind
- Keeping the same `width` for bitcast (no conversion)
# Other
This is stuff that Claude wrote for itself. It can probably be improved.
## Naga Tests
**Test Structure:**
1. **Unit Tests**: In the same file as the code being tested
- Example: `naga/src/proc/constant_evaluator.rs` has tests in a `#[cfg(test)] mod tests` block
- Pattern: Create arenas, build expressions, evaluate, assert results
2. **Snapshot Tests**:
- Input files: `naga/tests/in/wgsl/*.wgsl`
- Output files: `naga/tests/out/wgsl/*.wgsl`
- Run with: `cargo test -p naga --test naga snapshots::convert_snapshots_wgsl`
- The output shows how constant expressions are evaluated at compile time
3. **Adding Integration Tests**:
- Add test WGSL code to `naga/tests/in/wgsl/const-exprs.wgsl` for const expression tests
- The test automatically parses, validates, and generates output in `naga/tests/out/wgsl/wgsl-const-exprs.wgsl`
- Verify constant evaluation by checking the output file
**Running Tests:**
```bash
# Unit tests only
cargo test -p naga --lib
# Specific test
cargo test -p naga --lib bitcast
# All naga tests (including integration)
cargo test -p naga
# WGSL snapshot tests
cargo test -p naga --test naga snapshots::convert_snapshots_wgsl
```
## WGSL Specification Implementation
When implementing WGSL built-in functions:
1. **Read the spec carefully**: WGSL spec section numbers are usually commented in code (e.g., "17.2.1. bitcast")
2. **Check parameterization**: The spec lists exactly which type combinations are valid
3. **Don't assume types**: For bitcast, only `i32`, `u32`, `f32` are specified - not 64-bit types
4. **AbstractInt special cases**: Some operations have special handling for abstract integers
================================================
FILE: CHANGELOG.md
================================================
# Change Log
<!--
Please add your PR to the changelog! Choose from a top level and bottom
level category, then write your changes like follows:
- Describe your change in a user friendly format. By @yourslug in [#99999](https://github.com/gfx-rs/wgpu/pull/99999)
You can add additional user facing information if it's a major breaking change. You can use the following to help:
```diff
- Old code
+ New code
```
Top level categories:
- Major changes
- Added/New Features
- Changes
- Bug Fixes (that don't change API)
- Performance
- Documentation
- Dependency Updates
- deno_webgpu
- Examples
- Testing/Internal
Bottom level categories:
- General
- naga
- Validation
- DX12
- Vulkan
- Metal
- GLES / OpenGL
- WebGPU
- Emscripten
- Hal
-->
## Unreleased
### Changes
#### General
- `Features::CLIP_DISTANCE`, `naga::Capabilities::CLIP_DISTANCE`, and `naga::BuiltIn::ClipDistance` have been renamed to `CLIP_DISTANCES` and `ClipDistances` (viz., pluralized) as appropriate, to match the WebGPU spec. By @ErichDonGubler in [#9267](https://github.com/gfx-rs/wgpu/pull/9267).
#### Validation
- Add clip distances validation for `maxInterStageShaderVariables`. By @ErichDonGubler in [8762](https://github.com/gfx-rs/wgpu/pull/8762). This may break some existing programs, but it compiles with the WebGPU spec.
### Bug Fixes
#### General
- Fix limit comparison logic for `max_inter_stage_shader_variables` By @ErichDonGubler in [9264](https://github.com/gfx-rs/wgpu/pull/9264).
## v29.0.0 (2026-03-18)
### Major Changes
#### `Surface::get_current_texture` now returns `CurrentSurfaceTexture` enum
`Surface::get_current_texture` no longer returns `Result<SurfaceTexture, SurfaceError>`.
Instead, it returns a single `CurrentSurfaceTexture` enum that represents all possible outcomes as variants.
`SurfaceError` has been removed, and the `suboptimal` field on `SurfaceTexture` has been replaced by a dedicated `Suboptimal` variant.
```rust
match surface.get_current_texture() {
wgpu::CurrentSurfaceTexture::Success(frame) => { /* render */ }
wgpu::CurrentSurfaceTexture::Timeout
| wgpu::CurrentSurfaceTexture::Occluded => { /* skip frame */ }
wgpu::CurrentSurfaceTexture::Outdated
| wgpu::CurrentSurfaceTexture::Suboptimal(frame) => { /* reconfigure surface */ }
wgpu::CurrentSurfaceTexture::Lost => { /* reconfigure surface, or recreate device if device lost */ }
wgpu::CurrentSurfaceTexture::Validation => {
/* Only happens if there is a validation error and you
have registered a error scope or uncaptured error handler. */
}
}
```
By @cwfitzgerald, @Wumpf, and @emilk in [#9141](https://github.com/gfx-rs/wgpu/pull/9141) and [#9257](https://github.com/gfx-rs/wgpu/pull/9257).
#### `InstanceDescriptor` initialization APIs and display handle changes
A display handle represents a connection to the platform's display server (e.g. a Wayland or X11 connection on Linux). This is distinct from a window — a display handle is the system-level connection through which windows are created and managed.
`InstanceDescriptor`'s convenience constructors (an implementation of `Default` and the static `from_env_or_default` method) have been removed. In their place are new static methods that force recognition of whether a display handle is used:
- `new_with_display_handle`
- `new_with_display_handle_from_env`
- `new_without_display_handle`
- `new_without_display_handle_from_env`
If you are using `winit`, this can be populated using `EventLoop::owned_display_handle`.
```diff
- InstanceDescriptor::default();
- InstanceDescriptor::from_env_or_default();
+ InstanceDescriptor::new_with_display_handle(Box::new(event_loop.owned_display_handle()));
+ InstanceDescriptor::new_with_display_handle_from_env(Box::new(event_loop.owned_display_handle()));
```
Additionally, `DisplayHandle` is now optional when creating a surface if a display handle was already passed to `InstanceDescriptor`. This means that once you've provided the display handle at instance creation time, you no longer need to pass it again for each surface you create.
By @MarijnS95 in [#8782](https://github.com/gfx-rs/wgpu/pull/8782)
#### Bind group layouts now optional in `PipelineLayoutDescriptor`
This allows gaps in bind group layouts and adds full support for unbinding, bring us in compliance with the WebGPU spec. As a result of this `PipelineLayoutDescriptor`'s `bind_group_layouts` field now has type of `&[Option<&BindGroupLayout>]`. To migrate wrap bind group layout references in `Some`:
```diff
let pl_desc = wgpu::PipelineLayoutDescriptor {
label: None,
bind_group_layouts: &[
- &bind_group_layout
+ Some(&bind_group_layout)
],
immediate_size: 0,
});
```
By @teoxoy in [#9034](https://github.com/gfx-rs/wgpu/pull/9034).
#### MSRV update
`wgpu` now has a new MSRV policy. This release has an MSRV of **1.87**. This is lower than v27's 1.88 and v28's 1.92. Going forward, we will only bump wgpu's MSRV if it has tangible benefits for the code, and we will never bump to an MSRV higher than `stable - 3`. So if stable is at 1.97 and 1.94 brought benefit to our code, we could bump it no higher than 1.94. As before, MSRV bumps will always be breaking changes.
By @cwfitzgerald in [#8999](https://github.com/gfx-rs/wgpu/pull/8999).
#### `WriteOnly`
To ensure memory safety when accessing mapped GPU memory, `MapMode::Write` buffer mappings (`BufferViewMut` and also `QueueWriteBufferView`) can no longer be dereferenced to Rust `&mut [u8]`. Instead, they must be used through the new pointer type `wgpu::WriteOnly<[u8]>`, which does not allow reading at all.
`WriteOnly<[u8]>` is designed to offer similar functionality to `&mut [u8]` and have almost no performance overhead, but you will probably need to make some changes for anything more complicated than `get_mapped_range_mut().copy_from_slice(my_data)`; in particular, replacing `view[start..end]` with `view.slice(start..end)`.
By @kpreid in [#9042](https://github.com/gfx-rs/wgpu/pull/9042).
#### Depth/stencil state changes
The `depth_write_enabled` and `depth_compare` members of `DepthStencilState` are now optional, and may be omitted when they do not apply, to match WebGPU.
`depth_write_enabled` is applicable, and must be `Some`, if `format` has a depth aspect, i.e., is a depth or depth/stencil format. Otherwise, a value of `None` best reflects that it does not apply, although `Some(false)` is also accepted.
`depth_compare` is applicable, and must be `Some`, if `depth_write_enabled` is `Some(true)`, or if `depth_fail_op` for either stencil face is not `Keep`. Otherwise, a value of `None` best reflects that it does not apply, although `Some(CompareFunction::Always)` is also accepted.
There is also a new constructor `DepthStencilState::stencil` which may be used instead of a struct literal for stencil operations.
Example 1: A configuration that does a depth test and writes updated values:
```diff
depth_stencil: Some(wgpu::DepthStencilState {
format: wgpu::TextureFormat::Depth32Float,
- depth_write_enabled: true,
- depth_compare: wgpu::CompareFunction::Less,
+ depth_write_enabled: Some(true),
+ depth_compare: Some(wgpu::CompareFunction::Less),
stencil: wgpu::StencilState::default(),
bias: wgpu::DepthBiasState::default(),
}),
```
Example 2: A configuration with only stencil:
```diff
depth_stencil: Some(wgpu::DepthStencilState {
format: wgpu::TextureFormat::Stencil8,
- depth_write_enabled: false,
- depth_compare: wgpu::CompareFunction::Always,
+ depth_write_enabled: None,
+ depth_compare: None,
stencil: wgpu::StencilState::default(),
bias: wgpu::DepthBiasState::default(),
}),
```
Example 3: The previous example written using the new `stencil()` constructor:
```rust
depth_stencil: Some(wgpu::DepthStencilState::stencil(
wgpu::TextureFormat::Stencil8,
wgpu::StencilState::default(),
)),
```
#### D3D12 Agility SDK support
Added support for loading a specific [DirectX 12 Agility SDK](https://devblogs.microsoft.com/directx/directx12agility/) runtime via the [Independent Devices API](https://devblogs.microsoft.com/directx/d3d12-independent-devices/). The Agility SDK lets applications ship a newer D3D12 runtime alongside their binary, unlocking the latest D3D12 features without waiting for an OS update.
Configure it programmatically:
```rust
let options = wgpu::Dx12BackendOptions {
agility_sdk: Some(wgpu::Dx12AgilitySDK {
sdk_version: 619,
sdk_path: "path/to/sdk/bin/x64".into(),
}),
..Default::default()
};
```
Or via environment variables:
```
WGPU_DX12_AGILITY_SDK_PATH=path/to/sdk/bin/x64
WGPU_DX12_AGILITY_SDK_VERSION=619
```
The `sdk_version` must match the version of the `D3D12Core.dll` in the provided path exactly, or loading will fail.
If the Agility SDK fails to load (e.g. version mismatch, missing DLL, or unsupported OS), wgpu logs a warning and falls back to the system D3D12 runtime.
By @cwfitzgerald in [#9130](https://github.com/gfx-rs/wgpu/pull/9130).
#### `primitive_index` is now a WGSL `enable` extension
WGSL shaders using `@builtin(primitive_index)` must now request it with `enable primitive_index;`. The `SHADER_PRIMITIVE_INDEX` feature has been renamed to `PRIMITIVE_INDEX` and moved from `FeaturesWGPU` to `FeaturesWebGPU`. By @inner-daemons in [#8879](https://github.com/gfx-rs/wgpu/pull/8879) and @andyleiserson in [#9101](https://github.com/gfx-rs/wgpu/pull/9101).
```diff
- device.features().contains(wgpu::FeaturesWGPU::SHADER_PRIMITIVE_INDEX)
+ device.features().contains(wgpu::FeaturesWebGPU::PRIMITIVE_INDEX)
```
```wgsl
// WGSL shaders must now include this directive:
enable primitive_index;
```
#### `maxInterStageShaderComponents` replaced by `maxInterStageShaderVariables`
Migrated from the `max_inter_stage_shader_components` limit to `max_inter_stage_shader_variables`, following the latest WebGPU spec. Components counted individual scalars (e.g. a `vec4` = 4 components), while variables counts locations (e.g. a `vec4` = 1 variable). This changes validation in a way that should not affect most programs. By @ErichDonGubler in [#8652](https://github.com/gfx-rs/wgpu/pull/8652), [#8792](https://github.com/gfx-rs/wgpu/pull/8792).
```diff
- limits.max_inter_stage_shader_components
+ limits.max_inter_stage_shader_variables
```
#### Other Breaking Changes
- Use clearer field names for `StageError::InvalidWorkgroupSize`. By @ErichDonGubler in [#9192](https://github.com/gfx-rs/wgpu/pull/9192).
### New Features
#### General
- Added TLAS binding array support via `ACCELERATION_STRUCTURE_BINDING_ARRAY`. By @kvark in [#8923](https://github.com/gfx-rs/wgpu/pull/8923).
- Added `wgpu-naga-bridge` crate with conversions between `naga` and `wgpu-types` (features to capabilities, storage format mapping, shader stage mapping). By @atlv24 in [#9201](https://github.com/gfx-rs/wgpu/pull/9201).
- Added support for cooperative load/store operations in shaders. Currently only WGSL on the input and SPIR-V, METAL, and WGSL on the output are supported. By @kvark in [#8251](https://github.com/gfx-rs/wgpu/issues/8251).
- Added support for per-vertex attributes in fragment shaders. Currently only WGSL input is supported, and only SPIR-V or WGSL output is supported. By @atlv24 in [#8821](https://github.com/gfx-rs/wgpu/issues/8821).
- Added support for no-perspective barycentric coordinates. By @atlv24 in [#8852](https://github.com/gfx-rs/wgpu/issues/8852).
- Added support for obtaining `AdapterInfo` from `Device`. By @sagudev in [#8807](https://github.com/gfx-rs/wgpu/pull/8807).
- Added `Limits::or_worse_values_from`. By @atlv24 in [#8870](https://github.com/gfx-rs/wgpu/pull/8870).
- Added `Features::FLOAT32_BLENDABLE` on Vulkan and Metal. By @timokoesters in [#8963](https://github.com/gfx-rs/wgpu/pull/8963) and @andyleiserson in [#9032](https://github.com/gfx-rs/wgpu/pull/9032).
- Added `Dx12BackendOptions::force_shader_model` to allow using advanced features in passthrough shaders without bundling DXC. By @inner-daemons in [#8984](https://github.com/gfx-rs/wgpu/pull/8984).
- Changed passthrough shaders to not require an entry point parameter, so that the same shader module may be used in multiple entry points. Also added support for metallib passthrough. By @inner-daemons in [#8886](https://github.com/gfx-rs/wgpu/pull/8886).
- Added `Dx12Compiler::Auto` to automatically use static or dynamic DXC if available, before falling back to FXC. By @inner-daemons in [#8882](https://github.com/gfx-rs/wgpu/pull/8882).
- Added support for `insert_debug_marker`, `push_debug_group` and `pop_debug_group` on WebGPU. By @evilpie in [#9017](https://github.com/gfx-rs/wgpu/pull/9017).
- Added support for `@builtin(draw_index)` to the vulkan backend. By @inner-daemons in [#8883](https://github.com/gfx-rs/wgpu/pull/8883).
- Added `TextureFormat::channels` method to get some information about which color channels are covered by the texture format. By @TornaxO7 in [#9167](https://github.com/gfx-rs/wgpu/pull/9167)
- BREAKING: Add `V6_8` variant to `DxcShaderModel` and `naga::back::hlsl::ShaderModel`. By @inner-daemons in [#8882](https://github.com/gfx-rs/wgpu/pull/8882) and @ErichDonGubler in [#9083](https://github.com/gfx-rs/wgpu/pull/9083).
- BREAKING: Add `V6_9` variant to `DxcShaderModel` and `naga::back::hlsl::ShaderModel`. By @ErichDonGubler in [#9083](https://github.com/gfx-rs/wgpu/pull/9083).
#### naga
- Initial wgsl-in ray tracing pipelines. By @Vecvec in [#8570](https://github.com/gfx-rs/wgpu/pull/8570).
- wgsl-out ray tracing pipelines. By @Vecvec in [#8970](https://github.com/gfx-rs/wgpu/pull/8970).
- Allow parsing shaders which make use of `SPV_KHR_non_semantic_info` for debug info. Also removes `naga::front::spv::SUPPORTED_EXT_SETS`. By @inner-daemons in [#8827](https://github.com/gfx-rs/wgpu/pull/8827).
- Added memory decorations for storage buffers: `coherent`, supported on all native backends, and `volatile`, only on Vulkan and GL. By @atlv24 in [#9168](https://github.com/gfx-rs/wgpu/pull/9168).
- Made the following available in `const` contexts; by @ErichDonGubler in [#8943](https://github.com/gfx-rs/wgpu/pull/8943):
- `naga`
- `Arena::len`
- `Arena::is_empty`
- `Range::first_and_last`
- `front::wgsl::Frontend::set_options`
- `ir::Block::is_empty`
- `ir::Block::len`
#### GLES
- Added `GlDebugFns` option in `GlBackendOptions` to control OpenGL debug functions (`glPushDebugGroup`, `glPopDebugGroup`, `glObjectLabel`, etc.). Automatically disables them on Mali GPUs to work around a driver crash. By @Xavientois in [#8931](https://github.com/gfx-rs/wgpu/pull/8931).
#### WebGPU
- Added support for `insert_debug_marker`, `push_debug_group` and `pop_debug_group`. By @evilpie in [#9017](https://github.com/gfx-rs/wgpu/pull/9017).
- Added support for `begin_occlusion_query` and `end_occlusion_query`. By @evilpie in [#9039](https://github.com/gfx-rs/wgpu/pull/9039).
### Changes
#### General
- Tracing now uses the `.metal` extension for metal source files, instead of `.msl`. By @inner-daemons in [#8880](https://github.com/gfx-rs/wgpu/pull/8880).
- BREAKING: Several error APIs were changed by @ErichDonGubler in [#9073](https://github.com/gfx-rs/wgpu/pull/9073) and [#9205](https://github.com/gfx-rs/wgpu/pull/9205):
- `BufferAccessError`:
- Split the `OutOfBoundsOverrun` variant into new `OutOfBoundsStartOffsetOverrun` and `OutOfBoundsEndOffsetOverrun` variants.
- Removed the `NegativeRange` variant in favor of new `MapStartOffsetUnderrun` and `MapStartOffsetOverrun` variants.
- Split the `TransferError::BufferOverrun` variant into new `BufferStartOffsetOverrun` and `BufferEndOffsetOverrun` variants.
- `ImmediateUploadError`:
- Removed the `TooLarge` variant in favor of new `StartOffsetOverrun` and `EndOffsetOverrun` variants.
- Removed the `Unaligned` variant in favor of new `StartOffsetUnaligned` and `SizeUnaligned` variants.
- Added the `ValueStartIndexOverrun` and `ValueEndIndexOverrun` invariants
- The various "max resources per stage" limits are now capped at 100, so that their total remains below `max_bindings_per_bind_group`, as required by WebGPU. By @andyleiserson in [#9118](https://github.com/gfx-rs/wgpu/pull/9118).
- The `max_uniform_buffer_binding_size` and `max_storage_buffer_binding_size` limits are now `u64` instead of `u32`, to match WebGPU. By @wingertge in [#9146](https://github.com/gfx-rs/wgpu/pull/9146).
- The main 3 native backends now report their limits properly. By @teoxoy in [#9196](https://github.com/gfx-rs/wgpu/pull/9196).
#### naga
- Naga and `wgpu` now reject shaders with an `enable` directive for functionality that is not available, even if that functionality is not used by the shader. By @andyleiserson in [#8913](https://github.com/gfx-rs/wgpu/pull/8913).
- Prevent UB from incorrectly using ray queries on HLSL. By @Vecvec in [#8763](https://github.com/gfx-rs/wgpu/pull/8763).
- Added support for dual-source blending in SPIR-V shaders. By @andyleiserson in [#8865](https://github.com/gfx-rs/wgpu/pull/8865).
- Added `supported_capabilities` to all backends. By @inner-daemons in [#9068](https://github.com/gfx-rs/wgpu/pull/9068).
- Updated codespan-reporting to 0.13. By @cwfitzgerald in [#9243](https://github.com/gfx-rs/wgpu/pull/9243).
#### Metal
- Use autogenerated `objc2` bindings internally, which should resolve a lot of leaks and unsoundness. By @madsmtm in [#5641](https://github.com/gfx-rs/wgpu/pull/5641).
- Implements ray-tracing acceleration structures for metal backend. By @lichtso in [#8071](https://github.com/gfx-rs/wgpu/pull/8071).
- Remove mutex for `MTLCommandQueue` because the Metal object is thread-safe. By @andyleiserson in [#9217](https://github.com/gfx-rs/wgpu/pull/9217).
#### deno_webgpu
- Expose the `GPU.wgslLanguageFeatures` property. By @andyleiserson in [#8884](https://github.com/gfx-rs/wgpu/pull/8884).
- `GPUFeatureName` now includes all `wgpu` extensions. Feature names for extensions should be written with a `wgpu-` prefix, although unprefixed names that were accepted previously are still accepted. By @andyleiserson in [#9163](https://github.com/gfx-rs/wgpu/pull/9163).
#### Hal
- Make ordered texture and buffer uses hal specific. By @NiklasEi in [#8924](https://github.com/gfx-rs/wgpu/pull/8924).
### Bug Fixes
#### General
- Tracing support has been restored. By @andyleiserson in [#8429](https://github.com/gfx-rs/wgpu/pull/8429).
- Pipelines using passthrough shaders now correctly require explicit pipeline layout. By @inner-daemons in [#8881](https://github.com/gfx-rs/wgpu/pull/8881).
- Allow using a shader that defines I/O for dual-source blending in a pipeline that does not make use of it. By @andyleiserson in [#8856](https://github.com/gfx-rs/wgpu/pull/8856).
- Improve validation of dual-source blending, by @andyleiserson in [#9200](https://github.com/gfx-rs/wgpu/pull/9200):
- Validate structs with `@blend_src` members whether or not they are used by an entry point.
- Dual-source blending is not supported when there are multiple color attachments.
- `TypeFlags::IO_SHAREABLE` is not set for structs other than `@blend_src` structs.
- Validate `strip_index_format` isn't None and equals index buffer format for indexed drawing with strip topology. By @beicause in [#8850](https://github.com/gfx-rs/wgpu/pull/8850).
- BREAKING: Renamed `EXPERIMENTAL_PASSTHROUGH_SHADERS` to `PASSTHROUGH_SHADERS` and made this no longer an experimental feature. By @inner-daemons in [#9054](https://github.com/gfx-rs/wgpu/pull/9054).
- BREAKING: End offsets in trace and `player` commands are now represented using `offset` + `size` instead. By @ErichDonGubler in [#9073](https://github.com/gfx-rs/wgpu/pull/9073).
- Validate some uncaught cases where buffer transfer operations could overflow when computing an end offset. By @ErichDonGubler in [#9073](https://github.com/gfx-rs/wgpu/pull/9073).
- Fix `local_invocation_id` and `local_invocation_index` being written multiple times in HLSL/MSL backends, and naming conflicts when users name variables `__local_invocation_id` or `__local_invocation_index`. By @inner-daemons in [#9099](https://github.com/gfx-rs/wgpu/pull/9099).
- Added internal labels to validation GPU objects and timestamp normalization code to improve clarity in graphics debuggers. By @szostid in [#9094](https://github.com/gfx-rs/wgpu/pull/9094)
- Fix multi-planar texture copying. By @noituri in [#9069](https://github.com/gfx-rs/wgpu/pull/9069)
#### naga
- The validator checks that override-sized arrays have a positive size, if overrides have been resolved. By @andyleiserson in [#8822](https://github.com/gfx-rs/wgpu/pull/8822).
- Fix some cases where f16 constants were not working. By @andyleiserson in [#8816](https://github.com/gfx-rs/wgpu/pull/8816).
- Use wrapping arithmetic when evaluating constant expressions involving `u32`. By @andyleiserson in [#8912](https://github.com/gfx-rs/wgpu/pull/8912).
- Fix missing side effects from sequence expressions in GLSL. By @Vipitis in [#8787](https://github.com/gfx-rs/wgpu/pull/8787).
- Naga now enforces the `@must_use` attribute on WGSL built-in functions, when applicable. You can waive the error with a phony assignment, e.g., `_ = subgroupElect()`. By @andyleiserson in [#8713](https://github.com/gfx-rs/wgpu/pull/8713).
- Reject zero-value construction of a runtime-sized array with a validation error. Previously it would crash in the HLSL backend. By @mooori in [#8741](https://github.com/gfx-rs/wgpu/pull/8741).
- Reject splat vector construction if the argument type does not match the type of the vector's scalar. Previously it would succeed. By @mooori in [#8829](https://github.com/gfx-rs/wgpu/pull/8829).
- Fixed `workgroupUniformLoad` incorrectly returning an atomic when called on an atomic, it now returns the inner `T` as per the spec. By @cryvosh in [#8791](https://github.com/gfx-rs/wgpu/pull/8791).
- Fixed constant evaluation for `sign()` builtin to return zero when the argument is zero. By @mandryskowski in [#8942](https://github.com/gfx-rs/wgpu/pull/8942).
- Allow array generation to compile with the macOS 10.12 Metal compiler. By @madsmtm in [#8953](https://github.com/gfx-rs/wgpu/pull/8953)
- Naga now detects bitwise shifts by a constant exceeding the operand bit width at compile time, and disallows scalar-by-vector and vector-by-scalar shifts in constant evaluation. By @andyleiserson in [#8907](https://github.com/gfx-rs/wgpu/pull/8907).
- Naga uses wrapping arithmetic when evaluating dot products on concrete integer types (`u32` and `i32`). By @BKDaugherty in [#9142](https://github.com/gfx-rs/wgpu/pull/9142).
- Disallow negation of a matrix in WGSL. By @andyleiserson in [#9157](https://github.com/gfx-rs/wgpu/pull/9157).
- Fix evaluation order of compound assignment (e.g. `+=`) LHS and RHS. By @andyleiserson in [#9181](https://github.com/gfx-rs/wgpu/pull/9181).
- Fixed invalid MSL when `float16`-format vertex input data was accessed via an `f16`-type variable in a vertex shader. By @andyleiserson in [#9166](https://github.com/gfx-rs/wgpu/pull/9166).
#### Validation
- Fixed validation of the texture format in GPUDepthStencilState when neither depth nor stencil is actually enabled. By @andyleiserson in [#8766](https://github.com/gfx-rs/wgpu/pull/8766).
- Check that depth bias is not used with non-triangle topologies. By @andyleiserson in [#8856](https://github.com/gfx-rs/wgpu/pull/8856).
- Check that if the shader outputs `frag_depth`, then the pipeline must have a depth attachment. By @andyleiserson in [#8856](https://github.com/gfx-rs/wgpu/pull/8856).
- Fix incorrect acceptance of some swizzle selectors that are not valid for their operand, e.g. `const v = vec2<i32>(); let r = v.xyz`. By @andyleiserson in [#8949](https://github.com/gfx-rs/wgpu/pull/8949).
- Fixed calculation of the total number of bindings in a pipeline layout when validating against device limits. By @andyleiserson in [#8997](https://github.com/gfx-rs/wgpu/pull/8997).
- Reject non-constructible types (runtime- and override-sized arrays, and structs containing non-constructible types) in more places where they should not be allowed. By @andyleiserson in [#8873](https://github.com/gfx-rs/wgpu/pull/8873).
- The query set type for an occlusion query is now validated when opening the render pass, in addition to within the call to `beginOcclusionQuery`. By @andyleiserson in [#9086](https://github.com/gfx-rs/wgpu/pull/9086).
- Require that the blend factor is `One` when the blend operation is `Min` or `Max`. The `BlendFactorOnUnsupportedTarget` error is now reported within `ColorStateError` rather than directly in `CreateRenderPipelineError`. By @andyleiserson in [#9110](https://github.com/gfx-rs/wgpu/pull/9110).
#### Vulkan
- Fixed a variety of mesh shader SPIR-V writer issues from the original implementation. By @inner-daemons in [#8756](https://github.com/gfx-rs/wgpu/pull/8756)
- Offset the vertex buffer device address when building a BLAS instead of using the `first_vertex` field. By @Vecvec in [#9220](https://github.com/gfx-rs/wgpu/pull/9220)
- Remove incorrect ordered texture uses. By @NiklasEi in [#8924](https://github.com/gfx-rs/wgpu/pull/8924).
#### Metal / macOS
- Fix one-second delay when switching a wgpu app to the foreground. By [@emilk](https://github.com/emilk) in [#9141](https://github.com/gfx-rs/wgpu/pull/9141)
- Work around Metal driver bug with atomic textures. By @atlv24 in [#9185](https://github.com/gfx-rs/wgpu/pull/9185)
- Fix setting an immediate for a Mesh shader. By [@waywardmonkeys](https://github.com/waywardmonkeys) in [#9254](https://github.com/gfx-rs/wgpu/pull/9254)
#### GLES
- `DisplayHandle` should now be passed to `InstanceDescriptor` for correct EGL initialization on Wayland. By @MarijnS95 in [#8012](https://github.com/gfx-rs/wgpu/pull/8012)
Note that the existing workaround to create surfaces before the adapter is no longer valid.
- Changing shader constants now correctly recompiles the shader. By @DerSchmale in [#8291](https://github.com/gfx-rs/wgpu/pull/8291).
### Performance
#### GLES
- The GL backend would now try to take advantage of `GL_EXT_multisampled_render_to_texture` extension when applicable to skip the multi-sample resolve operation. By @opstic in [#8536](https://github.com/gfx-rs/wgpu/pull/8536).
### Documentation
#### General
- Expanded documentation of `QuerySet`, `QueryType`, and `resolve_query_set()` describing how to use queries. By @kpreid in [#8776](https://github.com/gfx-rs/wgpu/pull/8776).
## v28.0.1 (2025-03-01)
### General
- Fixed crash on nvidia cards when presenting from another thread. By @inner-daemons in [#9036](https://github.com/gfx-rs/wgpu/pull/9036).
### Vulkan
- Fixed crash on some Mali drivers on Android. By @beicause in [#8769](https://github.com/gfx-rs/wgpu/pull/8769).
### Metal
- Re-added support for TRANSIENT textures on Apple A7 chips. By @Opstic in [#8725](https://github.com/gfx-rs/wgpu/pull/8725).
## v28.0.0 (2025-12-17)
### Major Changes
#### Mesh Shaders
This has been a long time coming. See [the tracking issue](https://github.com/gfx-rs/wgpu/issues/7197) for more information.
They are now fully supported on Vulkan, and supported on Metal and DX12 with passthrough shaders. WGSL parsing and rewriting
is supported, meaning they can be used through WESL or naga_oil.
Mesh shader pipelines replace the standard vertex shader pipelines and allow new ways to render meshes.
They are ideal for meshlet rendering, a form of rendering where small groups of triangles are handled together,
for both culling and rendering.
They are compute-like shaders, and generate primitives which are passed directly to the rasterizer, rather
than having a list of vertices generated individually and then using a static index buffer. This means that certain computations
on nearby groups of triangles can be done together, the relationship between vertices and primitives is more programmable, and
you can even pass non-interpolated per-primitive data to the fragment shader, independent of vertices.
Mesh shaders are very versatile, and are powerful enough to replace vertex shaders, tesselation shaders, and geometry shaders
on their own or with task shaders.
A full example of mesh shaders in use can be seen in the `mesh_shader` example. For the full specification of mesh shaders in wgpu, go to [docs/api-specs/mesh_shading.md](docs/api-specs/mesh_shading.md). Below is a small snippet of shader code demonstrating their usage:
```wgsl
@task
@payload(taskPayload)
@workgroup_size(1)
fn ts_main() -> @builtin(mesh_task_size) vec3<u32> {
// Task shaders can use workgroup variables like compute shaders
workgroupData = 1.0;
// Pass some data to all mesh shaders dispatched by this workgroup
taskPayload.colorMask = vec4(1.0, 1.0, 0.0, 1.0);
taskPayload.visible = 1;
// Dispatch a mesh shader grid with one workgroup
return vec3(1, 1, 1);
}
@mesh(mesh_output)
@payload(taskPayload)
@workgroup_size(1)
fn ms_main(@builtin(local_invocation_index) index: u32, @builtin(global_invocation_id) id: vec3<u32>) {
// Set how many outputs this workgroup will generate
mesh_output.vertex_count = 3;
mesh_output.primitive_count = 1;
// Can also use workgroup variables
workgroupData = 2.0;
// Set vertex outputs
mesh_output.vertices[0].position = positions[0];
mesh_output.vertices[0].color = colors[0] * taskPayload.colorMask;
mesh_output.vertices[1].position = positions[1];
mesh_output.vertices[1].color = colors[1] * taskPayload.colorMask;
mesh_output.vertices[2].position = positions[2];
mesh_output.vertices[2].color = colors[2] * taskPayload.colorMask;
// Set the vertex indices for the only primitive
mesh_output.primitives[0].indices = vec3<u32>(0, 1, 2);
// Cull it if the data passed by the task shader says to
mesh_output.primitives[0].cull = taskPayload.visible == 1;
// Give a noninterpolated per-primitive vec4 to the fragment shader
mesh_output.primitives[0].colorMask = vec4<f32>(1.0, 0.0, 1.0, 1.0);
}
```
##### Thanks
This was a monumental effort from many different people, but it was championed by @inner-daemons, without whom it would not have happened.
Thank you @cwfitzgerald for doing the bulk of the code review. Finally thank you @ColinTimBarndt for coordinating the testing effort.
Reviewers:
- @cwfitzgerald
- @jimblandy
- @ErichDonGubler
`wgpu` Contributions:
- Metal implementation in wgpu-hal. By @inner-daemons in [#8139](https://github.com/gfx-rs/wgpu/pull/8139).
- DX12 implementation in wgpu-hal. By @inner-daemons in [#8110](https://github.com/gfx-rs/wgpu/pull/8110).
- Vulkan implementation in wgpu-hal. By @inner-daemons in [#7089](https://github.com/gfx-rs/wgpu/pull/7089).
- wgpu/wgpu-core implementation. By @inner-daemons in [#7345](https://github.com/gfx-rs/wgpu/pull/7345).
- New mesh shader limits and validation. By @inner-daemons in [#8507](https://github.com/gfx-rs/wgpu/pull/8507).
`naga` Contributions:
- Naga IR implementation. By @inner-daemons in [#8104](https://github.com/gfx-rs/wgpu/pull/8104).
- `wgsl-in` implementation in naga. By @inner-daemons in [#8370](https://github.com/gfx-rs/wgpu/pull/8370).
- `spv-out` implementation in naga. By @inner-daemons in [#8456](https://github.com/gfx-rs/wgpu/pull/8456).
- `wgsl-out` implementation in naga. By @Slightlyclueless in [#8481](https://github.com/gfx-rs/wgpu/pull/8481).
- Allow barriers in mesh/task shaders. By @inner-daemons in [#8749](https://github.com/gfx-rs/wgpu/pull/8749)
Testing Assistance:
- @ColinTimBarndt
- @AdamK2003
- @Mhowser
- @9291Sam
- 3 more testers who wished to remain anonymous.
Thank you to everyone to made this happen!
#### Switch from `gpu-alloc` to `gpu-allocator` in the `vulkan` backend
`gpu-allocator` is the allocator used in the `dx12` backend, allowing to configure
the allocator the same way in those two backends converging their behavior.
This also brings the `Device::generate_allocator_report` feature to
the vulkan backend.
By @DeltaEvo in [#8158](https://github.com/gfx-rs/wgpu/pull/8158).
#### `wgpu::Instance::enumerate_adapters` is now `async` & available on WebGPU
BREAKING CHANGE: `enumerate_adapters` is now `async`:
```diff
- pub fn enumerate_adapters(&self, backends: Backends) -> Vec<Adapter> {
+ pub fn enumerate_adapters(&self, backends: Backends) -> impl Future<Output = Vec<Adapter>> {
```
This yields two benefits:
- This method is now implemented on non-native using the standard `Adapter::request_adapter(…)`, making `enumerate_adapters` a portable surface. This was previously a nontrivial pain point when an application wanted to do some of its own filtering of adapters.
- This method can now be implemented in custom backends.
By @R-Cramer4 in [#8230](https://github.com/gfx-rs/wgpu/pull/8230)
#### New `LoadOp::DontCare`
In the case where a renderpass unconditionally writes to all pixels in the rendertarget,
`Load` can cause unnecessary memory traffic, and `Clear` can spend time unnecessarily
clearing the rendertargets. `DontCare` is a new `LoadOp` which will leave the contents
of the rendertarget undefined. Because this could lead to undefined behavior, this API
requires that the user gives an unsafe token to use the api.
While you can use this unconditionally, on platforms where `DontCare` is not available,
it will internally use a different load op.
```rust
load: LoadOp::DontCare(unsafe { wgpu::LoadOpDontCare::enabled() })
```
By @cwfitzgerald in [#8549](https://github.com/gfx-rs/wgpu/pull/8549)
#### `MipmapFilterMode` is split from `FilterMode`
This is a breaking change that aligns wgpu with spec.
```diff
SamplerDescriptor {
...
- mipmap_filter: FilterMode::Nearest
+ mipmap_filter: MipmapFilterMode::Nearest
...
}
```
By @sagudev in [#8314](https://github.com/gfx-rs/wgpu/pull/8314).
#### Multiview on all major platforms and support for multiview bitmasks
Multiview is a feature that allows rendering the same content to multiple layers of a texture.
This is useful primarily in VR where you wish to display almost identical content to 2 views,
just with a different perspective. Instead of using 2 draw calls or 2 instances for each object, you
can use this feature.
Multiview is also called view instancing in DX12 or vertex amplification in Metal.
Multiview has been reworked, adding support for Metal and DX12, and adding testing and validation to wgpu itself.
This change also introduces a view bitmask, a new field in `RenderPassDescriptor` that allows a render pass to render
to multiple non-adjacent layers when using the `SELECTIVE_MULTIVIEW` feature. If you don't use multi-view,
you can set this field to none.
```diff
- wgpu::RenderPassDescriptor {
- label: None,
- color_attachments: &color_attachments,
- depth_stencil_attachment: None,
- timestamp_writes: None,
- occlusion_query_set: None,
- }
+ wgpu::RenderPassDescriptor {
+ label: None,
+ color_attachments: &color_attachments,
+ depth_stencil_attachment: None,
+ timestamp_writes: None,
+ occlusion_query_set: None,
+ multiview_mask: NonZero::new(3),
+ }
```
One other breaking change worth noting is that in WGSL `@builtin(view_index)` now requires a type of `u32`, where previously it required `i32`.
By @inner-daemons in [#8206](https://github.com/gfx-rs/wgpu/pull/8206).
#### Error scopes now use guards and are thread-local.
```diff
- device.push_error_scope(wgpu::ErrorFilter::Validation);
+ let scope = device.push_error_scope(wgpu::ErrorFilter::Validation);
// ... perform operations on the device ...
- let error: Option<Error> = device.pop_error_scope().await;
+ let error: Option<Error> = scope.pop().await;
```
Device error scopes now operate on a per-thread basis. This allows them to be used easily within multithreaded contexts,
without having the error scope capture errors from other threads.
When the `std` feature is **not** enabled, we have no way to differentiate between threads, so error scopes return to be
global operations.
By @cwfitzgerald in [#8685](https://github.com/gfx-rs/wgpu/pull/8685)
#### Log Levels
We have received complaints about wgpu being way too log spammy at log levels `info`/`warn`/`error`. We have
adjusted our log policy and changed logging such that `info` and above should be silent unless some exceptional
event happens. Our new log policy is as follows:
- Error: if we can’t (for some reason, usually a bug) communicate an error any other way.
- Warning: similar, but there may be one-shot warnings about almost certainly sub-optimal.
- Info: do not use
- Debug: Used for interesting events happening inside wgpu.
- Trace: Used for all events that might be useful to either `wgpu` or application developers.
By @cwfitzgerald in [#8579](https://github.com/gfx-rs/wgpu/pull/8579).
#### Push constants renamed immediates, API brought in line with spec.
As the "immediate data" api is getting close to stabilization in the WebGPU specification,
we're bringing our implementation in line with what the spec dictates.
First, in the `PipelineLayoutDescriptor`, you now pass a unified size for all stages:
```diff
- push_constant_ranges: &[wgpu::PushConstantRange {
- stages: wgpu::ShaderStages::VERTEX_FRAGMENT,
- range: 0..12,
- }]
+ immediate_size: 12,
```
Second, on the command encoder you no longer specify a shader stage, uploads apply
to all shader stages that use immediate data.
```diff
- rpass.set_push_constants(wgpu::ShaderStages::FRAGMENT, 0, bytes);
+ rpass.set_immediates(0, bytes);
```
Third, immediates are now declared with the `immediate` address space instead of
the `push_constant` address space. Due to a [known issue on DX12](https://github.com/gfx-rs/wgpu/issues/5683)
it is advised to always use a structure for your immediates until that issue
is fixed.
```diff
- var<push_constant> my_pc: MyPushConstant;
+ var<immediate> my_imm: MyImmediate;
```
Finally, our implementation currently still zero-initializes the immediate data
range you declared in the pipeline layout. This is not spec compliant and failing
to populate immediate "slots" that are used in the shader will be a validation error
in a future version. See [the proposal][immediate-data-spec] for details for determining
which slots are populated in a given shader.
By @cwfitzgerald in [#8724](https://github.com/gfx-rs/wgpu/pull/8724).
[immediate-data-spec]: https://github.com/gpuweb/gpuweb/blob/main/proposals/immediate-data.md#immediate-slots
#### `subgroup_{min,max}_size` renamed and moved from `Limits` -> `AdapterInfo`
To bring our code in line with the WebGPU spec, we have moved information about subgroup size
from limits to adapter info. Limits was not the correct place for this anyway, and we had some
code special casing those limits.
Additionally we have renamed the fields to match the spec.
```diff
- let min = limits.min_subgroup_size;
+ let min = info.subgroup_min_size;
- let max = limits.max_subgroup_size;
+ let max = info.subgroup_max_size;
```
By @cwfitzgerald in [#8609](https://github.com/gfx-rs/wgpu/pull/8609).
### New Features
- Added support for transient textures on Vulkan and Metal. By @opstic in [#8247](https://github.com/gfx-rs/wgpu/pull/8247)
- Implement shader triangle barycentric coordinate builtins. By @atlv24 in [#8320](https://github.com/gfx-rs/wgpu/pull/8320).
- Added support for binding arrays of storage textures on Metal. By @msvbg in [#8464](https://github.com/gfx-rs/wgpu/pull/8464)
- Added support for multisampled texture arrays on Vulkan through adapter feature `MULTISAMPLE_ARRAY`. By @LaylBongers in [#8571](https://github.com/gfx-rs/wgpu/pull/8571).
- Added `get_configuration` to `wgpu::Surface`, that returns the current configuration of `wgpu::Surface`. By @sagudev in [#8664](https://github.com/gfx-rs/wgpu/pull/8664).
- Add `wgpu_core::Global::create_bind_group_layout_error`. By @ErichDonGubler in [#8650](https://github.com/gfx-rs/wgpu/pull/8650).
### Changes
#### General
- Require new enable extensions when using ray queries and position fetch (`wgpu_ray_query`, `wgpu_ray_query_vertex_return`). By @Vecvec in [#8545](https://github.com/gfx-rs/wgpu/pull/8545).
- Texture now has `from_custom`. By @R-Cramer4 in [#8315](https://github.com/gfx-rs/wgpu/pull/8315).
- Using both the wgpu command encoding APIs and `CommandEncoder::as_hal_mut` on the same encoder will now result in a panic.
- Allow `include_spirv!` and `include_spirv_raw!` macros to be used in constants and statics. By @clarfonthey in [#8250](https://github.com/gfx-rs/wgpu/pull/8250).
- Added support for rendering onto multi-planar textures. By @noituri in [#8307](https://github.com/gfx-rs/wgpu/pull/8307).
- Validation errors from `CommandEncoder::finish()` will report the label of the invalid encoder. By @kpreid in [#8449](https://github.com/gfx-rs/wgpu/pull/8449).
- Corrected documentation of the minimum alignment of the _end_ of a mapped range of a buffer (it is 4, not 8). By @kpreid in [#8450](https://github.com/gfx-rs/wgpu/pull/8450).
- `util::StagingBelt` now takes a `Device` when it is created instead of when it is used. By @kpreid in [#8462](https://github.com/gfx-rs/wgpu/pull/8462).
- `wgpu_hal::vulkan::Texture` API changes to handle externally-created textures and memory more flexibly. By @s-ol in [#8512](https://github.com/gfx-rs/wgpu/pull/8512), [#8521](https://github.com/gfx-rs/wgpu/pull/8521).
- Render passes are now validated against the `maxColorAttachmentBytesPerSample` limit. By @andyleiserson in [#8697](https://github.com/gfx-rs/wgpu/pull/8697).
#### Metal
- Expose render layer. By @xiaopengli89 in [#8707](https://github.com/gfx-rs/wgpu/pull/8707)
- `MTLDevice` is thread-safe. By @uael in [#8168](https://github.com/gfx-rs/wgpu/pull/8168)
#### naga
- Prevent UB with invalid ray query calls on spirv. By @Vecvec in [#8390](https://github.com/gfx-rs/wgpu/pull/8390).
- Update the set of binding_array capabilities. In most cases, they are set automatically from `wgpu` features, and this change should not be user-visible. By @andyleiserson in [#8671](https://github.com/gfx-rs/wgpu/pull/8671).
- Naga now accepts the `var<function>` syntax for declaring local variables. By @andyleiserson in [#8710](https://github.com/gfx-rs/wgpu/pull/8710).
### Bug Fixes
#### General
- Fixed a bug where mapping sub-ranges of a buffer on web would fail with `OperationError: GPUBuffer.getMappedRange: GetMappedRange range extends beyond buffer's mapped range`. By @ryankaplan in [#8349](https://github.com/gfx-rs/wgpu/pull/8349)
- Reject fragment shader output `location`s > `max_color_attachments` limit. By @ErichDonGubler in [#8316](https://github.com/gfx-rs/wgpu/pull/8316).
- WebGPU device requests now support the required limits `maxColorAttachments` and `maxColorAttachmentBytesPerSample`. By @evilpie in [#8328](https://github.com/gfx-rs/wgpu/pull/8328)
- Reject binding indices that exceed `wgpu_types::Limits::max_bindings_per_bind_group` when deriving a bind group layout for a pipeline. By @jimblandy in [#8325](https://github.com/gfx-rs/wgpu/pull/8325).
- Removed three features from `wgpu-hal` which did nothing useful: `"cargo-clippy"`, `"gpu-allocator"`, and `"rustc-hash"`. By @kpreid in [#8357](https://github.com/gfx-rs/wgpu/pull/8357).
- `wgpu_types::PollError` now always implements the `Error` trait. By @kpreid in [#8384](https://github.com/gfx-rs/wgpu/pull/8384).
- The texture subresources used by the color attachments of a render pass are no longer allowed to overlap when accessed via different texture views. By @andyleiserson in [#8402](https://github.com/gfx-rs/wgpu/pull/8402).
- The `STORAGE_READ_ONLY` texture usage is now permitted to coexist with other read-only usages. By @andyleiserson in [#8490](https://github.com/gfx-rs/wgpu/pull/8490).
- Validate that buffers are unmapped in `write_buffer` calls. By @ErichDonGubler in [#8454](https://github.com/gfx-rs/wgpu/pull/8454).
- Shorten critical section inside present such that the snatch write lock is no longer held during present, preventing other work happening on other threads. By @cwfitzgerald in [#8608](https://github.com/gfx-rs/wgpu/pull/8608).
#### naga
- The `||` and `&&` operators now "short circuit", i.e., do not evaluate the RHS if the result can be determined from just the LHS. By @andyleiserson in [#7339](https://github.com/gfx-rs/wgpu/pull/7339).
- Fix a bug that resulted in the Metal error `program scope variable must reside in constant address space` in some cases. By @teoxoy in [#8311](https://github.com/gfx-rs/wgpu/pull/8311).
- Handle `rayQueryTerminate` in spv-out instead of ignoring it. By @Vecvec in [#8581](https://github.com/gfx-rs/wgpu/pull/8581).
#### DX12
- Align copies b/w textures and buffers via a single intermediate buffer per copy when `D3D12_FEATURE_DATA_D3D12_OPTIONS13.UnrestrictedBufferTextureCopyPitchSupported` is `false`. By @ErichDonGubler in [#7721](https://github.com/gfx-rs/wgpu/pull/7721).
- Fix detection of Int64 Buffer/Texture atomic features. By @cwfitzgerald in [#8667](https://github.com/gfx-rs/wgpu/pull/8667).
#### Vulkan
- Fixed a validation error regarding atomic memory semantics. By @atlv24 in [#8391](https://github.com/gfx-rs/wgpu/pull/8391).
#### Metal
- Fixed a variety of feature detection related bugs. By @inner-daemons in [#8439](https://github.com/gfx-rs/wgpu/pull/8439).
#### WebGPU
- Fixed a bug where the texture aspect was not passed through when calling `copy_texture_to_buffer` in WebGPU, causing the copy to fail for depth/stencil textures. By @Tim-Evans-Seequent in [#8445](https://github.com/gfx-rs/wgpu/pull/8445).
#### GLES
- Fix race when downloading texture from compute shader pass. By @SpeedCrash100 in [#8527](https://github.com/gfx-rs/wgpu/pull/8527)
- Fix double window class registration when dynamic libraries are used. By @Azorlogh in [#8548](https://github.com/gfx-rs/wgpu/pull/8548)
- Fix context loss on device initialization on GL3.3-4.1 contexts. By @cwfitzgerald in [#8674](https://github.com/gfx-rs/wgpu/pull/8674).
- `VertexFormat::Unorm10_10_10_2` can now be used on `gl` backends. By @mooori in [#8717](https://github.com/gfx-rs/wgpu/pull/8717).
#### hal
- `DropCallback`s are now called after dropping all other fields of their parent structs. By @jerzywilczek in [#8353](https://github.com/gfx-rs/wgpu/pull/8353)
## v27.0.4 (2025-10-23)
This release includes `wgpu-hal` version `27.0.4`. All other crates remain at their previous versions.
### Bug Fixes
#### General
- Remove fragile dependency constraint on `ordered-float` that prevented semver-compatible changes above `5.0.0`. By @kpreid in [#8371](https://github.com/gfx-rs/wgpu/pull/8371).
#### Vulkan
- Work around extremely poor frame pacing from AMD and Nvidia cards on Windows in `Fifo` and `FifoRelaxed` present modes. This is due to the drivers implicitly using a DXGI (Direct3D) swapchain to implement these modes and it having vastly different timing properties. See https://github.com/gfx-rs/wgpu/issues/8310 and https://github.com/gfx-rs/wgpu/issues/8354 for more information. By @cwfitzgerald in [#8420](https://github.com/gfx-rs/wgpu/pull/8420).
## v27.0.3 (2025-10-22)
This release includes `naga`, `wgpu-core` and `wgpu-hal` version `27.0.3`. All other crates remain at their previous versions.
### Bug Fixes
#### naga
- Fix a bug that resulted in the Metal error `program scope variable must reside in constant address space` in some cases. Backport of [#8311](https://github.com/gfx-rs/wgpu/pull/8311) by @teoxoy.
#### General
- Remove an assertion that causes problems if `CommandEncoder::as_hal_mut` is used. By @andyleiserson in [#8387](https://github.com/gfx-rs/wgpu/pull/8387).
#### DX12
- Align copies b/w textures and buffers via a single intermediate buffer per copy when `D3D12_FEATURE_DATA_D3D12_OPTIONS13.UnrestrictedBufferTextureCopyPitchSupported` is `false`. By @ErichDonGubler in [#7721](https://github.com/gfx-rs/wgpu/pull/7721), backported in [#8374](https://github.com/gfx-rs/wgpu/pull/8374).
## v27.0.2 (2025-10-03)
### Bug Fixes
#### DX12
- Fix device creation failures for devices that do not support mesh shaders. By @vorporeal in [#8297](https://github.com/gfx-rs/wgpu/pull/8297).
## v27.0.1 (2025-10-02)
### Bug Fixes
- Fixed the build on docs.rs. By @cwfitzgerald in [#8292](https://github.com/gfx-rs/wgpu/pull/8292).
## v27.0.0 (2025-10-01)
### Major Changes
#### Deferred command buffer actions: `map_buffer_on_submit` and `on_submitted_work_done`
You may schedule buffer mapping and a submission-complete callback to run automatically after you submit, directly from encoders, command buffers, and passes.
```rust
// Record some GPU work so the submission isn't empty and touches `buffer`.
encoder.clear_buffer(&buffer, 0, None);
// Defer mapping until this encoder is submitted.
encoder.map_buffer_on_submit(&buffer, wgpu::MapMode::Read, 0..size, |result| { .. });
// Fires after the command buffer's work is finished.
encoder.on_submitted_work_done(|| { .. });
// Automatically calls `map_async` and `on_submitted_work_done` after this submission finishes.
queue.submit([encoder.finish()]);
```
Available on `CommandEncoder`, `CommandBuffer`, `RenderPass`, and `ComputePass`.
By @cwfitzgerald in [#8125](https://github.com/gfx-rs/wgpu/pull/8125).
#### Builtin Support for DXGI swapchains on top of of DirectComposition Visuals in DX12
By enabling DirectComposition support, the dx12 backend can now support transparent windows.
This creates a single `IDCompositionVisual` over the entire window that is used by the mf`Surface`. If a user wants to manage the composition tree themselves, they should create their own device and composition, and pass the relevant visual down into `wgpu` via `SurfaceTargetUnsafe::CompositionVisual`.
```rust
let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor {
backend_options: wgpu::BackendOptions {
dx12: wgpu::Dx12BackendOptions {
presentation_system: wgpu::Dx12SwapchainKind::DxgiFromVisual,
..
},
..
},
..
});
```
By @n1ght-hunter in [#7550](https://github.com/gfx-rs/wgpu/pull/7550).
#### `EXPERIMENTAL_RAY_TRACING_ACCELERATION_STRUCTURE` has been merged into `EXPERIMENTAL_RAY_QUERY`
We have merged the acceleration structure feature into the `RayQuery` feature. This is to help work around an AMD driver bug and reduce the feature complexity of ray tracing. In the future when ray tracing pipelines are implemented, if either feature is enabled, acceleration structures will be available.
```diff
- Features::EXPERIMENTAL_RAY_TRACING_ACCELERATION_STRUCTURE
+ Features::EXPERIMENTAL_RAY_QUERY
```
By @Vecvec in [#7913](https://github.com/gfx-rs/wgpu/pull/7913).
#### New `EXPERIMENTAL_PRECOMPILED_SHADERS` API
We have added `Features::EXPERIMENTAL_PRECOMPILED_SHADERS`, replacing existing passthrough types with a unified `CreateShaderModuleDescriptorPassthrough` which allows passing multiple shader codes for different backends. By @SupaMaggie70Incorporated in [#7834](https://github.com/gfx-rs/wgpu/pull/7834)
Difference for SPIR-V passthrough:
```diff
- device.create_shader_module_passthrough(wgpu::ShaderModuleDescriptorPassthrough::SpirV(
- wgpu::ShaderModuleDescriptorSpirV {
- label: None,
- source: spirv_code,
- },
- ))
+ device.create_shader_module_passthrough(wgpu::ShaderModuleDescriptorPassthrough {
+ entry_point: "main".into(),
+ label: None,
+ spirv: Some(spirv_code),
+ ..Default::default()
})
```
This allows using precompiled shaders without manually checking which backend's code to pass, for example if you have shaders precompiled for both DXIL and SPIR-V.
#### Buffer mapping apis no longer have lifetimes
`Buffer::get_mapped_range()`, `Buffer::get_mapped_range_mut()`, and `Queue::write_buffer_with()` now return guard objects without any lifetimes. This
makes it significantly easier to store these types in structs, which is useful for building utilities that build the contents of a buffer over time.
```diff
- let buffer_mapping_ref: wgpu::BufferView<'_> = buffer.get_mapped_range(..);
- let buffer_mapping_mut: wgpu::BufferViewMut<'_> = buffer.get_mapped_range_mut(..);
- let queue_write_with: wgpu::QueueWriteBufferView<'_> = queue.write_buffer_with(..);
+ let buffer_mapping_ref: wgpu::BufferView = buffer.get_mapped_range(..);
+ let buffer_mapping_mut: wgpu::BufferViewMut = buffer.get_mapped_range_mut(..);
+ let queue_write_with: wgpu::QueueWriteBufferView = queue.write_buffer_with(..);
```
By @sagudev in [#8046](https://github.com/gfx-rs/wgpu/pull/8046) and @cwfitzgerald in [#8070](https://github.com/gfx-rs/wgpu/pull/8161).
#### `EXPERIMENTAL_*` features now require unsafe code to enable
We want to be able to expose potentially experimental features to our users before we have ensured that they are fully sound to use.
As such, we now require any feature that is prefixed with `EXPERIMENTAL` to have a special unsafe token enabled in the device descriptor
acknowledging that the features may still have bugs in them and to report any they find.
```rust
adapter.request_device(&wgpu::DeviceDescriptor {
features: wgpu::Features::EXPERIMENTAL_MESH_SHADER,
experimental_features: unsafe { wgpu::ExperimentalFeatures::enabled() }
..
})
```
By @cwfitzgerald in [#8163](https://github.com/gfx-rs/wgpu/pull/8163).
#### Multi-draw indirect is now unconditionally supported when indirect draws are supported
We have removed `Features::MULTI_DRAW_INDIRECT` as it was unconditionally available on all platforms.
`RenderPass::multi_draw_indirect` is now available if the device supports downlevel flag `DownlevelFlags::INDIRECT_EXECUTION`.
If you are using spirv-passthrough with multi-draw indirect and `gl_DrawID`, you can know if `MULTI_DRAW_INDIRECT` is being emulated
by if the `Feature::MULTI_DRAW_INDIRECT_COUNT` feature is available on the device, this feature cannot be emulated efficicently.
By @cwfitzgerald in [#8162](https://github.com/gfx-rs/wgpu/pull/8162).
#### `wgpu::PollType::Wait` has now an optional timeout
We removed `wgpu::PollType::WaitForSubmissionIndex` and added fields to `wgpu::PollType::Wait` in order to express timeouts.
Before/after for `wgpu::PollType::Wait`:
```diff
-device.poll(wgpu::PollType::Wait).unwrap();
-device.poll(wgpu::PollType::wait_indefinitely()).unwrap();
+device.poll(wgpu::PollType::Wait {
+ submission_index: None, // Wait for most recent submission
+ timeout: Some(std::time::Duration::from_secs(60)), // Previous behavior, but more likely you want `None` instead.
+ })
+ .unwrap();
```
Before/after for `wgpu::PollType::WaitForSubmissionIndex`:
```diff
-device.poll(wgpu::PollType::WaitForSubmissionIndex(index_to_wait_on))
+device.poll(wgpu::PollType::Wait {
+ submission_index: Some(index_to_wait_on),
+ timeout: Some(std::time::Duration::from_secs(60)), // Previous behavior, but more likely you want `None` instead.
+ })
+ .unwrap();
```
⚠️ Previously, both `wgpu::PollType::WaitForSubmissionIndex` and `wgpu::PollType::Wait` had a hard-coded timeout of 60 seconds.
To wait indefinitely on the latest submission, you can also use the `wait_indefinitely` convenience function:
```rust
device.poll(wgpu::PollType::wait_indefinitely());
```
By @wumpf in [#8282](https://github.com/gfx-rs/wgpu/pull/8282), [#8285](https://github.com/gfx-rs/wgpu/pull/8285)
### New Features
#### General
- Added mesh shader support to `wgpu`, with examples. Requires passthrough. By @SupaMaggie70Incorporated in [#7345](https://github.com/gfx-rs/wgpu/pull/7345).
- Added support for external textures based on WebGPU's [`GPUExternalTexture`](https://www.w3.org/TR/webgpu/#gpuexternaltexture). These allow shaders to transparently operate on potentially multiplanar source texture data in either RGB or YCbCr formats via WGSL's `texture_external` type. This is gated behind the `Features::EXTERNAL_TEXTURE` feature, which is currently only supported on DX12. By @jamienicol in [#4386](https://github.com/gfx-rs/wgpu/issues/4386).
- `wgpu::Device::poll` can now specify a timeout via `wgpu::PollType::Wait`. By @wumpf in [#8282](https://github.com/gfx-rs/wgpu/pull/8282) & [#8285](https://github.com/gfx-rs/wgpu/pull/8285)
#### naga
- Expose `naga::front::wgsl::UnimplementedEnableExtension`. By @ErichDonGubler in [#8237](https://github.com/gfx-rs/wgpu/pull/8237).
### Changes
#### General
- Command encoding now happens when `CommandEncoder::finish` is called, not when the individual operations are requested. This does not affect the API, but may affect performance characteristics. By @andyleiserson in [#8220](https://github.com/gfx-rs/wgpu/pull/8220).
- Prevent resources for acceleration structures being created if acceleration structures are not enabled. By @Vecvec in [#8036](https://github.com/gfx-rs/wgpu/pull/8036).
- Validate that each `push_debug_group` pairs with exactly one `pop_debug_group`. By @andyleiserson in [#8048](https://github.com/gfx-rs/wgpu/pull/8048).
- `set_viewport` now requires that the supplied minimum depth value is less than the maximum depth value. By @andyleiserson in [#8040](https://github.com/gfx-rs/wgpu/pull/8040).
- Validation of `copy_texture_to_buffer`, `copy_buffer_to_texture`, and `copy_texture_to_texture` operations more closely follows the WebGPU specification. By @andyleiserson in various PRs.
- Copies within the same texture must not overlap.
- Copies of multisampled or depth/stencil formats must span an entire subresource (layer).
- Copies of depth/stencil formats must be 4B aligned.
- For texture-buffer copies, `bytes_per_row` on the buffer side must be 256B-aligned, even if the transfer is a single row.
- The offset for `set_vertex_buffer` and `set_index_buffer` must be 4B aligned. By @andyleiserson in [#7929](https://github.com/gfx-rs/wgpu/pull/7929).
- The offset and size of bindings are validated as fitting within the underlying buffer in more cases. By @andyleiserson in [#7911](https://github.com/gfx-rs/wgpu/pull/7911).
- The function you pass to `Device::on_uncaptured_error()` must now implement `Sync` in addition to `Send`, and be wrapped in `Arc` instead of `Box`.
In exchange for this, it is no longer possible for calling `wgpu` functions while in that callback to cause a deadlock (not that we encourage you to actually do that).
By @kpreid in [#8011](https://github.com/gfx-rs/wgpu/pull/8011).
- Make a compacted hal acceleration structure inherit a label from the base BLAS. By @Vecvec in [#8103](https://github.com/gfx-rs/wgpu/pull/8103).
- The limits requested for a device must now satisfy `min_subgroup_size <= max_subgroup_size`. By @andyleiserson in [#8085](https://github.com/gfx-rs/wgpu/pull/8085).
- Improve errors when buffer mapping is done incorrectly. Allow aliasing immutable [`BufferViews`]. By @cwfitzgerald in [#8150](https://github.com/gfx-rs/wgpu/pull/8150).
- Require new `F16_IN_F32` downlevel flag for `quantizeToF16`, `pack2x16float`, and `unpack2x16float` in WGSL input. By @aleiserson in [#8130](https://github.com/gfx-rs/wgpu/pull/8130).
- The error message for non-copyable depth/stencil formats no longer mentions the aspect when it is not relevant. By @reima in [#8156](https://github.com/gfx-rs/wgpu/pull/8156).
- Track the initialization status of buffer memory correctly when `copy_texture_to_buffer` skips over padding space between rows or layers, or when the start/end of a texture-buffer transfer is not 4B aligned. By @andyleiserson in [#8099](https://github.com/gfx-rs/wgpu/pull/8099).
#### naga
- naga now requires that no type be larger than 1 GB. This limit may be lowered in the future; feedback on an appropriate value for the limit is welcome. By @andyleiserson in [#7950](https://github.com/gfx-rs/wgpu/pull/7950).
- If the shader source contains control characters, naga now replaces them with U+FFFD ("replacement character") in diagnostic output. By @andyleiserson in [#8049](https://github.com/gfx-rs/wgpu/pull/8049).
- Add f16 IO polyfill on Vulkan backend to enable SHADER_F16 use without requiring `storageInputOutput16`. By @cryvosh in [#7884](https://github.com/gfx-rs/wgpu/pull/7884).
- For custom Naga backend authors: `naga::proc::Namer` now accepts reserved keywords using two new dedicated types, `proc::{KeywordSet, CaseInsensitiveKeywordSet}`. By @kpreid in [#8136](https://github.com/gfx-rs/wgpu/pull/8136).
- **BREAKING**: Previously the WGSL storage-texture format `rg11b10float` was incorrectly accepted and generated by naga, but now only accepts the the correct name `rg11b10ufloat` instead. By @ErikWDev in [#8219](https://github.com/gfx-rs/wgpu/pull/8219).
- The [`source()`](https://doc.rust-lang.org/std/error/trait.Error.html#method.source) method of `ShaderError` no longer reports the error as its own source. By @andyleiserson in [#8258](https://github.com/gfx-rs/wgpu/pull/8258).
- naga correctly ingests SPIR-V that use descriptor runtime indexing, which in turn is correctly converted into WGSLs binding array. By @hasenbanck in [8256](https://github.com/gfx-rs/wgpu/pull/8256).
- naga correctly ingests SPIR-V that loads from multi-sampled textures, which in turn is correctly converted into WGSLs texture_multisampled_2d and load operations. By @hasenbanck in [8270](https://github.com/gfx-rs/wgpu/pull/8270).
- naga implement OpImageGather and OpImageDrefGather operations when ingesting SPIR-V. By @hasenbanck in [8280](https://github.com/gfx-rs/wgpu/pull/8280).
#### DX12
- Allow disabling waiting for latency waitable object. By @marcpabst in [#7400](https://github.com/gfx-rs/wgpu/pull/7400)
- Add mesh shader support, including to the example. By @SupaMaggie70Incorporated in [#8110](https://github.com/gfx-rs/wgpu/issues/8110)
### Bug Fixes
#### General
- Validate that effective buffer binding size is aligned to 4 when creating bind groups with buffer entries.. By @ErichDonGubler in [8041](https://github.com/gfx-rs/wgpu/pull/8041).
#### DX12
- Create an event per wait to prevent 60 second hangs in certain multithreaded scenarios. By @Vecvec in [#8273](https://github.com/gfx-rs/wgpu/pull/8273).
- Fixed a bug where access to matrices with 2 rows would not work in some cases. By @andyleiserson in [#7438](https://github.com/gfx-rs/wgpu/pull/7438).
##### EGL
- Fixed unwrap failed in context creation for some Android devices. By @uael in [#8024](https://github.com/gfx-rs/wgpu/pull/8024).
##### Vulkan
- Fixed wrong color format+space being reported versus what is hardcoded in `create_swapchain()`. By @MarijnS95 in [#8226](https://github.com/gfx-rs/wgpu/pull/8226).
#### naga
- [wgsl-in] Allow a trailing comma in `@blend_src(…)` attributes. By @ErichDonGubler in [#8137](https://github.com/gfx-rs/wgpu/pull/8137).
- [wgsl-in] Allow a trailing comma in the list of `case` values inside a `switch`. By @reima in [#8165](https://github.com/gfx-rs/wgpu/pull/8165).
- Escape, rather than strip, identifiers with Unicode. By @ErichDonGubler in [7995](https://github.com/gfx-rs/wgpu/pull/7995).
### Documentation
#### General
- Clarify that subgroup barriers require both the `SUBGROUP` and `SUBGROUP_BARRIER` features / capabilities. By @andyleiserson in [#8203](https://github.com/gfx-rs/wgpu/pull/8203).
# v26.0.6 (2025-10-23)
This release includes `wgpu-hal` version `26.0.6`. All other crates remain at their previous versions.
### Bug Fixes
#### Vulkan
- Work around extremely poor frame pacing from AMD and Nvidia cards on Windows in `Fifo` and `FifoRelaxed` present modes. This is due to the drivers implicitly using a DXGI (Direct3D) swapchain to implement these modes and it having vastly different timing properties. See https://github.com/gfx-rs/wgpu/issues/8310 and https://github.com/gfx-rs/wgpu/issues/8354 for more information. By @cwfitzgerald in [#8420](https://github.com/gfx-rs/wgpu/pull/8420).
## v26.0.5 (2025-10-21)
This release includes `wgpu-hal` version `26.0.5`. All other crates remain at their previous versions.
### Bug Fixes
#### DX12
- Align copies b/w textures and buffers via a single intermediate buffer per copy when `D3D12_FEATURE_DATA_D3D12_OPTIONS13.UnrestrictedBufferTextureCopyPitchSupported` is `false`. By @ErichDonGubler in [#7721](https://github.com/gfx-rs/wgpu/pull/7721), backported in [#8375](https://github.com/gfx-rs/wgpu/pull/8375).
## v26.0.4 (2025-08-07)
### Bug Fixes
#### Vulkan
- Fix `STATUS_HEAP_CORRUPTION` crash when concurrently calling `create_sampler`. By @atlv24 in [#8043](https://github.com/gfx-rs/wgpu/pull/8043), [#8056](https://github.com/gfx-rs/wgpu/pull/8056).
## v26.0.3 (2025-07-30)
### Bug Fixes
- Fixed memory leak in vulkan backend. By @cwfitzgerald in [#8031](https://github.com/gfx-rs/wgpu/pull/8031).
### Bug Fixes
#### naga
- Fix empty `if` statements causing errors on spirv 1.6+. By @Vecvec in [#7883](https://github.com/gfx-rs/wgpu/pull/7883).
## v26.0.2 (2025-07-23)
### Bug Fixes
- Fixed vulkan validation error regarding the swapchain in latest SDK. By @cwfitzgerald in [#7971](https://github.com/gfx-rs/wgpu/pull/7971).
- Fixed flickering on AMD devices and crashes inside Renderdoc due to incorrect caching of `VkFramebuffer`s when the driver re-used image view handles. By @cwfitzgerald in [#7972](https://github.com/gfx-rs/wgpu/pull/7972).
> [!WARNING]
> There is formally a breaking change in `wgpu_hal::vulkan::Device::texture_from_raw` as there is now a `&self` receiver where
> there previously wasn't one. This will not affect you unless you explicitly use this api. We have gone ahead with the release
> as the bug was pervasive and made wgpu unusable for the affected people on v26.
## v26.0.1 (2025-07-10)
### Bug Fixes
- Fixed build error inside `wgpu::util::initialize_adapter_from_env` when `std` feature is not enabled. By @kpreid in [#7918](https://github.com/gfx-rs/wgpu/pull/7918).
- Fixed build error occurring when the `profiling` dependency is configured to have profiling active. By @kpreid in [#7916](https://github.com/gfx-rs/wgpu/pull/7916).
- Emit a validation error instead of panicking when a query set index is OOB. By @ErichDonGubler in [#7908](https://github.com/gfx-rs/wgpu/pull/7908).
## v26.0.0 (2025-07-09)
### Major Features
#### New method `TextureView::texture`
You can now call `texture_view.texture()` to get access to the texture that
a given texture view points to.
By @cwfitzgerald and @Wumpf in [#7907](https://github.com/gfx-rs/wgpu/pull/7907).
#### `as_hal` calls now return guards instead of using callbacks.
Previously, if you wanted to get access to the wgpu-hal or underlying api types, you would call `as_hal` and get the hal type as a callback. Now the function returns a guard which dereferences to the hal type.
```diff
- device.as_hal::<hal::api::Vulkan>(|hal_device| {...});
+ let hal_device: impl Deref<Item = hal::vulkan::Device> = device.as_hal::<hal::api::Vulkan>();
```
By @cwfitzgerald in [#7863](https://github.com/gfx-rs/wgpu/pull/7863).
#### Enabling Vulkan Features/Extensions
For those who are doing vulkan/wgpu interop or passthrough and need to enable features/extensions that wgpu does not expose, there is a new `wgpu_hal::vulkan::Adapter::open_with_callback` that allows the user to modify the pnext chains and extension lists populated by wgpu before we create a vulkan device. This should vastly simplify the experience, as previously you needed to create a device yourself.
Underlying api interop is a quickly evolving space, so we welcome all feedback!
```rust
type VkApi = wgpu::hal::api::Vulkan;
let adapter: wgpu::Adapter = ...;
let mut buffer_device_address_create_info = ash::vk::PhysicalDeviceBufferDeviceAddressFeatures { .. };
let hal_device: wgpu::hal::OpenDevice<VkApi> = adapter
.as_hal::<VkApi>()
.unwrap()
.open_with_callback(
wgpu::Features::empty(),
&wgpu::MemoryHints::Performance,
Some(Box::new(|args| {
// Add the buffer device address extension.
args.extensions.push(ash::khr::buffer_device_address::NAME);
// Extend the create info with the buffer device address create info.
*args.create_info = args
.create_info
.push_next(&mut buffer_device_address_create_info);
// We also have access to the queue create infos if we need them.
let _ = args.queue_create_infos;
})),
)
.unwrap();
let (device, queue) = adapter
.create_device_from_hal(hal_device, &wgpu::DeviceDescriptor { .. })
.unwrap();
```
By @Vecvec in [#7829](https://github.com/gfx-rs/wgpu/pull/7829).
### naga
- Added `no_std` support with default features disabled. By @Bushrat011899 in [#7585](https://github.com/gfx-rs/wgpu/pull/7585).
- [wgsl-in,ir] Add support for parsing rust-style doc comments via `naga::front::glsl::Frontend::new_with_options`. By @Vrixyz in [#6364](https://github.com/gfx-rs/wgpu/pull/6364).
- When emitting GLSL, Uniform and Storage Buffer memory layouts are now emitted even if no explicit binding is given. By @cloone8 in [#7579](https://github.com/gfx-rs/wgpu/pull/7579).
- Diagnostic rendering methods (i.e., `naga::{front::wgsl::ParseError,WithSpan}::emit_error_to_string_with_path`) now accept more types for their `path` argument via a new sealed `AsDiagnosticFilePath` trait. By @atlv24, @bushrat011899, and @ErichDonGubler in [#7643](https://github.com/gfx-rs/wgpu/pull/7643).
- Add support for [quad operations](https://www.w3.org/TR/WGSL/#quad-builtin-functions) (requires `SUBGROUP` feature to be enabled). By @dzamkov and @valaphee in [#7683](https://github.com/gfx-rs/wgpu/pull/7683).
- Add support for `atomicCompareExchangeWeak` in HLSL and GLSL backends. By @cryvosh in [#7658](https://github.com/gfx-rs/wgpu/pull/7658)
### General
- Add support for astc-sliced-3d feature. By @mehmetoguzderin in [#7577](https://github.com/gfx-rs/wgpu/issues/7577)
- Added `wgpu_hal::dx12::Adapter::as_raw()`. By @tronical in [##7852](https://github.com/gfx-rs/wgpu/pull/7852)
- Add support for rendering to slices of 3D texture views and single layered 2D-Array texture views (this requires `VK_KHR_maintenance1` which should be widely available on newer drivers). By @teoxoy in [#7596](https://github.com/gfx-rs/wgpu/pull/7596)
- Add extra acceleration structure vertex formats. By @Vecvec in [#7580](https://github.com/gfx-rs/wgpu/pull/7580).
- Add acceleration structure limits. By @Vecvec in [#7845](https://github.com/gfx-rs/wgpu/pull/7845).
- Add support for clip-distances feature for Vulkan and GL backends. By @dzamkov in [#7730](https://github.com/gfx-rs/wgpu/pull/7730)
- Added `wgpu_types::error::{ErrorType, WebGpuError}` for classification of errors according to WebGPU's [`GPUError`]'s classification scheme, and implement `WebGpuError` for existing errors. This allows users of `wgpu-core` to offload error classification onto the wgpu ecosystem, rather than having to do it themselves without sufficient information. By @ErichDonGubler in [#6547](https://github.com/gfx-rs/wgpu/pull/6547).
[`GPUError`]: https://www.w3.org/TR/webgpu/#gpuerror
### Bug Fixes
#### General
- Fix error message for sampler array limit. By @LPGhatguy in [#7704](https://github.com/gfx-rs/wgpu/pull/7704).
- Fix bug where using `BufferSlice::get_mapped_range_as_array_buffer()` on a buffer would prevent you from ever unmapping it. Note that this API has changed and is now `BufferView::as_uint8array()`.
#### naga
- naga now infers the correct binding layout when a resource appears only in an assignment to `_`. By @andyleiserson in [#7540](https://github.com/gfx-rs/wgpu/pull/7540).
- Implement `dot4U8Packed` and `dot4I8Packed` for all backends, using specialized intrinsics on SPIR-V, HLSL, and Metal if available, and polyfills everywhere else. By @robamler in [#7494](https://github.com/gfx-rs/wgpu/pull/7494), [#7574](https://github.com/gfx-rs/wgpu/pull/7574), and [#7653](https://github.com/gfx-rs/wgpu/pull/7653).
- Add polyfilled `pack4x{I,U}8Clamped` built-ins to all backends and WGSL frontend. By @ErichDonGubler in [#7546](https://github.com/gfx-rs/wgpu/pull/7546).
- Allow textureLoad's sample index arg to be unsigned. By @jimblandy in [#7625](https://github.com/gfx-rs/wgpu/pull/7625).
- Properly convert arguments to atomic operations. By @jimblandy in [#7573](https://github.com/gfx-rs/wgpu/pull/7573).
- Apply necessary automatic conversions to the `value` argument of `textureStore`. By @jimblandy in [#7567](https://github.com/gfx-rs/wgpu/pull/7567).
- Properly apply WGSL's automatic conversions to the arguments to texture sampling functions. By @jimblandy in [#7548](https://github.com/gfx-rs/wgpu/pull/7548).
- Properly evaluate `abs(most negative abstract int)`. By @jimblandy in [#7507](https://github.com/gfx-rs/wgpu/pull/7507).
- Generate vectorized code for `[un]pack4x{I,U}8[Clamp]` on SPIR-V and MSL 2.1+. By @robamler in [#7664](https://github.com/gfx-rs/wgpu/pull/7664).
- Fix typing for `select`, which had issues particularly with a lack of automatic type conversion. By @ErichDonGubler in [#7572](https://github.com/gfx-rs/wgpu/pull/7572).
- Allow scalars as the first argument of the `distance` built-in function. By @bernhl in [#7530](https://github.com/gfx-rs/wgpu/pull/7530).
- Don't panic when handling `f16` for pipeline constants, i.e., `override`s in WGSL. By @ErichDonGubler in [#7801](https://github.com/gfx-rs/wgpu/pull/7801).
- Prevent aliased ray queries crashing naga when writing SPIR-V out. By @Vecvec in [#7759](https://github.com/gfx-rs/wgpu/pull/7759).
#### DX12
- Get `vertex_index` & `instance_index` builtins working for indirect draws. By @teoxoy in [#7535](https://github.com/gfx-rs/wgpu/pull/7535)
#### Vulkan
- Fix OpenBSD compilation of `wgpu_hal::vulkan::drm`. By @ErichDonGubler in [#7810](https://github.com/gfx-rs/wgpu/pull/7810).
- Fix warnings for unrecognized present mode. By @Wumpf in [#7850](https://github.com/gfx-rs/wgpu/pull/7850).
#### Metal
- Remove extraneous main thread warning in `fn surface_capabilities()`. By @jamesordner in [#7692](https://github.com/gfx-rs/wgpu/pull/7692)
#### WebGPU
- Fix setting unclipped_depth. By @atlv24 in [#7841](https://github.com/gfx-rs/wgpu/pull/7841)
- Implement `on_submitted_work_done` for WebGPU backend. By @drewcrawford in [#7864](https://github.com/gfx-rs/wgpu/pull/7864)
### Changes
- Loosen Viewport validation requirements to match the [new specs](https://github.com/gpuweb/gpuweb/pull/5025). By @ebbdrop in [#7564](https://github.com/gfx-rs/wgpu/pull/7564)
- `wgpu` and `deno_webgpu` now use `wgpu-types::error::WebGpuError` to classify errors. Any changes here are likely to be regressions; please report them if you find them! By @ErichDonGubler in [#6547](https://github.com/gfx-rs/wgpu/pull/6547).
#### General
- Support BLAS compaction in wgpu. By @Vecvec in [#7285](https://github.com/gfx-rs/wgpu/pull/7285).
- Removed `MaintainBase` in favor of using `PollType`. By @waywardmonkeys in [#7508](https://github.com/gfx-rs/wgpu/pull/7508).
- The `destroy` functions for buffers and textures in wgpu-core are now infallible. Previously, they returned an error if called multiple times for the same object. This only affects the wgpu-core API; the wgpu API already allowed multiple `destroy` calls. By @andyleiserson in [#7686](https://github.com/gfx-rs/wgpu/pull/7686) and [#7720](https://github.com/gfx-rs/wgpu/pull/7720).
- Remove `CommandEncoder::build_acceleration_structures_unsafe_tlas` in favour of `as_hal` and apply
simplifications allowed by this. By @Vecvec in [#7513](https://github.com/gfx-rs/wgpu/pull/7513)
- The type of the `size` parameter to `copy_buffer_to_buffer` has changed from `BufferAddress` to `impl Into<Option<BufferAddress>>`. This achieves the spec-defined behavior of the value being optional, while still accepting existing calls without changes. By @andyleiserson in [#7659](https://github.com/gfx-rs/wgpu/pull/7659).
- To bring wgpu's error reporting into compliance with the WebGPU specification, the error type returned from some functions has changed, and some errors may be raised at a different time than they were previously.
- The error type returned by many methods on `CommandEncoder`, `RenderPassEncoder`, `ComputePassEncoder`, and `RenderBundleEncoder` has changed to `EncoderStateError` or `PassStateError`. These functions will return the `Ended` variant of these errors if called on an encoder that is no longer active. Reporting of all other errors is deferred until a call to `finish()`.
- Variants holding a `CommandEncoderError` in the error enums `ClearError`, `ComputePassErrorInner`, `QueryError`, and `RenderPassErrorInner` have been replaced with variants holding an `EncoderStateError`.
- The definition of `enum CommandEncoderError` has changed significantly, to reflect which errors can be raised by `CommandEncoder.finish()`. There are also some errors that no longer appear directly in `CommandEncoderError`, and instead appear nested within the `RenderPass` or `ComputePass` variants.
- `CopyError` has been removed. Errors that were previously a `CopyError` are now a `CommandEncoderError` returned by `finish()`. (The detailed reasons for copies to fail were and still are described by `TransferError`, which was previously a variant of `CopyError`, and is now a variant of `CommandEncoderError`).
#### naga
- Mark `readonly_and_readwrite_storage_textures` & `packed_4x8_integer_dot_product` language extensions as implemented. By @teoxoy in [#7543](https://github.com/gfx-rs/wgpu/pull/7543)
- `naga::back::hlsl::Writer::new` has a new `pipeline_options` argument. `hlsl::PipelineOptions::default()` can be passed as a default. The `shader_stage` and `entry_point` members of `pipeline_options` can be used to write only a single entry point when using the HLSL and MSL backends (GLSL and SPIR-V already had this functionality). The Metal and DX12 HALs now write only a single entry point when loading shaders. By @andyleiserson in [#7626](https://github.com/gfx-rs/wgpu/pull/7626).
- Implemented `early_depth_test` for SPIR-V backend, enabling `SHADER_EARLY_DEPTH_TEST` for Vulkan. Additionally, fixed conservative depth optimizations when using `early_depth_test`. The syntax for forcing early depth tests is now `@early_depth_test(force)` instead of `@early_depth_test`. By @dzamkov in [#7676](https://github.com/gfx-rs/wgpu/pull/7676).
- `ImplementedLanguageExtension::VARIANTS` is now implemented manually rather than derived using `strum` (allowing `strum` to become a dev-only dependency) so it is no longer a member of the `strum::VARIANTS` trait. Unless you are using this trait as a bound this should have no effect.
- Compaction changes, by @andyleiserson in [#7703](https://github.com/gfx-rs/wgpu/pull/7703):
- [`process_overrides`](https://docs.rs/naga/latest/naga/back/pipeline_constants/fn.process_overrides.html) now compacts the module to remove unused items. It is no longer necessary to supply values for overrides that are not used by the active entry point.
- The `compact` Cargo feature has been removed. It is no longer possible to exclude compaction support from the build.
- [`compact`](https://docs.rs/naga/latest/naga/compact/fn.compact.html) now has an additional argument that specifies whether to remove unused functions, globals, and named types and overrides. For the previous behavior, pass `KeepUnused::Yes`.
#### D3D12
- Remove the need for dxil.dll. By @teoxoy in [#7566](https://github.com/gfx-rs/wgpu/pull/7566)
- Ability to get the raw `IDXGIFactory4` from `Instance`. By @MendyBerger in [#7827](https://github.com/gfx-rs/wgpu/pull/7827)
#### Vulkan
- Use highest SPIR-V version supported by Vulkan API version. By @robamler in [#7595](https://github.com/gfx-rs/wgpu/pull/7595)
#### HAL
- Added initial `no_std` support to `wgpu-hal`. By @bushrat011899 in [#7599](https://github.com/gfx-rs/wgpu/pull/7599)
### Documentation
#### General
- Remove outdated information about `Adapter::request_device`. By @tesselode in [#7768](https://github.com/gfx-rs/wgpu/pull/7768)
## v25.0.2 (2025-05-24)
### Bug Fixes
#### General
- Fix a possible deadlock within `Queue::write_buffer`. By @RedMindZ in [#7582](https://github.com/gfx-rs/wgpu/pull/7582)
- Fix `raw-window-handle` dependency being too lenient. By @kpreid in [#7526](https://github.com/gfx-rs/wgpu/pull/7526)
#### WebGPU
- Insert fragment pipeline constants into fragment descriptor instead of vertex descriptor. By @DerSchmale in [#7621](https://github.com/gfx-rs/wgpu/pull/7621)
## v25.0.1 (2025-04-11)
### Bug Fixes
- Fix typos in various documentation. By @waywardmonkeys in [#7510](https://github.com/gfx-rs/wgpu/pull/7510).
- Fix compile error when building with `profiling/profile-with-*` feature enabled. By @waywardmonkeys in [#7509](https://github.com/gfx-rs/wgpu/pull/7509).
- Use `once_cell::race::OnceBox` instead of `std::sync::LazyLock` to allow `naga::proc::Namer::default()` to be available without backend features being enabled. By @cwfitzgerald in [#7517](https://github.com/gfx-rs/wgpu/pull/7517).
#### DX12
- Fix validation error when creating a non-mappable buffer using the committed allocation scheme. By @cwfitzgerald and @ErichDonGubler in [#7519](https://github.com/gfx-rs/wgpu/pull/7519).
## v25.0.0 (2025-04-10)
### Major Features
#### Hashmaps Removed from APIs
Both `PipelineCompilationOptions::constants` and `ShaderSource::Glsl::defines` now take
slices of key-value pairs instead of `hashmap`s. This is to prepare for `no_std`
support and allow us to keep which `hashmap` hasher and such as implementation details. It
also allows more easily creating these structures inline.
By @cwfitzgerald in [#7133](https://github.com/gfx-rs/wgpu/pull/7133)
#### All Backends Now Have Features
Previously, the `vulkan` and `gles` backends were non-optional on windows, linux, and android and there was no way to disable them. We have now figured out how to properly make them disablable! Additionally, if you turn on the `webgl` feature, you will only get the GLES backend on WebAssembly, it won't leak into native builds, like previously it might have.
> [!WARNING]
> If you use wgpu with `default-features = false` and you want to retain the `vulkan` and `gles` backends, you will need to add them to your feature list.
>
> ```diff
> -wgpu = { version = "24", default-features = false, features = ["metal", "wgsl", "webgl"] }
> +wgpu = { version = "25", default-features = false, features = ["metal", "wgsl", "webgl", "vulkan", "gles"] }
> ```
By @cwfitzgerald in [#7076](https://github.com/gfx-rs/wgpu/pull/7076).
#### `device.poll` Api Reworked
This release reworked the poll api significantly to allow polling to return errors when polling hits internal timeout limits.
`Maintain` was renamed `PollType`. Additionally, `poll` now returns a result containing information about what happened during the poll.
```diff
-pub fn wgpu::Device::poll(&self, maintain: wgpu::Maintain) -> wgpu::MaintainResult
+pub fn wgpu::Device::poll(&self, poll_type: wgpu::PollType) -> Result<wgpu::PollStatus, wgpu::PollError>
-device.poll(wgpu::Maintain::Poll);
+device.poll(wgpu::PollType::Poll).unwrap();
```
```rust
pub enum PollType<T> {
/// On wgpu-core based backends, block until the given submission has
/// completed execution, and any callbacks have been invoked.
///
/// On WebGPU, this has no effect. Callbacks are invoked from the
/// window event loop.
WaitForSubmissionIndex(T),
/// Same as WaitForSubmissionIndex but waits for the most recent submission.
Wait,
/// Check the device for a single time without blocking.
Poll,
}
pub enum PollStatus {
/// There are no active submissions in flight as of the beginning of the poll call.
/// Other submissions may have been queued on other threads during the call.
///
/// This implies that the given Wait was satisfied before the timeout.
QueueEmpty,
/// The requested Wait was satisfied before the timeout.
WaitSucceeded,
/// This was a poll.
Poll,
}
pub enum PollError {
/// The requested Wait timed out before the submission was completed.
Timeout,
}
```
> [!WARNING]
> As part of this change, WebGL's default behavior has changed. Previously `device.poll(Wait)` appeared as though it functioned correctly. This was a quirk caused by the bug that these PRs fixed. Now it will always return `Timeout` if the submission has not already completed. As many people rely on this behavior on WebGL, there is a new options in `BackendOptions`. If you want the old behavior, set the following on instance creation:
>
> ```rust
> instance_desc.backend_options.gl.fence_behavior = wgpu::GlFenceBehavior::AutoFinish;
> ```
>
> You will lose the ability to know exactly when a submission has completed, but `device.poll(Wait)` will behave the same as it does on native.
By @cwfitzgerald in [#6942](https://github.com/gfx-rs/wgpu/pull/6942) and [#7030](https://github.com/gfx-rs/wgpu/pull/7030).
#### `wgpu::Device::start_capture` renamed, documented, and made unsafe
```diff
- device.start_capture();
+ unsafe { device.start_graphics_debugger_capture() }
// Your code here
- device.stop_capture();
+ unsafe { device.stop_graphics_debugger_capture() }
```
There is now documentation to describe how this maps to the various debuggers' apis.
By @cwfitzgerald in [#7470](https://github.com/gfx-rs/wgpu/pull/7470)
##### Ensure loops generated by SPIR-V and HLSL naga backends are bounded
Make sure that all loops in shaders generated by these naga backends are bounded
to avoid undefined behaviour due to infinite loops. Note that this may have a
performance cost. As with the existing implementation for the MSL backend this
can be disabled by using `Device::create_shader_module_trusted()`.
By @jamienicol in [#6929](https://github.com/gfx-rs/wgpu/pull/6929) and [#7080](https://github.com/gfx-rs/wgpu/pull/7080).
#### Split up `Features` internally
Internally split up the `Features` struct and recombine them internally using a macro. There should be no breaking
changes from this. This means there are also namespaces (as well as the old `Features::*`) for all wgpu specific
features and webgpu feature (`FeaturesWGPU` and `FeaturesWebGPU` respectively) and `Features::from_internal_flags` which
allow you to be explicit about whether features you need are available on the web too.
By @Vecvec in [#6905](https://github.com/gfx-rs/wgpu/pull/6905), [#7086](https://github.com/gfx-rs/wgpu/pull/7086)
#### WebGPU compliant dual source blending feature
Previously, dual source blending was implemented with a `wgpu` native only feature flag and used a custom syntax in wgpu.
By now, dual source blending was added to the [WebGPU spec as an extension](https://www.w3.org/TR/webgpu/#dom-gpufeaturename-dual-source-blending).
We're now following suite and implement the official syntax.
Existing shaders using dual source blending need to be updated:
```diff
struct FragmentOutput{
- @location(0) source0: vec4<f32>,
- @location(0) @second_blend_source source1: vec4<f32>,
+ @location(0) @blend_src(0) source0: vec4<f32>,
+ @location(0) @blend_src(1) source1: vec4<f32>,
}
```
With that `wgpu::Features::DUAL_SOURCE_BLENDING` is now available on WebGPU.
Furthermore, GLSL shaders now support dual source blending as well via the `index` layout qualifier:
```c
layout(location = 0, index = 0) out vec4 output0;
layout(location = 0, index = 1) out vec4 output1;
```
By @wumpf in [#7144](https://github.com/gfx-rs/wgpu/pull/7144)
#### Unify interface for SpirV shader passthrough
Replace device `create_shader_module_spirv` function with a generic `create_shader_module_passthrough` function
taking a `ShaderModuleDescriptorPassthrough` enum as parameter.
Update your calls to `create_shader_module_spirv` and use `create_shader_module_passthrough` instead:
```diff
- device.create_shader_module_spirv(
- wgpu::ShaderModuleDescriptorSpirV {
- label: Some(&name),
- source: Cow::Borrowed(&source),
- }
- )
+ device.create_shader_module_passthrough(
+ wgpu::ShaderModuleDescriptorPassthrough::SpirV(
+ wgpu::ShaderModuleDescriptorSpirV {
+ label: Some(&name),
+ source: Cow::Borrowed(&source),
+ },
+ ),
+ )
```
By @syl20bnr in [#7326](https://github.com/gfx-rs/wgpu/pull/7326).
#### Noop Backend
It is now possible to create a dummy `wgpu` device even when no GPU is available. This may be useful for testing of code which manages graphics resources. Currently, it supports reading and writing buffers, and other resource types can be created but do nothing.
To use it, enable the `noop` feature of `wgpu`, and either call `Device::noop()`, or add `NoopBackendOptions { enable: true }` to the backend options of your `Instance` (this is an additional safeguard beyond the `Backends` bits).
By @kpreid in [#7063](https://github.com/gfx-rs/wgpu/pull/7063) and [#7342](https://github.com/gfx-rs/wgpu/pull/7342).
#### `SHADER_F16` feature is now available with naga shaders
Previously this feature only allowed you to use `f16` on SPIR-V passthrough shaders. Now you can use it on all shaders, including WGSL, SPIR-V, and GLSL!
```wgsl
enable f16;
fn hello_world(a: f16) -> f16 {
return a + 1.0h;
}
```
By @FL33TW00D, @ErichDonGubler, and @cwfitzgerald in [#5701](https://github.com/gfx-rs/wgpu/pull/5701)
#### Bindless support improved and validation rules changed.
Metal support for bindless has significantly improved and the limits for binding arrays have been increased.
Previously, all resources inside binding arrays contributed towards the standard limit of their type (`texture_2d` arrays for example would contribute to `max_sampled_textures_per_shader_stage`). Now these resources will only contribute towards binding-array specific limits:
- `max_binding_array_elements_per_shader_stage` for all non-sampler resources
- `max_binding_array_sampler_elements_per_shader_stage` for sampler resources.
This change has allowed the metal binding array limits to go from between 32 and 128 resources, all the way 500,000 sampled textures. Additionally binding arrays are now bound more efficiently on Metal.
This change also enabled legacy Intel GPUs to support 1M bindless resources, instead of the previous 1800.
To facilitate this change, there was an additional validation rule put in place: if there is a binding array in a bind group, you may not use dynamic offset buffers or uniform buffers in that bind group. This requirement comes from vulkan rules on `UpdateAfterBind` descriptors.
By @cwfitzgerald in [#6811](https://github.com/gfx-rs/wgpu/pull/6811), [#6815](https://github.com/gfx-rs/wgpu/pull/6815), and [#6952](https://github.com/gfx-rs/wgpu/pull/6952).
### New Features
#### General
- Add `Buffer` methods corresponding to `BufferSlice` methods, so you can skip creating a `BufferSlice` when it offers no benefit, and `BufferSlice::slice()` for sub-slicing a slice. By @kpreid in [#7123](https://github.com/gfx-rs/wgpu/pull/7123).
- Add `BufferSlice::buffer()`, `BufferSlice::offset()` and `BufferSlice::size()`. By @kpreid in [#7148](https://github.com/gfx-rs/wgpu/pull/7148).
- Add `impl From<BufferSlice> for BufferBinding` and `impl From<BufferSlice> for BindingResource`, allowing `BufferSlice`s to be easily used in creating bind groups. By @kpreid in [#7148](https://github.com/gfx-rs/wgpu/pull/7148).
- Add `util::StagingBelt::allocate()` so the staging belt can be used to write textures. By @kpreid in [#6900](https://github.com/gfx-rs/wgpu/pull/6900).
- Added `CommandEncoder::transition_resources()` for native API interop, and allowing users to slightly optimize barriers. By @JMS55 in [#6678](https://github.com/gfx-rs/wgpu/pull/6678).
- Add `wgpu_hal::vulkan::Adapter::texture_format_as_raw` for native API interop. By @JMS55 in [#7228](https://github.com/gfx-rs/wgpu/pull/7228).
- Support getting vertices of the hit triangle when raytracing. By @Vecvec in [#7183](https://github.com/gfx-rs/wgpu/pull/7183).
- Add `as_hal` for both acceleration structures. By @Vecvec in [#7303](https://github.com/gfx-rs/wgpu/pull/7303).
- Add Metal compute shader passthrough. Use `create_shader_module_passthrough` on device. By @syl20bnr in [#7326](https://github.com/gfx-rs/wgpu/pull/7326).
- new `Features::MSL_SHADER_PASSTHROUGH` run-time feature allows providing pass-through MSL Metal shaders. By @syl20bnr in [#7326](https://github.com/gfx-rs/wgpu/pull/7326).
- Added mesh shader support to `wgpu_hal`. By @SupaMaggie70Incorporated in [#7089](https://github.com/gfx-rs/wgpu/pull/7089)
#### naga
- Add support for unsigned types when calling textureLoad with the level parameter. By @ygdrasil-io in [#7058](https://github.com/gfx-rs/wgpu/pull/7058).
- Support @must_use attribute on function declarations. By @turbocrime in [#6801](https://github.com/gfx-rs/wgpu/pull/6801).
- Support for generating the candidate intersections from AABB geometry, and confirming the hits. By @kvark in [#7047](https://github.com/gfx-rs/wgpu/pull/7047).
- Make naga::back::spv::Function::to_words write the OpFunctionEnd instruction in itself, instead of making another call after it. By @junjunjd in [#7156](https://github.com/gfx-rs/wgpu/pull/7156).
- Add support for texture memory barriers. By @Devon7925 in [#7173](https://github.com/gfx-rs/wgpu/pull/7173).
- Add polyfills for `unpackSnorm4x8`, `unpackUnorm4x8`, `unpackSnorm2x16`, `unpackUnorm2x16` for GLSL versions they aren't supported in. By @DJMcNab in [#7408](https://github.com/gfx-rs/wgpu/pull/7408).
#### Examples
- Added an example that shows how to handle datasets too large to fit in a single `GPUBuffer` by distributing it across many buffers, and then having the shader receive them as a `binding_array` of storage buffers. By @alphastrata in [#6138](https://github.com/gfx-rs/wgpu/pull/6138)
### Changes
#### General
- `wgpu::Instance::request_adapter()` now returns `Result` instead of `Option`; the error provides information about why no suitable adapter was returned. By @kpreid in [#7330](https://github.com/gfx-rs/wgpu/pull/7330).
- Support BLAS compaction in wgpu-hal. By @Vecvec in [#7101](https://github.com/gfx-rs/wgpu/pull/7101).
- Avoid using default features in many dependencies, etc. By Brody in [#7031](https://github.com/gfx-rs/wgpu/pull/7031)
- Use `hashbrown` to simplify no-std support. By Brody in [#6938](https://github.com/gfx-rs/wgpu/pull/6938) & [#6925](https://github.com/gfx-rs/wgpu/pull/6925).
- If you use Binding Arrays in a bind group, you may not use Dynamic Offset Buffers or Uniform Buffers in that bind group. By @cwfitzgerald in [#6811](https://github.com/gfx-rs/wgpu/pull/6811)
- Rename `instance_id` and `instance_custom_index` to `instance_index` and `instance_custom_data` by @Vecvec in
[#6780](https://github.com/gfx-rs/wgpu/pull/6780)
#### naga
- naga IR types are now available in the module `naga::ir` (e.g. `naga::ir::Module`).
The original names (e.g. `naga::Module`) remain present for compatibility.
By @kpreid in [#7365](https://github.com/gfx-rs/wgpu/pull/7365).
- Refactored `use` statements to simplify future `no_std` support. By @bushrat011899 in [#7256](https://github.com/gfx-rs/wgpu/pull/7256)
- naga's WGSL frontend no longer allows using the `&` operator to take the address of a component of a vector,
which is not permitted by the WGSL specification. By @andyleiserson in [#7284](https://github.com/gfx-rs/wgpu/pull/7284)
- naga's use of `termcolor` and `stderr` are now optional behind features of the same names. By @bushrat011899 in [#7482](https://github.com/gfx-rs/wgpu/pull/7482)
#### Vulkan
##### HAL queue callback support
- Add a way to notify with `Queue::submit()` to Vulkan's `vk::Semaphore` allocated outside of wgpu. By @sotaroikeda in [#6813](https://github.com/gfx-rs/wgpu/pull/6813).
### Bug Fixes
#### naga
- Fix some instances of functions which have a return type but don't return a value being incorrectly validated. By @jamienicol in [#7013](https://github.com/gfx-rs/wgpu/pull/7013).
- Allow abstract expressions to be used in WGSL function return statements. By @jamienicol in [#7035](https://github.com/gfx-rs/wgpu/pull/7035).
- Error if structs have two fields with the same name. By @SparkyPotato in [#7088](https://github.com/gfx-rs/wgpu/pull/7088).
- Forward '--keep-coordinate-space' flag to GLSL backend in naga-cli. By @cloone8 in [#7206](https://github.com/gfx-rs/wgpu/pull/7206).
- Allow template lists to have a trailing comma. By @KentSlaney in [#7142](https://github.com/gfx-rs/wgpu/pull/7142).
- Allow WGSL const declarations to have abstract types. By @jamienicol in [#7055](https://github.com/gfx-rs/wgpu/pull/7055) and [#7222](https://github.com/gfx-rs/wgpu/pull/7222).
- Allows override-sized arrays to resolve to the same size without causing the type arena to panic. By @KentSlaney in [#7082](https://github.com/gfx-rs/wgpu/pull/7082).
- Allow abstract types to be used for WGSL switch statement selector and case selector expressions. By @jamienicol in [#7250](https://github.com/gfx-rs/wgpu/pull/7250).
- Apply automatic conversions to `let` declarations, and accept `vecN()` as a constructor for vectors (in any context). By @andyleiserson in [#7367](https://github.com/gfx-rs/wgpu/pull/7367).
- The `&&` and `||` operators are no longer allowed on vectors. By @andyleiserson in [#7368](https://github.com/gfx-rs/wgpu/pull/7368).
- Prevent ray intersection function overwriting each other. By @Vecvec in [#7497](https://github.com/gfx-rs/wgpu/pull/7497).
- Require that the level operand of an ImageQuery::Size expression is i32 or u32, per spec. By @jimblandy in [#7426](https://github.com/gfx-rs/wgpu/pull/7426).
- Implement constant evaluation for the cross builtin. By @jimblandy in [#7404](https://github.com/gfx-rs/wgpu/pull/7404).
- Properly handle automatic type conversions in calls to `MathFunction` builtins. By @jimblandy in [#6833](https://github.com/gfx-rs/wgpu/pull/6833).
#### General
- Fix some validation errors when building acceleration
structures. By @Vecvec in [#7486](https://github.com/gfx-rs/wgpu/pull/7486).
- Avoid overflow in query set bounds check validation. By @ErichDonGubler in [#6933](https://github.com/gfx-rs/wgpu/pull/6933).
- Add Flush to GL Queue::submit. By @cwfitzgerald in [#6941](https://github.com/gfx-rs/wgpu/pull/6941).
- Reduce downlevel `max_color_attachments` limit from 8 to 4 for better GLES compatibility. By @adrian17 in [#6994](https://github.com/gfx-rs/wgpu/pull/6994).
- Fix building a BLAS with a transform buffer by adding a flag to indicate usage of the transform buffer. By @Vecvec in
[#7062](https://github.com/gfx-rs/wgpu/pull/7062).
- Move incrementation of `Device::last_acceleration_structure_build_command_index` into queue submit. By @Vecvec in [#7462](https://github.com/gfx-rs/wgpu/pull/7462).
- Implement indirect draw validation. By @teoxoy in [#7140](https://github.com/gfx-rs/wgpu/pull/7140)
#### Vulkan
- Stop naga causing undefined behavior when a ray query misses. By @Vecvec in [#6752](https://github.com/gfx-rs/wgpu/pull/6752).
- In naga's SPIR-V backend, avoid duplicating SPIR-V OpTypePointer instructions. By @jimblandy in [#7246](https://github.com/gfx-rs/wgpu/pull/7246).
#### Gles
- Support OpenHarmony render with `gles`. By @richerfu in [#7085](https://github.com/gfx-rs/wgpu/pull/7085)
#### Dx12
- Fix HLSL storage format generation. By @Vecvec in [#6993](https://github.com/gfx-rs/wgpu/pull/6993) and [#7104](https://github.com/gfx-rs/wgpu/pull/7104)
- Fix 3D storage texture bindings. By @SparkyPotato in [#7071](https://github.com/gfx-rs/wgpu/pull/7071)
- Fix DX12 composite alpha modes. By @amrbashir in [#7117](https://github.com/gfx-rs/wgpu/pull/7117)
- Bound check dynamic buffers. By @teoxoy in [#6931](https://github.com/gfx-rs/wgpu/pull/6931)
- Fix size of buffer. By @teoxoy in [#7310](https://github.com/gfx-rs/wgpu/pull/7310)
#### WebGPU
- Improve efficiency of dropping read-only buffer mappings. By @kpreid in [#7007](https://github.com/gfx-rs/wgpu/pull/7007).
### Performance
#### naga
- Replace `unicode-xid` with `unicode-ident`. By @CrazyboyQCD in [#7135](https://github.com/gfx-rs/wgpu/pull/7135)
### Documentation
- Improved documentation around pipeline caches and `TextureBlitter`. By @DJMcNab in [#6978](https://github.com/gfx-rs/wgpu/pull/6978) and [#7003](https://github.com/gfx-rs/wgpu/pull/7003).
- Improved documentation of `PresentMode`, buffer mapping functions, memory alignment requirements, texture formats’ automatic conversions, and various types and constants. By @kpreid in [#7211](https://github.com/gfx-rs/wgpu/pull/7211) and [#7283](https://github.com/gfx-rs/wgpu/pull/7283).
- Added a hello window example. By @laycookie in [#6992](https://github.com/gfx-rs/wgpu/pull/6992).
### Examples
- Call `pre_present_notify()` before presenting. By @kjarosh in [#7074](https://github.com/gfx-rs/wgpu/pull/7074).
## v24.0.5 (2025-05-24)
### Bug Fixes
#### General
- Fix a possible deadlock within `Queue::write_buffer`. By @RedMindZ in [#7582](https://github.com/gfx-rs/wgpu/pull/7582)
#### WebGPU
- Insert fragment pipeline constants into fragment descriptor instead of vertex descriptor. By @DerSchmale in [#7621](https://github.com/gfx-rs/wgpu/pull/7621)
## v24.0.4 (2025-04-03)
### Metal
- Use resize observers for smoother resizing. By @madsmtm in [#7026](https://github.com/gfx-rs/wgpu/pull/7026).
## v24.0.3 (2025-03-19)
### Bug Fixes
- Fix drop order in `Surface`, solving segfaults on exit on some systems. By @ed-2100 in [#6997](https://github.com/gfx-rs/wgpu/pull/6997)
## v24.0.2 (2025-02-26)
### Bug Fixes
- Fix GLES renderpass clears causing violation of `max_color_attachments` limit. By @adrian17 in [#6994](https://github.com/gfx-rs/wgpu/pull/6994).
- Fix a possible deadlock within `Queue::write_texture`. By @metamuffin in [#7004](https://github.com/gfx-rs/wgpu/pull/7004)
- Decrement `max_storage_buffer_binding_size` by 1 to match `max_buffer_size`. By @minus1ms in [#7217](https://github.com/gfx-rs/wgpu/pull/7217)
## v24.0.1 (2025-01-22)
### Bug Fixes
- Fix `wgpu` not building with `--no-default-features` on when targeting `wasm32-unknown-unknown`. By @wumpf in [#6946](https://github.com/gfx-rs/wgpu/pull/6946).
- Implement `Clone` on `ShaderModule`. By @a1phyr in [#6937](https://github.com/gfx-rs/wgpu/pull/6937).
- Fix `CopyExternalImageDestInfo` not exported on `wgpu`. By @wumpf in [#6962](https://github.com/gfx-rs/wgpu/pull/6962).
## v24.0.0 (2025-01-15)
### Major changes
#### Refactored Dispatch Between `wgpu-core` and `webgpu`
The crate `wgpu` has two different "backends", one which targets webgpu in the browser, one which targets `wgpu_core` on native platforms and webgl. This was previously very difficult to traverse and add new features to. The entire system was refactored to make it simpler. Additionally the new system has zero overhead if there is only one "backend" in use. You can see the new system in action by using go-to-definition on any wgpu functions in your IDE.
By @cwfitzgerald in [#6619](https://github.com/gfx-rs/wgpu/pull/6619).
#### Most objects in `wgpu` are now `Clone`
All types in the `wgpu` API are now `Clone`.
This is implemented with internal reference counting, so cloning for instance a `Buffer` does copies only the "handle" of the GPU buffer, not the underlying resource.
Previously, libraries using `wgpu` objects like `Device`, `Buffer` or `Texture` etc. often had to manually wrap them in a `Arc` to allow passing between libraries.
This caused a lot of friction since if one library wanted to use a `Buffer` by value, calling code had to give up ownership of the resource which may interfere with other subsystems.
Note that this also mimics how the WebGPU javascript API works where objects can be cloned and moved around freely.
By @cwfitzgerald in [#6665](https://github.com/gfx-rs/wgpu/pull/6665).
#### Render and Compute Passes Now Properly Enforce Their Lifetime
A regression introduced in 23.0.0 caused lifetimes of render and compute passes to be incorrectly enforced. While this is not
a soundness issue, the intent is to move an error from runtime to compile time. This issue has been fixed and restored to the 22.0.0 behavior.
#### Bindless (`binding_array`) Grew More Capabilities
- DX12 now supports `PARTIALLY_BOUND_BINDING_ARRAY` on Resource Binding Tier 3 Hardware. This is most D3D12 hardware [D3D12 Feature Table] for more information on what hardware supports this feature. By @cwfitzgerald in [#6734](https://github.com/gfx-rs/wgpu/pull/6734).
[D3D12 Feature Table]: https://d3d12infodb.boolka.dev/FeatureTable.html
#### `Device::create_shader_module_unchecked` Renamed and Now Has Configuration Options
`create_shader_module_unchecked` became `create_shader_module_trusted`.
This allows you to customize which exact checks are omitted so that you can get the correct balance of performance and safety for your use case. Calling the function is still unsafe, but now can be used to skip certain checks only on certain builds.
This also allows users to disable the workarounds in the `msl-out` backend to prevent the compiler from optimizing infinite loops. This can have a big impact on performance, but is not recommended for untrusted shaders.
```diff
let desc: ShaderModuleDescriptor = include_wgsl!(...)
- let module = unsafe { device.create_shader_module_unchecked(desc) };
+ let module = unsafe { device.create_shader_module_trusted(desc, wgpu::ShaderRuntimeChecks::unchecked()) };
```
By @cwfitzgerald and @rudderbucky in [#6662](https://github.com/gfx-rs/wgpu/pull/6662).
#### `wgpu::Instance::new` now takes `InstanceDescriptor` by reference
Previously `wgpu::Instance::new` took `InstanceDescriptor` by value (which is overall fairly uncommon in wgpu).
Furthermore, `InstanceDescriptor` is now cloneable.
```diff
- let instance = wgpu::Instance::new(instance_desc);
+ let instance = wgpu::Instance::new(&instance_desc);
```
By @wumpf in [#6849](https://github.com/gfx-rs/wgpu/pull/6849).
#### Environment Variable Handling Overhaul
Previously how various bits of code handled reading settings from environment variables was inconsistent and unideomatic.
We have unified it to (`Type::from_env()` or `Type::from_env_or_default()`) and `Type::with_env` for all types.
```diff
- wgpu::util::backend_bits_from_env()
+ wgpu::Backends::from_env()
- wgpu::util::power_preference_from_env()
+ wgpu::PowerPreference::from_env()
- wgpu::util::dx12_shader_compiler_from_env()
+ wgpu::Dx12Compiler::from_env()
- wgpu::util::gles_minor_version_from_env()
+ wgpu::Gles3MinorVersion::from_env()
- wgpu::util::instance_descriptor_from_env()
+ wgpu::InstanceDescriptor::from_env_or_default()
- wgpu::util::parse_backends_from_comma_list(&str)
+ wgpu::Backends::from_comma_list(&str)
```
By @cwfitzgerald in [#6895](https://github.com/gfx-rs/wgpu/pull/6895)
#### Backend-specific instance options are now in separate structs
In order to better facilitate growing more interesting backend options, we have put them into individual structs. This allows users to more easily understand what options can be defaulted and which they care about. All of these new structs implement `from_env()` and delegate to their respective `from_env()` methods.
```diff
- let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor {
- backends: wgpu::Backends::all(),
- flags: wgpu::InstanceFlags::default(),
- dx12_shader_compiler: wgpu::Dx12Compiler::Dxc,
- gles_minor_version: wgpu::Gles3MinorVersion::Automatic,
- });
+ let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor {
+ backends: wgpu::Backends::all(),
+ flags: wgpu::InstanceFlags::default(),
+ backend_options: wgpu::BackendOptions {
+ dx12: wgpu::Dx12BackendOptions {
+ shader_compiler: wgpu::Dx12ShaderCompiler::Dxc,
+ },
+ gl: wgpu::GlBackendOptions {
+ gles_minor_version: wgpu::Gles3MinorVersion::Automatic,
+ },
+ },
+ });
```
If you do not need any of these options, or only need one backend's info use the `default()` impl to fill out the remaining feelds.
By @cwfitzgerald in [#6895](https://github.com/gfx-rs/wgpu/pull/6895)
#### The `diagnostic(…);` directive is now supported in WGSL
naga now parses `diagnostic(…);` directives according to the WGSL spec. This allows users to control certain lints, similar to Rust's `allow`, `warn`, and `deny` attributes. For example, in standard WGSL (but, notably, not naga yet—see <https://github.com/gfx-rs/wgpu/issues/4369>) this snippet would emit a uniformity error:
```wgsl
@group(0) @binding(0) var s : sampler;
@group(0) @binding(2) var tex : texture_2d<f32>;
@group(1) @binding(0) var<storage, read> ro_buffer : array<f32, 4>;
@fragment
fn main(@builtin(position) p : vec4f) -> @location(0) vec4f {
if ro_buffer[0] == 0 {
// Emits a derivative uniformity error during validation.
return textureSample(tex, s, vec2(0.,0.));
}
return vec4f(0.);
}
```
…but we can now silence it with the `off` severity level, like so:
```wgsl
// Disable the diagnosic with this…
diagnostic(off, derivative_uniformity);
@group(0) @binding(0) var s : sampler;
@group(0) @binding(2) var tex : texture_2d<f32>;
@group(1) @binding(0) var<storage, read> ro_buffer : array<f32, 4>;
@fragment
fn main(@builtin(position) p : vec4f) -> @location(0) vec4f {
if ro_buffer[0] == 0 {
// Look ma, no error!
return textureSample(tex, s, vec2(0.,0.));
}
return vec4f(0.);
}
```
There are some limitations to keep in mind with this new functionality:
- We support `@diagnostic(…)` rules as `fn` attributes, but prioritization for rules in statement positions (i.e., `if (…) @diagnostic(…) { … }` is unclear. If you are blocked by not being able to parse `diagnostic(…)` rules in statement positions, please let us know in <https://github.com/gfx-rs/wgpu/issues/5320>, so we can determine how to prioritize it!
- Standard WGSL specifies `error`, `warning`, `info`, and `off` severity levels. These are all technically usable now! A caveat, though: warning- and info-level are only emitted to `stderr` via the `log` façade, rat
gitextract_6vnxf1s_/
├── .cargo/
│ └── config.toml
├── .claude/
│ └── skills/
│ ├── cts-triage/
│ │ └── SKILL.md
│ └── webgpu-specs/
│ ├── SKILL.md
│ └── download.sh
├── .config/
│ └── nextest.toml
├── .deny.toml
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── config.yml
│ │ ├── feature_request.md
│ │ └── other.md
│ ├── actions/
│ │ ├── install-agility-sdk/
│ │ │ └── action.yml
│ │ ├── install-dxc/
│ │ │ └── action.yml
│ │ ├── install-mesa/
│ │ │ └── action.yml
│ │ ├── install-vulkan-sdk/
│ │ │ └── action.yml
│ │ └── install-warp/
│ │ └── action.yml
│ ├── pull_request_template.md
│ └── workflows/
│ ├── changelog.yml
│ ├── ci.yml
│ ├── cts.yml
│ ├── docs.yml
│ ├── generate.yml
│ ├── lazy.yml
│ ├── publish.yml
│ └── shaders.yml
├── .gitignore
├── .prettierignore
├── AGENTS.md
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Cargo.toml
├── GOVERNANCE.md
├── LICENSE.APACHE
├── LICENSE.MIT
├── README.md
├── SECURITY.md
├── benches/
│ ├── Cargo.toml
│ ├── README.md
│ ├── benches/
│ │ └── wgpu-benchmark/
│ │ ├── bind_groups.rs
│ │ ├── computepass-bindless.wgsl
│ │ ├── computepass.rs
│ │ ├── computepass.wgsl
│ │ ├── main.rs
│ │ ├── renderpass-bindless.wgsl
│ │ ├── renderpass.rs
│ │ ├── renderpass.wgsl
│ │ ├── resource_creation.rs
│ │ └── shader.rs
│ └── src/
│ ├── context.rs
│ ├── file.rs
│ ├── iter.rs
│ ├── lib.rs
│ └── print.rs
├── clippy.toml
├── codecov.yml
├── cts_runner/
│ ├── Cargo.toml
│ ├── README.md
│ ├── examples/
│ │ └── hello-compute.js
│ ├── fail.lst
│ ├── revision.txt
│ ├── skip.lst
│ ├── src/
│ │ ├── bootstrap.js
│ │ └── main.rs
│ ├── test.lst
│ └── tests/
│ └── integration.rs
├── deno_webgpu/
│ ├── 00_init.js
│ ├── 01_webgpu.js
│ ├── 02_surface.js
│ ├── Cargo.toml
│ ├── LICENSE.md
│ ├── README.md
│ ├── adapter.rs
│ ├── bind_group.rs
│ ├── bind_group_layout.rs
│ ├── buffer.rs
│ ├── byow.rs
│ ├── command_buffer.rs
│ ├── command_encoder.rs
│ ├── compute_pass.rs
│ ├── compute_pipeline.rs
│ ├── device.rs
│ ├── error.rs
│ ├── lib.rs
│ ├── pipeline_layout.rs
│ ├── query_set.rs
│ ├── queue.rs
│ ├── render_bundle.rs
│ ├── render_pass.rs
│ ├── render_pipeline.rs
│ ├── rustfmt.toml
│ ├── sampler.rs
│ ├── shader.rs
│ ├── surface.rs
│ ├── texture.rs
│ └── webidl.rs
├── docs/
│ ├── api-specs/
│ │ ├── cooperative_matrix.md
│ │ ├── mesh_shading.md
│ │ └── ray_tracing.md
│ ├── big-picture.xml
│ ├── broadcast_license.nu
│ ├── release-checklist.md
│ ├── review-checklist.md
│ └── testing.md
├── examples/
│ ├── README.md
│ ├── bug-repro/
│ │ └── 01_texture_atomic_bug/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── main.rs
│ │ └── shader.wgsl
│ ├── features/
│ │ ├── Cargo.toml
│ │ ├── src/
│ │ │ ├── big_compute_buffers/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ ├── shader.wgsl
│ │ │ │ └── tests.rs
│ │ │ ├── boids/
│ │ │ │ ├── README.md
│ │ │ │ ├── compute.wgsl
│ │ │ │ ├── draw.wgsl
│ │ │ │ └── mod.rs
│ │ │ ├── bunnymark/
│ │ │ │ ├── README.md
│ │ │ │ └── mod.rs
│ │ │ ├── conservative_raster/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ ├── triangle_and_lines.wgsl
│ │ │ │ └── upscale.wgsl
│ │ │ ├── cooperative_matrix/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ ├── shader.wgsl
│ │ │ │ ├── shader_f16_16x16.wgsl
│ │ │ │ └── tests.rs
│ │ │ ├── cube/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── framework.rs
│ │ │ ├── hello_synchronization/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ ├── shaders.wgsl
│ │ │ │ └── tests.rs
│ │ │ ├── hello_triangle/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── hello_windows/
│ │ │ │ ├── README.md
│ │ │ │ └── mod.rs
│ │ │ ├── hello_workgroups/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── lib.rs
│ │ │ ├── main.rs
│ │ │ ├── mesh_shader/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ ├── shader.hlsl
│ │ │ │ ├── shader.metal
│ │ │ │ └── shader.wgsl
│ │ │ ├── mipmap/
│ │ │ │ ├── README.md
│ │ │ │ ├── blit.wgsl
│ │ │ │ ├── draw.wgsl
│ │ │ │ └── mod.rs
│ │ │ ├── msaa_line/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── multiple_render_targets/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── multiview/
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── ray_cube_compute/
│ │ │ │ ├── README.md
│ │ │ │ ├── blit.wgsl
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── ray_cube_fragment/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── ray_cube_normals/
│ │ │ │ ├── README.md
│ │ │ │ ├── blit.wgsl
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── ray_scene/
│ │ │ │ ├── cube.mtl
│ │ │ │ ├── cube.obj
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── ray_shadows/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── ray_traced_triangle/
│ │ │ │ ├── README.md
│ │ │ │ ├── blit.wgsl
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── render_to_texture/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── render_with_compute/
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── repeated_compute/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── shadow/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── skybox/
│ │ │ │ ├── README.md
│ │ │ │ ├── images/
│ │ │ │ │ ├── astc.ktx2
│ │ │ │ │ ├── bc7.ktx2
│ │ │ │ │ ├── etc2.ktx2
│ │ │ │ │ ├── generation.bash
│ │ │ │ │ └── rgba8.ktx2
│ │ │ │ ├── mod.rs
│ │ │ │ ├── models/
│ │ │ │ │ ├── rustacean-3d.mtl
│ │ │ │ │ └── rustacean-3d.obj
│ │ │ │ └── shader.wgsl
│ │ │ ├── srgb_blend/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── stencil_triangles/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── storage_texture/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── texture_arrays/
│ │ │ │ ├── README.md
│ │ │ │ ├── indexing.wgsl
│ │ │ │ ├── mod.rs
│ │ │ │ └── non_uniform_indexing.wgsl
│ │ │ ├── timestamp_queries/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── uniform_values/
│ │ │ │ ├── README.md
│ │ │ │ ├── mod.rs
│ │ │ │ └── shader.wgsl
│ │ │ ├── utils.rs
│ │ │ └── water/
│ │ │ ├── README.md
│ │ │ ├── mod.rs
│ │ │ ├── point_gen.rs
│ │ │ ├── terrain.wgsl
│ │ │ └── water.wgsl
│ │ └── web-static/
│ │ └── index.html
│ └── standalone/
│ ├── 01_hello_compute/
│ │ ├── Cargo.toml
│ │ ├── cargo-generate.toml
│ │ └── src/
│ │ ├── main.rs
│ │ └── shader.wgsl
│ ├── 02_hello_window/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ └── main.rs
│ └── custom_backend/
│ ├── Cargo.toml
│ └── src/
│ ├── custom.rs
│ └── main.rs
├── lock-analyzer/
│ ├── Cargo.toml
│ └── src/
│ └── main.rs
├── naga/
│ ├── .cargo/
│ │ └── config.toml
│ ├── .gitattributes
│ ├── .gitignore
│ ├── CHANGELOG.md
│ ├── Cargo.toml
│ ├── LICENSE.APACHE
│ ├── LICENSE.MIT
│ ├── README.md
│ ├── build.rs
│ ├── fuzz/
│ │ ├── .gitignore
│ │ ├── Cargo.toml
│ │ ├── build.rs
│ │ └── fuzz_targets/
│ │ ├── glsl_parser.rs
│ │ ├── ir.rs
│ │ ├── spv_parser.rs
│ │ └── wgsl_parser.rs
│ ├── hlsl-snapshots/
│ │ ├── Cargo.toml
│ │ └── src/
│ │ └── lib.rs
│ ├── src/
│ │ ├── arena/
│ │ │ ├── handle.rs
│ │ │ ├── handle_set.rs
│ │ │ ├── handlevec.rs
│ │ │ ├── mod.rs
│ │ │ ├── range.rs
│ │ │ └── unique_arena.rs
│ │ ├── back/
│ │ │ ├── continue_forward.rs
│ │ │ ├── dot/
│ │ │ │ └── mod.rs
│ │ │ ├── glsl/
│ │ │ │ ├── conv.rs
│ │ │ │ ├── features.rs
│ │ │ │ ├── keywords.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── writer.rs
│ │ │ ├── hlsl/
│ │ │ │ ├── conv.rs
│ │ │ │ ├── help.rs
│ │ │ │ ├── keywords.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── ray.rs
│ │ │ │ ├── storage.rs
│ │ │ │ └── writer.rs
│ │ │ ├── mod.rs
│ │ │ ├── msl/
│ │ │ │ ├── keywords.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── sampler.rs
│ │ │ │ └── writer.rs
│ │ │ ├── pipeline_constants.rs
│ │ │ ├── spv/
│ │ │ │ ├── block.rs
│ │ │ │ ├── f16_polyfill.rs
│ │ │ │ ├── helpers.rs
│ │ │ │ ├── image.rs
│ │ │ │ ├── index.rs
│ │ │ │ ├── instructions.rs
│ │ │ │ ├── layout.rs
│ │ │ │ ├── mesh_shader.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── ray/
│ │ │ │ │ ├── mod.rs
│ │ │ │ │ └── query.rs
│ │ │ │ ├── reclaimable.rs
│ │ │ │ ├── selection.rs
│ │ │ │ ├── subgroup.rs
│ │ │ │ └── writer.rs
│ │ │ └── wgsl/
│ │ │ ├── mod.rs
│ │ │ ├── polyfill/
│ │ │ │ ├── inverse/
│ │ │ │ │ ├── inverse_2x2_f16.wgsl
│ │ │ │ │ ├── inverse_2x2_f32.wgsl
│ │ │ │ │ ├── inverse_3x3_f16.wgsl
│ │ │ │ │ ├── inverse_3x3_f32.wgsl
│ │ │ │ │ ├── inverse_4x4_f16.wgsl
│ │ │ │ │ └── inverse_4x4_f32.wgsl
│ │ │ │ └── mod.rs
│ │ │ └── writer.rs
│ │ ├── common/
│ │ │ ├── diagnostic_debug.rs
│ │ │ ├── diagnostic_display.rs
│ │ │ ├── mod.rs
│ │ │ ├── predeclared.rs
│ │ │ └── wgsl/
│ │ │ ├── diagnostics.rs
│ │ │ ├── mod.rs
│ │ │ ├── to_wgsl.rs
│ │ │ └── types.rs
│ │ ├── compact/
│ │ │ ├── expressions.rs
│ │ │ ├── functions.rs
│ │ │ ├── handle_set_map.rs
│ │ │ ├── mod.rs
│ │ │ ├── statements.rs
│ │ │ └── types.rs
│ │ ├── diagnostic_filter.rs
│ │ ├── error.rs
│ │ ├── front/
│ │ │ ├── atomic_upgrade.rs
│ │ │ ├── glsl/
│ │ │ │ ├── ast.rs
│ │ │ │ ├── builtins.rs
│ │ │ │ ├── context.rs
│ │ │ │ ├── error.rs
│ │ │ │ ├── functions.rs
│ │ │ │ ├── lex.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── offset.rs
│ │ │ │ ├── parser/
│ │ │ │ │ ├── declarations.rs
│ │ │ │ │ ├── expressions.rs
│ │ │ │ │ ├── functions.rs
│ │ │ │ │ └── types.rs
│ │ │ │ ├── parser.rs
│ │ │ │ ├── parser_tests.rs
│ │ │ │ ├── token.rs
│ │ │ │ ├── types.rs
│ │ │ │ └── variables.rs
│ │ │ ├── interpolator.rs
│ │ │ ├── mod.rs
│ │ │ ├── spv/
│ │ │ │ ├── convert.rs
│ │ │ │ ├── error.rs
│ │ │ │ ├── function.rs
│ │ │ │ ├── image.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── next_block.rs
│ │ │ │ └── null.rs
│ │ │ ├── type_gen.rs
│ │ │ └── wgsl/
│ │ │ ├── error.rs
│ │ │ ├── index.rs
│ │ │ ├── lower/
│ │ │ │ ├── construction.rs
│ │ │ │ ├── conversion.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── template_list.rs
│ │ │ ├── mod.rs
│ │ │ ├── parse/
│ │ │ │ ├── ast.rs
│ │ │ │ ├── conv.rs
│ │ │ │ ├── directive/
│ │ │ │ │ ├── enable_extension.rs
│ │ │ │ │ └── language_extension.rs
│ │ │ │ ├── directive.rs
│ │ │ │ ├── lexer.rs
│ │ │ │ ├── mod.rs
│ │ │ │ └── number.rs
│ │ │ └── tests.rs
│ │ ├── ir/
│ │ │ ├── block.rs
│ │ │ └── mod.rs
│ │ ├── keywords/
│ │ │ ├── mod.rs
│ │ │ └── wgsl.rs
│ │ ├── lib.rs
│ │ ├── non_max_u32.rs
│ │ ├── proc/
│ │ │ ├── constant_evaluator.rs
│ │ │ ├── emitter.rs
│ │ │ ├── index.rs
│ │ │ ├── keyword_set.rs
│ │ │ ├── layouter.rs
│ │ │ ├── mod.rs
│ │ │ ├── namer.rs
│ │ │ ├── overloads/
│ │ │ │ ├── any_overload_set.rs
│ │ │ │ ├── constructor_set.rs
│ │ │ │ ├── list.rs
│ │ │ │ ├── mathfunction.rs
│ │ │ │ ├── mod.rs
│ │ │ │ ├── one_bits_iter.rs
│ │ │ │ ├── regular.rs
│ │ │ │ ├── rule.rs
│ │ │ │ ├── scalar_set.rs
│ │ │ │ └── utils.rs
│ │ │ ├── terminator.rs
│ │ │ ├── type_methods.rs
│ │ │ └── typifier.rs
│ │ ├── racy_lock.rs
│ │ ├── span.rs
│ │ └── valid/
│ │ ├── analyzer.rs
│ │ ├── compose.rs
│ │ ├── expression.rs
│ │ ├── function.rs
│ │ ├── handles.rs
│ │ ├── interface.rs
│ │ ├── mod.rs
│ │ └── type.rs
│ ├── tests/
│ │ ├── in/
│ │ │ ├── glsl/
│ │ │ │ ├── 210-bevy-2d-shader.frag
│ │ │ │ ├── 210-bevy-2d-shader.vert
│ │ │ │ ├── 210-bevy-shader.vert
│ │ │ │ ├── 246-collatz.comp
│ │ │ │ ├── 277-casting.frag
│ │ │ │ ├── 280-matrix-cast.frag
│ │ │ │ ├── 484-preprocessor-if.frag
│ │ │ │ ├── 5246-dual-iteration.frag
│ │ │ │ ├── 800-out-of-bounds-panic.toml
│ │ │ │ ├── 800-out-of-bounds-panic.vert
│ │ │ │ ├── 896-push-constant.frag
│ │ │ │ ├── 896-push-constant.toml
│ │ │ │ ├── 900-implicit-conversions.frag
│ │ │ │ ├── 901-lhs-field-select.frag
│ │ │ │ ├── 931-constant-emitting.frag
│ │ │ │ ├── 932-for-loop-if.frag
│ │ │ │ ├── anonymous-entry-point-type.frag
│ │ │ │ ├── bevy-pbr.frag
│ │ │ │ ├── bevy-pbr.vert
│ │ │ │ ├── bits.frag
│ │ │ │ ├── bits.toml
│ │ │ │ ├── bool-select.frag
│ │ │ │ ├── buffer.frag
│ │ │ │ ├── clamp-splat.vert
│ │ │ │ ├── const-global-swizzle.frag
│ │ │ │ ├── constant-array-size.frag
│ │ │ │ ├── declarations.frag
│ │ │ │ ├── double-math-functions.frag
│ │ │ │ ├── double-math-functions.toml
│ │ │ │ ├── dual-source-blending.frag
│ │ │ │ ├── dual-source-blending.toml
│ │ │ │ ├── expressions.frag
│ │ │ │ ├── f16-glsl.comp
│ │ │ │ ├── f16-glsl.toml
│ │ │ │ ├── fma.frag
│ │ │ │ ├── functions_call.frag
│ │ │ │ ├── global-constant-array.frag
│ │ │ │ ├── images.frag
│ │ │ │ ├── inverse-polyfill.frag
│ │ │ │ ├── local-var-init-in-loop.comp
│ │ │ │ ├── long-form-matrix.frag
│ │ │ │ ├── math-functions.frag
│ │ │ │ ├── multipart-for-loop.frag
│ │ │ │ ├── prepostfix.frag
│ │ │ │ ├── quad_glsl.frag
│ │ │ │ ├── quad_glsl.vert
│ │ │ │ ├── sampler-functions.frag
│ │ │ │ ├── samplers.frag
│ │ │ │ ├── spec-constant.frag
│ │ │ │ ├── spec-constant.toml
│ │ │ │ ├── statements.frag
│ │ │ │ ├── variations.frag
│ │ │ │ ├── variations.toml
│ │ │ │ ├── vector-functions.frag
│ │ │ │ └── vector-functions.toml
│ │ │ ├── spv/
│ │ │ │ ├── 8151-barrier-reorder.spvasm
│ │ │ │ ├── atomic_compare_exchange.spvasm
│ │ │ │ ├── atomic_exchange.spvasm
│ │ │ │ ├── atomic_global_struct_field_vertex.spvasm
│ │ │ │ ├── atomic_i_add_sub.spvasm
│ │ │ │ ├── atomic_i_decrement.spvasm
│ │ │ │ ├── atomic_i_increment.spvasm
│ │ │ │ ├── atomic_load_and_store.spvasm
│ │ │ │ ├── barrier.spvasm
│ │ │ │ ├── barrier.toml
│ │ │ │ ├── binding-arrays.dynamic.spvasm
│ │ │ │ ├── binding-arrays.dynamic.toml
│ │ │ │ ├── binding-arrays.runtime.slang
│ │ │ │ ├── binding-arrays.runtime.spvasm
│ │ │ │ ├── binding-arrays.runtime.toml
│ │ │ │ ├── binding-arrays.static.spvasm
│ │ │ │ ├── binding-arrays.static.toml
│ │ │ │ ├── builtin-accessed-outside-entrypoint.spvasm
│ │ │ │ ├── builtin-accessed-outside-entrypoint.toml
│ │ │ │ ├── degrees.spvasm
│ │ │ │ ├── degrees.toml
│ │ │ │ ├── do-while.spvasm
│ │ │ │ ├── do-while.toml
│ │ │ │ ├── dual-source-blending.spvasm
│ │ │ │ ├── dual-source-blending.toml
│ │ │ │ ├── empty-global-name.spvasm
│ │ │ │ ├── empty-global-name.toml
│ │ │ │ ├── f16-spv.comp
│ │ │ │ ├── f16-spv.spvasm
│ │ │ │ ├── f16-spv.toml
│ │ │ │ ├── fetch_depth.spvasm
│ │ │ │ ├── fetch_depth.toml
│ │ │ │ ├── gather-cmp.slang
│ │ │ │ ├── gather-cmp.spvasm
│ │ │ │ ├── gather-cmp.toml
│ │ │ │ ├── gather.slang
│ │ │ │ ├── gather.spvasm
│ │ │ │ ├── gather.toml
│ │ │ │ ├── inv-hyperbolic-trig-functions.spvasm
│ │ │ │ ├── inv-hyperbolic-trig-functions.toml
│ │ │ │ ├── load-ms-texture.slang
│ │ │ │ ├── load-ms-texture.spvasm
│ │ │ │ ├── load-ms-texture.toml
│ │ │ │ ├── non-semantic-debug.spvasm
│ │ │ │ ├── per-vertex.spvasm
│ │ │ │ ├── per-vertex.toml
│ │ │ │ ├── quad-vert.spvasm
│ │ │ │ ├── quad-vert.toml
│ │ │ │ ├── shadow.spvasm
│ │ │ │ ├── shadow.toml
│ │ │ │ ├── spec-constants-issue-5598.spvasm
│ │ │ │ ├── spec-constants-issue-5598.toml
│ │ │ │ ├── spec-constants.spvasm
│ │ │ │ ├── spec-constants.toml
│ │ │ │ ├── spec-constants.vert
│ │ │ │ ├── subgroup-barrier.spvasm
│ │ │ │ ├── subgroup-barrier.toml
│ │ │ │ ├── subgroup-operations-s.spvasm
│ │ │ │ ├── subgroup-operations-s.toml
│ │ │ │ ├── unnamed-gl-per-vertex.spvasm
│ │ │ │ └── unnamed-gl-per-vertex.toml
│ │ │ └── wgsl/
│ │ │ ├── 6220-break-from-loop.toml
│ │ │ ├── 6220-break-from-loop.wgsl
│ │ │ ├── 6438-conflicting-idents.wgsl
│ │ │ ├── 6772-unpack-expr-accesses.wgsl
│ │ │ ├── 7048-multiple-dynamic-1.toml
│ │ │ ├── 7048-multiple-dynamic-1.wgsl
│ │ │ ├── 7048-multiple-dynamic-2.toml
│ │ │ ├── 7048-multiple-dynamic-2.wgsl
│ │ │ ├── 7048-multiple-dynamic-3.toml
│ │ │ ├── 7048-multiple-dynamic-3.wgsl
│ │ │ ├── 7995-unicode-idents.wgsl
│ │ │ ├── 8820-multiple-local-invocation-index-id.wgsl
│ │ │ ├── 9105-primitive-index-ordering.toml
│ │ │ ├── 9105-primitive-index-ordering.wgsl
│ │ │ ├── abstract-types-atomic.toml
│ │ │ ├── abstract-types-atomic.wgsl
│ │ │ ├── abstract-types-builtins.toml
│ │ │ ├── abstract-types-builtins.wgsl
│ │ │ ├── abstract-types-const.toml
│ │ │ ├── abstract-types-const.wgsl
│ │ │ ├── abstract-types-function-calls.toml
│ │ │ ├── abstract-types-function-calls.wgsl
│ │ │ ├── abstract-types-let.toml
│ │ │ ├── abstract-types-let.wgsl
│ │ │ ├── abstract-types-operators.toml
│ │ │ ├── abstract-types-operators.wgsl
│ │ │ ├── abstract-types-return.wgsl
│ │ │ ├── abstract-types-texture.toml
│ │ │ ├── abstract-types-texture.wgsl
│ │ │ ├── abstract-types-var.toml
│ │ │ ├── abstract-types-var.wgsl
│ │ │ ├── access.toml
│ │ │ ├── access.wgsl
│ │ │ ├── aliased-ray-query.toml
│ │ │ ├── aliased-ray-query.wgsl
│ │ │ ├── array-in-ctor.wgsl
│ │ │ ├── array-in-function-return-type.wgsl
│ │ │ ├── atomicCompareExchange-int64.toml
│ │ │ ├── atomicCompareExchange-int64.wgsl
│ │ │ ├── atomicCompareExchange.toml
│ │ │ ├── atomicCompareExchange.wgsl
│ │ │ ├── atomicOps-float32.toml
│ │ │ ├── atomicOps-float32.wgsl
│ │ │ ├── atomicOps-int64-min-max.toml
│ │ │ ├── atomicOps-int64-min-max.wgsl
│ │ │ ├── atomicOps-int64.toml
│ │ │ ├── atomicOps-int64.wgsl
│ │ │ ├── atomicOps.wgsl
│ │ │ ├── atomicTexture-int64.toml
│ │ │ ├── atomicTexture-int64.wgsl
│ │ │ ├── atomicTexture.toml
│ │ │ ├── atomicTexture.wgsl
│ │ │ ├── barycentrics.toml
│ │ │ ├── barycentrics.wgsl
│ │ │ ├── binding-arrays.toml
│ │ │ ├── binding-arrays.wgsl
│ │ │ ├── binding-buffer-arrays.toml
│ │ │ ├── binding-buffer-arrays.wgsl
│ │ │ ├── bitcast.wgsl
│ │ │ ├── bits-optimized-msl.toml
│ │ │ ├── bits-optimized-msl.wgsl
│ │ │ ├── bits.toml
│ │ │ ├── bits.wgsl
│ │ │ ├── bits_downlevel.toml
│ │ │ ├── bits_downlevel.wgsl
│ │ │ ├── bits_downlevel_webgl.toml
│ │ │ ├── bits_downlevel_webgl.wgsl
│ │ │ ├── boids.toml
│ │ │ ├── boids.wgsl
│ │ │ ├── bounds-check-dynamic-buffer.toml
│ │ │ ├── bounds-check-dynamic-buffer.wgsl
│ │ │ ├── bounds-check-image-restrict-depth.toml
│ │ │ ├── bounds-check-image-restrict-depth.wgsl
│ │ │ ├── bounds-check-image-restrict.toml
│ │ │ ├── bounds-check-image-restrict.wgsl
│ │ │ ├── bounds-check-image-rzsw-depth.toml
│ │ │ ├── bounds-check-image-rzsw-depth.wgsl
│ │ │ ├── bounds-check-image-rzsw.toml
│ │ │ ├── bounds-check-image-rzsw.wgsl
│ │ │ ├── bounds-check-restrict.toml
│ │ │ ├── bounds-check-restrict.wgsl
│ │ │ ├── bounds-check-zero-atomic.toml
│ │ │ ├── bounds-check-zero-atomic.wgsl
│ │ │ ├── bounds-check-zero.toml
│ │ │ ├── bounds-check-zero.wgsl
│ │ │ ├── break-if.wgsl
│ │ │ ├── clip-distances.toml
│ │ │ ├── clip-distances.wgsl
│ │ │ ├── collatz.toml
│ │ │ ├── collatz.wgsl
│ │ │ ├── const-exprs.wgsl
│ │ │ ├── const_assert.toml
│ │ │ ├── const_assert.wgsl
│ │ │ ├── constructors.wgsl
│ │ │ ├── control-flow.toml
│ │ │ ├── control-flow.wgsl
│ │ │ ├── conversion-float-to-int-no-f64.toml
│ │ │ ├── conversion-float-to-int-no-f64.wgsl
│ │ │ ├── conversion-float-to-int.toml
│ │ │ ├── conversion-float-to-int.wgsl
│ │ │ ├── conversions.wgsl
│ │ │ ├── cooperative-matrix.toml
│ │ │ ├── cooperative-matrix.wgsl
│ │ │ ├── cross.wgsl
│ │ │ ├── cubeArrayShadow.toml
│ │ │ ├── cubeArrayShadow.wgsl
│ │ │ ├── debug-symbol-large-source.toml
│ │ │ ├── debug-symbol-large-source.wgsl
│ │ │ ├── debug-symbol-simple.toml
│ │ │ ├── debug-symbol-simple.wgsl
│ │ │ ├── debug-symbol-terrain.toml
│ │ │ ├── debug-symbol-terrain.wgsl
│ │ │ ├── diagnostic-filter.toml
│ │ │ ├── diagnostic-filter.wgsl
│ │ │ ├── draw-index.toml
│ │ │ ├── draw-index.wgsl
│ │ │ ├── dualsource.toml
│ │ │ ├── dualsource.wgsl
│ │ │ ├── early-depth-test-conservative.toml
│ │ │ ├── early-depth-test-conservative.wgsl
│ │ │ ├── early-depth-test-force.toml
│ │ │ ├── early-depth-test-force.wgsl
│ │ │ ├── empty-if.toml
│ │ │ ├── empty-if.wgsl
│ │ │ ├── empty.wgsl
│ │ │ ├── extra.toml
│ │ │ ├── extra.wgsl
│ │ │ ├── f16-native.toml
│ │ │ ├── f16-native.wgsl
│ │ │ ├── f16-polyfill.toml
│ │ │ ├── f16-polyfill.wgsl
│ │ │ ├── f16.toml
│ │ │ ├── f16.wgsl
│ │ │ ├── f64.toml
│ │ │ ├── f64.wgsl
│ │ │ ├── force_point_size_vertex_shader_webgl.toml
│ │ │ ├── force_point_size_vertex_shader_webgl.wgsl
│ │ │ ├── fragment-output.wgsl
│ │ │ ├── functions-optimized-by-capability.toml
│ │ │ ├── functions-optimized-by-capability.wgsl
│ │ │ ├── functions-optimized-by-version.toml
│ │ │ ├── functions-optimized-by-version.wgsl
│ │ │ ├── functions-unoptimized.toml
│ │ │ ├── functions-unoptimized.wgsl
│ │ │ ├── functions-webgl.toml
│ │ │ ├── functions-webgl.wgsl
│ │ │ ├── functions.wgsl
│ │ │ ├── globals.wgsl
│ │ │ ├── hlsl-keyword.toml
│ │ │ ├── hlsl-keyword.wgsl
│ │ │ ├── image.toml
│ │ │ ├── image.wgsl
│ │ │ ├── index-by-value.toml
│ │ │ ├── index-by-value.wgsl
│ │ │ ├── int64.toml
│ │ │ ├── int64.wgsl
│ │ │ ├── interface.toml
│ │ │ ├── interface.wgsl
│ │ │ ├── interpolate.toml
│ │ │ ├── interpolate.wgsl
│ │ │ ├── interpolate_compat.toml
│ │ │ ├── interpolate_compat.wgsl
│ │ │ ├── invariant.toml
│ │ │ ├── invariant.wgsl
│ │ │ ├── lexical-scopes.toml
│ │ │ ├── lexical-scopes.wgsl
│ │ │ ├── local-const.toml
│ │ │ ├── local-const.wgsl
│ │ │ ├── mat_cx2.toml
│ │ │ ├── mat_cx2.wgsl
│ │ │ ├── mat_cx3.toml
│ │ │ ├── mat_cx3.wgsl
│ │ │ ├── math-functions.toml
│ │ │ ├── math-functions.wgsl
│ │ │ ├── memory-decorations-coherent.toml
│ │ │ ├── memory-decorations-coherent.wgsl
│ │ │ ├── memory-decorations.toml
│ │ │ ├── memory-decorations.wgsl
│ │ │ ├── mesh-shader-empty.toml
│ │ │ ├── mesh-shader-empty.wgsl
│ │ │ ├── mesh-shader-lines.toml
│ │ │ ├── mesh-shader-lines.wgsl
│ │ │ ├── mesh-shader-points.toml
│ │ │ ├── mesh-shader-points.wgsl
│ │ │ ├── mesh-shader.toml
│ │ │ ├── mesh-shader.wgsl
│ │ │ ├── module-scope.toml
│ │ │ ├── module-scope.wgsl
│ │ │ ├── msl-varyings.toml
│ │ │ ├── msl-varyings.wgsl
│ │ │ ├── msl-vpt-formats-x1.toml
│ │ │ ├── msl-vpt-formats-x1.wgsl
│ │ │ ├── msl-vpt-formats-x2.toml
│ │ │ ├── msl-vpt-formats-x2.wgsl
│ │ │ ├── msl-vpt-formats-x3.toml
│ │ │ ├── msl-vpt-formats-x3.wgsl
│ │ │ ├── msl-vpt-formats-x4.toml
│ │ │ ├── msl-vpt-formats-x4.wgsl
│ │ │ ├── msl-vpt.toml
│ │ │ ├── msl-vpt.wgsl
│ │ │ ├── multiview.toml
│ │ │ ├── multiview.wgsl
│ │ │ ├── multiview_webgl.toml
│ │ │ ├── multiview_webgl.wgsl
│ │ │ ├── must-use.toml
│ │ │ ├── must-use.wgsl
│ │ │ ├── operators.wgsl
│ │ │ ├── overrides-atomicCompareExchangeWeak.toml
│ │ │ ├── overrides-atomicCompareExchangeWeak.wgsl
│ │ │ ├── overrides-ray-query.toml
│ │ │ ├── overrides-ray-query.wgsl
│ │ │ ├── overrides.toml
│ │ │ ├── overrides.wgsl
│ │ │ ├── padding.toml
│ │ │ ├── padding.wgsl
│ │ │ ├── per-vertex.toml
│ │ │ ├── per-vertex.wgsl
│ │ │ ├── phony_assignment.wgsl
│ │ │ ├── pointer-function-arg-restrict.toml
│ │ │ ├── pointer-function-arg-restrict.wgsl
│ │ │ ├── pointer-function-arg-rzsw.toml
│ │ │ ├── pointer-function-arg-rzsw.wgsl
│ │ │ ├── pointer-function-arg.toml
│ │ │ ├── pointer-function-arg.wgsl
│ │ │ ├── pointers.toml
│ │ │ ├── pointers.wgsl
│ │ │ ├── policy-mix.toml
│ │ │ ├── policy-mix.wgsl
│ │ │ ├── primitive-index-mesh.toml
│ │ │ ├── primitive-index-mesh.wgsl
│ │ │ ├── primitive-index.toml
│ │ │ ├── primitive-index.wgsl
│ │ │ ├── push-constants.toml
│ │ │ ├── push-constants.wgsl
│ │ │ ├── quad.toml
│ │ │ ├── quad.wgsl
│ │ │ ├── ray-query-no-init-tracking.toml
│ │ │ ├── ray-query-no-init-tracking.wgsl
│ │ │ ├── ray-query.toml
│ │ │ ├── ray-query.wgsl
│ │ │ ├── ray-tracing-pipeline.toml
│ │ │ ├── ray-tracing-pipeline.wgsl
│ │ │ ├── resource-binding-map.toml
│ │ │ ├── resource-binding-map.wgsl
│ │ │ ├── sample-cube-array-depth-lod.toml
│ │ │ ├── sample-cube-array-depth-lod.wgsl
│ │ │ ├── select.wgsl
│ │ │ ├── separate-entry-points.toml
│ │ │ ├── separate-entry-points.wgsl
│ │ │ ├── shadow.toml
│ │ │ ├── shadow.wgsl
│ │ │ ├── skybox.toml
│ │ │ ├── skybox.wgsl
│ │ │ ├── sprite.toml
│ │ │ ├── sprite.wgsl
│ │ │ ├── standard.wgsl
│ │ │ ├── storage-textures.toml
│ │ │ ├── storage-textures.wgsl
│ │ │ ├── struct-layout.wgsl
│ │ │ ├── subgroup-barrier.toml
│ │ │ ├── subgroup-barrier.wgsl
│ │ │ ├── subgroup-operations.toml
│ │ │ ├── subgroup-operations.wgsl
│ │ │ ├── template-list-ge.toml
│ │ │ ├── template-list-ge.wgsl
│ │ │ ├── template-list-trailing-comma.toml
│ │ │ ├── template-list-trailing-comma.wgsl
│ │ │ ├── texture-arg.toml
│ │ │ ├── texture-arg.wgsl
│ │ │ ├── texture-external.toml
│ │ │ ├── texture-external.wgsl
│ │ │ ├── type-alias.toml
│ │ │ ├── type-alias.wgsl
│ │ │ ├── type-inference.wgsl
│ │ │ ├── types_with_comments.toml
│ │ │ ├── types_with_comments.wgsl
│ │ │ ├── unconsumed_vertex_outputs_frag.toml
│ │ │ ├── unconsumed_vertex_outputs_frag.wgsl
│ │ │ ├── unconsumed_vertex_outputs_vert.toml
│ │ │ ├── unconsumed_vertex_outputs_vert.wgsl
│ │ │ ├── use-gl-ext-over-grad-workaround-if-instructed.toml
│ │ │ ├── use-gl-ext-over-grad-workaround-if-instructed.wgsl
│ │ │ ├── workgroup-uniform-load-atomic.wgsl
│ │ │ ├── workgroup-uniform-load.wgsl
│ │ │ ├── workgroup-var-init.toml
│ │ │ └── workgroup-var-init.wgsl
│ │ ├── naga/
│ │ │ ├── example_wgsl.rs
│ │ │ ├── main.rs
│ │ │ ├── snapshots.rs
│ │ │ ├── spirv_capabilities.rs
│ │ │ ├── validation.rs
│ │ │ └── wgsl_errors.rs
│ │ └── out/
│ │ ├── analysis/
│ │ │ ├── spv-shadow.info.ron
│ │ │ ├── wgsl-access.info.ron
│ │ │ ├── wgsl-collatz.info.ron
│ │ │ ├── wgsl-overrides.info.ron
│ │ │ └── wgsl-storage-textures.info.ron
│ │ ├── dot/
│ │ │ └── wgsl-quad.dot
│ │ ├── glsl/
│ │ │ ├── glsl-variations.frag.main.Fragment.glsl
│ │ │ ├── spv-barrier.main.Compute.glsl
│ │ │ ├── spv-do-while.main.Fragment.glsl
│ │ │ ├── spv-quad-vert.main.Vertex.glsl
│ │ │ ├── spv-spec-constants-issue-5598.fragment.Fragment.glsl
│ │ │ ├── spv-spec-constants-issue-5598.vertex.Vertex.glsl
│ │ │ ├── spv-subgroup-barrier.main.Compute.glsl
│ │ │ ├── spv-subgroup-operations-s.main.Compute.glsl
│ │ │ ├── spv-unnamed-gl-per-vertex.main.Vertex.glsl
│ │ │ ├── wgsl-6438-conflicting-idents.fs.Fragment.glsl
│ │ │ ├── wgsl-6438-conflicting-idents.vs.Vertex.glsl
│ │ │ ├── wgsl-6772-unpack-expr-accesses.main.Compute.glsl
│ │ │ ├── wgsl-7995-unicode-idents.main.Compute.glsl
│ │ │ ├── wgsl-8820-multiple-local-invocation-index-id.compute1.Compute.glsl
│ │ │ ├── wgsl-abstract-types-builtins.f.Compute.glsl
│ │ │ ├── wgsl-abstract-types-function-calls.main.Compute.glsl
│ │ │ ├── wgsl-abstract-types-let.main.Compute.glsl
│ │ │ ├── wgsl-abstract-types-operators.main.Compute.glsl
│ │ │ ├── wgsl-abstract-types-return.main.Compute.glsl
│ │ │ ├── wgsl-abstract-types-var.main.Compute.glsl
│ │ │ ├── wgsl-access.foo_compute.Compute.glsl
│ │ │ ├── wgsl-access.foo_frag.Fragment.glsl
│ │ │ ├── wgsl-access.foo_vert.Vertex.glsl
│ │ │ ├── wgsl-array-in-ctor.cs_main.Compute.glsl
│ │ │ ├── wgsl-array-in-function-return-type.main.Fragment.glsl
│ │ │ ├── wgsl-atomicCompareExchange.test_atomic_compare_exchange_i32.Compute.glsl
│ │ │ ├── wgsl-atomicCompareExchange.test_atomic_compare_exchange_u32.Compute.glsl
│ │ │ ├── wgsl-atomicOps.cs_main.Compute.glsl
│ │ │ ├── wgsl-atomicTexture.cs_main.Compute.glsl
│ │ │ ├── wgsl-barycentrics.fs_main.Fragment.glsl
│ │ │ ├── wgsl-barycentrics.fs_main_no_perspective.Fragment.glsl
│ │ │ ├── wgsl-bitcast.main.Compute.glsl
│ │ │ ├── wgsl-bits.main.Compute.glsl
│ │ │ ├── wgsl-bits_downlevel.main.Fragment.glsl
│ │ │ ├── wgsl-bits_downlevel_webgl.main.Fragment.glsl
│ │ │ ├── wgsl-boids.main.Compute.glsl
│ │ │ ├── wgsl-bounds-check-image-restrict.fragment_shader.Fragment.glsl
│ │ │ ├── wgsl-bounds-check-image-rzsw.fragment_shader.Fragment.glsl
│ │ │ ├── wgsl-break-if.main.Compute.glsl
│ │ │ ├── wgsl-clip-distances.main.Vertex.glsl
│ │ │ ├── wgsl-const-exprs.main.Compute.glsl
│ │ │ ├── wgsl-constructors.main.Compute.glsl
│ │ │ ├── wgsl-control-flow.main.Compute.glsl
│ │ │ ├── wgsl-conversions.main.Compute.glsl
│ │ │ ├── wgsl-cross.main.Compute.glsl
│ │ │ ├── wgsl-cubeArrayShadow.fragment.Fragment.glsl
│ │ │ ├── wgsl-dualsource.main.Fragment.glsl
│ │ │ ├── wgsl-early-depth-test-conservative.main.Fragment.glsl
│ │ │ ├── wgsl-early-depth-test-force.main.Fragment.glsl
│ │ │ ├── wgsl-empty-if.comp.Compute.glsl
│ │ │ ├── wgsl-empty.main.Compute.glsl
│ │ │ ├── wgsl-f64.main.Compute.glsl
│ │ │ ├── wgsl-force_point_size_vertex_shader_webgl.fs_main.Fragment.glsl
│ │ │ ├── wgsl-force_point_size_vertex_shader_webgl.vs_main.Vertex.glsl
│ │ │ ├── wgsl-fragment-output.main_vec2scalar.Fragment.glsl
│ │ │ ├── wgsl-fragment-output.main_vec4vec3.Fragment.glsl
│ │ │ ├── wgsl-functions-webgl.main.Fragment.glsl
│ │ │ ├── wgsl-functions.main.Compute.glsl
│ │ │ ├── wgsl-globals.main.Compute.glsl
│ │ │ ├── wgsl-image.gather.Fragment.glsl
│ │ │ ├── wgsl-image.levels_queries.Vertex.glsl
│ │ │ ├── wgsl-image.main.Compute.glsl
│ │ │ ├── wgsl-image.queries.Vertex.glsl
│ │ │ ├── wgsl-image.texture_sample.Fragment.glsl
│ │ │ ├── wgsl-image.texture_sample_comparison.Fragment.glsl
│ │ │ ├── wgsl-interpolate_compat.frag_main.Fragment.glsl
│ │ │ ├── wgsl-interpolate_compat.vert_main.Vertex.glsl
│ │ │ ├── wgsl-invariant.fs.Fragment.glsl
│ │ │ ├── wgsl-invariant.vs.Vertex.glsl
│ │ │ ├── wgsl-math-functions.main.Fragment.glsl
│ │ │ ├── wgsl-memory-decorations-coherent.main.Compute.glsl
│ │ │ ├── wgsl-memory-decorations.main.Compute.glsl
│ │ │ ├── wgsl-multiview.main.Fragment.glsl
│ │ │ ├── wgsl-multiview_webgl.main.Fragment.glsl
│ │ │ ├── wgsl-operators.main.Compute.glsl
│ │ │ ├── wgsl-overrides.main.Compute.glsl
│ │ │ ├── wgsl-padding.vertex.Vertex.glsl
│ │ │ ├── wgsl-phony_assignment.main.Compute.glsl
│ │ │ ├── wgsl-pointer-function-arg.main.Compute.glsl
│ │ │ ├── wgsl-primitive-index-mesh.func.Fragment.glsl
│ │ │ ├── wgsl-primitive-index.func.Fragment.glsl
│ │ │ ├── wgsl-push-constants.main.Fragment.glsl
│ │ │ ├── wgsl-push-constants.vert_main.Vertex.glsl
│ │ │ ├── wgsl-quad.frag_main.Fragment.glsl
│ │ │ ├── wgsl-quad.fs_extra.Fragment.glsl
│ │ │ ├── wgsl-quad.vert_main.Vertex.glsl
│ │ │ ├── wgsl-sample-cube-array-depth-lod.main.Fragment.glsl
│ │ │ ├── wgsl-select.main.Compute.glsl
│ │ │ ├── wgsl-separate-entry-points.compute.Compute.glsl
│ │ │ ├── wgsl-separate-entry-points.fragment.Fragment.glsl
│ │ │ ├── wgsl-shadow.fs_main.Fragment.glsl
│ │ │ ├── wgsl-shadow.fs_main_without_storage.Fragment.glsl
│ │ │ ├── wgsl-shadow.vs_main.Vertex.glsl
│ │ │ ├── wgsl-skybox.fs_main.Fragment.glsl
│ │ │ ├── wgsl-skybox.vs_main.Vertex.glsl
│ │ │ ├── wgsl-standard.derivatives.Fragment.glsl
│ │ │ ├── wgsl-struct-layout.needs_padding_comp.Compute.glsl
│ │ │ ├── wgsl-struct-layout.needs_padding_frag.Fragment.glsl
│ │ │ ├── wgsl-struct-layout.needs_padding_vert.Vertex.glsl
│ │ │ ├── wgsl-struct-layout.no_padding_comp.Compute.glsl
│ │ │ ├── wgsl-struct-layout.no_padding_frag.Fragment.glsl
│ │ │ ├── wgsl-struct-layout.no_padding_vert.Vertex.glsl
│ │ │ ├── wgsl-subgroup-operations.main.Compute.glsl
│ │ │ ├── wgsl-texture-arg.main.Fragment.glsl
│ │ │ ├── wgsl-type-inference.main.Compute.glsl
│ │ │ ├── wgsl-use-gl-ext-over-grad-workaround-if-instructed.main.Fragment.glsl
│ │ │ ├── wgsl-workgroup-uniform-load-atomic.test_atomic_workgroup_uniform_load.Compute.glsl
│ │ │ ├── wgsl-workgroup-uniform-load.test_workgroupUniformLoad.Compute.glsl
│ │ │ └── wgsl-workgroup-var-init.main.Compute.glsl
│ │ ├── hlsl/
│ │ │ ├── spv-barrier.hlsl
│ │ │ ├── spv-barrier.ron
│ │ │ ├── spv-do-while.hlsl
│ │ │ ├── spv-do-while.ron
│ │ │ ├── spv-empty-global-name.hlsl
│ │ │ ├── spv-empty-global-name.ron
│ │ │ ├── spv-fetch_depth.hlsl
│ │ │ ├── spv-fetch_depth.ron
│ │ │ ├── spv-inv-hyperbolic-trig-functions.hlsl
│ │ │ ├── spv-inv-hyperbolic-trig-functions.ron
│ │ │ ├── spv-quad-vert.hlsl
│ │ │ ├── spv-quad-vert.ron
│ │ │ ├── spv-subgroup-operations-s.hlsl
│ │ │ ├── spv-subgroup-operations-s.ron
│ │ │ ├── spv-unnamed-gl-per-vertex.hlsl
│ │ │ ├── spv-unnamed-gl-per-vertex.ron
│ │ │ ├── wgsl-6438-conflicting-idents.hlsl
│ │ │ ├── wgsl-6438-conflicting-idents.ron
│ │ │ ├── wgsl-6772-unpack-expr-accesses.hlsl
│ │ │ ├── wgsl-6772-unpack-expr-accesses.ron
│ │ │ ├── wgsl-7995-unicode-idents.hlsl
│ │ │ ├── wgsl-7995-unicode-idents.ron
│ │ │ ├── wgsl-8820-multiple-local-invocation-index-id.hlsl
│ │ │ ├── wgsl-8820-multiple-local-invocation-index-id.ron
│ │ │ ├── wgsl-9105-primitive-index-ordering.hlsl
│ │ │ ├── wgsl-9105-primitive-index-ordering.ron
│ │ │ ├── wgsl-abstract-types-return.hlsl
│ │ │ ├── wgsl-abstract-types-return.ron
│ │ │ ├── wgsl-access.hlsl
│ │ │ ├── wgsl-access.ron
│ │ │ ├── wgsl-aliased-ray-query.hlsl
│ │ │ ├── wgsl-aliased-ray-query.ron
│ │ │ ├── wgsl-array-in-ctor.hlsl
│ │ │ ├── wgsl-array-in-ctor.ron
│ │ │ ├── wgsl-array-in-function-return-type.hlsl
│ │ │ ├── wgsl-array-in-function-return-type.ron
│ │ │ ├── wgsl-atomicCompareExchange-int64.hlsl
│ │ │ ├── wgsl-atomicCompareExchange-int64.ron
│ │ │ ├── wgsl-atomicCompareExchange.hlsl
│ │ │ ├── wgsl-atomicCompareExchange.ron
│ │ │ ├── wgsl-atomicOps-int64-min-max.hlsl
│ │ │ ├── wgsl-atomicOps-int64-min-max.ron
│ │ │ ├── wgsl-atomicOps-int64.hlsl
│ │ │ ├── wgsl-atomicOps-int64.ron
│ │ │ ├── wgsl-atomicOps.hlsl
│ │ │ ├── wgsl-atomicOps.ron
│ │ │ ├── wgsl-atomicTexture-int64.hlsl
│ │ │ ├── wgsl-atomicTexture-int64.ron
│ │ │ ├── wgsl-atomicTexture.hlsl
│ │ │ ├── wgsl-atomicTexture.ron
│ │ │ ├── wgsl-barycentrics.hlsl
│ │ │ ├── wgsl-barycentrics.ron
│ │ │ ├── wgsl-binding-arrays.hlsl
│ │ │ ├── wgsl-binding-arrays.ron
│ │ │ ├── wgsl-bitcast.hlsl
│ │ │ ├── wgsl-bitcast.ron
│ │ │ ├── wgsl-bits.hlsl
│ │ │ ├── wgsl-bits.ron
│ │ │ ├── wgsl-boids.hlsl
│ │ │ ├── wgsl-boids.ron
│ │ │ ├── wgsl-bounds-check-dynamic-buffer.hlsl
│ │ │ ├── wgsl-bounds-check-dynamic-buffer.ron
│ │ │ ├── wgsl-break-if.hlsl
│ │ │ ├── wgsl-break-if.ron
│ │ │ ├── wgsl-collatz.hlsl
│ │ │ ├── wgsl-collatz.ron
│ │ │ ├── wgsl-const-exprs.hlsl
│ │ │ ├── wgsl-const-exprs.ron
│ │ │ ├── wgsl-constructors.hlsl
│ │ │ ├── wgsl-constructors.ron
│ │ │ ├── wgsl-control-flow.hlsl
│ │ │ ├── wgsl-control-flow.ron
│ │ │ ├── wgsl-conversion-float-to-int.hlsl
│ │ │ ├── wgsl-conversion-float-to-int.ron
│ │ │ ├── wgsl-conversions.hlsl
│ │ │ ├── wgsl-conversions.ron
│ │ │ ├── wgsl-cross.hlsl
│ │ │ ├── wgsl-cross.ron
│ │ │ ├── wgsl-dualsource.hlsl
│ │ │ ├── wgsl-dualsource.ron
│ │ │ ├── wgsl-empty-if.hlsl
│ │ │ ├── wgsl-empty-if.ron
│ │ │ ├── wgsl-empty.hlsl
│ │ │ ├── wgsl-empty.ron
│ │ │ ├── wgsl-f16.hlsl
│ │ │ ├── wgsl-f16.ron
│ │ │ ├── wgsl-f64.hlsl
│ │ │ ├── wgsl-f64.ron
│ │ │ ├── wgsl-fragment-output.hlsl
│ │ │ ├── wgsl-fragment-output.ron
│ │ │ ├── wgsl-functions-optimized-by-version.hlsl
│ │ │ ├── wgsl-functions-optimized-by-version.ron
│ │ │ ├── wgsl-functions-unoptimized.hlsl
│ │ │ ├── wgsl-functions-unoptimized.ron
│ │ │ ├── wgsl-functions.hlsl
│ │ │ ├── wgsl-functions.ron
│ │ │ ├── wgsl-globals.hlsl
│ │ │ ├── wgsl-globals.ron
│ │ │ ├── wgsl-hlsl-keyword.hlsl
│ │ │ ├── wgsl-hlsl-keyword.ron
│ │ │ ├── wgsl-image.hlsl
│ │ │ ├── wgsl-image.ron
│ │ │ ├── wgsl-int64.hlsl
│ │ │ ├── wgsl-int64.ron
│ │ │ ├── wgsl-interface.hlsl
│ │ │ ├── wgsl-interface.ron
│ │ │ ├── wgsl-interpolate.hlsl
│ │ │ ├── wgsl-interpolate.ron
│ │ │ ├── wgsl-interpolate_compat.hlsl
│ │ │ ├── wgsl-interpolate_compat.ron
│ │ │ ├── wgsl-mat_cx2.hlsl
│ │ │ ├── wgsl-mat_cx2.ron
│ │ │ ├── wgsl-mat_cx3.hlsl
│ │ │ ├── wgsl-mat_cx3.ron
│ │ │ ├── wgsl-math-functions.hlsl
│ │ │ ├── wgsl-math-functions.ron
│ │ │ ├── wgsl-memory-decorations-coherent.hlsl
│ │ │ ├── wgsl-memory-decorations-coherent.ron
│ │ │ ├── wgsl-multiview.hlsl
│ │ │ ├── wgsl-multiview.ron
│ │ │ ├── wgsl-operators.hlsl
│ │ │ ├── wgsl-operators.ron
│ │ │ ├── wgsl-overrides.hlsl
│ │ │ ├── wgsl-overrides.ron
│ │ │ ├── wgsl-padding.hlsl
│ │ │ ├── wgsl-padding.ron
│ │ │ ├── wgsl-phony_assignment.hlsl
│ │ │ ├── wgsl-phony_assignment.ron
│ │ │ ├── wgsl-pointer-function-arg.hlsl
│ │ │ ├── wgsl-pointer-function-arg.ron
│ │ │ ├── wgsl-primitive-index.hlsl
│ │ │ ├── wgsl-primitive-index.ron
│ │ │ ├── wgsl-push-constants.hlsl
│ │ │ ├── wgsl-push-constants.ron
│ │ │ ├── wgsl-quad.hlsl
│ │ │ ├── wgsl-quad.ron
│ │ │ ├── wgsl-ray-query-no-init-tracking.hlsl
│ │ │ ├── wgsl-ray-query-no-init-tracking.ron
│ │ │ ├── wgsl-ray-query.hlsl
│ │ │ ├── wgsl-ray-query.ron
│ │ │ ├── wgsl-select.hlsl
│ │ │ ├── wgsl-select.ron
│ │ │ ├── wgsl-shadow.hlsl
│ │ │ ├── wgsl-shadow.ron
│ │ │ ├── wgsl-skybox.hlsl
│ │ │ ├── wgsl-skybox.ron
│ │ │ ├── wgsl-standard.hlsl
│ │ │ ├── wgsl-standard.ron
│ │ │ ├── wgsl-storage-textures.hlsl
│ │ │ ├── wgsl-storage-textures.ron
│ │ │ ├── wgsl-struct-layout.hlsl
│ │ │ ├── wgsl-struct-layout.ron
│ │ │ ├── wgsl-subgroup-operations.hlsl
│ │ │ ├── wgsl-subgroup-operations.ron
│ │ │ ├── wgsl-texture-arg.hlsl
│ │ │ ├── wgsl-texture-arg.ron
│ │ │ ├── wgsl-texture-external.hlsl
│ │ │ ├── wgsl-texture-external.ron
│ │ │ ├── wgsl-type-inference.hlsl
│ │ │ ├── wgsl-type-inference.ron
│ │ │ ├── wgsl-unconsumed_vertex_outputs_frag.hlsl
│ │ │ ├── wgsl-unconsumed_vertex_outputs_frag.ron
│ │ │ ├── wgsl-unconsumed_vertex_outputs_vert.hlsl
│ │ │ ├── wgsl-unconsumed_vertex_outputs_vert.ron
│ │ │ ├── wgsl-workgroup-uniform-load-atomic.hlsl
│ │ │ ├── wgsl-workgroup-uniform-load-atomic.ron
│ │ │ ├── wgsl-workgroup-uniform-load.hlsl
│ │ │ ├── wgsl-workgroup-uniform-load.ron
│ │ │ ├── wgsl-workgroup-var-init.hlsl
│ │ │ └── wgsl-workgroup-var-init.ron
│ │ ├── ir/
│ │ │ ├── spv-fetch_depth.compact.ron
│ │ │ ├── spv-fetch_depth.ron
│ │ │ ├── spv-shadow.compact.ron
│ │ │ ├── spv-shadow.ron
│ │ │ ├── spv-spec-constants.compact.ron
│ │ │ ├── spv-spec-constants.ron
│ │ │ ├── wgsl-access.compact.ron
│ │ │ ├── wgsl-access.ron
│ │ │ ├── wgsl-collatz.compact.ron
│ │ │ ├── wgsl-collatz.ron
│ │ │ ├── wgsl-const_assert.compact.ron
│ │ │ ├── wgsl-const_assert.ron
│ │ │ ├── wgsl-diagnostic-filter.compact.ron
│ │ │ ├── wgsl-diagnostic-filter.ron
│ │ │ ├── wgsl-index-by-value.compact.ron
│ │ │ ├── wgsl-index-by-value.ron
│ │ │ ├── wgsl-local-const.compact.ron
│ │ │ ├── wgsl-local-const.ron
│ │ │ ├── wgsl-must-use.compact.ron
│ │ │ ├── wgsl-must-use.ron
│ │ │ ├── wgsl-overrides-atomicCompareExchangeWeak.compact.ron
│ │ │ ├── wgsl-overrides-atomicCompareExchangeWeak.ron
│ │ │ ├── wgsl-overrides-ray-query.compact.ron
│ │ │ ├── wgsl-overrides-ray-query.ron
│ │ │ ├── wgsl-overrides.compact.ron
│ │ │ ├── wgsl-overrides.ron
│ │ │ ├── wgsl-storage-textures.compact.ron
│ │ │ ├── wgsl-storage-textures.ron
│ │ │ ├── wgsl-template-list-trailing-comma.compact.ron
│ │ │ ├── wgsl-template-list-trailing-comma.ron
│ │ │ ├── wgsl-texture-external.compact.ron
│ │ │ ├── wgsl-texture-external.ron
│ │ │ ├── wgsl-types_with_comments.compact.ron
│ │ │ └── wgsl-types_with_comments.ron
│ │ ├── msl/
│ │ │ ├── spv-barrier.metal
│ │ │ ├── spv-do-while.metal
│ │ │ ├── spv-empty-global-name.metal
│ │ │ ├── spv-fetch_depth.metal
│ │ │ ├── spv-quad-vert.metal
│ │ │ ├── spv-subgroup-barrier.metal
│ │ │ ├── spv-subgroup-operations-s.metal
│ │ │ ├── spv-unnamed-gl-per-vertex.metal
│ │ │ ├── wgsl-6438-conflicting-idents.metal
│ │ │ ├── wgsl-6772-unpack-expr-accesses.metal
│ │ │ ├── wgsl-7995-unicode-idents.metal
│ │ │ ├── wgsl-8820-multiple-local-invocation-index-id.metal
│ │ │ ├── wgsl-abstract-types-builtins.metal
│ │ │ ├── wgsl-abstract-types-const.metal
│ │ │ ├── wgsl-abstract-types-function-calls.metal
│ │ │ ├── wgsl-abstract-types-let.metal
│ │ │ ├── wgsl-abstract-types-operators.metal
│ │ │ ├── wgsl-abstract-types-return.metal
│ │ │ ├── wgsl-abstract-types-texture.metal
│ │ │ ├── wgsl-abstract-types-var.metal
│ │ │ ├── wgsl-access.metal
│ │ │ ├── wgsl-aliased-ray-query.metal
│ │ │ ├── wgsl-array-in-ctor.metal
│ │ │ ├── wgsl-array-in-function-return-type.metal
│ │ │ ├── wgsl-atomicCompareExchange.metal
│ │ │ ├── wgsl-atomicOps-float32.metal
│ │ │ ├── wgsl-atomicOps-int64-min-max.metal
│ │ │ ├── wgsl-atomicOps.metal
│ │ │ ├── wgsl-atomicTexture-int64.metal
│ │ │ ├── wgsl-atomicTexture.metal
│ │ │ ├── wgsl-barycentrics.metal
│ │ │ ├── wgsl-binding-arrays.metal
│ │ │ ├── wgsl-bitcast.metal
│ │ │ ├── wgsl-bits-optimized-msl.metal
│ │ │ ├── wgsl-bits.metal
│ │ │ ├── wgsl-boids.metal
│ │ │ ├── wgsl-bounds-check-image-restrict-depth.metal
│ │ │ ├── wgsl-bounds-check-image-restrict.metal
│ │ │ ├── wgsl-bounds-check-image-rzsw-depth.metal
│ │ │ ├── wgsl-bounds-check-image-rzsw.metal
│ │ │ ├── wgsl-bounds-check-restrict.metal
│ │ │ ├── wgsl-bounds-check-zero-atomic.metal
│ │ │ ├── wgsl-bounds-check-zero.metal
│ │ │ ├── wgsl-break-if.metal
│ │ │ ├── wgsl-collatz.metal
│ │ │ ├── wgsl-const-exprs.metal
│ │ │ ├── wgsl-constructors.metal
│ │ │ ├── wgsl-control-flow.metal
│ │ │ ├── wgsl-conversion-float-to-int-no-f64.metal
│ │ │ ├── wgsl-conversions.metal
│ │ │ ├── wgsl-cooperative-matrix.metal
│ │ │ ├── wgsl-cross.metal
│ │ │ ├── wgsl-dualsource.metal
│ │ │ ├── wgsl-empty-if.metal
│ │ │ ├── wgsl-empty.metal
│ │ │ ├── wgsl-extra.metal
│ │ │ ├── wgsl-f16.metal
│ │ │ ├── wgsl-fragment-output.metal
│ │ │ ├── wgsl-functions-optimized-by-version.metal
│ │ │ ├── wgsl-functions-unoptimized.metal
│ │ │ ├── wgsl-functions.metal
│ │ │ ├── wgsl-globals.metal
│ │ │ ├── wgsl-image.metal
│ │ │ ├── wgsl-int64.metal
│ │ │ ├── wgsl-interface.metal
│ │ │ ├── wgsl-interpolate.metal
│ │ │ ├── wgsl-interpolate_compat.metal
│ │ │ ├── wgsl-math-functions.metal
│ │ │ ├── wgsl-memory-decorations-coherent.metal
│ │ │ ├── wgsl-msl-varyings.metal
│ │ │ ├── wgsl-msl-vpt-formats-x1.metal
│ │ │ ├── wgsl-msl-vpt-formats-x2.metal
│ │ │ ├── wgsl-msl-vpt-formats-x3.metal
│ │ │ ├── wgsl-msl-vpt-formats-x4.metal
│ │ │ ├── wgsl-msl-vpt.metal
│ │ │ ├── wgsl-multiview.metal
│ │ │ ├── wgsl-operators.metal
│ │ │ ├── wgsl-overrides-atomicCompareExchangeWeak.metal
│ │ │ ├── wgsl-overrides-ray-query.metal
│ │ │ ├── wgsl-overrides.metal
│ │ │ ├── wgsl-padding.metal
│ │ │ ├── wgsl-phony_assignment.metal
│ │ │ ├── wgsl-pointer-function-arg-restrict.metal
│ │ │ ├── wgsl-pointer-function-arg-rzsw.metal
│ │ │ ├── wgsl-pointer-function-arg.metal
│ │ │ ├── wgsl-policy-mix.metal
│ │ │ ├── wgsl-primitive-index.metal
│ │ │ ├── wgsl-quad.metal
│ │ │ ├── wgsl-ray-query-no-init-tracking.metal
│ │ │ ├── wgsl-ray-query.metal
│ │ │ ├── wgsl-resource-binding-map.metal
│ │ │ ├── wgsl-select.metal
│ │ │ ├── wgsl-shadow.metal
│ │ │ ├── wgsl-skybox.metal
│ │ │ ├── wgsl-standard.metal
│ │ │ ├── wgsl-storage-textures.metal
│ │ │ ├── wgsl-struct-layout.metal
│ │ │ ├── wgsl-subgroup-barrier.metal
│ │ │ ├── wgsl-subgroup-operations.metal
│ │ │ ├── wgsl-texture-arg.metal
│ │ │ ├── wgsl-texture-external.metal
│ │ │ ├── wgsl-type-inference.metal
│ │ │ ├── wgsl-workgroup-uniform-load-atomic.metal
│ │ │ ├── wgsl-workgroup-uniform-load.metal
│ │ │ └── wgsl-workgroup-var-init.metal
│ │ ├── spv/
│ │ │ ├── spv-barrier.spvasm
│ │ │ ├── spv-fetch_depth.spvasm
│ │ │ ├── spv-per-vertex.spvasm
│ │ │ ├── spv-subgroup-barrier.spvasm
│ │ │ ├── wgsl-6220-break-from-loop.spvasm
│ │ │ ├── wgsl-6438-conflicting-idents.spvasm
│ │ │ ├── wgsl-6772-unpack-expr-accesses.spvasm
│ │ │ ├── wgsl-7048-multiple-dynamic-1.spvasm
│ │ │ ├── wgsl-7048-multiple-dynamic-2.spvasm
│ │ │ ├── wgsl-7048-multiple-dynamic-3.spvasm
│ │ │ ├── wgsl-7995-unicode-idents.spvasm
│ │ │ ├── wgsl-8820-multiple-local-invocation-index-id.spvasm
│ │ │ ├── wgsl-abstract-types-builtins.spvasm
│ │ │ ├── wgsl-abstract-types-const.spvasm
│ │ │ ├── wgsl-abstract-types-function-calls.spvasm
│ │ │ ├── wgsl-abstract-types-let.spvasm
│ │ │ ├── wgsl-abstract-types-operators.spvasm
│ │ │ ├── wgsl-abstract-types-return.spvasm
│ │ │ ├── wgsl-abstract-types-var.spvasm
│ │ │ ├── wgsl-access.spvasm
│ │ │ ├── wgsl-aliased-ray-query.spvasm
│ │ │ ├── wgsl-array-in-ctor.spvasm
│ │ │ ├── wgsl-array-in-function-return-type.spvasm
│ │ │ ├── wgsl-atomicCompareExchange-int64.spvasm
│ │ │ ├── wgsl-atomicCompareExchange.spvasm
│ │ │ ├── wgsl-atomicOps-float32.spvasm
│ │ │ ├── wgsl-atomicOps-int64-min-max.spvasm
│ │ │ ├── wgsl-atomicOps-int64.spvasm
│ │ │ ├── wgsl-atomicOps.spvasm
│ │ │ ├── wgsl-atomicTexture-int64.spvasm
│ │ │ ├── wgsl-atomicTexture.spvasm
│ │ │ ├── wgsl-barycentrics.spvasm
│ │ │ ├── wgsl-binding-arrays.spvasm
│ │ │ ├── wgsl-binding-buffer-arrays.spvasm
│ │ │ ├── wgsl-bitcast.spvasm
│ │ │ ├── wgsl-bits.spvasm
│ │ │ ├── wgsl-boids.spvasm
│ │ │ ├── wgsl-bounds-check-image-restrict-depth.spvasm
│ │ │ ├── wgsl-bounds-check-image-restrict.spvasm
│ │ │ ├── wgsl-bounds-check-image-rzsw-depth.spvasm
│ │ │ ├── wgsl-bounds-check-image-rzsw.spvasm
│ │ │ ├── wgsl-bounds-check-restrict.spvasm
│ │ │ ├── wgsl-bounds-check-zero.spvasm
│ │ │ ├── wgsl-break-if.spvasm
│ │ │ ├── wgsl-clip-distances.spvasm
│ │ │ ├── wgsl-collatz.spvasm
│ │ │ ├── wgsl-const-exprs.spvasm
│ │ │ ├── wgsl-constructors.spvasm
│ │ │ ├── wgsl-control-flow.spvasm
│ │ │ ├── wgsl-conversion-float-to-int.spvasm
│ │ │ ├── wgsl-conversions.spvasm
│ │ │ ├── wgsl-cooperative-matrix.spvasm
│ │ │ ├── wgsl-cross.spvasm
│ │ │ ├── wgsl-debug-symbol-large-source.spvasm
│ │ │ ├── wgsl-debug-symbol-simple.spvasm
│ │ │ ├── wgsl-debug-symbol-terrain.spvasm
│ │ │ ├── wgsl-draw-index.spvasm
│ │ │ ├── wgsl-dualsource.spvasm
│ │ │ ├── wgsl-early-depth-test-conservative.spvasm
│ │ │ ├── wgsl-early-depth-test-force.spvasm
│ │ │ ├── wgsl-empty-if.spvasm
│ │ │ ├── wgsl-empty.spvasm
│ │ │ ├── wgsl-extra.spvasm
│ │ │ ├── wgsl-f16-native.spvasm
│ │ │ ├── wgsl-f16-polyfill.spvasm
│ │ │ ├── wgsl-f16.spvasm
│ │ │ ├── wgsl-f64.spvasm
│ │ │ ├── wgsl-fragment-output.spvasm
│ │ │ ├── wgsl-functions-optimized-by-capability.spvasm
│ │ │ ├── wgsl-functions-optimized-by-version.spvasm
│ │ │ ├── wgsl-functions-unoptimized.spvasm
│ │ │ ├── wgsl-functions.spvasm
│ │ │ ├── wgsl-globals.spvasm
│ │ │ ├── wgsl-image.spvasm
│ │ │ ├── wgsl-index-by-value.spvasm
│ │ │ ├── wgsl-int64.spvasm
│ │ │ ├── wgsl-interface.compute.spvasm
│ │ │ ├── wgsl-interface.fragment.spvasm
│ │ │ ├── wgsl-interface.vertex.spvasm
│ │ │ ├── wgsl-interface.vertex_two_structs.spvasm
│ │ │ ├── wgsl-interpolate.spvasm
│ │ │ ├── wgsl-interpolate_compat.spvasm
│ │ │ ├── wgsl-mat_cx2.spvasm
│ │ │ ├── wgsl-mat_cx3.spvasm
│ │ │ ├── wgsl-math-functions.spvasm
│ │ │ ├── wgsl-memory-decorations-coherent.spvasm
│ │ │ ├── wgsl-memory-decorations.spvasm
│ │ │ ├── wgsl-mesh-shader-empty.spvasm
│ │ │ ├── wgsl-mesh-shader-lines.spvasm
│ │ │ ├── wgsl-mesh-shader-points.spvasm
│ │ │ ├── wgsl-mesh-shader.spvasm
│ │ │ ├── wgsl-multiview.spvasm
│ │ │ ├── wgsl-operators.spvasm
│ │ │ ├── wgsl-overrides-atomicCompareExchangeWeak.f.spvasm
│ │ │ ├── wgsl-overrides-ray-query.main.spvasm
│ │ │ ├── wgsl-overrides.main.spvasm
│ │ │ ├── wgsl-padding.spvasm
│ │ │ ├── wgsl-per-vertex.spvasm
│ │ │ ├── wgsl-phony_assignment.spvasm
│ │ │ ├── wgsl-pointers.spvasm
│ │ │ ├── wgsl-policy-mix.spvasm
│ │ │ ├── wgsl-primitive-index.spvasm
│ │ │ ├── wgsl-quad.spvasm
│ │ │ ├── wgsl-ray-query-no-init-tracking.spvasm
│ │ │ ├── wgsl-ray-query.spvasm
│ │ │ ├── wgsl-select.spvasm
│ │ │ ├── wgsl-separate-entry-points.compute.spvasm
│ │ │ ├── wgsl-separate-entry-points.fragment.spvasm
│ │ │ ├── wgsl-shadow.spvasm
│ │ │ ├── wgsl-skybox.spvasm
│ │ │ ├── wgsl-sprite.spvasm
│ │ │ ├── wgsl-standard.spvasm
│ │ │ ├── wgsl-storage-textures.spvasm
│ │ │ ├── wgsl-struct-layout.spvasm
│ │ │ ├── wgsl-subgroup-barrier.spvasm
│ │ │ ├── wgsl-subgroup-operations.spvasm
│ │ │ ├── wgsl-texture-arg.spvasm
│ │ │ ├── wgsl-type-inference.spvasm
│ │ │ ├── wgsl-workgroup-uniform-load-atomic.spvasm
│ │ │ ├── wgsl-workgroup-uniform-load.spvasm
│ │ │ └── wgsl-workgroup-var-init.spvasm
│ │ └── wgsl/
│ │ ├── glsl-210-bevy-2d-shader.frag.wgsl
│ │ ├── glsl-210-bevy-2d-shader.vert.wgsl
│ │ ├── glsl-210-bevy-shader.vert.wgsl
│ │ ├── glsl-246-collatz.comp.wgsl
│ │ ├── glsl-277-casting.frag.wgsl
│ │ ├── glsl-280-matrix-cast.frag.wgsl
│ │ ├── glsl-484-preprocessor-if.frag.wgsl
│ │ ├── glsl-5246-dual-iteration.frag.wgsl
│ │ ├── glsl-800-out-of-bounds-panic.vert.wgsl
│ │ ├── glsl-896-push-constant.frag.wgsl
│ │ ├── glsl-900-implicit-conversions.frag.wgsl
│ │ ├── glsl-901-lhs-field-select.frag.wgsl
│ │ ├── glsl-931-constant-emitting.frag.wgsl
│ │ ├── glsl-932-for-loop-if.frag.wgsl
│ │ ├── glsl-anonymous-entry-point-type.frag.wgsl
│ │ ├── glsl-bevy-pbr.frag.wgsl
│ │ ├── glsl-bevy-pbr.vert.wgsl
│ │ ├── glsl-bits.frag.wgsl
│ │ ├── glsl-bool-select.frag.wgsl
│ │ ├── glsl-buffer.frag.wgsl
│ │ ├── glsl-clamp-splat.vert.wgsl
│ │ ├── glsl-const-global-swizzle.frag.wgsl
│ │ ├── glsl-constant-array-size.frag.wgsl
│ │ ├── glsl-declarations.frag.wgsl
│ │ ├── glsl-double-math-functions.frag.wgsl
│ │ ├── glsl-dual-source-blending.frag.wgsl
│ │ ├── glsl-expressions.frag.wgsl
│ │ ├── glsl-f16-glsl.comp.wgsl
│ │ ├── glsl-fma.frag.wgsl
│ │ ├── glsl-functions_call.frag.wgsl
│ │ ├── glsl-global-constant-array.frag.wgsl
│ │ ├── glsl-images.frag.wgsl
│ │ ├── glsl-inverse-polyfill.frag.wgsl
│ │ ├── glsl-local-var-init-in-loop.comp.wgsl
│ │ ├── glsl-long-form-matrix.frag.wgsl
│ │ ├── glsl-math-functions.frag.wgsl
│ │ ├── glsl-multipart-for-loop.frag.wgsl
│ │ ├── glsl-prepostfix.frag.wgsl
│ │ ├── glsl-quad_glsl.frag.wgsl
│ │ ├── glsl-quad_glsl.vert.wgsl
│ │ ├── glsl-sampler-functions.frag.wgsl
│ │ ├── glsl-samplers.frag.wgsl
│ │ ├── glsl-spec-constant.frag.wgsl
│ │ ├── glsl-statements.frag.wgsl
│ │ ├── glsl-vector-functions.frag.wgsl
│ │ ├── spv-8151-barrier-reorder.wgsl
│ │ ├── spv-atomic_compare_exchange.wgsl
│ │ ├── spv-atomic_exchange.wgsl
│ │ ├── spv-atomic_global_struct_field_vertex.wgsl
│ │ ├── spv-atomic_i_add_sub.wgsl
│ │ ├── spv-atomic_i_decrement.wgsl
│ │ ├── spv-atomic_i_increment.wgsl
│ │ ├── spv-atomic_load_and_store.wgsl
│ │ ├── spv-barrier.wgsl
│ │ ├── spv-binding-arrays.dynamic.wgsl
│ │ ├── spv-binding-arrays.runtime.wgsl
│ │ ├── spv-binding-arrays.static.wgsl
│ │ ├── spv-builtin-accessed-outside-entrypoint.wgsl
│ │ ├── spv-do-while.wgsl
│ │ ├── spv-dual-source-blending.wgsl
│ │ ├── spv-empty-global-name.wgsl
│ │ ├── spv-f16-spv.wgsl
│ │ ├── spv-fetch_depth.wgsl
│ │ ├── spv-gather-cmp.wgsl
│ │ ├── spv-gather.wgsl
│ │ ├── spv-inv-hyperbolic-trig-functions.wgsl
│ │ ├── spv-load-ms-texture.wgsl
│ │ ├── spv-non-semantic-debug.wgsl
│ │ ├── spv-per-vertex.wgsl
│ │ ├── spv-quad-vert.wgsl
│ │ ├── spv-subgroup-barrier.wgsl
│ │ ├── spv-subgroup-operations-s.wgsl
│ │ ├── spv-unnamed-gl-per-vertex.wgsl
│ │ ├── wgsl-6438-conflicting-idents.wgsl
│ │ ├── wgsl-6772-unpack-expr-accesses.wgsl
│ │ ├── wgsl-7995-unicode-idents.wgsl
│ │ ├── wgsl-8820-multiple-local-invocation-index-id.wgsl
│ │ ├── wgsl-abstract-types-atomic.wgsl
│ │ ├── wgsl-abstract-types-builtins.wgsl
│ │ ├── wgsl-abstract-types-const.wgsl
│ │ ├── wgsl-abstract-types-function-calls.wgsl
│ │ ├── wgsl-abstract-types-let.wgsl
│ │ ├── wgsl-abstract-types-operators.wgsl
│ │ ├── wgsl-abstract-types-return.wgsl
│ │ ├── wgsl-abstract-types-var.wgsl
│ │ ├── wgsl-access.wgsl
│ │ ├── wgsl-array-in-ctor.wgsl
│ │ ├── wgsl-array-in-function-return-type.wgsl
│ │ ├── wgsl-atomicCompareExchange-int64.wgsl
│ │ ├── wgsl-atomicCompareExchange.wgsl
│ │ ├── wgsl-atomicOps-float32.wgsl
│ │ ├── wgsl-atomicOps-int64-min-max.wgsl
│ │ ├── wgsl-atomicOps-int64.wgsl
│ │ ├── wgsl-atomicOps.wgsl
│ │ ├── wgsl-atomicTexture-int64.wgsl
│ │ ├── wgsl-atomicTexture.wgsl
│ │ ├── wgsl-barycentrics.wgsl
│ │ ├── wgsl-binding-arrays.wgsl
│ │ ├── wgsl-binding-buffer-arrays.wgsl
│ │ ├── wgsl-bitcast.wgsl
│ │ ├── wgsl-bits.wgsl
│ │ ├── wgsl-boids.wgsl
│ │ ├── wgsl-break-if.wgsl
│ │ ├── wgsl-clip-distances.wgsl
│ │ ├── wgsl-collatz.wgsl
│ │ ├── wgsl-const-exprs.wgsl
│ │ ├── wgsl-const_assert.wgsl
│ │ ├── wgsl-constructors.wgsl
│ │ ├── wgsl-control-flow.wgsl
│ │ ├── wgsl-conversion-float-to-int.wgsl
│ │ ├── wgsl-conversions.wgsl
│ │ ├── wgsl-cooperative-matrix.wgsl
│ │ ├── wgsl-cross.wgsl
│ │ ├── wgsl-draw-index.wgsl
│ │ ├── wgsl-dualsource.wgsl
│ │ ├── wgsl-empty-if.wgsl
│ │ ├── wgsl-empty.wgsl
│ │ ├── wgsl-extra.wgsl
│ │ ├── wgsl-f16.wgsl
│ │ ├── wgsl-f64.wgsl
│ │ ├── wgsl-fragment-output.wgsl
│ │ ├── wgsl-functions.wgsl
│ │ ├── wgsl-globals.wgsl
│ │ ├── wgsl-image.wgsl
│ │ ├── wgsl-int64.wgsl
│ │ ├── wgsl-interface.wgsl
│ │ ├── wgsl-interpolate.wgsl
│ │ ├── wgsl-interpolate_compat.wgsl
│ │ ├── wgsl-lexical-scopes.wgsl
│ │ ├── wgsl-local-const.wgsl
│ │ ├── wgsl-math-functions.wgsl
│ │ ├── wgsl-memory-decorations-coherent.wgsl
│ │ ├── wgsl-memory-decorations.wgsl
│ │ ├── wgsl-mesh-shader-empty.wgsl
│ │ ├── wgsl-mesh-shader-lines.wgsl
│ │ ├── wgsl-mesh-shader-points.wgsl
│ │ ├── wgsl-mesh-shader.wgsl
│ │ ├── wgsl-module-scope.wgsl
│ │ ├── wgsl-multiview.wgsl
│ │ ├── wgsl-operators.wgsl
│ │ ├── wgsl-padding.wgsl
│ │ ├── wgsl-per-vertex.wgsl
│ │ ├── wgsl-phony_assignment.wgsl
│ │ ├── wgsl-pointer-function-arg.wgsl
│ │ ├── wgsl-pointers.wgsl
│ │ ├── wgsl-primitive-index.wgsl
│ │ ├── wgsl-quad.wgsl
│ │ ├── wgsl-ray-tracing-pipeline.wgsl
│ │ ├── wgsl-select.wgsl
│ │ ├── wgsl-shadow.wgsl
│ │ ├── wgsl-skybox.wgsl
│ │ ├── wgsl-standard.wgsl
│ │ ├── wgsl-struct-layout.wgsl
│ │ ├── wgsl-subgroup-barrier.wgsl
│ │ ├── wgsl-subgroup-operations.wgsl
│ │ ├── wgsl-texture-arg.wgsl
│ │ ├── wgsl-texture-external.wgsl
│ │ ├── wgsl-type-alias.wgsl
│ │ ├── wgsl-type-inference.wgsl
│ │ ├── wgsl-workgroup-uniform-load-atomic.wgsl
│ │ ├── wgsl-workgroup-uniform-load.wgsl
│ │ └── wgsl-workgroup-var-init.wgsl
│ └── xtask/
│ ├── .gitignore
│ ├── Cargo.toml
│ └── src/
│ ├── cli.rs
│ ├── fs.rs
│ ├── glob.rs
│ ├── jobserver.rs
│ ├── main.rs
│ ├── path.rs
│ ├── process.rs
│ └── validate.rs
├── naga-cli/
│ ├── Cargo.toml
│ ├── LICENSE.APACHE
│ ├── LICENSE.MIT
│ └── src/
│ └── bin/
│ └── naga.rs
├── naga-test/
│ ├── Cargo.toml
│ └── src/
│ └── lib.rs
├── player/
│ ├── Cargo.toml
│ ├── README.md
│ ├── src/
│ │ ├── bin/
│ │ │ └── play.rs
│ │ └── lib.rs
│ └── tests/
│ └── player/
│ ├── data/
│ │ ├── all.ron
│ │ ├── bind-group.ron
│ │ ├── buffer-copy.ron
│ │ ├── clear-buffer-texture.ron
│ │ ├── empty.wgsl
│ │ ├── pipeline-statistics-query.ron
│ │ ├── quad.ron
│ │ ├── quad.wgsl
│ │ ├── zero-init-buffer-for-binding.wgsl
│ │ ├── zero-init-buffer.ron
│ │ ├── zero-init-texture-binding.ron
│ │ ├── zero-init-texture-binding.wgsl
│ │ ├── zero-init-texture-copytobuffer.ron
│ │ └── zero-init-texture-rendertarget.ron
│ └── main.rs
├── renovate.json
├── rust-toolchain.toml
├── rustfmt.toml
├── taplo.toml
├── tests/
│ ├── Cargo.toml
│ ├── src/
│ │ ├── config.rs
│ │ ├── copy_texture_to_buffer.wgsl
│ │ ├── expectations.rs
│ │ ├── image.rs
│ │ ├── init.rs
│ │ ├── isolation.rs
│ │ ├── lib.rs
│ │ ├── native.rs
│ │ ├── params.rs
│ │ ├── poll.rs
│ │ ├── report.rs
│ │ └── run.rs
│ └── tests/
│ ├── wgpu-compile/
│ │ ├── fail/
│ │ │ ├── cpass_lifetime.rs
│ │ │ ├── cpass_lifetime.stderr
│ │ │ ├── rpass_lifetime.rs
│ │ │ └── rpass_lifetime.stderr
│ │ └── main.rs
│ ├── wgpu-dependency/
│ │ └── main.rs
│ ├── wgpu-gpu/
│ │ ├── bgra8unorm_storage.rs
│ │ ├── bind_group_layout_dedup.rs
│ │ ├── bind_groups.rs
│ │ ├── binding_array/
│ │ │ ├── buffers.rs
│ │ │ ├── mod.rs
│ │ │ ├── sampled_textures.rs
│ │ │ ├── samplers.rs
│ │ │ ├── storage_textures.rs
│ │ │ └── tlas.rs
│ │ ├── buffer.rs
│ │ ├── buffer_copy.rs
│ │ ├── buffer_usages.rs
│ │ ├── clear_texture.rs
│ │ ├── clip_distances.rs
│ │ ├── cloneable_types.rs
│ │ ├── compute_pass_ownership.rs
│ │ ├── create_surface_error.rs
│ │ ├── device.rs
│ │ ├── dispatch_workgroups_indirect.rs
│ │ ├── draw_index.rs
│ │ ├── draw_indirect.rs
│ │ ├── dual_source_blending.rs
│ │ ├── encoder.rs
│ │ ├── external_image_copy.rs
│ │ ├── external_texture/
│ │ │ ├── dimensions.wgsl
│ │ │ ├── load.wgsl
│ │ │ ├── mod.rs
│ │ │ └── sample.wgsl
│ │ ├── float32_filterable.rs
│ │ ├── image_atomics/
│ │ │ ├── image_32_atomics.wgsl
│ │ │ ├── image_64_atomics.wgsl
│ │ │ └── mod.rs
│ │ ├── immediates.rs
│ │ ├── instance.rs
│ │ ├── life_cycle.rs
│ │ ├── main.rs
│ │ ├── mem_leaks.rs
│ │ ├── mesh_shader/
│ │ │ ├── basic.hlsl
│ │ │ ├── mod.rs
│ │ │ ├── shader.metal
│ │ │ └── shader.wgsl
│ │ ├── multiview/
│ │ │ ├── mod.rs
│ │ │ └── shader.wgsl
│ │ ├── naga_capabilities.rs
│ │ ├── occlusion_query/
│ │ │ ├── mod.rs
│ │ │ └── shader.wgsl
│ │ ├── oob_indexing.rs
│ │ ├── oom.rs
│ │ ├── pass_ops/
│ │ │ └── mod.rs
│ │ ├── passthrough/
│ │ │ ├── mod.rs
│ │ │ ├── shader.frag
│ │ │ ├── shader.hlsl
│ │ │ ├── shader.metal
│ │ │ ├── shader.vert
│ │ │ └── shader.wgsl
│ │ ├── per_vertex/
│ │ │ ├── mod.rs
│ │ │ └── per_vertex.wgsl
│ │ ├── pipeline.rs
│ │ ├── pipeline_cache.rs
│ │ ├── planar_texture/
│ │ │ ├── mod.rs
│ │ │ ├── planar_texture_rendering.wgsl
│ │ │ └── planar_texture_sampling.wgsl
│ │ ├── poll.rs
│ │ ├── primitive_index.rs
│ │ ├── query_set.rs
│ │ ├── queue_transfer.rs
│ │ ├── ray_tracing/
│ │ │ ├── as_build.rs
│ │ │ ├── as_create.rs
│ │ │ ├── as_use_after_free.rs
│ │ │ ├── limits.rs
│ │ │ ├── mod.rs
│ │ │ ├── scene/
│ │ │ │ ├── mesh_gen.rs
│ │ │ │ └── mod.rs
│ │ │ ├── shader.rs
│ │ │ └── shader.wgsl
│ │ ├── regression/
│ │ │ ├── issue_3349.fs.wgsl
│ │ │ ├── issue_3349.rs
│ │ │ ├── issue_3349.vs.wgsl
│ │ │ ├── issue_3457.rs
│ │ │ ├── issue_3457.wgsl
│ │ │ ├── issue_4024.rs
│ │ │ ├── issue_4122.rs
│ │ │ ├── issue_4485.rs
│ │ │ ├── issue_4485.wgsl
│ │ │ ├── issue_4514.rs
│ │ │ ├── issue_4514.wgsl
│ │ │ ├── issue_5553.rs
│ │ │ ├── issue_5553.wgsl
│ │ │ ├── issue_6317.rs
│ │ │ ├── issue_6467.rs
│ │ │ └── issue_6827.rs
│ │ ├── render_pass_ownership.rs
│ │ ├── render_target.rs
│ │ ├── resource_descriptor_accessor.rs
│ │ ├── resource_error.rs
│ │ ├── samplers.rs
│ │ ├── scissor_tests/
│ │ │ ├── mod.rs
│ │ │ └── solid_white.wgsl
│ │ ├── shader/
│ │ │ ├── array_size_overrides.rs
│ │ │ ├── compilation_messages/
│ │ │ │ ├── error_shader.wgsl
│ │ │ │ ├── mod.rs
│ │ │ │ └── successful_shader.wgsl
│ │ │ ├── data_builtins.rs
│ │ │ ├── mod.rs
│ │ │ ├── numeric_builtins.rs
│ │ │ ├── shader_test.wgsl
│ │ │ ├── struct_layout.rs
│ │ │ ├── workgroup_size_overrides.rs
│ │ │ ├── zero_init_workgroup_mem.rs
│ │ │ └── zero_init_workgroup_mem.wgsl
│ │ ├── shader_barycentric/
│ │ │ ├── barycentric.wgsl
│ │ │ └── mod.rs
│ │ ├── shader_primitive_index/
│ │ │ ├── mod.rs
│ │ │ └── primitive_index.wgsl
│ │ ├── shader_view_format/
│ │ │ ├── mod.rs
│ │ │ └── view_format.wgsl
│ │ ├── subgroup_operations/
│ │ │ ├── mod.rs
│ │ │ └── shader.wgsl
│ │ ├── texture_binding/
│ │ │ ├── mod.rs
│ │ │ ├── shader.wgsl
│ │ │ └── single_scalar.wgsl
│ │ ├── texture_blit.rs
│ │ ├── texture_bounds.rs
│ │ ├── texture_view_creation.rs
│ │ ├── timestamp_normalization/
│ │ │ ├── mod.rs
│ │ │ ├── shift_right_u96.wgsl
│ │ │ ├── u64_mul_u32.wgsl
│ │ │ └── utils.rs
│ │ ├── timestamp_query.rs
│ │ ├── transfer.rs
│ │ ├── transient.rs
│ │ ├── transition_resources.rs
│ │ ├── vertex_formats/
│ │ │ ├── draw.vert.wgsl
│ │ │ └── mod.rs
│ │ ├── vertex_indices/
│ │ │ ├── draw.vert.wgsl
│ │ │ └── mod.rs
│ │ ├── vertex_state.rs
│ │ ├── write_texture.rs
│ │ └── zero_init_texture_after_discard.rs
│ ├── wgpu-validation/
│ │ ├── api/
│ │ │ ├── binding_arrays.rs
│ │ │ ├── buffer.rs
│ │ │ ├── buffer_mapping.rs
│ │ │ ├── buffer_slice.rs
│ │ │ ├── command_buffer_actions.rs
│ │ │ ├── device.rs
│ │ │ ├── encoding.rs
│ │ │ ├── error_scopes.rs
│ │ │ ├── experimental.rs
│ │ │ ├── external_texture.rs
│ │ │ ├── instance.rs
│ │ │ ├── mod.rs
│ │ │ ├── render_pipeline.rs
│ │ │ └── texture.rs
│ │ ├── main.rs
│ │ ├── noop.rs
│ │ └── util.rs
│ └── wgpu_trace.rs
├── typos.toml
├── wgpu/
│ ├── Cargo.toml
│ ├── LICENSE.APACHE
│ ├── LICENSE.MIT
│ ├── build.rs
│ └── src/
│ ├── api/
│ │ ├── adapter.rs
│ │ ├── bind_group.rs
│ │ ├── bind_group_layout.rs
│ │ ├── blas.rs
│ │ ├── buffer.rs
│ │ ├── command_buffer.rs
│ │ ├── command_buffer_actions.rs
│ │ ├── command_encoder.rs
│ │ ├── common_pipeline.rs
│ │ ├── compute_pass.rs
│ │ ├── compute_pipeline.rs
│ │ ├── device.rs
│ │ ├── external_texture.rs
│ │ ├── instance.rs
│ │ ├── mod.rs
│ │ ├── pipeline_cache.rs
│ │ ├── pipeline_layout.rs
│ │ ├── query_set.rs
│ │ ├── queue.rs
│ │ ├── render_bundle.rs
│ │ ├── render_bundle_encoder.rs
│ │ ├── render_pass.rs
│ │ ├── render_pipeline.rs
│ │ ├── sampler.rs
│ │ ├── shader_module.rs
│ │ ├── surface.rs
│ │ ├── surface_texture.rs
│ │ ├── texture.rs
│ │ ├── texture_view.rs
│ │ └── tlas.rs
│ ├── backend/
│ │ ├── custom.rs
│ │ ├── mod.rs
│ │ ├── webgpu/
│ │ │ ├── defined_non_null_js_value.rs
│ │ │ ├── ext_bindings.rs
│ │ │ └── webgpu_sys/
│ │ │ ├── gen_Gpu.rs
│ │ │ ├── gen_GpuAdapter.rs
│ │ │ ├── gen_GpuAdapterInfo.rs
│ │ │ ├── gen_GpuAddressMode.rs
│ │ │ ├── gen_GpuAutoLayoutMode.rs
│ │ │ ├── gen_GpuBindGroup.rs
│ │ │ ├── gen_GpuBindGroupDescriptor.rs
│ │ │ ├── gen_GpuBindGroupEntry.rs
│ │ │ ├── gen_GpuBindGroupLayout.rs
│ │ │ ├── gen_GpuBindGroupLayoutDescriptor.rs
│ │ │ ├── gen_GpuBindGroupLayoutEntry.rs
│ │ │ ├── gen_GpuBlendComponent.rs
│ │ │ ├── gen_GpuBlendFactor.rs
│ │ │ ├── gen_GpuBlendOperation.rs
│ │ │ ├── gen_GpuBlendState.rs
│ │ │ ├── gen_GpuBuffer.rs
│ │ │ ├── gen_GpuBufferBinding.rs
│ │ │ ├── gen_GpuBufferBindingLayout.rs
│ │ │ ├── gen_GpuBufferBindingType.rs
│ │ │ ├── gen_GpuBufferDescriptor.rs
│ │ │ ├── gen_GpuBufferMapState.rs
│ │ │ ├── gen_GpuCanvasAlphaMode.rs
│ │ │ ├── gen_GpuCanvasConfiguration.rs
│ │ │ ├── gen_GpuCanvasContext.rs
│ │ │ ├── gen_GpuCanvasToneMapping.rs
│ │ │ ├── gen_GpuCanvasToneMappingMode.rs
│ │ │ ├── gen_GpuColorDict.rs
│ │ │ ├── gen_GpuColorTargetState.rs
│ │ │ ├── gen_GpuCommandBuffer.rs
│ │ │ ├── gen_GpuCommandBufferDescriptor.rs
│ │ │ ├── gen_GpuCommandEncoder.rs
│ │ │ ├── gen_GpuCommandEncoderDescriptor.rs
│ │ │ ├── gen_GpuCompareFunction.rs
│ │ │ ├── gen_GpuCompilationInfo.rs
│ │ │ ├── gen_GpuCompilationMessage.rs
│ │ │ ├── gen_GpuCompilationMessageType.rs
│ │ │ ├── gen_GpuComputePassDescriptor.rs
│ │ │ ├── gen_GpuComputePassEncoder.rs
│ │ │ ├── gen_GpuComputePassTimestampWrites.rs
│ │ │ ├── gen_GpuComputePipeline.rs
│ │ │ ├── gen_GpuComputePipelineDescriptor.rs
│ │ │ ├── gen_GpuCopyExternalImageDestInfo.rs
│ │ │ ├── gen_GpuCopyExternalImageSourceInfo.rs
│ │ │ ├── gen_GpuCullMode.rs
│ │ │ ├── gen_GpuDepthStencilState.rs
│ │ │ ├── gen_GpuDevice.rs
│ │ │ ├── gen_GpuDeviceDescriptor.rs
│ │ │ ├── gen_GpuDeviceLostInfo.rs
│ │ │ ├── gen_GpuDeviceLostReason.rs
│ │ │ ├── gen_GpuError.rs
│ │ │ ├── gen_GpuErrorFilter.rs
│ │ │ ├── gen_GpuExtent3dDict.rs
│ │ │ ├── gen_GpuExternalTexture.rs
│ │ │ ├── gen_GpuExternalTextureBindingLayout.rs
│ │ │ ├── gen_GpuExternalTextureDescriptor.rs
│ │ │ ├── gen_GpuFeatureName.rs
│ │ │ ├── gen_GpuFilterMode.rs
│ │ │ ├── gen_GpuFragmentState.rs
│ │ │ ├── gen_GpuFrontFace.rs
│ │ │ ├── gen_GpuIndexFormat.rs
│ │ │ ├── gen_GpuLoadOp.rs
│ │ │ ├── gen_GpuMipmapFilterMode.rs
│ │ │ ├── gen_GpuMultisampleState.rs
│ │ │ ├── gen_GpuObjectDescriptorBase.rs
│ │ │ ├── gen_GpuOrigin2dDict.rs
│ │ │ ├── gen_GpuOrigin3dDict.rs
│ │ │ ├── gen_GpuOutOfMemoryError.rs
│ │ │ ├── gen_GpuPipelineDescriptorBase.rs
│ │ │ ├── gen_GpuPipelineLayout.rs
│ │ │ ├── gen_GpuPipelineLayoutDescriptor.rs
│ │ │ ├── gen_GpuPowerPreference.rs
│ │ │ ├── gen_GpuPrimitiveState.rs
│ │ │ ├── gen_GpuPrimitiveTopology.rs
│ │ │ ├── gen_GpuProgrammableStage.rs
│ │ │ ├── gen_GpuQuerySet.rs
│ │ │ ├── gen_GpuQuerySetDescriptor.rs
│ │ │ ├── gen_GpuQueryType.rs
│ │ │ ├── gen_GpuQueue.rs
│ │ │ ├── gen_GpuQueueDescriptor.rs
│ │ │ ├── gen_GpuRenderBundle.rs
│ │ │ ├── gen_GpuRenderBundleDescriptor.rs
│ │ │ ├── gen_GpuRenderBundleEncoder.rs
│ │ │ ├── gen_GpuRenderBundleEncoderDescriptor.rs
│ │ │ ├── gen_GpuRenderPassColorAttachment.rs
│ │ │ ├── gen_GpuRenderPassDepthStencilAttachment.rs
│ │ │ ├── gen_GpuRenderPassDescriptor.rs
│ │ │ ├── gen_GpuRenderPassEncoder.rs
│ │ │ ├── gen_GpuRenderPassTimestampWrites.rs
│ │ │ ├── gen_GpuRenderPipeline.rs
│ │ │ ├── gen_GpuRenderPipelineDescriptor.rs
│ │ │ ├── gen_GpuRequestAdapterOptions.rs
│ │ │ ├── gen_GpuSampler.rs
│ │ │ ├── gen_GpuSamplerBindingLayout.rs
│ │ │ ├── gen_GpuSamplerBindingType.rs
│ │ │ ├── gen_GpuSamplerDescriptor.rs
│ │ │ ├── gen_GpuShaderModule.rs
│ │ │ ├── gen_GpuShaderModuleDescriptor.rs
│ │ │ ├── gen_GpuStencilFaceState.rs
│ │ │ ├── gen_GpuStencilOperation.rs
│ │ │ ├── gen_GpuStorageTextureAccess.rs
│ │ │ ├── gen_GpuStorageTextureBindingLayout.rs
│ │ │ ├── gen_GpuStoreOp.rs
│ │ │ ├── gen_GpuSupportedFeatures.rs
│ │ │ ├── gen_GpuSupportedLimits.rs
│ │ │ ├── gen_GpuTexelCopyBufferInfo.rs
│ │ │ ├── gen_GpuTexelCopyBufferLayout.rs
│ │ │ ├── gen_GpuTexelCopyTextureInfo.rs
│ │ │ ├── gen_GpuTexture.rs
│ │ │ ├── gen_GpuTextureAspect.rs
│ │ │ ├── gen_GpuTextureBindingLayout.rs
│ │ │ ├── gen_GpuTextureDescriptor.rs
│ │ │ ├── gen_GpuTextureDimension.rs
│ │ │ ├── gen_GpuTextureFormat.rs
│ │ │ ├── gen_GpuTextureSampleType.rs
│ │ │ ├── gen_GpuTextureView.rs
│ │ │ ├── gen_GpuTextureViewDescriptor.rs
│ │ │ ├── gen_GpuTextureViewDimension.rs
│ │ │ ├── gen_GpuUncapturedErrorEvent.rs
│ │ │ ├── gen_GpuUncapturedErrorEventInit.rs
│ │ │ ├── gen_GpuValidationError.rs
│ │ │ ├── gen_GpuVertexAttribute.rs
│ │ │ ├── gen_GpuVertexBufferLayout.rs
│ │ │ ├── gen_GpuVertexFormat.rs
│ │ │ ├── gen_GpuVertexState.rs
│ │ │ ├── gen_GpuVertexStepMode.rs
│ │ │ ├── gen_WgslLanguageFeatures.rs
│ │ │ ├── gen_gpu_map_mode.rs
│ │ │ └── mod.rs
│ │ ├── webgpu.rs
│ │ ├── wgpu_core/
│ │ │ └── thread_id.rs
│ │ └── wgpu_core.rs
│ ├── cmp.rs
│ ├── dispatch.rs
│ ├── lib.rs
│ ├── macros/
│ │ ├── be-aligned.spv
│ │ ├── le-aligned.spv
│ │ └── mod.rs
│ └── util/
│ ├── belt.rs
│ ├── blit.wgsl
│ ├── device.rs
│ ├── encoder.rs
│ ├── init.rs
│ ├── mod.rs
│ ├── mutex.rs
│ ├── panicking.rs
│ ├── spirv.rs
│ └── texture_blitter.rs
├── wgpu-core/
│ ├── Cargo.toml
│ ├── LICENSE.APACHE
│ ├── LICENSE.MIT
│ ├── build.rs
│ ├── platform-deps/
│ │ ├── apple/
│ │ │ ├── Cargo.toml
│ │ │ ├── LICENSE.APACHE
│ │ │ ├── LICENSE.MIT
│ │ │ ├── README.md
│ │ │ └── src/
│ │ │ └── lib.rs
│ │ ├── emscripten/
│ │ │ ├── Cargo.toml
│ │ │ ├── LICENSE.APACHE
│ │ │ ├── LICENSE.MIT
│ │ │ ├── README.md
│ │ │ └── src/
│ │ │ └── lib.rs
│ │ ├── wasm/
│ │ │ ├── Cargo.toml
│ │ │ ├── LICENSE.APACHE
│ │ │ ├── LICENSE.MIT
│ │ │ ├── README.md
│ │ │ └── src/
│ │ │ └── lib.rs
│ │ └── windows-linux-android/
│ │ ├── Cargo.toml
│ │ ├── LICENSE.APACHE
│ │ ├── LICENSE.MIT
│ │ ├── README.md
│ │ └── src/
│ │ └── lib.rs
│ └── src/
│ ├── as_hal.rs
│ ├── binding_model.rs
│ ├── command/
│ │ ├── allocator.rs
│ │ ├── bind.rs
│ │ ├── bundle.rs
│ │ ├── clear.rs
│ │ ├── compute.rs
│ │ ├── compute_command.rs
│ │ ├── draw.rs
│ │ ├── encoder.rs
│ │ ├── encoder_command.rs
│ │ ├── ffi.rs
│ │ ├── memory_init.rs
│ │ ├── mod.rs
│ │ ├── pass.rs
│ │ ├── query.rs
│ │ ├── ray_tracing.rs
│ │ ├── render.rs
│ │ ├── render_command.rs
│ │ ├── timestamp_writes.rs
│ │ ├── transfer.rs
│ │ └── transition_resources.rs
│ ├── conv.rs
│ ├── device/
│ │ ├── bgl.rs
│ │ ├── global.rs
│ │ ├── life.rs
│ │ ├── mod.rs
│ │ ├── queue.rs
│ │ ├── ray_tracing.rs
│ │ ├── resource.rs
│ │ ├── trace/
│ │ │ ├── record.rs
│ │ │ └── replay.rs
│ │ └── trace.rs
│ ├── error.rs
│ ├── global.rs
│ ├── hash_utils.rs
│ ├── hub.rs
│ ├── id.rs
│ ├── identity.rs
│ ├── indirect_validation/
│ │ ├── dispatch.rs
│ │ ├── draw.rs
│ │ ├── mod.rs
│ │ ├── utils.rs
│ │ └── validate_draw.wgsl
│ ├── init_tracker/
│ │ ├── buffer.rs
│ │ ├── mod.rs
│ │ └── texture.rs
│ ├── instance.rs
│ ├── lib.rs
│ ├── lock/
│ │ ├── mod.rs
│ │ ├── observing.rs
│ │ ├── rank.rs
│ │ ├── ranked.rs
│ │ └── vanilla.rs
│ ├── pipeline.rs
│ ├── pipeline_cache.rs
│ ├── pool.rs
│ ├── present.rs
│ ├── ray_tracing.rs
│ ├── registry.rs
│ ├── resource.rs
│ ├── scratch.rs
│ ├── snatch.rs
│ ├── storage.rs
│ ├── timestamp_normalization/
│ │ ├── common.wgsl
│ │ ├── mod.rs
│ │ └── timestamp_normalization.wgsl
│ ├── track/
│ │ ├── blas.rs
│ │ ├── buffer.rs
│ │ ├── metadata.rs
│ │ ├── mod.rs
│ │ ├── range.rs
│ │ ├── stateless.rs
│ │ └── texture.rs
│ ├── validation/
│ │ └── shader_io_deductions.rs
│ ├── validation.rs
│ └── weak_vec.rs
├── wgpu-hal/
│ ├── Cargo.toml
│ ├── LICENSE.APACHE
│ ├── LICENSE.MIT
│ ├── README.md
│ ├── build.rs
│ ├── examples/
│ │ ├── halmark/
│ │ │ ├── main.rs
│ │ │ └── shader.wgsl
│ │ ├── raw-gles.em.html
│ │ ├── raw-gles.rs
│ │ └── ray-traced-triangle/
│ │ ├── main.rs
│ │ └── shader.wgsl
│ └── src/
│ ├── auxil/
│ │ ├── dxgi/
│ │ │ ├── conv.rs
│ │ │ ├── exception.rs
│ │ │ ├── factory.rs
│ │ │ ├── mod.rs
│ │ │ ├── name.rs
│ │ │ ├── result.rs
│ │ │ └── time.rs
│ │ ├── mod.rs
│ │ └── renderdoc.rs
│ ├── dx12/
│ │ ├── adapter.rs
│ │ ├── command.rs
│ │ ├── conv.rs
│ │ ├── dcomp.rs
│ │ ├── descriptor.rs
│ │ ├── device.rs
│ │ ├── device_creation.rs
│ │ ├── instance.rs
│ │ ├── mod.rs
│ │ ├── pipeline_desc.rs
│ │ ├── sampler.rs
│ │ ├── shader_compilation.rs
│ │ ├── suballocation.rs
│ │ ├── types.rs
│ │ └── view.rs
│ ├── dynamic/
│ │ ├── adapter.rs
│ │ ├── command.rs
│ │ ├── device.rs
│ │ ├── instance.rs
│ │ ├── mod.rs
│ │ ├── queue.rs
│ │ └── surface.rs
│ ├── gles/
│ │ ├── adapter.rs
│ │ ├── command.rs
│ │ ├── conv.rs
│ │ ├── device.rs
│ │ ├── egl.rs
│ │ ├── emscripten.rs
│ │ ├── fence.rs
│ │ ├── mod.rs
│ │ ├── queue.rs
│ │ ├── shaders/
│ │ │ ├── clear.frag
│ │ │ ├── clear.vert
│ │ │ ├── srgb_present.frag
│ │ │ └── srgb_present.vert
│ │ ├── web.rs
│ │ └── wgl.rs
│ ├── lib.rs
│ ├── metal/
│ │ ├── adapter.rs
│ │ ├── command.rs
│ │ ├── conv.rs
│ │ ├── device.rs
│ │ ├── library_from_metallib.rs
│ │ ├── mod.rs
│ │ ├── surface.rs
│ │ └── time.rs
│ ├── noop/
│ │ ├── buffer.rs
│ │ ├── command.rs
│ │ └── mod.rs
│ ├── validation_canary.rs
│ └── vulkan/
│ ├── adapter.rs
│ ├── command.rs
│ ├── conv.rs
│ ├── device.rs
│ ├── drm.rs
│ ├── instance.rs
│ ├── mod.rs
│ ├── sampler.rs
│ ├── semaphore_list.rs
│ └── swapchain/
│ ├── mod.rs
│ └── native.rs
├── wgpu-info/
│ ├── Cargo.toml
│ ├── LICENSE.APACHE
│ ├── LICENSE.MIT
│ ├── README.md
│ └── src/
│ ├── cli.rs
│ ├── human.rs
│ ├── main.rs
│ ├── report.rs
│ ├── tests.rs
│ └── texture.rs
├── wgpu-macros/
│ ├── Cargo.toml
│ └── src/
│ └── lib.rs
├── wgpu-naga-bridge/
│ ├── Cargo.toml
│ ├── LICENSE.APACHE
│ ├── LICENSE.MIT
│ └── src/
│ └── lib.rs
├── wgpu-types/
│ ├── Cargo.toml
│ ├── LICENSE.APACHE
│ ├── LICENSE.MIT
│ └── src/
│ ├── adapter.rs
│ ├── assertions.rs
│ ├── backend.rs
│ ├── binding.rs
│ ├── buffer.rs
│ ├── cast_utils.rs
│ ├── counters.rs
│ ├── device.rs
│ ├── env.rs
│ ├── error.rs
│ ├── features.rs
│ ├── instance.rs
│ ├── lib.rs
│ ├── limits.rs
│ ├── math.rs
│ ├── origin_extent.rs
│ ├── ray_tracing.rs
│ ├── render.rs
│ ├── send_sync.rs
│ ├── shader.rs
│ ├── surface.rs
│ ├── texture/
│ │ ├── external_image.rs
│ │ ├── external_texture.rs
│ │ └── format.rs
│ ├── texture.rs
│ ├── tokens.rs
│ ├── transfers.rs
│ ├── vertex.rs
│ └── write_only.rs
└── xtask/
├── Cargo.toml
└── src/
├── changelog.rs
├── cts.rs
├── install_agility_sdk.rs
├── install_warp.rs
├── main.rs
├── miri.rs
├── run_wasm.rs
├── test.rs
├── util.rs
└── vendor_web_sys.rs
Showing preview only (819K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (9543 symbols across 621 files)
FILE: benches/benches/wgpu-benchmark/bind_groups.rs
type Params (line 8) | struct Params {
constant BENCHMARK_PARAMS (line 17) | const BENCHMARK_PARAMS: Params = Params {
constant TEST_PARAMS (line 22) | const TEST_PARAMS: Params = Params {
function run_bench (line 27) | pub fn run_bench(ctx: BenchmarkContext) -> anyhow::Result<Vec<SubBenchRe...
FILE: benches/benches/wgpu-benchmark/computepass.rs
function dispatch_count (line 12) | fn dispatch_count(ctx: &BenchmarkContext) -> usize {
function dispatch_count_bindless (line 27) | fn dispatch_count_bindless(ctx: &BenchmarkContext) -> usize {
function thread_count_list (line 37) | fn thread_count_list(ctx: &BenchmarkContext) -> &'static [usize] {
constant TEXTURES_PER_DISPATCH (line 46) | const TEXTURES_PER_DISPATCH: usize = 2;
constant STORAGE_TEXTURES_PER_DISPATCH (line 47) | const STORAGE_TEXTURES_PER_DISPATCH: usize = 2;
constant STORAGE_BUFFERS_PER_DISPATCH (line 48) | const STORAGE_BUFFERS_PER_DISPATCH: usize = 2;
constant BUFFER_SIZE (line 50) | const BUFFER_SIZE: u64 = 16;
type ComputepassState (line 52) | struct ComputepassState {
method new (line 64) | fn new(ctx: &BenchmarkContext) -> Self {
method run_subpass (line 379) | fn run_subpass(
method run_bindless_pass (line 413) | fn run_bindless_pass(&self, dispatch_count_bindless: usize) -> wgpu::C...
function run_bench (line 438) | pub fn run_bench(mut ctx: BenchmarkContext) -> anyhow::Result<Vec<wgpu_b...
FILE: benches/benches/wgpu-benchmark/main.rs
type DeviceState (line 12) | struct DeviceState {
method new (line 19) | fn new() -> Self {
function main (line 65) | fn main() {
FILE: benches/benches/wgpu-benchmark/renderpass.rs
function draw_count (line 12) | fn draw_count(ctx: &BenchmarkContext) -> u32 {
function thread_count_list (line 22) | fn thread_count_list(ctx: &BenchmarkContext) -> &'static [u32] {
constant TEXTURES_PER_DRAW (line 31) | const TEXTURES_PER_DRAW: u32 = 7;
constant VERTEX_BUFFERS_PER_DRAW (line 32) | const VERTEX_BUFFERS_PER_DRAW: u32 = 2;
type RenderpassState (line 34) | struct RenderpassState {
method new (line 49) | fn new(ctx: &BenchmarkContext) -> Self {
method run_subpass (line 343) | fn run_subpass(
method run_bindless_pass (line 399) | fn run_bindless_pass(&self, draw_count: u32) -> wgpu::CommandBuffer {
function run_bench (line 441) | pub fn run_bench(mut ctx: BenchmarkContext) -> anyhow::Result<Vec<wgpu_b...
FILE: benches/benches/wgpu-benchmark/resource_creation.rs
function thread_count_list (line 8) | fn thread_count_list(ctx: &BenchmarkContext) -> &'static [usize] {
function run_bench (line 16) | pub fn run_bench(ctx: BenchmarkContext) -> anyhow::Result<Vec<SubBenchRe...
FILE: benches/benches/wgpu-benchmark/shader.rs
constant DIR_IN (line 4) | const DIR_IN: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/../naga/tests...
type InputWithInfo (line 8) | struct InputWithInfo {
method from (line 17) | fn from(value: Input) -> Self {
method filename (line 31) | fn filename(&self) -> &str {
type Inputs (line 36) | struct Inputs {
method from_dir (line 42) | fn from_dir(folder: &str, extension: &str) -> Self {
method bytes (line 49) | fn bytes(&self) -> u64 {
method load (line 56) | fn load(&mut self) {
method load_utf8 (line 66) | fn load_utf8(&mut self) {
method parse (line 78) | fn parse(&mut self) {
method validate (line 93) | fn validate(&mut self) {
method is_empty (line 113) | fn is_empty(&self) -> bool {
function parse_glsl (line 118) | fn parse_glsl(stage: naga::ShaderStage, inputs: &Inputs) {
function get_wgsl_inputs (line 131) | fn get_wgsl_inputs() -> Inputs {
function frontends (line 144) | pub fn frontends(ctx: BenchmarkContext) -> anyhow::Result<Vec<SubBenchRe...
function validation (line 285) | pub fn validation(ctx: BenchmarkContext) -> anyhow::Result<Vec<SubBenchR...
function compact (line 315) | pub fn compact(ctx: BenchmarkContext) -> anyhow::Result<Vec<SubBenchResu...
function backends (line 340) | pub fn backends(ctx: BenchmarkContext) -> anyhow::Result<Vec<SubBenchRes...
FILE: benches/src/context.rs
type LoopControl (line 4) | pub enum LoopControl {
method finished (line 16) | pub(crate) fn finished(&self, iterations: u32, elapsed: Duration) -> b...
method default (line 10) | fn default() -> Self {
type BenchmarkContext (line 24) | pub struct BenchmarkContext {
method is_test (line 31) | pub fn is_test(&self) -> bool {
FILE: benches/src/file.rs
constant FILE_PREFIX (line 5) | const FILE_PREFIX: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/../targe...
constant PREVIOUS (line 6) | pub const PREVIOUS: &str = "previous";
function get_comparison_file (line 8) | pub(crate) fn get_comparison_file(baseline: Option<&str>) -> Option<Benc...
function write_results_file (line 17) | pub(crate) fn write_results_file(
FILE: benches/src/iter.rs
function iter (line 5) | pub fn iter(
function iter_auto (line 37) | pub fn iter_auto(
function iter_many (line 57) | pub fn iter_many(
FILE: benches/src/lib.rs
type BenchmarkFile (line 42) | pub struct BenchmarkFile {
method get_result (line 47) | pub fn get_result(
type SubBenchResult (line 60) | pub struct SubBenchResult {
method throughput_per_second (line 74) | pub fn throughput_per_second(&self) -> f64 {
type Benchmark (line 83) | pub struct Benchmark {
constant HELP (line 88) | const HELP: &str = "\
function main (line 114) | pub fn main(benchmarks: Vec<Benchmark>) {
FILE: benches/src/print.rs
type Delta (line 9) | struct Delta {
method new (line 17) | fn new(previous: &SubBenchResult, current: &SubBenchResult) -> Self {
function get_change_color (line 51) | fn get_change_color(percent_change: f64) -> ColorSpec {
function print_results (line 66) | pub fn print_results(
function human_scale (line 178) | fn human_scale(value: f64) -> String {
FILE: cts_runner/examples/hello-compute.js
function isTypedArrayEqual (line 107) | function isTypedArrayEqual(a, b) {
FILE: cts_runner/src/bootstrap.js
class NotFound (line 48) | class NotFound extends Error {
method constructor (line 49) | constructor(msg) {
class BrokenPipe (line 55) | class BrokenPipe extends Error {
method constructor (line 56) | constructor(msg) {
class AlreadyExists (line 62) | class AlreadyExists extends Error {
method constructor (line 63) | constructor(msg) {
class InvalidData (line 69) | class InvalidData extends Error {
method constructor (line 70) | constructor(msg) {
class TimedOut (line 76) | class TimedOut extends Error {
method constructor (line 77) | constructor(msg) {
class WriteZero (line 83) | class WriteZero extends Error {
method constructor (line 84) | constructor(msg) {
class UnexpectedEof (line 90) | class UnexpectedEof extends Error {
method constructor (line 91) | constructor(msg) {
class NotSupported (line 97) | class NotSupported extends Error {
method constructor (line 98) | constructor(msg) {
method writable (line 105) | writable(value) {
method nonEnumerable (line 113) | nonEnumerable(value) {
method readOnly (line 120) | readOnly(value) {
method getterOnly (line 126) | getterOnly(getter) {
class Navigator (line 137) | class Navigator {
method constructor (line 138) | constructor() {
method get (line 150) | get() {
method exit (line 268) | exit(code) {
method readFileSync (line 271) | readFileSync(path) {
method readTextFileSync (line 274) | readTextFileSync(path) {
method writeFileSync (line 279) | writeFileSync(path, buf) {
function bootstrapRuntime (line 318) | function bootstrapRuntime({ args, cwd, enableExternalTexture = false }) {
FILE: cts_runner/src/main.rs
function run (line 25) | pub async fn run() -> Result<(), AnyError> {
function op_exit (line 121) | fn op_exit(code: i32) {
function op_read_file_sync (line 127) | fn op_read_file_sync(#[string] path: &str) -> Result<Vec<u8>, std::io::E...
function op_write_file_sync (line 136) | fn op_write_file_sync(#[string] path: &str, #[buffer] buf: &[u8]) -> Res...
function unwrap_or_exit (line 143) | pub fn unwrap_or_exit<T>(result: Result<T, AnyError>) -> T {
function style (line 153) | fn style<S: AsRef<str>>(s: S, colorspec: ColorSpec) -> impl fmt::Display {
function red_bold (line 162) | fn red_bold<S: AsRef<str>>(s: S) -> impl fmt::Display {
type Permissions (line 169) | struct Permissions;
method allow_hrtime (line 172) | fn allow_hrtime(&mut self) -> bool {
function main (line 178) | async fn main() {
FILE: cts_runner/tests/integration.rs
function target_dir (line 12) | pub fn target_dir() -> PathBuf {
function cts_runner_exe_path (line 18) | pub fn cts_runner_exe_path() -> PathBuf {
function exec_cts_runner (line 27) | fn exec_cts_runner(script_file: impl AsRef<OsStr>) -> Output {
type Error (line 36) | struct Error(String);
method fmt (line 39) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
function exec_js_file (line 44) | fn exec_js_file(script_file: impl AsRef<OsStr>) -> Result<(), Error> {
function check_js_stderr (line 57) | fn check_js_stderr(script: &str, expected: &str) -> Result<(), Error> {
function exec_js (line 89) | fn exec_js(script: &str) -> Result<(), Error> {
function hello_compute_example (line 94) | fn hello_compute_example() -> Result<(), Error> {
function features (line 99) | fn features() -> Result<(), Error> {
function uncaptured_error (line 133) | fn uncaptured_error() -> Result<(), Error> {
function lst_files_are_sorted (line 152) | fn lst_files_are_sorted() {
FILE: deno_webgpu/01_webgpu.js
class GPUError (line 67) | class GPUError {
method constructor (line 68) | constructor(key = null) {
method message (line 75) | get message() {
method [privateCustomInspect] (line 80) | [privateCustomInspect](inspect, inspectOptions) {
class GPUValidationError (line 95) | class GPUValidationError extends GPUError {
method constructor (line 97) | constructor(message) {
class GPUOutOfMemoryError (line 108) | class GPUOutOfMemoryError extends GPUError {
method constructor (line 109) | constructor(message) {
class GPUInternalError (line 120) | class GPUInternalError extends GPUError {
method constructor (line 121) | constructor() {
class GPUPipelineError (line 128) | class GPUPipelineError extends DOMException {
method constructor (line 131) | constructor(message = "", options = { __proto__: null }) {
method reason (line 144) | get reason() {
class GPUUncapturedErrorEvent (line 151) | class GPUUncapturedErrorEvent extends Event {
method constructor (line 154) | constructor(type, gpuUncapturedErrorEventInitDict) {
method error (line 170) | get error() {
method value (line 180) | value(inspect, inspectOptions) {
method value (line 188) | value(inspect, inspectOptions) {
method value (line 207) | value(inspect, inspectOptions) {
method value (line 231) | value(inspect, inspectOptions) {
method value (line 246) | value(inspect, inspectOptions) {
method value (line 260) | value(inspect, inspectOptions) {
method value (line 311) | value(inspect, inspectOptions) {
method value (line 334) | value(inspect, inspectOptions) {
method value (line 357) | value(inspect, inspectOptions) {
method value (line 374) | value(inspect, inspectOptions) {
class GPUBufferUsage (line 391) | class GPUBufferUsage {
method constructor (line 392) | constructor() {
method MAP_READ (line 396) | static get MAP_READ() {
method MAP_WRITE (line 399) | static get MAP_WRITE() {
method COPY_SRC (line 402) | static get COPY_SRC() {
method COPY_DST (line 405) | static get COPY_DST() {
method INDEX (line 408) | static get INDEX() {
method VERTEX (line 411) | static get VERTEX() {
method UNIFORM (line 414) | static get UNIFORM() {
method STORAGE (line 417) | static get STORAGE() {
method INDIRECT (line 420) | static get INDIRECT() {
method QUERY_RESOLVE (line 423) | static get QUERY_RESOLVE() {
class GPUMapMode (line 428) | class GPUMapMode {
method constructor (line 429) | constructor() {
method READ (line 433) | static get READ() {
method WRITE (line 436) | static get WRITE() {
method value (line 444) | value(inspect, inspectOptions) {
class GPUTextureUsage (line 466) | class GPUTextureUsage {
method constructor (line 467) | constructor() {
method COPY_SRC (line 471) | static get COPY_SRC() {
method COPY_DST (line 474) | static get COPY_DST() {
method TEXTURE_BINDING (line 477) | static get TEXTURE_BINDING() {
method STORAGE_BINDING (line 480) | static get STORAGE_BINDING() {
method RENDER_ATTACHMENT (line 483) | static get RENDER_ATTACHMENT() {
method value (line 491) | value(inspect, inspectOptions) {
method value (line 508) | value(inspect, inspectOptions) {
method value (line 528) | value(inspect, inspectOptions) {
method value (line 548) | value(inspect, inspectOptions) {
method value (line 568) | value(inspect, inspectOptions) {
method value (line 585) | value(inspect, inspectOptions) {
method value (line 601) | value(inspect, inspectOptions) {
method value (line 621) | value(inspect, inspectOptions) {
class GPUShaderStage (line 644) | class GPUShaderStage {
method constructor (line 645) | constructor() {
method VERTEX (line 649) | static get VERTEX() {
method FRAGMENT (line 653) | static get FRAGMENT() {
method COMPUTE (line 657) | static get COMPUTE() {
method value (line 665) | value(inspect, inspectOptions) {
method value (line 685) | value(inspect, inspectOptions) {
class GPUColorWrite (line 702) | class GPUColorWrite {
method constructor (line 703) | constructor() {
method RED (line 707) | static get RED() {
method GREEN (line 710) | static get GREEN() {
method BLUE (line 713) | static get BLUE() {
method ALPHA (line 716) | static get ALPHA() {
method ALL (line 719) | static get ALL() {
method value (line 727) | value(inspect, inspectOptions) {
method value (line 747) | value(inspect, inspectOptions) {
method value (line 767) | value(inspect, inspectOptions) {
method value (line 787) | value(inspect, inspectOptions) {
method value (line 804) | value(inspect, inspectOptions) {
method value (line 824) | value(inspect, inspectOptions) {
method value (line 841) | value(inspect, inspectOptions) {
function deviceStartCapture (line 890) | function deviceStartCapture(device) {
function deviceStopCapture (line 894) | function deviceStopCapture(device) {
function initGPU (line 904) | function initGPU() {
FILE: deno_webgpu/02_surface.js
method value (line 20) | value(inspect, inspectOptions) {
FILE: deno_webgpu/adapter.rs
type GPURequestAdapterOptions (line 23) | pub(crate) struct GPURequestAdapterOptions {
type GPUPowerPreference (line 33) | pub(crate) enum GPUPowerPreference {
type GPUDeviceDescriptor (line 40) | struct GPUDeviceDescriptor {
type GPUAdapter (line 51) | pub struct GPUAdapter {
method constructor (line 76) | fn constructor(_: bool) -> Result<GPUAdapter, GPUGenericError> {
method info (line 82) | fn info(&self, scope: &mut v8::HandleScope) -> v8::Global<v8::Object> {
method features (line 92) | fn features(&self, scope: &mut v8::HandleScope) -> v8::Global<v8::Obje...
method limits (line 103) | fn limits(&self, scope: &mut v8::HandleScope) -> v8::Global<v8::Object> {
method request_device (line 112) | fn request_device(
method drop (line 61) | fn drop(&mut self) {
method get_name (line 67) | fn get_name(&self) -> &'static std::ffi::CStr {
type CreateDeviceError (line 247) | pub enum CreateDeviceError {
type GPUSupportedLimits (line 259) | pub struct GPUSupportedLimits(pub wgpu_types::Limits);
method constructor (line 271) | fn constructor(_: bool) -> Result<GPUSupportedLimits, GPUGenericError> {
method maxTextureDimension1D (line 276) | fn maxTextureDimension1D(&self) -> u32 {
method maxTextureDimension2D (line 281) | fn maxTextureDimension2D(&self) -> u32 {
method maxTextureDimension3D (line 286) | fn maxTextureDimension3D(&self) -> u32 {
method maxTextureArrayLayers (line 291) | fn maxTextureArrayLayers(&self) -> u32 {
method maxBindGroups (line 296) | fn maxBindGroups(&self) -> u32 {
method maxBindingsPerBindGroup (line 303) | fn maxBindingsPerBindGroup(&self) -> u32 {
method maxDynamicUniformBuffersPerPipelineLayout (line 308) | fn maxDynamicUniformBuffersPerPipelineLayout(&self) -> u32 {
method maxDynamicStorageBuffersPerPipelineLayout (line 313) | fn maxDynamicStorageBuffersPerPipelineLayout(&self) -> u32 {
method maxSampledTexturesPerShaderStage (line 318) | fn maxSampledTexturesPerShaderStage(&self) -> u32 {
method maxSamplersPerShaderStage (line 323) | fn maxSamplersPerShaderStage(&self) -> u32 {
method maxStorageBuffersPerShaderStage (line 328) | fn maxStorageBuffersPerShaderStage(&self) -> u32 {
method maxStorageBuffersInVertexStage (line 333) | fn maxStorageBuffersInVertexStage(&self) -> u32 {
method maxStorageBuffersInFragmentStage (line 340) | fn maxStorageBuffersInFragmentStage(&self) -> u32 {
method maxStorageTexturesPerShaderStage (line 347) | fn maxStorageTexturesPerShaderStage(&self) -> u32 {
method maxStorageTexturesInVertexStage (line 352) | fn maxStorageTexturesInVertexStage(&self) -> u32 {
method maxStorageTexturesInFragmentStage (line 359) | fn maxStorageTexturesInFragmentStage(&self) -> u32 {
method maxUniformBuffersPerShaderStage (line 366) | fn maxUniformBuffersPerShaderStage(&self) -> u32 {
method maxUniformBufferBindingSize (line 372) | fn maxUniformBufferBindingSize(&self) -> u64 {
method maxStorageBufferBindingSize (line 378) | fn maxStorageBufferBindingSize(&self) -> u64 {
method minUniformBufferOffsetAlignment (line 383) | fn minUniformBufferOffsetAlignment(&self) -> u32 {
method minStorageBufferOffsetAlignment (line 388) | fn minStorageBufferOffsetAlignment(&self) -> u32 {
method maxVertexBuffers (line 393) | fn maxVertexBuffers(&self) -> u32 {
method maxBufferSize (line 399) | fn maxBufferSize(&self) -> u64 {
method maxVertexAttributes (line 404) | fn maxVertexAttributes(&self) -> u32 {
method maxVertexBufferArrayStride (line 409) | fn maxVertexBufferArrayStride(&self) -> u32 {
method maxInterStageShaderVariables (line 414) | fn maxInterStageShaderVariables(&self) -> u32 {
method maxColorAttachments (line 419) | fn maxColorAttachments(&self) -> u32 {
method maxColorAttachmentBytesPerSample (line 424) | fn maxColorAttachmentBytesPerSample(&self) -> u32 {
method maxComputeWorkgroupStorageSize (line 429) | fn maxComputeWorkgroupStorageSize(&self) -> u32 {
method maxComputeInvocationsPerWorkgroup (line 434) | fn maxComputeInvocationsPerWorkgroup(&self) -> u32 {
method maxComputeWorkgroupSizeX (line 439) | fn maxComputeWorkgroupSizeX(&self) -> u32 {
method maxComputeWorkgroupSizeY (line 444) | fn maxComputeWorkgroupSizeY(&self) -> u32 {
method maxComputeWorkgroupSizeZ (line 449) | fn maxComputeWorkgroupSizeZ(&self) -> u32 {
method maxComputeWorkgroupsPerDimension (line 454) | fn maxComputeWorkgroupsPerDimension(&self) -> u32 {
method get_name (line 262) | fn get_name(&self) -> &'static std::ffi::CStr {
type GPUSupportedFeatures (line 459) | pub struct GPUSupportedFeatures(v8::Global<v8::Value>);
method new (line 468) | pub fn new(
method constructor (line 487) | fn constructor(_: bool) -> Result<GPUSupportedFeatures, GPUGenericErro...
method set (line 493) | fn set(&self) -> v8::Global<v8::Value> {
method get_name (line 462) | fn get_name(&self) -> &'static std::ffi::CStr {
type GPUAdapterInfo (line 498) | pub struct GPUAdapterInfo {
method constructor (line 512) | fn constructor(_: bool) -> Result<GPUAdapterInfo, GPUGenericError> {
method vendor (line 518) | fn vendor(&self) -> String {
method architecture (line 524) | fn architecture(&self) -> &'static str {
method device (line 530) | fn device(&self) -> String {
method description (line 536) | fn description(&self) -> String {
method subgroup_min_size (line 541) | fn subgroup_min_size(&self) -> u32 {
method subgroup_max_size (line 546) | fn subgroup_max_size(&self) -> u32 {
method is_fallback_adapter (line 551) | fn is_fallback_adapter(&self) -> bool {
method get_name (line 503) | fn get_name(&self) -> &'static std::ffi::CStr {
FILE: deno_webgpu/bind_group.rs
type GPUBindGroup (line 25) | pub struct GPUBindGroup {
method constructor (line 51) | fn constructor(_: bool) -> Result<GPUBindGroup, GPUGenericError> {
method label (line 57) | fn label(&self) -> String {
method label (line 62) | fn label(&self, #[webidl] _label: String) {
method drop (line 32) | fn drop(&mut self) {
constant NAME (line 38) | const NAME: &'static str = "GPUBindGroup";
method get_name (line 42) | fn get_name(&self) -> &'static std::ffi::CStr {
type GPUBindGroupDescriptor (line 69) | pub(crate) struct GPUBindGroupDescriptor {
type GPUBindGroupEntry (line 79) | pub(crate) struct GPUBindGroupEntry {
type GPUBufferBinding (line 87) | pub(crate) struct GPUBufferBinding {
type GPUBindingResource (line 96) | pub(crate) enum GPUBindingResource {
type Options (line 106) | type Options = ();
method convert (line 108) | fn convert<'b>(
FILE: deno_webgpu/bind_group_layout.rs
type GPUBindGroupLayout (line 12) | pub struct GPUBindGroupLayout {
constant NAME (line 25) | const NAME: &'static str = "GPUBindGroupLayout";
method constructor (line 38) | fn constructor(_: bool) -> Result<GPUBindGroupLayout, GPUGenericError> {
method label (line 44) | fn label(&self) -> String {
method label (line 49) | fn label(&self, #[webidl] _label: String) {
method drop (line 19) | fn drop(&mut self) {
method get_name (line 29) | fn get_name(&self) -> &'static std::ffi::CStr {
type GPUBindGroupLayoutDescriptor (line 56) | pub(crate) struct GPUBindGroupLayoutDescriptor {
type GPUBindGroupLayoutEntry (line 64) | pub(crate) struct GPUBindGroupLayoutEntry {
type GPUBufferBindingLayout (line 77) | pub(crate) struct GPUBufferBindingLayout {
type GPUBufferBindingType (line 88) | pub(crate) enum GPUBufferBindingType {
function from (line 95) | fn from(value: GPUBufferBindingType) -> Self {
type GPUSamplerBindingLayout (line 108) | pub(crate) struct GPUSamplerBindingLayout {
type GPUSamplerBindingType (line 115) | pub(crate) enum GPUSamplerBindingType {
function from (line 122) | fn from(value: GPUSamplerBindingType) -> Self {
type GPUTextureBindingLayout (line 133) | pub(crate) struct GPUTextureBindingLayout {
type GPUTextureSampleType (line 144) | pub(crate) enum GPUTextureSampleType {
function from (line 153) | fn from(value: GPUTextureSampleType) -> Self {
type GPUStorageTextureBindingLayout (line 168) | pub(crate) struct GPUStorageTextureBindingLayout {
type GPUStorageTextureAccess (line 178) | pub(crate) enum GPUStorageTextureAccess {
function from (line 185) | fn from(value: GPUStorageTextureAccess) -> Self {
type GPUExternalTextureBindingLayout (line 196) | pub(crate) struct GPUExternalTextureBindingLayout {}
FILE: deno_webgpu/buffer.rs
type GPUBufferDescriptor (line 21) | pub(crate) struct GPUBufferDescriptor {
type BufferError (line 33) | pub enum BufferError {
type GPUBuffer (line 48) | pub struct GPUBuffer {
method constructor (line 86) | fn constructor(_: bool) -> Result<GPUBuffer, GPUGenericError> {
method label (line 92) | fn label(&self) -> String {
method label (line 97) | fn label(&self, #[webidl] _label: String) {
method size (line 103) | fn size(&self) -> u64 {
method usage (line 107) | fn usage(&self) -> u32 {
method map_state (line 113) | fn map_state(&self) -> &'static str {
method map_async (line 121) | async fn map_async(
method get_mapped_range (line 203) | fn get_mapped_range<'s>(
method unmap (line 257) | fn unmap(&self, scope: &mut v8::HandleScope) -> Result<(), BufferError> {
method destroy (line 275) | fn destroy(&self) {
method drop (line 67) | fn drop(&mut self) {
constant NAME (line 73) | const NAME: &'static str = "GPUBuffer";
method get_name (line 77) | fn get_name(&self) -> &'static std::ffi::CStr {
FILE: deno_webgpu/byow.rs
type ByowError (line 27) | pub enum ByowError {
type UnsafeWindowSurface (line 93) | pub struct UnsafeWindowSurface {
method new (line 111) | fn new(
method get_context (line 158) | fn get_context(
method present (line 174) | fn present(&self, scope: &mut v8::HandleScope) -> Result<(), JsErrorBo...
method resize (line 183) | fn resize(&self, width: u32, height: u32, scope: &mut v8::HandleScope) {
method get_name (line 102) | fn get_name(&self) -> &'static std::ffi::CStr {
type UnsafeWindowSurfaceOptions (line 195) | struct UnsafeWindowSurfaceOptions {
type Error (line 212) | type Error = JsErrorBox;
method from_v8 (line 214) | fn from_v8(
type UnsafeWindowSurfaceSystem (line 204) | enum UnsafeWindowSurfaceSystem {
type RawHandles (line 277) | type RawHandles = (
function raw_window (line 283) | fn raw_window(
function raw_window (line 305) | fn raw_window(
function raw_window (line 336) | fn raw_window(
function raw_window (line 380) | fn raw_window(
FILE: deno_webgpu/command_buffer.rs
type GPUCommandBuffer (line 10) | pub struct GPUCommandBuffer {
constant NAME (line 23) | const NAME: &'static str = "GPUCommandBuffer";
method constructor (line 36) | fn constructor(_: bool) -> Result<GPUCommandBuffer, GPUGenericError> {
method label (line 42) | fn label(&self) -> String {
method label (line 47) | fn label(&self, #[webidl] _label: String) {
method drop (line 17) | fn drop(&mut self) {
method get_name (line 27) | fn get_name(&self) -> &'static std::ffi::CStr {
type GPUCommandBufferDescriptor (line 54) | pub(crate) struct GPUCommandBufferDescriptor {
FILE: deno_webgpu/command_encoder.rs
type GPUCommandEncoder (line 28) | pub struct GPUCommandEncoder {
method constructor (line 57) | fn constructor(_: bool) -> Result<GPUCommandEncoder, GPUGenericError> {
method label (line 63) | fn label(&self) -> String {
method label (line 68) | fn label(&self, #[webidl] _label: String) {
method begin_render_pass (line 74) | fn begin_render_pass(
method begin_compute_pass (line 157) | fn begin_compute_pass(
method copy_buffer_to_buffer (line 192) | fn copy_buffer_to_buffer<'a>(
method copy_buffer_to_texture (line 282) | fn copy_buffer_to_texture(
method copy_texture_to_buffer (line 318) | fn copy_texture_to_buffer(
method copy_texture_to_texture (line 354) | fn copy_texture_to_texture(
method clear_buffer (line 388) | fn clear_buffer(
method resolve_query_set (line 403) | fn resolve_query_set(
method finish (line 427) | fn finish(
method push_debug_group (line 451) | fn push_debug_group(&self, #[webidl] group_label: String) {
method pop_debug_group (line 460) | fn pop_debug_group(&self) {
method insert_debug_marker (line 465) | fn insert_debug_marker(&self, #[webidl] marker_label: String) {
method drop (line 42) | fn drop(&mut self) {
method get_name (line 48) | fn get_name(&self) -> &'static std::ffi::CStr {
type GPUCommandEncoderDescriptor (line 476) | pub(crate) struct GPUCommandEncoderDescriptor {
type GPUTexelCopyBufferInfo (line 483) | pub(crate) struct GPUTexelCopyBufferInfo {
FILE: deno_webgpu/compute_pass.rs
type GPUComputePassEncoder (line 19) | pub struct GPUComputePassEncoder {
method constructor (line 37) | fn constructor(_: bool) -> Result<GPUComputePassEncoder, GPUGenericErr...
method label (line 43) | fn label(&self) -> String {
method label (line 48) | fn label(&self, #[webidl] _label: String) {
method set_pipeline (line 53) | fn set_pipeline(
method dispatch_workgroups (line 68) | fn dispatch_workgroups(
method dispatch_workgroups_indirect (line 89) | fn dispatch_workgroups_indirect(
method end (line 107) | fn end(&self) {
method push_debug_group (line 116) | fn push_debug_group(&self, #[webidl] group_label: String) {
method pop_debug_group (line 130) | fn pop_debug_group(&self) {
method insert_debug_marker (line 139) | fn insert_debug_marker(&self, #[webidl] marker_label: String) {
method set_bind_group (line 152) | fn set_bind_group<'a>(
method get_name (line 28) | fn get_name(&self) -> &'static std::ffi::CStr {
type GPUComputePassDescriptor (line 237) | pub(crate) struct GPUComputePassDescriptor {
type GPUComputePassTimestampWrites (line 246) | pub(crate) struct GPUComputePassTimestampWrites {
FILE: deno_webgpu/compute_pipeline.rs
type GPUComputePipeline (line 16) | pub struct GPUComputePipeline {
method constructor (line 44) | fn constructor(_: bool) -> Result<GPUComputePipeline, GPUGenericError> {
method label (line 50) | fn label(&self) -> String {
method label (line 55) | fn label(&self, #[webidl] _label: String) {
method get_bind_group_layout (line 60) | fn get_bind_group_layout(&self, #[webidl] index: u32) -> GPUBindGroupL...
method drop (line 25) | fn drop(&mut self) {
constant NAME (line 31) | const NAME: &'static str = "GPUComputePipeline";
method get_name (line 35) | fn get_name(&self) -> &'static std::ffi::CStr {
type GPUComputePipelineDescriptor (line 78) | pub(crate) struct GPUComputePipelineDescriptor {
type GPUProgrammableStage (line 88) | pub(crate) struct GPUProgrammableStage {
FILE: deno_webgpu/device.rs
constant DEVICE_EXTERNAL_MEMORY_SIZE (line 43) | pub(crate) const DEVICE_EXTERNAL_MEMORY_SIZE: i64 = 1 << 24;
type GPUDevice (line 45) | pub struct GPUDevice {
method constructor (line 86) | fn constructor(_: bool) -> Result<GPUDevice, GPUGenericError> {
method label (line 92) | fn label(&self) -> String {
method label (line 97) | fn label(&self, #[webidl] _label: String) {
method features (line 103) | fn features(&self, scope: &mut v8::HandleScope) -> v8::Global<v8::Obje...
method limits (line 112) | fn limits(&self, scope: &mut v8::HandleScope) -> v8::Global<v8::Object> {
method adapter_info (line 121) | fn adapter_info(
method queue (line 134) | fn queue(&self) -> v8::Global<v8::Object> {
method destroy (line 140) | fn destroy(&self) {
method create_buffer (line 149) | fn create_buffer(
method create_texture (line 213) | fn create_texture(
method create_sampler (line 255) | fn create_sampler(
method create_bind_group_layout (line 292) | fn create_bind_group_layout(
method create_pipeline_layout (line 373) | fn create_pipeline_layout(
method create_bind_group (line 410) | fn create_bind_group(
method create_shader_module (line 472) | fn create_shader_module(
method create_compute_pipeline (line 507) | fn create_compute_pipeline(
method create_render_pipeline (line 518) | fn create_render_pipeline(
method create_compute_pipeline_async (line 531) | fn create_compute_pipeline_async(
method create_render_pipeline_async (line 558) | fn create_render_pipeline_async(
method create_command_encoder (line 581) | fn create_command_encoder<'a>(
method create_render_bundle_encoder (line 650) | fn create_render_bundle_encoder(
method create_query_set (line 697) | fn create_query_set(
method lost (line 725) | fn lost(&self) -> v8::Global<v8::Promise> {
method push_error_scope (line 731) | fn push_error_scope(&self, #[webidl] filter: super::error::GPUErrorFil...
method pop_error_scope (line 742) | fn pop_error_scope(
method start_capture (line 769) | fn start_capture(&self) {
method stop_capture (line 777) | fn stop_capture(&self) {
method new_compute_pipeline (line 787) | fn new_compute_pipeline(
method new_render_pipeline (line 823) | fn new_render_pipeline(
method drop (line 66) | fn drop(&mut self) {
constant NAME (line 72) | const NAME: &'static str = "GPUDevice";
method get_name (line 76) | fn get_name(&self) -> &'static std::ffi::CStr {
type GPUDeviceLostReason (line 988) | pub enum GPUDeviceLostReason {
method from (line 995) | fn from(value: wgpu_types::DeviceLostReason) -> Self {
type GPUDeviceLostInfo (line 1004) | pub struct GPUDeviceLostInfo {
method constructor (line 1018) | fn constructor(_: bool) -> Result<GPUDeviceLostInfo, GPUGenericError> {
method reason (line 1024) | fn reason(&self) -> &'static str {
method message (line 1034) | fn message(&self) -> &'static str {
method get_name (line 1009) | fn get_name(&self) -> &'static std::ffi::CStr {
function op_webgpu_device_start_capture (line 1040) | pub fn op_webgpu_device_start_capture(#[cppgc] device: &GPUDevice) {
function op_webgpu_device_stop_capture (line 1049) | pub fn op_webgpu_device_stop_capture(#[cppgc] device: &GPUDevice) {
FILE: deno_webgpu/error.rs
type ErrorHandler (line 44) | pub type ErrorHandler = std::rc::Rc<DeviceErrorHandler>;
type DeviceErrorHandler (line 46) | pub struct DeviceErrorHandler {
method new (line 59) | pub fn new(
method set_device (line 72) | pub fn set_device(&self, device: v8::Weak<v8::Object>) {
method push_error (line 76) | pub fn push_error<E: Into<GPUError>>(&self, err: Option<E>) {
type GPUErrorFilter (line 164) | pub enum GPUErrorFilter {
type GPUError (line 171) | pub enum GPUError {
method from_webgpu (line 197) | fn from_webgpu(e: impl WebGpuError) -> Self {
method from (line 224) | fn from(err: EncoderStateError) -> Self {
method from (line 230) | fn from(err: PassStateError) -> Self {
method from (line 236) | fn from(err: CreateBufferError) -> Self {
method from (line 242) | fn from(err: DeviceError) -> Self {
method from (line 248) | fn from(err: BufferAccessError) -> Self {
method from (line 254) | fn from(err: CreateBindGroupLayoutError) -> Self {
method from (line 260) | fn from(err: CreatePipelineLayoutError) -> Self {
method from (line 266) | fn from(err: CreateBindGroupError) -> Self {
method from (line 272) | fn from(err: RenderBundleError) -> Self {
method from (line 278) | fn from(err: CreateRenderBundleError) -> Self {
method from (line 284) | fn from(err: CommandEncoderError) -> Self {
method from (line 290) | fn from(err: QueryError) -> Self {
method from (line 296) | fn from(err: ComputePassError) -> Self {
method from (line 302) | fn from(err: CreateComputePipelineError) -> Self {
method from (line 308) | fn from(err: GetBindGroupLayoutError) -> Self {
method from (line 314) | fn from(err: CreateRenderPipelineError) -> Self {
method from (line 320) | fn from(err: RenderPassError) -> Self {
method from (line 326) | fn from(err: CreateSamplerError) -> Self {
method from (line 332) | fn from(err: CreateShaderModuleError) -> Self {
method from (line 338) | fn from(err: CreateTextureError) -> Self {
method from (line 344) | fn from(err: CreateTextureViewError) -> Self {
method from (line 350) | fn from(err: CreateQuerySetError) -> Self {
method from (line 356) | fn from(err: QueueSubmitError) -> Self {
method from (line 362) | fn from(err: QueueWriteError) -> Self {
method from (line 368) | fn from(err: ClearError) -> Self {
method from (line 374) | fn from(err: ConfigureSurfaceError) -> Self {
method fmt (line 184) | fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
function fmt_err (line 207) | pub(crate) fn fmt_err(err: &(dyn std::error::Error + 'static)) -> String {
type GPUGenericError (line 380) | pub enum GPUGenericError {
type GPUPipelineErrorReason (line 386) | pub enum GPUPipelineErrorReason {
method fmt (line 393) | fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
function make_pipeline_error (line 401) | pub(crate) fn make_pipeline_error<'a>(
FILE: deno_webgpu/lib.rs
constant UNSTABLE_FEATURE_NAME (line 45) | pub const UNSTABLE_FEATURE_NAME: &str = "webgpu";
constant DX12_COMPILER_ENV_VAR (line 47) | pub const DX12_COMPILER_ENV_VAR: &str = "DENO_WEBGPU_DX12_COMPILER";
function print_linker_flags (line 50) | pub fn print_linker_flags(name: &str) {
type Instance (line 68) | pub type Instance = Arc<wgpu_core::global::Global>;
function op_create_gpu (line 117) | pub fn op_create_gpu(
type EventTargetSetup (line 142) | struct EventTargetSetup {
type ErrorEventClass (line 146) | struct ErrorEventClass(v8::Global<v8::Value>);
type PipelineErrorClass (line 147) | struct PipelineErrorClass(v8::Global<v8::Value>);
type GPU (line 149) | pub struct GPU {
method constructor (line 163) | fn constructor(_: bool) -> Result<GPU, GPUGenericError> {
method request_adapter (line 169) | async fn request_adapter(
method getPreferredCanvasFormat (line 246) | fn getPreferredCanvasFormat(&self) -> &'static str {
method wgslLanguageFeatures (line 257) | fn wgslLanguageFeatures(
method get_name (line 154) | fn get_name(&self) -> &'static std::ffi::CStr {
type WGSLLanguageFeatures (line 267) | pub struct WGSLLanguageFeatures(v8::Global<v8::Value>);
method new (line 276) | pub fn new(scope: &mut v8::HandleScope) -> Self {
method constructor (line 292) | fn constructor(_: bool) -> Result<WGSLLanguageFeatures, GPUGenericErro...
method set (line 298) | fn set(&self) -> v8::Global<v8::Value> {
method get_name (line 270) | fn get_name(&self) -> &'static std::ffi::CStr {
function transform_label (line 303) | fn transform_label<'a>(label: String) -> Option<std::borrow::Cow<'a, str...
FILE: deno_webgpu/pipeline_layout.rs
type GPUPipelineLayout (line 13) | pub struct GPUPipelineLayout {
method constructor (line 39) | fn constructor(_: bool) -> Result<GPUPipelineLayout, GPUGenericError> {
method label (line 45) | fn label(&self) -> String {
method label (line 50) | fn label(&self, #[webidl] _label: String) {
method drop (line 20) | fn drop(&mut self) {
constant NAME (line 26) | const NAME: &'static str = "GPUPipelineLayout";
method get_name (line 30) | fn get_name(&self) -> &'static std::ffi::CStr {
type GPUPipelineLayoutDescriptor (line 57) | pub(crate) struct GPUPipelineLayoutDescriptor {
FILE: deno_webgpu/query_set.rs
type GPUQuerySet (line 12) | pub struct GPUQuerySet {
method constructor (line 40) | fn constructor(_: bool) -> Result<GPUQuerySet, GPUGenericError> {
method label (line 46) | fn label(&self) -> String {
method label (line 51) | fn label(&self, #[webidl] _label: String) {
method destroy (line 57) | fn destroy(&self) -> Result<(), JsErrorBox> {
method r#type (line 67) | fn r#type(&self) -> &'static str {
method count (line 72) | fn count(&self) -> u32 {
method drop (line 21) | fn drop(&mut self) {
constant NAME (line 27) | const NAME: &'static str = "GPUQuerySet";
method get_name (line 31) | fn get_name(&self) -> &'static std::ffi::CStr {
type GPUQuerySetDescriptor (line 79) | pub(crate) struct GPUQuerySetDescriptor {
type GPUQueryType (line 90) | pub(crate) enum GPUQueryType {
function from (line 95) | fn from(value: GPUQueryType) -> Self {
FILE: deno_webgpu/queue.rs
type GPUQueue (line 23) | pub struct GPUQueue {
method constructor (line 49) | fn constructor(_: bool) -> Result<GPUQueue, GPUGenericError> {
method label (line 55) | fn label(&self) -> String {
method label (line 60) | fn label(&self, #[webidl] _label: String) {
method submit (line 66) | fn submit(
method on_submitted_work_done (line 88) | async fn on_submitted_work_done(&self) -> Result<(), JsErrorBox> {
method write_buffer (line 130) | fn write_buffer(
method write_texture (line 155) | fn write_texture(
method drop (line 34) | fn drop(&mut self) {
method get_name (line 40) | fn get_name(&self) -> &'static std::ffi::CStr {
type GPUTexelCopyTextureInfo (line 192) | pub(crate) struct GPUTexelCopyTextureInfo {
type GPUTexelCopyBufferLayout (line 205) | struct GPUTexelCopyBufferLayout {
FILE: deno_webgpu/render_bundle.rs
function c_string_truncated_at_first_nul (line 24) | fn c_string_truncated_at_first_nul<T: Into<Vec<u8>>>(
type GPURenderBundleEncoder (line 33) | pub struct GPURenderBundleEncoder {
method constructor (line 51) | fn constructor(_: bool) -> Result<GPURenderBundleEncoder, GPUGenericEr...
method label (line 57) | fn label(&self) -> String {
method label (line 62) | fn label(&self, #[webidl] _label: String) {
method finish (line 67) | fn finish(
method push_debug_group (line 91) | fn push_debug_group(
method pop_debug_group (line 115) | fn pop_debug_group(&self) -> Result<(), JsErrorBox> {
method insert_debug_marker (line 125) | fn insert_debug_marker(
method set_bind_group (line 147) | fn set_bind_group<'a>(
method set_pipeline (line 234) | fn set_pipeline(
method set_index_buffer (line 252) | fn set_index_buffer(
method set_vertex_buffer (line 275) | fn set_vertex_buffer(
method draw (line 299) | fn draw(
method draw_indexed (line 323) | fn draw_indexed(
method draw_indirect (line 349) | fn draw_indirect(
method draw_indexed_indirect (line 369) | fn draw_indexed_indirect(
method get_name (line 42) | fn get_name(&self) -> &'static std::ffi::CStr {
type GPURenderBundleEncoderDescriptor (line 390) | pub(crate) struct GPURenderBundleEncoderDescriptor {
type SetBindGroupError (line 407) | enum SetBindGroupError {
type GPURenderBundle (line 416) | pub struct GPURenderBundle {
method constructor (line 442) | fn constructor(_: bool) -> Result<GPURenderBundle, GPUGenericError> {
method label (line 448) | fn label(&self) -> String {
method label (line 453) | fn label(&self, #[webidl] _label: String) {
method drop (line 423) | fn drop(&mut self) {
constant NAME (line 429) | const NAME: &'static str = "GPURenderBundle";
method get_name (line 433) | fn get_name(&self) -> &'static std::ffi::CStr {
type GPURenderBundleDescriptor (line 460) | pub(crate) struct GPURenderBundleDescriptor {
FILE: deno_webgpu/render_pass.rs
type GPURenderPassEncoder (line 29) | pub struct GPURenderPassEncoder {
method constructor (line 47) | fn constructor(_: bool) -> Result<GPURenderPassEncoder, GPUGenericErro...
method label (line 53) | fn label(&self) -> String {
method label (line 58) | fn label(&self, #[webidl] _label: String) {
method set_viewport (line 64) | fn set_viewport(
method set_scissor_rect (line 90) | fn set_scissor_rect(
method set_blend_constant (line 112) | fn set_blend_constant(&self, #[webidl] color: GPUColor) {
method set_stencil_reference (line 125) | fn set_stencil_reference(
method begin_occlusion_query (line 141) | fn begin_occlusion_query(
method end_occlusion_query (line 157) | fn end_occlusion_query(&self) {
method execute_bundles (line 167) | fn execute_bundles(&self, #[webidl] bundles: Vec<Ptr<GPURenderBundle>>) {
method end (line 183) | fn end(&self) {
method push_debug_group (line 192) | fn push_debug_group(&self, #[webidl] group_label: String) {
method pop_debug_group (line 206) | fn pop_debug_group(&self) {
method insert_debug_marker (line 215) | fn insert_debug_marker(&self, #[webidl] marker_label: String) {
method set_bind_group (line 228) | fn set_bind_group<'a>(
method set_pipeline (line 312) | fn set_pipeline(
method set_index_buffer (line 325) | fn set_index_buffer(
method set_vertex_buffer (line 347) | fn set_vertex_buffer(
method draw (line 369) | fn draw(
method draw_indexed (line 391) | fn draw_indexed(
method draw_indirect (line 415) | fn draw_indirect(
method draw_indexed_indirect (line 433) | fn draw_indexed_indirect(
method get_name (line 38) | fn get_name(&self) -> &'static std::ffi::CStr {
type GPURenderPassDescriptor (line 452) | pub(crate) struct GPURenderPassDescriptor {
type GPURenderPassColorAttachment (line 470) | pub(crate) struct GPURenderPassColorAttachment {
type GPULoadOp (line 482) | pub(crate) enum GPULoadOp {
method with_default_value (line 487) | pub fn with_default_value<V: Default>(
method with_value (line 499) | pub fn with_value<V>(self, val: V) -> wgpu_core::command::LoadOp<V> {
type GPUStoreOp (line 509) | pub(crate) enum GPUStoreOp {
function from (line 514) | fn from(value: GPUStoreOp) -> Self {
type GPURenderPassDepthStencilAttachment (line 524) | pub(crate) struct GPURenderPassDepthStencilAttachment {
type GPURenderPassTimestampWrites (line 542) | pub(crate) struct GPURenderPassTimestampWrites {
type GPUTextureOrView (line 550) | pub(crate) enum GPUTextureOrView {
method to_view_id (line 556) | pub(crate) fn to_view_id(&self) -> wgpu_core::id::TextureViewId {
type Options (line 565) | type Options = ();
method convert (line 567) | fn convert<'b>(
FILE: deno_webgpu/render_pipeline.rs
type GPURenderPipeline (line 20) | pub struct GPURenderPipeline {
method constructor (line 48) | fn constructor(_: bool) -> Result<GPURenderPipeline, GPUGenericError> {
method label (line 54) | fn label(&self) -> String {
method label (line 59) | fn label(&self, #[webidl] _label: String) {
method get_bind_group_layout (line 64) | fn get_bind_group_layout(&self, #[webidl] index: u32) -> GPUBindGroupL...
method drop (line 29) | fn drop(&mut self) {
constant NAME (line 35) | const NAME: &'static str = "GPURenderPipeline";
method get_name (line 39) | fn get_name(&self) -> &'static std::ffi::CStr {
type GPURenderPipelineDescriptor (line 82) | pub(crate) struct GPURenderPipelineDescriptor {
type GPUMultisampleState (line 96) | pub(crate) struct GPUMultisampleState {
type GPUDepthStencilState (line 109) | pub(crate) struct GPUDepthStencilState {
type GPUStencilFaceState (line 132) | pub(crate) struct GPUStencilFaceState {
type GPUStencilOperation (line 145) | pub(crate) enum GPUStencilOperation {
function from (line 157) | fn from(value: GPUStencilOperation) -> Self {
type GPUVertexState (line 173) | pub(crate) struct GPUVertexState {
type GPUFragmentState (line 184) | pub(crate) struct GPUFragmentState {
type GPUColorTargetState (line 194) | pub(crate) struct GPUColorTargetState {
type GPUBlendState (line 203) | pub(crate) struct GPUBlendState {
type GPUBlendComponent (line 210) | pub(crate) struct GPUBlendComponent {
type GPUBlendOperation (line 221) | pub(crate) enum GPUBlendOperation {
function from (line 230) | fn from(value: GPUBlendOperation) -> Self {
type GPUBlendFactor (line 243) | pub(crate) enum GPUBlendFactor {
function from (line 281) | fn from(value: GPUBlendFactor) -> Self {
type GPUPrimitiveState (line 306) | pub(crate) struct GPUPrimitiveState {
type GPUPrimitiveTopology (line 320) | pub(crate) enum GPUPrimitiveTopology {
function from (line 329) | fn from(value: GPUPrimitiveTopology) -> Self {
type GPUIndexFormat (line 342) | pub(crate) enum GPUIndexFormat {
function from (line 350) | fn from(value: GPUIndexFormat) -> Self {
type GPUFrontFace (line 360) | pub(crate) enum GPUFrontFace {
function from (line 366) | fn from(value: GPUFrontFace) -> Self {
type GPUCullMode (line 376) | pub(crate) enum GPUCullMode {
function from (line 383) | fn from(value: GPUCullMode) -> Self {
type GPUVertexBufferLayout (line 394) | pub(crate) struct GPUVertexBufferLayout {
type GPUVertexStepMode (line 404) | pub(crate) enum GPUVertexStepMode {
function from (line 410) | fn from(value: GPUVertexStepMode) -> Self {
type GPUVertexAttribute (line 420) | pub(crate) struct GPUVertexAttribute {
type GPUVertexFormat (line 430) | pub(crate) enum GPUVertexFormat {
function from (line 516) | fn from(value: GPUVertexFormat) -> Self {
FILE: deno_webgpu/sampler.rs
type GPUSampler (line 11) | pub struct GPUSampler {
method constructor (line 37) | fn constructor(_: bool) -> Result<GPUSampler, GPUGenericError> {
method label (line 43) | fn label(&self) -> String {
method label (line 48) | fn label(&self, #[webidl] _label: String) {
method drop (line 18) | fn drop(&mut self) {
constant NAME (line 24) | const NAME: &'static str = "GPUSampler";
method get_name (line 28) | fn get_name(&self) -> &'static std::ffi::CStr {
type GPUSamplerDescriptor (line 55) | pub(super) struct GPUSamplerDescriptor {
type GPUAddressMode (line 86) | pub(crate) enum GPUAddressMode {
function from (line 93) | fn from(value: GPUAddressMode) -> Self {
type GPUFilterMode (line 104) | pub(crate) enum GPUFilterMode {
function from (line 110) | fn from(value: GPUFilterMode) -> Self {
type GPUMipmapFilterMode (line 120) | pub(crate) enum GPUMipmapFilterMode {
function from (line 126) | fn from(value: GPUMipmapFilterMode) -> Self {
type GPUCompareFunction (line 136) | pub(crate) enum GPUCompareFunction {
function from (line 148) | fn from(value: GPUCompareFunction) -> Self {
FILE: deno_webgpu/shader.rs
type GPUShaderModule (line 14) | pub struct GPUShaderModule {
method constructor (line 41) | fn constructor(_: bool) -> Result<GPUShaderModule, GPUGenericError> {
method label (line 47) | fn label(&self) -> String {
method label (line 52) | fn label(&self, #[webidl] _label: String) {
method get_compilation_info (line 56) | fn get_compilation_info<'a>(
method drop (line 22) | fn drop(&mut self) {
constant NAME (line 28) | const NAME: &'static str = "GPUShaderModule";
method get_name (line 32) | fn get_name(&self) -> &'static std::ffi::CStr {
type GPUShaderModuleDescriptor (line 69) | pub(crate) struct GPUShaderModuleDescriptor {
type GPUCompilationMessage (line 76) | pub struct GPUCompilationMessage {
method message (line 95) | fn message(&self) -> String {
method r#type (line 102) | fn r#type(&self) -> &'static str {
method line_num (line 108) | fn line_num(&self) -> u64 {
method line_pos (line 114) | fn line_pos(&self) -> u64 {
method offset (line 120) | fn offset(&self) -> u64 {
method length (line 126) | fn length(&self) -> u64 {
method new (line 132) | fn new(error: &pipeline::CreateShaderModuleError, source: &str) -> Self {
method get_name (line 86) | fn get_name(&self) -> &'static std::ffi::CStr {
type GPUCompilationInfo (line 175) | pub struct GPUCompilationInfo {
method messages (line 189) | fn messages(&self) -> v8::Global<v8::Object> {
method new (line 195) | pub fn new<'args, 'scope>(
method get_name (line 180) | fn get_name(&self) -> &'static std::ffi::CStr {
type GPUCompilationMessageType (line 222) | pub(crate) enum GPUCompilationMessageType {
FILE: deno_webgpu/surface.rs
type SurfaceError (line 21) | pub enum SurfaceError {
type Configuration (line 33) | pub struct Configuration {
type GPUCanvasContext (line 41) | pub struct GPUCanvasContext {
method constructor (line 62) | fn constructor(_: bool) -> Result<GPUCanvasContext, GPUGenericError> {
method canvas (line 68) | fn canvas(&self) -> v8::Global<v8::Object> {
method configure (line 73) | fn configure(
method unconfigure (line 117) | fn unconfigure(&self) {
method get_current_texture (line 122) | fn get_current_texture(
method present (line 175) | pub fn present(&self) -> Result<(), SurfaceError> {
method resize_configure (line 189) | pub fn resize_configure(&self, width: u32, height: u32) {
method get_name (line 53) | fn get_name(&self) -> &'static std::ffi::CStr {
type GPUCanvasConfiguration (line 213) | struct GPUCanvasConfiguration {
type GPUCanvasAlphaMode (line 229) | enum GPUCanvasAlphaMode {
function from (line 235) | fn from(value: GPUCanvasAlphaMode) -> Self {
type GPUPresentMode (line 246) | enum GPUPresentMode {
function from (line 262) | fn from(value: GPUPresentMode) -> Self {
FILE: deno_webgpu/texture.rs
type GPUTextureDescriptor (line 24) | pub(crate) struct GPUTextureDescriptor {
type GPUTexture (line 43) | pub struct GPUTexture {
method default_view_id (line 61) | pub(crate) fn default_view_id(&self) -> wgpu_core::id::TextureViewId {
method constructor (line 107) | fn constructor(_: bool) -> Result<GPUTexture, GPUGenericError> {
method label (line 113) | fn label(&self) -> String {
method label (line 118) | fn label(&self, #[webidl] _label: String) {
method width (line 123) | fn width(&self) -> u32 {
method height (line 127) | fn height(&self) -> u32 {
method depth_or_array_layers (line 131) | fn depth_or_array_layers(&self) -> u32 {
method mip_level_count (line 135) | fn mip_level_count(&self) -> u32 {
method sample_count (line 139) | fn sample_count(&self) -> u32 {
method dimension (line 144) | fn dimension(&self) -> &'static str {
method format (line 149) | fn format(&self) -> &'static str {
method usage (line 153) | fn usage(&self) -> u32 {
method destroy (line 158) | fn destroy(&self) {
method create_view (line 163) | fn create_view(
method drop (line 85) | fn drop(&mut self) {
constant NAME (line 94) | const NAME: &'static str = "GPUTexture";
method get_name (line 98) | fn get_name(&self) -> &'static std::ffi::CStr {
type GPUTextureViewDescriptor (line 198) | struct GPUTextureViewDescriptor {
type GPUTextureViewDimension (line 222) | pub(crate) enum GPUTextureViewDimension {
method from (line 238) | fn from(value: GPUTextureViewDimension) -> Self {
type GPUTextureAspect (line 252) | pub enum GPUTextureAspect {
method from (line 259) | fn from(value: GPUTextureAspect) -> Self {
type GPUTextureView (line 268) | pub struct GPUTextureView {
method constructor (line 295) | fn constructor(_: bool) -> Result<GPUTextureView, GPUGenericError> {
method label (line 301) | fn label(&self) -> String {
method label (line 306) | fn label(&self, #[webidl] _label: String) {
method drop (line 275) | fn drop(&mut self) {
constant NAME (line 281) | const NAME: &'static str = "GPUTextureView";
method get_name (line 285) | fn get_name(&self) -> &'static std::ffi::CStr {
type GPUTextureDimension (line 313) | pub enum GPUTextureDimension {
method from (line 323) | fn from(value: GPUTextureDimension) -> Self {
type GPUTextureFormat (line 334) | pub(crate) enum GPUTextureFormat {
method from (line 528) | fn from(value: GPUTextureFormat) -> Self {
type GPUExternalTexture (line 713) | pub struct GPUExternalTexture {
constant NAME (line 718) | const NAME: &'static str = "GPUExternalTexture";
method get_name (line 722) | fn get_name(&self) -> &'static std::ffi::CStr {
FILE: deno_webgpu/webidl.rs
type GPUExtent3DDict (line 17) | pub(crate) struct GPUExtent3DDict {
type GPUExtent3D (line 28) | pub(crate) enum GPUExtent3D {
type Options (line 34) | type Options = ();
method convert (line 36) | fn convert<'b>(
function from (line 102) | fn from(value: GPUExtent3D) -> Self {
type GPUOrigin3DDict (line 120) | pub(crate) struct GPUOrigin3DDict {
type GPUOrigin3D (line 132) | pub(crate) enum GPUOrigin3D {
type Options (line 144) | type Options = ();
method convert (line 146) | fn convert<'b>(
method default (line 138) | fn default() -> Self {
function from (line 212) | fn from(value: GPUOrigin3D) -> Self {
type GPUColorDict (line 226) | pub(crate) struct GPUColorDict {
type GPUColor (line 233) | pub(crate) enum GPUColor {
type Options (line 239) | type Options = ();
method convert (line 241) | fn convert<'b>(
function from (line 305) | fn from(value: GPUColor) -> Self {
type GPUAutoLayoutMode (line 320) | pub(crate) enum GPUAutoLayoutMode {
type GPUPipelineLayoutOrGPUAutoLayoutMode (line 324) | pub(crate) enum GPUPipelineLayoutOrGPUAutoLayoutMode {
type Options (line 345) | type Options = ();
method convert (line 347) | fn convert<'b>(
function from (line 332) | fn from(value: GPUPipelineLayoutOrGPUAutoLayoutMode) -> Self {
type GPUFeatureName (line 396) | pub struct GPUFeatureName(wgpu_types::Features);
type Options (line 367) | type Options = ();
method convert (line 369) | fn convert<'b>(
function from (line 399) | fn from(value: GPUFeatureName) -> wgpu_types::Features {
type GPUTextureUsageFlags (line 405) | pub(crate) struct GPUTextureUsageFlags(pub(crate) wgpu_types::TextureUsa...
type Options (line 408) | type Options = ();
method convert (line 410) | fn convert<'b>(
method bits (line 448) | pub fn bits(&self) -> u32 {
function from (line 442) | fn from(value: GPUTextureUsageFlags) -> Self {
type GPUShaderStageFlags (line 454) | pub(crate) struct GPUShaderStageFlags(pub(crate) wgpu_types::ShaderStages);
type Options (line 457) | type Options = ();
method convert (line 459) | fn convert<'b>(
function from (line 491) | fn from(value: GPUShaderStageFlags) -> Self {
type GPUColorWriteFlags (line 497) | pub(crate) struct GPUColorWriteFlags(pub(crate) wgpu_types::ColorWrites);
type Options (line 500) | type Options = ();
method convert (line 502) | fn convert<'b>(
function from (line 529) | fn from(value: GPUColorWriteFlags) -> Self {
FILE: examples/bug-repro/01_texture_atomic_bug/src/main.rs
function main (line 15) | fn main() {
type App (line 24) | struct App {
type State (line 28) | struct State {
method new (line 98) | fn new(window: Arc<Window>) -> Self {
method render_frame (line 274) | fn render_frame(&mut self) {
method resumed (line 49) | fn resumed(&mut self, event_loop: &ActiveEventLoop) {
method window_event (line 65) | fn window_event(
method about_to_wait (line 86) | fn about_to_wait(&mut self, _event_loop: &ActiveEventLoop) {
function tex_bind_entry (line 93) | fn tex_bind_entry(binding: u32, resource: wgpu::BindingResource<'_>) -> ...
FILE: examples/features/src/big_compute_buffers/mod.rs
constant MAX_BUFFER_SIZE (line 11) | const MAX_BUFFER_SIZE: u64 = 1 << 27;
constant MAX_DISPATCH_SIZE (line 12) | const MAX_DISPATCH_SIZE: u32 = (1 << 16) - 1;
function execute_gpu (line 14) | pub async fn execute_gpu(numbers: &[f32]) -> Vec<f32> {
function execute_gpu_inner (line 44) | pub async fn execute_gpu_inner(
function setup (line 97) | fn setup(
function setup_pipeline (line 122) | fn setup_pipeline(
function setup_binds (line 143) | fn setup_binds(
function calculate_chunks (line 182) | fn calculate_chunks(numbers: &[f32], max_buffer_size: u64) -> Vec<&[f32]> {
function create_storage_buffers (line 187) | fn create_storage_buffers(device: &wgpu::Device, numbers: &[f32]) -> Vec...
function create_staging_buffers (line 205) | fn create_staging_buffers(device: &wgpu::Device, numbers: &[f32]) -> Vec...
function run (line 223) | async fn run() {
function main (line 240) | pub fn main() {
FILE: examples/features/src/big_compute_buffers/tests.rs
constant SIZE (line 29) | const SIZE: usize = (1 << 27) / std::mem::size_of::<f32>() * 8;
function assert_execute_gpu (line 36) | async fn assert_execute_gpu(device: &wgpu::Device, queue: &wgpu::Queue, ...
FILE: examples/features/src/boids/mod.rs
constant NUM_PARTICLES (line 9) | const NUM_PARTICLES: u32 = 1500;
constant PARTICLES_PER_GROUP (line 13) | const PARTICLES_PER_GROUP: u32 = 64;
type Example (line 16) | struct Example {
method required_limits (line 27) | fn required_limits() -> wgpu::Limits {
method required_downlevel_capabilities (line 31) | fn required_downlevel_capabilities() -> wgpu::DownlevelCapabilities {
method init (line 39) | fn init(
method update (line 245) | fn update(&mut self, _event: winit::event::WindowEvent) {
method resize (line 250) | fn resize(
method render (line 261) | fn render(&mut self, view: &wgpu::TextureView, device: &wgpu::Device, ...
function main (line 320) | pub fn main() {
FILE: examples/features/src/bunnymark/mod.rs
constant MAX_BUNNIES (line 10) | const MAX_BUNNIES: usize = 1 << 20;
constant BUNNY_SIZE (line 11) | const BUNNY_SIZE: f32 = 0.15 * 256.0;
constant GRAVITY (line 12) | const GRAVITY: f32 = -9.8 * 100.0;
constant MAX_VELOCITY (line 13) | const MAX_VELOCITY: f32 = 750.0;
type Globals (line 17) | struct Globals {
type Bunny (line 25) | struct Bunny {
method update_data (line 33) | fn update_data(&mut self, delta: f32, extent: &[u32; 2]) {
type Example (line 56) | struct Example {
method spawn_bunnies (line 70) | fn spawn_bunnies(&mut self) {
method render_inner (line 89) | fn render_inner(
method init (line 142) | fn init(
method update (line 369) | fn update(&mut self, event: winit::event::WindowEvent) {
method resize (line 384) | fn resize(
method render (line 433) | fn render(&mut self, view: &wgpu::TextureView, device: &wgpu::Device, ...
function main (line 438) | pub fn main() {
FILE: examples/features/src/conservative_raster/mod.rs
constant RENDER_TARGET_FORMAT (line 1) | const RENDER_TARGET_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::R...
type Example (line 3) | struct Example {
method create_low_res_target (line 15) | fn create_low_res_target(
method required_features (line 65) | fn required_features() -> wgpu::Features {
method optional_features (line 68) | fn optional_features() -> wgpu::Features {
method init (line 71) | fn init(
method resize (line 242) | fn resize(
method update (line 254) | fn update(&mut self, _event: winit::event::WindowEvent) {}
method render (line 256) | fn render(&mut self, view: &wgpu::TextureView, device: &wgpu::Device, ...
function main (line 316) | pub fn main() {
FILE: examples/features/src/cooperative_matrix/mod.rs
constant M (line 22) | const M: u32 = 64;
constant N (line 23) | const N: u32 = 64;
constant K (line 24) | const K: u32 = 64;
type Dimensions (line 28) | struct Dimensions {
function run (line 35) | async fn run() {
type ExecuteResults (line 196) | struct ExecuteResults {
function execute (line 202) | async fn execute(
function main (line 451) | pub fn main() {
FILE: examples/features/src/cube/mod.rs
type Vertex (line 7) | struct Vertex {
function vertex (line 12) | fn vertex(pos: [i8; 3], tc: [i8; 2]) -> Vertex {
function create_vertices (line 19) | fn create_vertices() -> (Vec<Vertex>, Vec<u16>) {
function create_texels (line 65) | fn create_texels(size: usize) -> Vec<u8> {
type Example (line 83) | struct Example {
method generate_matrix (line 94) | fn generate_matrix(aspect_ratio: f32) -> glam::Mat4 {
method optional_features (line 106) | fn optional_features() -> wgpu::Features {
method init (line 110) | fn init(
method update (line 321) | fn update(&mut self, _event: winit::event::WindowEvent) {
method resize (line 325) | fn resize(
method render (line 336) | fn render(&mut self, view: &wgpu::TextureView, device: &wgpu::Device, ...
function main (line 379) | pub fn main() {
FILE: examples/features/src/framework.rs
type Example (line 14) | pub trait Example: 'static + Sized {
constant SRGB (line 15) | const SRGB: bool = true;
method optional_features (line 17) | fn optional_features() -> wgpu::Features {
method required_features (line 21) | fn required_features() -> wgpu::Features {
method required_downlevel_capabilities (line 25) | fn required_downlevel_capabilities() -> wgpu::DownlevelCapabilities {
method required_limits (line 33) | fn required_limits() -> wgpu::Limits {
method init (line 37) | fn init(
method resize (line 44) | fn resize(
method update (line 51) | fn update(&mut self, event: WindowEvent);
method render (line 53) | fn render(&mut self, view: &wgpu::TextureView, device: &wgpu::Device, ...
function init_logger (line 57) | fn init_logger() {
function spawn (line 88) | fn spawn(f: impl Future<Output = ()> + 'static) {
function spawn (line 95) | fn spawn(f: impl Future<Output = ()> + 'static) {
type SurfaceWrapper (line 102) | struct SurfaceWrapper {
method new (line 109) | fn new() -> Self {
method pre_adapter (line 123) | fn pre_adapter(&mut self, instance: &Instance, window: Arc<Window>) {
method resume (line 135) | fn resume(&mut self, context: &ExampleContext, window: Arc<Window>, sr...
method resize (line 173) | fn resize(&mut self, context: &ExampleContext, size: PhysicalSize<u32>) {
method acquire (line 186) | fn acquire(
method suspend (line 230) | fn suspend(&mut self) {
method get (line 236) | fn get(&self) -> Option<&'_ Surface<'static>> {
method config (line 240) | fn config(&self) -> &wgpu::SurfaceConfiguration {
type ExampleContext (line 246) | struct ExampleContext {
method init_async (line 254) | async fn init_async<E: Example>(
type FrameCounter (line 303) | struct FrameCounter {
method new (line 311) | fn new() -> Self {
method update (line 318) | fn update(&mut self) {
type AppAction (line 336) | enum AppAction {
type AppState (line 345) | enum AppState<E> {
type App (line 365) | struct App<E: Example> {
function new (line 375) | fn new(title: &'static str, event_loop: &EventLoop<AppAction>) -> Self {
function resumed (line 391) | fn resumed(&mut self, event_loop: &ActiveEventLoop) {
function user_event (line 456) | fn user_event(&mut self, _event_loop: &ActiveEventLoop, event: AppAction) {
function suspended (line 479) | fn suspended(&mut self, _event_loop: &ActiveEventLoop) {
function window_event (line 485) | fn window_event(
function start (line 572) | fn start<E: Example>(title: &'static str) {
function run (line 596) | pub fn run<E: Example>(title: &'static str) {
function parse_url_query_string (line 603) | pub fn parse_url_query_string<'a>(query: &'a str, search_key: &str) -> O...
type ExampleTestParams (line 626) | pub struct ExampleTestParams<E> {
function from (line 643) | fn from(params: ExampleTestParams<E>) -> Self {
FILE: examples/features/src/hello_synchronization/mod.rs
constant ARR_SIZE (line 1) | const ARR_SIZE: usize = 128;
type ExecuteResults (line 3) | struct ExecuteResults {
function run (line 8) | async fn run() {
function execute (line 46) | async fn execute(
function get_data (line 165) | async fn get_data<T: bytemuck::Pod>(
function main (line 191) | pub fn main() {
FILE: examples/features/src/hello_triangle/mod.rs
function spawn (line 13) | fn spawn(f: impl Future<Output = ()> + 'static) {
function spawn (line 20) | fn spawn(f: impl Future<Output = ()> + 'static) {
type WgpuState (line 24) | struct WgpuState {
type TriangleAction (line 34) | enum TriangleAction {
type AppState (line 39) | enum AppState {
type App (line 45) | struct App {
method new (line 52) | fn new(event_loop: &EventLoop<TriangleAction>) -> Self {
method resumed (line 62) | fn resumed(&mut self, event_loop: &ActiveEventLoop) {
method user_event (line 190) | fn user_event(&mut self, _event_loop: &ActiveEventLoop, event: Triangl...
method window_event (line 201) | fn window_event(
function main (line 307) | pub fn main() {
FILE: examples/features/src/hello_windows/mod.rs
type ViewportDesc (line 12) | struct ViewportDesc {
method new (line 24) | fn new(window: Arc<Window>, background: wgpu::Color, instance: &wgpu::...
method build (line 33) | fn build(self, adapter: &wgpu::Adapter, device: &wgpu::Device) -> View...
type Viewport (line 18) | struct Viewport {
method resize (line 45) | fn resize(&mut self, device: &wgpu::Device, size: winit::dpi::Physical...
method get_current_texture (line 51) | fn get_current_texture(&mut self) -> CurrentSurfaceTexture {
constant WINDOW_SIZE (line 56) | const WINDOW_SIZE: u32 = 128;
constant WINDOW_PADDING (line 57) | const WINDOW_PADDING: u32 = 16;
constant WINDOW_TITLEBAR (line 58) | const WINDOW_TITLEBAR: u32 = 32;
constant WINDOW_OFFSET (line 59) | const WINDOW_OFFSET: u32 = WINDOW_SIZE + WINDOW_PADDING;
constant ROWS (line 60) | const ROWS: u32 = 4;
constant COLUMNS (line 61) | const COLUMNS: u32 = 4;
type AppState (line 63) | enum AppState {
type App (line 73) | struct App {
method new (line 78) | fn new() -> Self {
method resumed (line 86) | fn resumed(&mut self, event_loop: &ActiveEventLoop) {
method window_event (line 173) | fn window_event(
function main (line 273) | pub fn main() {
FILE: examples/features/src/hello_workgroups/mod.rs
function run (line 12) | async fn run() {
function get_data (line 154) | async fn get_data<T: bytemuck::Pod>(
function main (line 180) | pub fn main() {
FILE: examples/features/src/lib.rs
function all_tests (line 42) | fn all_tests() -> Vec<wgpu_test::GpuTestInitializer> {
FILE: examples/features/src/main.rs
type ExampleDesc (line 1) | struct ExampleDesc {
constant EXAMPLES (line 10) | const EXAMPLES: &[ExampleDesc] = &[
function get_example_name (line 211) | fn get_example_name() -> Option<String> {
function print_examples (line 224) | fn print_examples() {
function print_unknown_example (line 259) | fn print_unknown_example(_result: Option<String>) {}
function print_unknown_example (line 262) | fn print_unknown_example(result: Option<String>) {
function main (line 275) | fn main() {
FILE: examples/features/src/mesh_shader/mod.rs
function compile_wgsl (line 2) | fn compile_wgsl(device: &wgpu::Device) -> wgpu::ShaderModule {
function compile_hlsl (line 14) | fn compile_hlsl(device: &wgpu::Device, entry: &str, stage_str: &str) -> ...
function compile_msl (line 46) | fn compile_msl(device: &wgpu::Device) -> wgpu::ShaderModule {
type Shaders (line 57) | struct Shaders {
function get_shaders (line 66) | fn get_shaders(device: &wgpu::Device, backend: wgpu::Backend) -> Shaders {
type Example (line 104) | pub struct Example {
method init (line 108) | fn init(
method render (line 157) | fn render(&mut self, view: &wgpu::TextureView, device: &wgpu::Device, ...
method required_downlevel_capabilities (line 190) | fn required_downlevel_capabilities() -> wgpu::DownlevelCapabilities {
method required_features (line 193) | fn required_features() -> wgpu::Features {
method required_limits (line 196) | fn required_limits() -> wgpu::Limits {
method resize (line 199) | fn resize(
method update (line 207) | fn update(&mut self, _event: winit::event::WindowEvent) {
function main (line 212) | pub fn main() {
FILE: examples/features/src/mipmap/mod.rs
constant TEXTURE_FORMAT (line 5) | const TEXTURE_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Rgba8Un...
constant MIP_LEVEL_COUNT (line 6) | const MIP_LEVEL_COUNT: u32 = 10;
constant MIP_PASS_COUNT (line 7) | const MIP_PASS_COUNT: u32 = MIP_LEVEL_COUNT - 1;
constant QUERY_FEATURES (line 9) | const QUERY_FEATURES: wgpu::Features = {
function create_texels (line 15) | fn create_texels(size: usize, cx: f32, cy: f32) -> Vec<u8> {
type QuerySets (line 38) | struct QuerySets {
type TimestampData (line 48) | struct TimestampData {
type TimestampQueries (line 53) | type TimestampQueries = [TimestampData; MIP_PASS_COUNT as usize];
type PipelineStatisticsQueries (line 54) | type PipelineStatisticsQueries = [u64; MIP_PASS_COUNT as usize];
function pipeline_statistics_offset (line 56) | fn pipeline_statistics_offset() -> wgpu::BufferAddress {
type Example (line 60) | struct Example {
method generate_matrix (line 67) | fn generate_matrix(aspect_ratio: f32) -> glam::Mat4 {
method generate_mipmaps (line 77) | fn generate_mipmaps(
method optional_features (line 210) | fn optional_features() -> wgpu::Features {
method init (line 214) | fn init(
method update (line 457) | fn update(&mut self, _event: winit::event::WindowEvent) {
method resize (line 461) | fn resize(
method render (line 472) | fn render(&mut self, view: &wgpu::TextureView, device: &wgpu::Device, ...
function main (line 507) | pub fn main() {
FILE: examples/features/src/msaa_line/mod.rs
type Vertex (line 22) | struct Vertex {
type Example (line 27) | struct Example {
method create_bundle (line 41) | fn create_bundle(
method create_multisampled_framebuffer (line 99) | fn create_multisampled_framebuffer(
method optional_features (line 127) | fn optional_features() -> wgpu::Features {
method init (line 131) | fn init(
method update (line 218) | fn update(&mut self, event: winit::event::WindowEvent) {
method resize (line 249) | fn resize(
method render (line 260) | fn render(&mut self, view: &wgpu::TextureView, device: &wgpu::Device, ...
function main (line 319) | pub fn main() {
FILE: examples/features/src/multiple_render_targets/mod.rs
constant EXAMPLE_NAME (line 1) | const EXAMPLE_NAME: &str = "multiple_render_targets";
type MultiTargetRenderer (line 4) | struct MultiTargetRenderer {
method create_image_texture (line 26) | fn create_image_texture(
method init (line 83) | fn init(
method draw (line 174) | fn draw(
function create_ball_texture_data (line 9) | fn create_ball_texture_data(width: usize, height: usize) -> Vec<u8> {
type TargetRenderer (line 194) | struct TargetRenderer {
method init (line 203) | fn init(
method create_bindgroups (line 284) | fn create_bindgroups(
method draw (line 322) | fn draw(
method rebuild_resources (line 361) | fn rebuild_resources(&mut self, device: &wgpu::Device, texture_targets...
type TextureTargets (line 371) | struct TextureTargets {
method new (line 377) | fn new(
type Example (line 430) | struct Example {
method init (line 439) | fn init(
method resize (line 489) | fn resize(
method update (line 502) | fn update(&mut self, _event: winit::event::WindowEvent) {}
method render (line 504) | fn render(&mut self, view: &wgpu::TextureView, device: &wgpu::Device, ...
function main (line 535) | pub fn main() {
FILE: examples/features/src/multiview/mod.rs
constant TEXTURE_SIZE (line 8) | const TEXTURE_SIZE: u32 = 512;
constant LAYER_MASK (line 11) | const LAYER_MASK: u32 = 0b11;
constant NUM_LAYERS (line 13) | const NUM_LAYERS: u32 = 32 - LAYER_MASK.leading_zeros();
type Example (line 15) | pub struct Example {
method init (line 24) | fn init(
method render (line 113) | fn render(&mut self, view: &wgpu::TextureView, device: &wgpu::Device, ...
method required_downlevel_capabilities (line 147) | fn required_downlevel_capabilities() -> wgpu::DownlevelCapabilities {
method required_features (line 151) | fn required_features() -> wgpu::Features {
method required_limits (line 160) | fn required_limits() -> wgpu::Limits {
method resize (line 167) | fn resize(
method update (line 175) | fn update(&mut self, _event: winit::event::WindowEvent) {
function main (line 180) | pub fn main() {
FILE: examples/features/src/ray_cube_compute/mod.rs
type Vertex (line 14) | struct Vertex {
function vertex (line 19) | fn vertex(pos: [i8; 3], tc: [i8; 2]) -> Vertex {
function create_vertices (line 26) | fn create_vertices() -> (Vec<Vertex>, Vec<u16>) {
type Uniforms (line 74) | struct Uniforms {
function affine_to_rows (line 80) | fn affine_to_rows(mat: &Affine3A) -> [f32; 12] {
type Example (line 101) | struct Example {
method required_features (line 122) | fn required_features() -> wgpu::Features {
method required_downlevel_capabilities (line 128) | fn required_downlevel_capabilities() -> wgpu::DownlevelCapabilities {
method required_limits (line 135) | fn required_limits() -> wgpu::Limits {
method init (line 139) | fn init(
method update (line 388) | fn update(&mut self, _event: winit::event::WindowEvent) {
method resize (line 392) | fn resize(
method render (line 400) | fn render(&mut self, view: &wgpu::TextureView, device: &wgpu::Device, ...
function main (line 460) | pub fn main() {
FILE: examples/features/src/ray_cube_fragment/mod.rs
type Vertex (line 11) | struct Vertex {
function vertex (line 16) | fn vertex(pos: [i8; 3], tc: [i8; 2]) -> Vertex {
function create_vertices (line 23) | fn create_vertices() -> (Vec<Vertex>, Vec<u16>) {
type Uniforms (line 71) | struct Uniforms {
type Example (line 76) | struct Example {
method required_features (line 87) | fn required_features() -> wgpu::Features {
method required_downlevel_capabilities (line 91) | fn required_downlevel_capabilities() -> wgpu::DownlevelCapabilities {
method required_limits (line 98) | fn required_limits() -> wgpu::Limits {
method init (line 102) | fn init(
method update (line 254) | fn update(&mut self, _event: winit::event::WindowEvent) {}
method resize (line 256) | fn resize(
method render (line 274) | fn render(&mut self, view: &wgpu::TextureView, device: &wgpu::Device, ...
function main (line 346) | pub fn main() {
FILE: examples/features/src/ray_cube_normals/mod.rs
type Vertex (line 13) | struct Vertex {
function vertex (line 18) | fn vertex(pos: [i8; 3], tc: [i8; 2]) -> Vertex {
function create_vertices (line 25) | fn create_vertices() -> (Vec<Vertex>, Vec<u16>) {
type Uniforms (line 73) | struct Uniforms {
function affine_to_rows (line 79) | fn affine_to_rows(mat: &Affine3A) -> [f32; 12] {
type Example (line 100) | struct Example {
constant SRGB (line 112) | const SRGB: bool = false;
method required_features (line 113) | fn required_features() -> wgpu::Features {
method required_downlevel_capabilities (line 117) | fn required_downlevel_capabilities() -> wgpu::DownlevelCapabilities {
method required_limits (line 124) | fn required_limits() -> wgpu::Limits {
method init (line 128) | fn init(
method update (line 374) | fn update(&mut self, _event: winit::event::WindowEvent) {
method resize (line 378) | fn resize(
method render (line 386) | fn render(&mut self, view: &wgpu::TextureView, device: &wgpu::Device, ...
function main (line 446) | pub fn main() {
FILE: examples/features/src/ray_scene/mod.rs
type Vertex (line 12) | struct Vertex {
type Uniforms (line 23) | struct Uniforms {
type RawSceneComponents (line 29) | struct RawSceneComponents {
type SceneComponents (line 36) | struct SceneComponents {
type InstanceEntry (line 46) | struct InstanceEntry {
type GeometryEntry (line 55) | struct GeometryEntry {
type Material (line 63) | struct Material {
function load_model (line 72) | fn load_model(scene: &mut RawSceneComponents, path: &str) {
function upload_scene_components (line 151) | fn upload_scene_components(
function load_scene (line 277) | fn load_scene(device: &wgpu::Device, queue: &wgpu::Queue) -> SceneCompon...
type Example (line 286) | struct Example {
method required_features (line 297) | fn required_features() -> wgpu::Features {
method required_downlevel_capabilities (line 301) | fn required_downlevel_capabilities() -> wgpu::DownlevelCapabilities {
method required_limits (line 308) | fn required_limits() -> wgpu::Limits {
method init (line 312) | fn init(
method update (line 424) | fn update(&mut self, _event: winit::event::WindowEvent) {}
method resize (line 426) | fn resize(
method render (line 444) | fn render(&mut self, view: &wgpu::TextureView, device: &wgpu::Device, ...
function main (line 526) | pub fn main() {
FILE: examples/features/src/ray_shadows/mod.rs
type Vertex (line 13) | struct Vertex {
function vertex (line 18) | fn vertex(pos: [f32; 3], normal: [f32; 3]) -> Vertex {
function create_vertices (line 25) | fn create_vertices() -> (Vec<Vertex>, Vec<u16>) {
type Uniforms (line 49) | struct Uniforms {
type Example (line 55) | struct Example {
method required_features (line 84) | fn required_features() -> wgpu::Features {
method required_downlevel_capabilities (line 88) | fn required_downlevel_capabilities() -> wgpu::DownlevelCapabilities {
method required_limits (line 95) | fn required_limits() -> wgpu::Limits {
method init (line 103) | fn init(
method update (line 280) | fn update(&mut self, _event: winit::event::WindowEvent) {}
method resize (line 282) | fn resize(
method render (line 294) | fn render(&mut self, view: &wgpu::TextureView, device: &wgpu::Device, ...
constant CAM_LOOK_AT (line 65) | const CAM_LOOK_AT: Vec3 = Vec3::new(0.0, 1.0, -1.5);
function create_matrix (line 67) | fn create_matrix(config: &wgpu::SurfaceConfiguration) -> Uniforms {
function main (line 343) | pub fn main() {
FILE: examples/features/src/ray_traced_triangle/mod.rs
type Example (line 13) | struct Example {
method required_features (line 31) | fn required_features() -> wgpu::Features {
method required_limits (line 35) | fn required_limits() -> wgpu::Limits {
method required_downlevel_capabilities (line 39) | fn required_downlevel_capabilities() -> wgpu::DownlevelCapabilities {
method init (line 46) | fn init(
method resize (line 365) | fn resize(
method update (line 373) | fn update(&mut self, _event: winit::event::WindowEvent) {}
method render (line 375) | fn render(&mut self, view: &wgpu::TextureView, device: &wgpu::Device, ...
type Uniforms (line 25) | struct Uniforms {
function main (line 429) | pub fn main() {
FILE: examples/features/src/render_to_texture/mod.rs
constant TEXTURE_DIMS (line 6) | const TEXTURE_DIMS: (usize, usize) = (512, 512);
function run (line 8) | async fn run(_path: Option<String>) {
function main (line 153) | pub fn main() {
FILE: examples/features/src/render_with_compute/mod.rs
type GlobalParams (line 11) | struct GlobalParams {
type Example (line 17) | pub struct Example {
method init (line 28) | fn init(
method required_limits (line 95) | fn required_limits() -> wgpu::Limits {
method resize (line 102) | fn resize(
method render (line 119) | fn render(&mut self, view: &wgpu::TextureView, device: &wgpu::Device, ...
method update (line 163) | fn update(&mut self, _event: winit::event::WindowEvent) {}
function create_tv_and_bg (line 166) | fn create_tv_and_bg(
function main (line 205) | pub fn main() {
FILE: examples/features/src/repeated_compute/mod.rs
constant OVERFLOW (line 10) | const OVERFLOW: u32 = 0xffffffff;
function run (line 12) | async fn run() {
function compute (line 36) | async fn compute(local_buffer: &mut [u32], context: &WgpuContext) {
function main (line 128) | pub fn main() {
type WgpuContext (line 149) | struct WgpuContext {
method new (line 159) | async fn new(buffer_size: usize) -> WgpuContext {
FILE: examples/features/src/shadow/mod.rs
type Vertex (line 8) | struct Vertex {
function vertex (line 13) | fn vertex(pos: [i8; 3], nor: [i8; 3]) -> Vertex {
function create_cube (line 20) | fn create_cube() -> (Vec<Vertex>, Vec<u16>) {
function create_plane (line 66) | fn create_plane(size: i8) -> (Vec<Vertex>, Vec<u16>) {
type Entity (line 79) | struct Entity {
type Light (line 90) | struct Light {
method to_raw (line 107) | fn to_raw(&self) -> LightRaw {
type LightRaw (line 100) | struct LightRaw {
type GlobalUniforms (line 131) | struct GlobalUniforms {
type EntityUniforms (line 138) | struct EntityUniforms {
type Pass (line 143) | struct Pass {
type Example (line 149) | struct Example {
constant MAX_LIGHTS (line 162) | const MAX_LIGHTS: usize = 10;
constant SHADOW_FORMAT (line 163) | const SHADOW_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Depth3...
constant SHADOW_SIZE (line 164) | const SHADOW_SIZE: wgpu::Extent3d = wgpu::Extent3d {
constant DEPTH_FORMAT (line 169) | const DEPTH_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Depth32...
method generate_matrix (line 171) | fn generate_matrix(aspect_ratio: f32) -> glam::Mat4 {
method create_depth_texture (line 181) | fn create_depth_texture(
method optional_features (line 205) | fn optional_features() -> wgpu::Features {
method init (line 209) | fn init(
method update (line 682) | fn update(&mut self, _event: winit::event::WindowEvent) {
method resize (line 686) | fn resize(
method render (line 704) | fn render(&mut self, view: &wgpu::TextureView, device: &wgpu::Device, ...
function main (line 838) | pub fn main() {
FILE: examples/features/src/skybox/mod.rs
constant IMAGE_SIZE (line 5) | const IMAGE_SIZE: u32 = 256;
type Vertex (line 9) | struct Vertex {
type Entity (line 14) | struct Entity {
type Camera (line 20) | struct Camera {
method to_uniform_data (line 30) | fn to_uniform_data(&self) -> [f32; 16 * 3 + 4] {
constant MODEL_CENTER_Y (line 27) | const MODEL_CENTER_Y: f32 = 2.0;
type Example (line 55) | pub struct Example {
constant DEPTH_FORMAT (line 67) | const DEPTH_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Depth24...
method create_depth_texture (line 69) | fn create_depth_texture(
method optional_features (line 93) | fn optional_features() -> wgpu::Features {
method init (line 99) | fn init(
method update (line 380) | fn update(&mut self, event: winit::event::WindowEvent) {
method resize (line 392) | fn resize(
method render (line 402) | fn render(&mut self, view: &wgpu::TextureView, device: &wgpu::Device, ...
function main (line 467) | pub fn main() {
FILE: examples/features/src/srgb_blend/mod.rs
type Vertex (line 6) | struct Vertex {
function vertex (line 11) | fn vertex(pos: [i8; 2], _color: [f32; 4], offset: f32) -> Vertex {
function quad (line 24) | fn quad(vertices: &mut Vec<Vertex>, indices: &mut Vec<u16>, color: [f32;...
function create_vertices (line 37) | fn create_vertices() -> (Vec<Vertex>, Vec<u16>) {
type Example (line 50) | struct Example<const SRGB: bool> {
constant SRGB (line 59) | const SRGB: bool = SRGB;
function optional_features (line 61) | fn optional_features() -> wgpu::Features {
function init (line 65) | fn init(
function update (line 163) | fn update(&mut self, _event: winit::event::WindowEvent) {
function resize (line 167) | fn resize(
function render (line 175) | fn render(&mut self, view: &wgpu::TextureView, device: &wgpu::Device, qu...
function main (line 214) | pub fn main() {
FILE: examples/features/src/stencil_triangles/mod.rs
type Vertex (line 6) | struct Vertex {
function vertex (line 10) | fn vertex(x: f32, y: f32) -> Vertex {
type Example (line 16) | struct Example {
method init (line 25) | fn init(
method update (line 162) | fn update(&mut self, _event: winit::event::WindowEvent) {
method resize (line 166) | fn resize(
method render (line 188) | fn render(&mut self, view: &wgpu::TextureView, device: &wgpu::Device, ...
function main (line 237) | pub fn main() {
FILE: examples/features/src/storage_texture/mod.rs
constant TEXTURE_DIMS (line 22) | const TEXTURE_DIMS: (usize, usize) = (512, 512);
function run (line 24) | async fn run(_path: Option<String>) {
function main (line 162) | pub fn main() {
FILE: examples/features/src/texture_arrays/mod.rs
type Vertex (line 7) | struct Vertex {
function vertex (line 13) | fn vertex(pos: [i8; 2], tc: [i8; 2], index: i8) -> Vertex {
function create_vertices (line 21) | fn create_vertices() -> Vec<Vertex> {
function create_indices (line 36) | fn create_indices() -> Vec<u16> {
type Color (line 48) | enum Color {
function create_texture_data (line 55) | fn create_texture_data(color: Color) -> [u8; 4] {
type Example (line 64) | struct Example {
method optional_features (line 75) | fn optional_features() -> wgpu::Features {
method required_features (line 78) | fn required_features() -> wgpu::Features {
method required_limits (line 81) | fn required_limits() -> wgpu::Limits {
method init (line 88) | fn init(
method resize (line 375) | fn resize(
method update (line 383) | fn update(&mut self, _event: winit::event::WindowEvent) {
method render (line 386) | fn render(&mut self, view: &wgpu::TextureView, device: &wgpu::Device, ...
function main (line 429) | pub fn main() {
FILE: examples/features/src/timestamp_queries/mod.rs
type Queries (line 22) | struct Queries {
method new (line 119) | fn new(device: &wgpu::Device, num_queries: u64) -> Self {
method resolve (line 143) | fn resolve(&self, encoder: &mut wgpu::CommandEncoder) {
method wait_for_results (line 160) | fn wait_for_results(&self, device: &wgpu::Device, is_test_on_metal: bo...
type QueryResults (line 30) | struct QueryResults {
constant NUM_QUERIES (line 48) | const NUM_QUERIES: u64 = 8;
method from_raw_results (line 54) | fn from_raw_results(timestamps: Vec<u64>, timestamps_inside_passes: bo...
method print (line 81) | fn print(&self, queue: &wgpu::Queue) {
function run (line 194) | async fn run() {
function submit_render_and_compute_pass_with_queries (line 241) | fn submit_render_and_compute_pass_with_queries(
function compute_pass (line 291) | fn compute_pass(
function render_pass (line 343) | fn render_pass(
function main (line 431) | pub fn main() {
function test_timestamps (line 493) | fn test_timestamps(
FILE: examples/features/src/uniform_values/mod.rs
constant ZOOM_INCREMENT_FACTOR (line 32) | const ZOOM_INCREMENT_FACTOR: f32 = 1.1;
constant CAMERA_POS_INCREMENT_FACTOR (line 33) | const CAMERA_POS_INCREMENT_FACTOR: f32 = 0.1;
function spawn (line 36) | fn spawn(f: impl Future<Output = ()> + 'static) {
function spawn (line 41) | fn spawn(f: impl Future<Output = ()> + 'static) {
type ShaderState (line 47) | struct ShaderState {
method as_wgsl_bytes (line 73) | fn as_wgsl_bytes(&self) -> encase::internal::Result<Vec<u8>> {
method translate_view (line 79) | fn translate_view(&mut self, increments: i32, axis: usize) {
method zoom (line 83) | fn zoom(&mut self, amount: f32) {
method default (line 90) | fn default() -> Self {
type WgpuContext (line 99) | struct WgpuContext {
method new (line 112) | async fn new(
method resize (line 229) | fn resize(&mut self, new_size: winit::dpi::PhysicalSize<u32>) {
type UniformAction (line 236) | enum UniformAction {
type RunState (line 241) | enum RunState {
type App (line 251) | struct App {
method new (line 258) | fn new(event_loop: &EventLoop<UniformAction>) -> Self {
method resumed (line 268) | fn resumed(&mut self, event_loop: &ActiveEventLoop) {
method user_event (line 313) | fn user_event(&mut self, _event_loop: &ActiveEventLoop, event: Uniform...
method exiting (line 327) | fn exiting(&mut self, _event_loop: &ActiveEventLoop) {
method window_event (line 331) | fn window_event(
function main (line 487) | pub fn main() {
FILE: examples/features/src/utils.rs
function get_content_div (line 8) | fn get_content_div() -> web_sys::Element {
function add_web_nothing_to_see_msg (line 17) | pub fn add_web_nothing_to_see_msg() {
function output_image_native (line 25) | pub fn output_image_native(image_data: Vec<u8>, texture_dims: (usize, us...
function output_image_wasm (line 51) | pub fn output_image_wasm(image_data: Vec<u8>, texture_dims: (usize, usiz...
function create_staging_canvas (line 136) | fn create_staging_canvas(document: &web_sys::Document) -> web_sys::HtmlC...
function create_output_image_element (line 152) | fn create_output_image_element(document: &web_sys::Document) -> web_sys:...
function get_adapter_with_capabilities_or_from_env (line 169) | pub(crate) async fn get_adapter_with_capabilities_or_from_env(
function get_adapter_with_capabilities_or_from_env (line 231) | pub(crate) async fn get_adapter_with_capabilities_or_from_env(
type AnimationTimer (line 271) | pub struct AnimationTimer {
method time (line 276) | pub fn time(&mut self) -> f32 {
FILE: examples/features/src/water/mod.rs
constant SIZE (line 17) | const SIZE: f32 = 29.0;
constant CAMERA (line 23) | const CAMERA: Vec3 = glam::Vec3::new(-200.0, 70.0, 200.0);
type Matrices (line 25) | struct Matrices {
type TerrainUniforms (line 33) | struct TerrainUniforms {
type WaterUniforms (line 40) | struct WaterUniforms {
type Uniforms (line 47) | struct Uniforms {
type Example (line 53) | struct Example {
method generate_matrices (line 96) | fn generate_matrices(aspect_ratio: f32) -> Matrices {
method generate_uniforms (line 123) | fn generate_uniforms(width: u32, height: u32) -> Uniforms {
method initialize_resources (line 151) | fn initialize_resources(
method init (line 269) | fn init(
method update (line 659) | fn update(&mut self, _event: winit::event::WindowEvent) {
method resize (line 663) | fn resize(
method render (line 693) | fn render(&mut self, view: &wgpu::TextureView, device: &wgpu::Device, ...
function main (line 822) | pub fn main() {
FILE: examples/features/src/water/point_gen.rs
constant A (line 15) | const A: f32 = std::f32::consts::FRAC_1_SQRT_2;
constant B (line 21) | const B: f32 = SQRT_3 * A;
constant S45 (line 26) | const S45: f32 = std::f32::consts::FRAC_1_SQRT_2;
constant C45 (line 30) | const C45: f32 = S45;
constant SQRT_3 (line 32) | const SQRT_3: f32 = 1.7320508;
type TerrainVertexAttributes (line 36) | pub struct TerrainVertexAttributes {
type WaterVertexAttributes (line 44) | pub struct WaterVertexAttributes {
type TerrainVertex (line 53) | pub struct TerrainVertex {
function surrounding_hexagonal_points (line 67) | fn surrounding_hexagonal_points(x: isize, y: isize) -> [(isize, isize); ...
function surrounding_point_values_iter (line 78) | fn surrounding_point_values_iter<T>(
function calculate_normal (line 98) | pub fn calculate_normal(a: glam::Vec3, b: glam::Vec3, c: glam::Vec3) -> ...
function q_given_r (line 105) | fn q_given_r(radius: f32) -> usize {
type HexTerrainMesh (line 113) | pub struct HexTerrainMesh {
method generate (line 123) | pub fn generate(radius: f32, mut gen_vertex: impl FnMut([f32; 2]) -> T...
method make_buffer_data (line 152) | pub fn make_buffer_data(&self) -> Vec<TerrainVertexAttributes> {
type HexWaterMesh (line 206) | pub struct HexWaterMesh {
method generate (line 212) | pub fn generate(radius: f32) -> Self {
method generate_points (line 238) | pub fn generate_points(&self) -> Vec<WaterVertexAttributes> {
FILE: examples/standalone/01_hello_compute/src/main.rs
function main (line 16) | fn main() {
FILE: examples/standalone/02_hello_window/src/main.rs
type State (line 10) | struct State {
method new (line 21) | async fn new(display: OwnedDisplayHandle, window: Arc<Window>) -> State {
method get_window (line 56) | fn get_window(&self) -> &Window {
method configure_surface (line 60) | fn configure_surface(&self) {
method resize (line 75) | fn resize(&mut self, new_size: winit::dpi::PhysicalSize<u32>) {
method render (line 82) | fn render(&mut self) {
type App (line 144) | struct App {
method resumed (line 149) | fn resumed(&mut self, event_loop: &ActiveEventLoop) {
method window_event (line 166) | fn window_event(&mut self, event_loop: &ActiveEventLoop, _id: WindowId, ...
function main (line 188) | fn main() {
FILE: examples/standalone/custom_backend/src/custom.rs
type Counter (line 12) | pub struct Counter(Arc<()>);
method new (line 15) | pub fn new() -> Self {
method count (line 19) | pub fn count(&self) -> usize {
type CustomInstance (line 25) | pub struct CustomInstance(pub Counter);
method new (line 28) | fn new(__desc: wgpu::InstanceDescriptor) -> Self
method create_surface (line 35) | unsafe fn create_surface(
method request_adapter (line 42) | fn request_adapter(
method poll_all_devices (line 51) | fn poll_all_devices(&self, _force_wait: bool) -> bool {
method wgsl_language_features (line 55) | fn wgsl_language_features(&self) -> wgpu::WgslLanguageFeatures {
method enumerate_adapters (line 59) | fn enumerate_adapters(
type CustomAdapter (line 68) | struct CustomAdapter(Counter);
method request_device (line 71) | fn request_device(
method cooperative_matrix_properties (line 83) | fn cooperative_matrix_properties(&self) -> Vec<wgpu::CooperativeMatrixPr...
method is_surface_supported (line 87) | fn is_surface_supported(&self, _surface: &DispatchSurface) -> bool {
method features (line 91) | fn features(&self) -> wgpu::Features {
method limits (line 95) | fn limits(&self) -> wgpu::Limits {
method downlevel_capabilities (line 99) | fn downlevel_capabilities(&self) -> wgpu::DownlevelCapabilities {
method get_info (line 103) | fn get_info(&self) -> wgpu::AdapterInfo {
method get_texture_format_features (line 107) | fn get_texture_format_features(
method get_presentation_timestamp (line 114) | fn get_presentation_timestamp(&self) -> wgpu::PresentationTimestamp {
type CustomDevice (line 120) | struct CustomDevice(Counter);
method features (line 123) | fn features(&self) -> wgpu::Features {
method limits (line 127) | fn limits(&self) -> wgpu::Limits {
method adapter_info (line 131) | fn adapter_info(&self) -> wgpu::AdapterInfo {
method create_shader_module (line 135) | fn create_shader_module(
method create_shader_module_passthrough (line 144) | unsafe fn create_shader_module_passthrough(
method create_bind_group_layout (line 151) | fn create_bind_group_layout(
method create_bind_group (line 158) | fn create_bind_group(
method create_pipeline_layout (line 165) | fn create_pipeline_layout(
method create_render_pipeline (line 172) | fn create_render_pipeline(
method create_mesh_pipeline (line 179) | fn create_mesh_pipeline(
method create_compute_pipeline (line 186) | fn create_compute_pipeline(
method create_pipeline_cache (line 194) | unsafe fn create_pipeline_cache(
method create_buffer (line 201) | fn create_buffer(&self, _desc: &wgpu::BufferDescriptor<'_>) -> wgpu::cus...
method create_texture (line 205) | fn create_texture(&self, _desc: &wgpu::TextureDescriptor<'_>) -> wgpu::c...
method create_external_texture (line 209) | fn create_external_texture(
method create_blas (line 217) | fn create_blas(
method create_tlas (line 225) | fn create_tlas(&self, _desc: &wgpu::CreateTlasDescriptor<'_>) -> wgpu::c...
method create_sampler (line 229) | fn create_sampler(&self, _desc: &wgpu::SamplerDescriptor<'_>) -> wgpu::c...
method create_query_set (line 233) | fn create_query_set(
method create_command_encoder (line 240) | fn create_command_encoder(
method create_render_bundle_encoder (line 247) | fn create_render_bundle_encoder(
method set_device_lost_callback (line 254) | fn set_device_lost_callback(&self, _device_lost_callback: wgpu::custom::...
method on_uncaptured_error (line 258) | fn on_uncaptured_error(&self, _handler: Arc<dyn wgpu::UncapturedErrorHan...
method push_error_scope (line 262) | fn push_error_scope(&self, _filter: wgpu::ErrorFilter) -> u32 {
method pop_error_scope (line 266) | fn pop_error_scope(&self, _index: u32) -> Pin<Box<dyn wgpu::custom::PopE...
method start_graphics_debugger_capture (line 270) | unsafe fn start_graphics_debugger_capture(&self) {
method stop_graphics_debugger_capture (line 274) | unsafe fn stop_graphics_debugger_capture(&self) {
method poll (line 278) | fn poll(
method get_internal_counters (line 285) | fn get_internal_counters(&self) -> wgpu::InternalCounters {
method generate_allocator_report (line 289) | fn generate_allocator_report(&self) -> Option<wgpu::AllocatorReport> {
method destroy (line 293) | fn destroy(&self) {
type CustomShaderModule (line 299) | pub struct CustomShaderModule(pub Counter);
method get_compilation_info (line 302) | fn get_compilation_info(&self) -> Pin<Box<dyn wgpu::custom::ShaderCompil...
type CustomQueue (line 308) | struct CustomQueue(Counter);
method write_buffer (line 311) | fn write_buffer(
method create_staging_buffer (line 320) | fn create_staging_buffer(
method validate_write_buffer (line 327) | fn validate_write_buffer(
method write_staging_buffer (line 336) | fn write_staging_buffer(
method write_texture (line 345) | fn write_texture(
method submit (line 355) | fn submit(
method get_timestamp_period (line 362) | fn get_timestamp_period(&self) -> f32 {
method on_submitted_work_done (line 366) | fn on_submitted_work_done(&self, _callback: wgpu::custom::BoxSubmittedWo...
method copy_external_image_to_texture (line 371) | fn copy_external_image_to_texture(
method compact_blas (line 380) | fn compact_blas(&self, _blas: &DispatchBlas) -> (Option<u64>, DispatchBl...
type CustomComputePipeline (line 386) | pub struct CustomComputePipeline(pub Counter);
method get_bind_group_layout (line 389) | fn get_bind_group_layout(&self, _index: u32) -> wgpu::custom::DispatchBi...
FILE: examples/standalone/custom_backend/src/main.rs
function main (line 9) | async fn main() {
FILE: lock-analyzer/src/main.rs
function main (line 25) | fn main() -> Result<()> {
type Action (line 186) | enum Action {
type LocationAddress (line 227) | type LocationAddress = u64;
type Rank (line 229) | struct Rank {
method is_leaf (line 236) | fn is_leaf(&self) -> bool {
type LocationSet (line 241) | type LocationSet = BTreeMap<Arc<Location>, BTreeSet<Arc<Location>>>;
type Location (line 244) | struct Location {
method fmt (line 251) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
FILE: naga-cli/src/bin/naga.rs
type Args (line 7) | struct Args {
type TaskDispatchLimitsArg (line 167) | struct TaskDispatchLimitsArg(Option<naga::back::TaskDispatchLimits>);
type Err (line 170) | type Err = String;
method from_str (line 172) | fn from_str(s: &str) -> Result<Self, Self::Err> {
type BoundsCheckPolicyArg (line 187) | struct BoundsCheckPolicyArg(naga::proc::BoundsCheckPolicy);
type Err (line 190) | type Err = String;
method from_str (line 192) | fn from_str(s: &str) -> Result<Self, Self::Err> {
type ShaderModelArg (line 209) | struct ShaderModelArg(naga::back::hlsl::ShaderModel);
type Err (line 212) | type Err = String;
method from_str (line 214) | fn from_str(s: &str) -> Result<Self, Self::Err> {
type SpirvVersionArg (line 233) | struct SpirvVersionArg(u8, u8);
type Err (line 236) | type Err = String;
method from_str (line 238) | fn from_str(s: &str) -> Result<Self, Self::Err> {
type ShaderStage (line 250) | struct ShaderStage(naga::ShaderStage);
type Err (line 253) | type Err = anyhow::Error;
method from_str (line 255) | fn from_str(s: &str) -> Result<Self, Self::Err> {
type InputKind (line 268) | enum InputKind {
type Err (line 275) | type Err = anyhow::Error;
method from_str (line 277) | fn from_str(s: &str) -> Result<Self, Self::Err> {
type GlslProfileArg (line 290) | struct GlslProfileArg(naga::back::glsl::Version);
type Err (line 293) | type Err = String;
method from_str (line 295) | fn from_str(s: &str) -> Result<Self, Self::Err> {
type MslVersionArg (line 309) | struct MslVersionArg((u8, u8));
type Err (line 312) | type Err = String;
method from_str (line 314) | fn from_str(s: &str) -> Result<Self, Self::Err> {
type Overrides (line 332) | struct Overrides {
type Err (line 337) | type Err = String;
method from_str (line 339) | fn from_str(s: &str) -> Result<Self, Self::Err> {
type Defines (line 353) | struct Defines {
type Err (line 358) | type Err = String;
method from_str (line 360) | fn from_str(s: &str) -> Result<Self, Self::Err> {
type CapabilitiesArg (line 374) | struct CapabilitiesArg(naga::valid::Capabilities);
type Err (line 377) | type Err = String;
method from_str (line 379) | fn from_str(s: &str) -> Result<Self, Self::Err> {
type Parameters (line 405) | struct Parameters<'a> {
type PrettyResult (line 431) | trait PrettyResult {
method unwrap_pretty (line 433) | fn unwrap_pretty(self) -> Self::Target;
type Target (line 455) | type Target = T;
method unwrap_pretty (line 456) | fn unwrap_pretty(self) -> T {
function print_err (line 438) | fn print_err(error: &dyn Error) {
function main (line 467) | fn main() {
type CliError (line 476) | struct CliError(&'static str);
method fmt (line 478) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
function run (line 484) | fn run() -> anyhow::Result<()> {
type Parsed (line 726) | struct Parsed {
function parse_input (line 732) | fn parse_input(input_path: &Path, input: Vec<u8>, params: &Parameters) -...
function write_output (line 822) | fn write_output(
function bulk_validate (line 1020) | fn bulk_validate(args: &Args, params: &Parameters) -> anyhow::Result<()> {
FILE: naga-test/src/lib.rs
method non_wgsl_default (line 38) | pub fn non_wgsl_default() -> Self {
method wgsl_default (line 43) | pub fn wgsl_default() -> Self {
type SpvOutVersion (line 49) | pub struct SpvOutVersion(pub u8, pub u8);
method default (line 51) | fn default() -> Self {
type BindingMapSerialization (line 57) | pub struct BindingMapSerialization {
function deserialize_binding_map (line 62) | pub fn deserialize_binding_map<'de, D>(
type WriterSharedOptions (line 80) | pub struct WriterSharedOptions {
type WgslInParameters (line 88) | pub struct WgslInParameters {
function from (line 92) | fn from(value: &WgslInParameters) -> Self {
type SpirvInParameters (line 102) | pub struct SpirvInParameters {
function from (line 106) | fn from(value: &SpirvInParameters) -> Self {
type SpirvOutParameters (line 116) | pub struct SpirvOutParameters {
method to_options (line 146) | pub fn to_options<'a>(
method default (line 130) | fn default() -> Self {
type WgslOutParameters (line 184) | pub struct WgslOutParameters {
function from (line 188) | fn from(value: &WgslOutParameters) -> Self {
type FragmentModule (line 196) | pub struct FragmentModule {
type Parameters (line 203) | pub struct Parameters {
function default_task_limits (line 254) | fn default_task_limits() -> Option<naga::back::TaskDispatchLimits> {
type Input (line 263) | pub struct Input {
method new (line 291) | pub fn new(subdirectory: &str, name: &str, extension: &str) -> Input {
method files_in_dir (line 302) | pub fn files_in_dir<'a>(
method input_directory (line 349) | pub fn input_directory(&self, dir_in: &str) -> PathBuf {
method output_directory (line 354) | pub fn output_directory(subdirectory: &str, dir_out: &str) -> PathBuf {
method input_path (line 359) | pub fn input_path(&self, dir_in: &str) -> PathBuf {
method output_path (line 365) | pub fn output_path(&self, subdirectory: &str, extension: &str, dir_out...
method read_source (line 390) | pub fn read_source(&self, dir_in: &str, print: bool) -> String {
method read_bytes (line 408) | pub fn read_bytes(&self, dir_in: &str, print: bool) -> Vec<u8> {
method bytes (line 425) | pub fn bytes(&self, dir_in: &str) -> u64 {
method read_parameters (line 431) | pub fn read_parameters(&self, dir_in: &str) -> Parameters {
method write_output_file (line 467) | pub fn write_output_file(
FILE: naga/build.rs
function main (line 1) | fn main() {
FILE: naga/fuzz/build.rs
function main (line 1) | fn main() {
FILE: naga/fuzz/fuzz_targets/glsl_parser.rs
type OptionsProxy (line 15) | struct OptionsProxy {
method from (line 21) | fn from(proxy: OptionsProxy) -> Self {
function main (line 44) | fn main() {}
FILE: naga/fuzz/fuzz_targets/ir.rs
function main (line 18) | fn main() {}
FILE: naga/fuzz/fuzz_targets/spv_parser.rs
function main (line 16) | fn main() {}
FILE: naga/fuzz/fuzz_targets/wgsl_parser.rs
function main (line 15) | fn main() {}
FILE: naga/hlsl-snapshots/src/lib.rs
type BadRonParse (line 7) | struct BadRonParse(BadRonParseKind);
method fmt (line 10) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
method source (line 16) | fn source(&self) -> Option<&(dyn Error + 'static)> {
type BadRonParseKind (line 22) | enum BadRonParseKind {
method fmt (line 29) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
method source (line 39) | fn source(&self) -> Option<&(dyn Error + 'static)> {
type Config (line 49) | pub struct Config {
method empty (line 57) | pub fn empty() -> Self {
method from_path (line 65) | pub fn from_path(path: impl AsRef<Path>) -> anyhow::Result<Config> {
method to_file (line 75) | pub fn to_file(&self, path: impl AsRef<Path>) -> anyhow::Result<()> {
method is_empty (line 83) | pub fn is_empty(&self) -> bool {
type ConfigItem (line 94) | pub struct ConfigItem {
FILE: naga/src/arena/handle.rs
type Index (line 13) | pub type Index = crate::non_max_u32::NonMaxU32;
type BadHandle (line 17) | pub struct BadHandle {
method new (line 23) | pub fn new<T>(handle: Handle<T>) -> Self {
type Handle (line 44) | pub struct Handle<T> {
method clone (line 51) | fn clone(&self) -> Self {
method eq (line 59) | fn eq(&self, other: &Self) -> bool {
method partial_cmp (line 67) | fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
method cmp (line 73) | fn cmp(&self, other: &Self) -> Ordering {
function fmt (line 79) | fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
function hash (line 85) | fn hash<H: hash::Hasher>(&self, hasher: &mut H) {
function new (line 91) | pub(crate) const fn new(index: Index) -> Self {
function index (line 99) | pub const fn index(self) -> usize {
function from_usize (line 104) | pub(super) fn from_usize(index: usize) -> Self {
function write_prefixed (line 113) | pub fn write_prefixed(
FILE: naga/src/arena/handle_set.rs
type HandleSet (line 7) | pub struct HandleSet<T> {
function new (line 20) | pub fn new() -> Self {
function is_empty (line 28) | pub fn is_empty(&self) -> bool {
function for_arena (line 33) | pub fn for_arena(arena: &impl ArenaType<T>) -> Self {
function clear (line 43) | pub fn clear(&mut self) {
function clear_for_arena (line 48) | pub fn clear_for_arena(&mut self, arena: &impl ArenaType<T>) {
function all_possible (line 55) | pub fn all_possible(&self) -> impl Iterator<Item = Handle<T>> {
function insert (line 62) | pub fn insert(&mut self, handle: Handle<T>) -> bool {
function remove (line 69) | pub fn remove(&mut self, handle: Handle<T>) -> bool {
function insert_iter (line 74) | pub fn insert_iter(&mut self, iter: impl IntoIterator<Item = Handle<T>>) {
function add_all (line 81) | pub fn add_all(&mut self) {
function contains (line 85) | pub fn contains(&self, handle: Handle<T>) -> bool {
function iter (line 90) | pub fn iter(&self) -> impl '_ + Iterator<Item = Handle<T>> {
function pop (line 96) | pub fn pop(&mut self) -> Option<Handle<T>> {
method default (line 113) | fn default() -> Self {
type ArenaType (line 118) | pub trait ArenaType<T> {
method len (line 119) | fn len(&self) -> usize;
function len (line 123) | fn len(&self) -> usize {
function len (line 129) | fn len(&self) -> usize {
FILE: naga/src/arena/handlevec.rs
type HandleVec (line 23) | pub(crate) struct HandleVec<T, U> {
method default (line 29) | fn default() -> Self {
function new (line 39) | pub(crate) const fn new() -> Self {
function with_capacity (line 46) | pub(crate) fn with_capacity(capacity: usize) -> Self {
function len (line 53) | pub(crate) const fn len(&self) -> usize {
function insert (line 65) | pub(crate) fn insert(&mut self, handle: Handle<T>, value: U) {
function get (line 70) | pub(crate) fn get(&self, handle: Handle<T>) -> Option<&U> {
function clear (line 74) | pub(crate) fn clear(&mut self) {
function resize (line 78) | pub(crate) fn resize(&mut self, len: usize, fill: U)
function iter (line 85) | pub(crate) fn iter(&self) -> impl Iterator<Item = &U> {
function iter_mut (line 89) | pub(crate) fn iter_mut(&mut self) -> impl Iterator<Item = &mut U> {
type Output (line 95) | type Output = U;
function index (line 97) | fn index(&self, handle: Handle<T>) -> &Self::Output {
function index_mut (line 103) | fn index_mut(&mut self, handle: Handle<T>) -> &mut Self::Output {
FILE: naga/src/arena/mod.rs
type Arena (line 52) | pub struct Arena<T> {
method default (line 60) | fn default() -> Self {
function fmt (line 66) | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
function new (line 73) | pub const fn new() -> Self {
function into_inner (line 81) | pub fn into_inner(self) -> Vec<T> {
function len (line 86) | pub const fn len(&self) -> usize {
function is_empty (line 91) | pub const fn is_empty(&self) -> bool {
function iter (line 97) | pub fn iter(&self) -> impl DoubleEndedIterator<Item = (Handle<T>, &T)> +...
function iter_mut_span (line 106) | pub fn iter_mut_span(
function drain (line 117) | pub fn drain(&mut self) -> impl DoubleEndedIterator<Item = (Handle<T>, T...
function iter_mut (line 129) | pub fn iter_mut(&mut self) -> impl DoubleEndedIterator<Item = (Handle<T>...
function append (line 137) | pub fn append(&mut self, value: T, span: Span) -> Handle<T> {
function fetch_if (line 145) | pub fn fetch_if<F: Fn(&T) -> bool>(&self, fun: F) -> Option<Handle<T>> {
function fetch_if_or_append (line 156) | pub fn fetch_if_or_append<F: Fn(&T, &T) -> bool>(
function fetch_or_append (line 170) | pub fn fetch_or_append(&mut self, value: T, span: Span) -> Handle<T>
function try_get (line 177) | pub fn try_get(&self, handle: Handle<T>) -> Result<&T, BadHandle> {
function get_mut (line 184) | pub fn get_mut(&mut self, handle: Handle<T>) -> &mut T {
function range_from (line 189) | pub fn range_from(&self, old_length: usize) -> Range<T> {
function clear (line 195) | pub fn clear(&mut self) {
function get_span (line 199) | pub fn get_span(&self, handle: Handle<T>) -> Span {
function check_contains_handle (line 207) | pub fn check_contains_handle(&self, handle: Handle<T>) -> Result<(), Bad...
function check_contains_range (line 216) | pub fn check_contains_range(&self, range: &Range<T>) -> Result<(), BadRa...
function retain_mut (line 236) | pub(crate) fn retain_mut<P>(&mut self, mut predicate: P)
function deserialize (line 267) | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
type Output (line 279) | type Output = T;
function index (line 280) | fn index(&self, handle: Handle<T>) -> &T {
function index_mut (line 286) | fn index_mut(&mut self, handle: Handle<T>) -> &mut T {
type Output (line 292) | type Output = [T];
function index (line 293) | fn index(&self, range: Range<T>) -> &[T] {
function append_non_unique (line 303) | fn append_non_unique() {
function append_unique (line 312) | fn append_unique() {
function fetch_or_append_non_unique (line 321) | fn fetch_or_append_non_unique() {
function fetch_or_append_unique (line 330) | fn fetch_or_append_unique() {
FILE: naga/src/arena/range.rs
type Range (line 24) | pub struct Range<T> {
function erase_type (line 31) | pub(crate) const fn erase_type(self) -> Range<()> {
type BadRangeError (line 44) | pub struct BadRangeError {
method new (line 52) | pub fn new<T>(range: Range<T>) -> Self {
method clone (line 61) | fn clone(&self) -> Self {
function fmt (line 70) | fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
type Item (line 76) | type Item = Handle<T>;
method next (line 77) | fn next(&mut self) -> Option<Self::Item> {
function new_from_bounds (line 90) | pub fn new_from_bounds(first: Handle<T>, last: Handle<T>) -> Self {
function full_range_from_size (line 98) | pub(super) fn full_range_from_size(size: usize) -> Self {
function first_and_last (line 109) | pub const fn first_and_last(&self) -> Option<(Handle<T>, Handle<T>)> {
function index_range (line 123) | pub fn index_range(&self) -> ops::Range<u32> {
function from_index_range (line 128) | pub fn from_index_range(inner: ops::Range<u32>, arena: &Arena<T>) -> Self {
FILE: naga/src/arena/unique_arena.rs
type UniqueArena (line 27) | pub struct UniqueArena<T> {
function new (line 41) | pub fn new() -> Self {
function len (line 49) | pub fn len(&self) -> usize {
function is_empty (line 54) | pub fn is_empty(&self) -> bool {
function clear (line 59) | pub fn clear(&mut self) {
function get_span (line 68) | pub fn get_span(&self, handle: Handle<T>) -> Span {
function drain_all (line 75) | pub(crate) fn drain_all(&mut self) -> UniqueArenaDrain<'_, T> {
type UniqueArenaDrain (line 84) | pub struct UniqueArenaDrain<'a, T> {
type Item (line 91) | type Item = (Handle<T>, T, Span);
method next (line 93) | fn next(&mut self) -> Option<Self::Item> {
function iter (line 109) | pub fn iter(&self) -> impl DoubleEndedIterator<Item = (Handle<T>, &T)> +...
function insert (line 130) | pub fn insert(&mut self, value: T, span: Span) -> Handle<T> {
function replace (line 149) | pub fn replace(&mut self, old: Handle<T>, new: T) {
function get (line 160) | pub fn get(&self, value: &T) -> Option<Handle<T>> {
function get_handle (line 167) | pub fn get_handle(&self, handle: Handle<T>) -> Result<&T, BadHandle> {
function check_contains_handle (line 174) | pub fn check_contains_handle(&self, handle: Handle<T>) -> Result<(), Bad...
method default (line 184) | fn default() -> Self {
function fmt (line 190) | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
type Output (line 196) | type Output = T;
function index (line 197) | fn index(&self, handle: Handle<T>) -> &T {
function serialize (line 207) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
function deserialize (line 220) | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
function arbitrary (line 237) | fn arbitrary(u: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result<S...
function arbitrary_take_rest (line 246) | fn arbitrary_take_rest(u: arbitrary::Unstructured<'a>) -> arbitrary::Res...
function size_hint (line 256) | fn size_hint(depth: usize) -> (usize, Option<usize>) {
FILE: naga/src/back/continue_forward.rs
type Nesting (line 67) | enum Nesting {
type ExitControlFlow (line 156) | pub(super) enum ExitControlFlow {
type ContinueCtx (line 180) | pub(super) struct ContinueCtx {
method clear (line 189) | pub fn clear(&mut self) {
method enter_loop (line 196) | pub fn enter_loop(&mut self) {
method exit_loop (line 203) | pub fn exit_loop(&mut self) {
method enter_switch (line 221) | pub fn enter_switch(&mut self, namer: &mut Namer) -> Option<Rc<String>> {
method exit_switch (line 253) | pub fn exit_switch(&mut self) -> ExitControlFlow {
method continue_encountered (line 301) | pub fn continue_encountered(&mut self) -> Option<&str> {
FILE: naga/src/back/dot/mod.rs
type Options (line 25) | pub struct Options {
type NodeId (line 31) | type NodeId = usize;
type Targets (line 35) | struct Targets {
type StatementGraph (line 44) | struct StatementGraph {
method add (line 65) | fn add(&mut self, block: &[crate::Statement], targets: Targets) -> (No...
function name (line 440) | fn name(option: &Option<String>) -> &str {
constant COLORS (line 445) | const COLORS: &[&str] = &[
type Prefixed (line 451) | struct Prefixed<T>(Handle<T>);
function fmt (line 454) | fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
function fmt (line 460) | fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
function fmt (line 466) | fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
function fmt (line 472) | fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
function write_fun (line 477) | fn write_fun(
function write_function_expressions (line 561) | fn write_function_expressions(
function write (line 847) | pub fn write(
FILE: naga/src/back/glsl/conv.rs
type ScalarString (line 6) | pub(in crate::back::glsl) struct ScalarString<'a> {
function glsl_scalar (line 19) | pub(in crate::back::glsl) const fn glsl_scalar(
function glsl_built_in (line 55) | pub(in crate::back::glsl) const fn glsl_built_in(
function glsl_storage_qualifier (line 149) | pub(in crate::back::glsl) const fn glsl_storage_qualifier(
function glsl_interpolation (line 167) | pub(in crate::back::glsl) const fn glsl_interpolation(
function glsl_sampling (line 181) | pub(in crate::back::glsl) const fn glsl_sampling(
function glsl_dimension (line 195) | pub(in crate::back::glsl) const fn glsl_dimension(dim: crate::ImageDimen...
function glsl_storage_format (line 207) | pub(in crate::back::glsl) fn glsl_storage_format(
FILE: naga/src/back/glsl/features.rs
type FeaturesManager (line 69) | pub(crate) struct FeaturesManager(Features);
method new (line 73) | pub const fn new() -> Self {
method request (line 78) | pub fn request(&mut self, features: Features) {
method contains (line 83) | pub const fn contains(&mut self, features: Features) -> bool {
method check_availability (line 89) | pub fn check_availability(&self, version: Version) -> BackendResult {
method write (line 156) | pub fn write(&self, options: &Options, mut out: impl Write) -> Backend...
function collect_required_features (line 325) | pub(super) fn collect_required_features(&mut self) -> BackendResult {
function scalar_required_features (line 607) | fn scalar_required_features(&mut self, scalar: Scalar) {
function varying_required_features (line 613) | fn varying_required_features(&mut self, binding: Option<&Binding>, ty: H...
FILE: naga/src/back/glsl/keywords.rs
constant RESERVED_KEYWORDS (line 4) | pub const RESERVED_KEYWORDS: &[&str] = &[
FILE: naga/src/back/glsl/mod.rs
constant SUPPORTED_CORE_VERSIONS (line 84) | pub const SUPPORTED_CORE_VERSIONS: &[u16] = &[140, 150, 330, 400, 410, 4...
constant SUPPORTED_ES_VERSIONS (line 86) | pub const SUPPORTED_ES_VERSIONS: &[u16] = &[300, 310, 320];
constant CLAMPED_LOD_SUFFIX (line 90) | const CLAMPED_LOD_SUFFIX: &str = "_clamped_lod";
constant MODF_FUNCTION (line 92) | pub(crate) const MODF_FUNCTION: &str = "naga_modf";
constant FREXP_FUNCTION (line 93) | pub(crate) const FREXP_FUNCTION: &str = "naga_frexp";
constant FIRST_INSTANCE_BINDING (line 96) | pub const FIRST_INSTANCE_BINDING: &str = "naga_vs_first_instance";
type BindingMapSerialization (line 100) | struct BindingMapSerialization {
function deserialize_binding_map (line 106) | fn deserialize_binding_map<'de, D>(deserializer: D) -> Result<BindingMap...
type BindingMap (line 121) | pub type BindingMap = alloc::collections::BTreeMap<crate::ResourceBindin...
function to_glsl (line 124) | const fn to_glsl(self) -> &'static str {
function initializable (line 140) | const fn initializable(&self) -> bool {
type Version (line 161) | pub enum Version {
method new_gles (line 170) | pub const fn new_gles(version: u16) -> Self {
method is_es (line 178) | const fn is_es(&self) -> bool {
method is_webgl (line 186) | const fn is_webgl(&self) -> bool {
method is_supported (line 199) | fn is_supported(&self) -> bool {
method supports_io_locations (line 206) | fn supports_io_locations(&self) -> bool {
method supports_explicit_locations (line 216) | fn supports_explicit_locations(&self) -> bool {
method supports_early_depth_test (line 220) | fn supports_early_depth_test(&self) -> bool {
method supports_std140_layout (line 224) | fn supports_std140_layout(&self) -> bool {
method supports_std430_layout (line 228) | fn supports_std430_layout(&self) -> bool {
method supports_fma_function (line 233) | fn supports_fma_function(&self) -> bool {
method supports_integer_functions (line 237) | fn supports_integer_functions(&self) -> bool {
method supports_frexp_function (line 241) | fn supports_frexp_function(&self) -> bool {
method supports_derivative_control (line 245) | fn supports_derivative_control(&self) -> bool {
method supports_pack_unpack_4x8 (line 255) | fn supports_pack_unpack_4x8(&self) -> bool {
method supports_pack_unpack_snorm_2x16 (line 258) | fn supports_pack_unpack_snorm_2x16(&self) -> bool {
method supports_pack_unpack_unorm_2x16 (line 261) | fn supports_pack_unpack_unorm_2x16(&self) -> bool {
method supports_pack_unpack_half_2x16 (line 269) | fn supports_pack_unpack_half_2x16(&self) -> bool {
method fmt (line 287) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
method partial_cmp (line 275) | fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
type Options (line 328) | pub struct Options {
method default (line 344) | fn default() -> Self {
type PipelineOptions (line 358) | pub struct PipelineOptions {
type VaryingLocation (line 371) | pub struct VaryingLocation {
type ReflectionInfo (line 382) | pub struct ReflectionInfo {
type TextureMapping (line 405) | pub struct TextureMapping {
type ImmediateItem (line 421) | pub struct ImmediateItem {
type IdGenerator (line 458) | struct IdGenerator(u32);
method generate (line 462) | const fn generate(&mut self) -> u32 {
type VaryingOptions (line 472) | struct VaryingOptions {
method from_writer_options (line 479) | const fn from_writer_options(options: &Options, output: bool) -> Self {
type VaryingName (line 495) | struct VaryingName<'a> {
function fmt (line 501) | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
method to_str (line 537) | const fn to_str(self) -> &'static str {
type BackendResult (line 553) | type BackendResult<T = ()> = Result<T, Error>;
type Error (line 557) | pub enum Error {
type BinaryOperation (line 597) | enum BinaryOperation {
function is_value_init_supported (line 608) | fn is_value_init_supported(module: &crate::Module, ty: Handle<crate::Typ...
function supported_capabilities (line 621) | pub fn supported_capabilities() -> valid::Capabilities {
FILE: naga/src/back/glsl/writer.rs
type Writer (line 4) | pub struct Writer<'a, W> {
function new (line 56) | pub fn new(
function write (line 131) | pub fn write(&mut self) -> Result<ReflectionInfo, Error> {
function write_array_size (line 457) | fn write_array_size(
function write_value_type (line 491) | fn write_value_type(&mut self, inner: &TypeInner) -> BackendResult {
function write_type (line 549) | fn write_type(&mut self, ty: Handle<crate::Type>) -> BackendResult {
function write_image_type (line 570) | fn write_image_type(
function write_global_layout (line 630) | fn write_global_layout(&mut self, global: &crate::GlobalVariable) -> Bac...
function write_global (line 693) | fn write_global(
function write_simple_global (line 753) | fn write_simple_global(
function write_interface_block (line 791) | fn write_interface_block(
function update_expressions_to_bake (line 845) | fn update_expressions_to_bake(&mut self, func: &crate::Function, info: &...
function get_global_name (line 953) | fn get_global_name(
function write_global_name (line 975) | fn write_global_name(
function write_varying (line 1032) | fn write_varying(
function write_function (line 1199) | fn write_function(
function write_workgroup_variables_initialization (line 1414) | fn write_workgroup_variables_initialization(
function write_slice (line 1456) | fn write_slice<T, F: FnMut(&mut Self, u32, &T) -> BackendResult>(
function write_global_constant (line 1473) | fn write_global_constant(&mut self, handle: Handle<crate::Constant>) -> ...
function write_dot_product (line 1490) | fn write_dot_product(
function write_struct_body (line 1529) | fn write_struct_body(
function write_stmt (line 1589) | fn write_stmt(
function write_const_expr (line 2271) | fn write_const_expr(
function write_possibly_const_expr (line 2302) | fn write_possibly_const_expr<'w, I, E>(
function write_expr (line 2392) | fn write_expr(
function write_clamped_lod (line 3801) | fn write_clamped_lod(
function get_coordinate_vector_size (line 3832) | fn get_coordinate_vector_size(&self, dim: crate::ImageDimension, arrayed...
function write_texture_coord (line 3848) | fn write_texture_coord(
function write_image_store (line 3913) | fn write_image_store(
function write_image_atomic (line 3961) | fn write_image_atomic(
function write_image_load (line 4012) | fn write_image_load(
function write_named_expr (line 4292) | fn write_named_expr(
function write_zero_init_value (line 4331) | fn write_zero_init_value(&mut self, ty: Handle<crate::Type>) -> BackendR...
function write_zero_init_scalar (line 4383) | fn write_zero_init_scalar(&mut self, kind: crate::ScalarKind) -> Backend...
function write_control_barrier (line 4400) | fn write_control_barrier(
function write_memory_barrier (line 4411) | fn write_memory_barrier(&mut self, flags: crate::Barrier, level: back::L...
function write_storage_access (line 4432) | fn write_storage_access(&mut self, storage_access: crate::StorageAccess)...
function collect_reflection_info (line 4446) | fn collect_reflection_info(&mut self) -> Result<ReflectionInfo, Error> {
function collect_immediates_items (line 4537) | fn collect_immediates_items(
FILE: naga/src/back/hlsl/conv.rs
function to_hlsl_cast (line 9) | pub(super) fn to_hlsl_cast(self) -> &'static str {
function to_hlsl_str (line 23) | pub(super) const fn to_hlsl_str(self) -> Result<&'static str, Error> {
function is_matrix (line 50) | pub(super) const fn is_matrix(&self) -> bool {
function size_hlsl (line 57) | pub(super) fn size_hlsl(&self, gctx: crate::proc::GlobalCtx) -> Result<u...
function hlsl_type_id (line 82) | pub(super) fn hlsl_type_id<'a>(
function to_hlsl_str (line 121) | pub(super) const fn to_hlsl_str(self) -> &'static str {
function to_hlsl_str (line 152) | pub(super) fn to_hlsl_str(self) -> Result<&'static str, Error> {
function to_hlsl_str (line 214) | pub(super) const fn to_hlsl_str(self) -> Option<&'static str> {
function to_hlsl_str (line 228) | pub(super) const fn to_hlsl_str(self) -> Option<&'static str> {
function to_hlsl_suffix (line 239) | pub(super) const fn to_hlsl_suffix(self) -> &'static str {
FILE: naga/src/back/hlsl/help.rs
type WrappedArrayLength (line 44) | pub(super) struct WrappedArrayLength {
type WrappedImageLoad (line 49) | pub(super) struct WrappedImageLoad {
type WrappedImageSample (line 54) | pub(super) struct WrappedImageSample {
type WrappedImageQuery (line 60) | pub(super) struct WrappedImageQuery {
type WrappedConstructor (line 68) | pub(super) struct WrappedConstructor {
type WrappedStructMatrixAccess (line 73) | pub(super) struct WrappedStructMatrixAccess {
type WrappedMatCx2 (line 79) | pub(super) struct WrappedMatCx2 {
type WrappedMath (line 84) | pub(super) struct WrappedMath {
type WrappedZeroValue (line 91) | pub(super) struct WrappedZeroValue {
type WrappedUnaryOp (line 96) | pub(super) struct WrappedUnaryOp {
type WrappedBinaryOp (line 104) | pub(super) struct WrappedBinaryOp {
type WrappedCast (line 113) | pub(super) struct WrappedCast {
type ImageQuery (line 153) | pub(super) enum ImageQuery {
method from (line 162) | fn from(q: crate::ImageQuery) -> Self {
constant IMAGE_STORAGE_LOAD_SCALAR_WRAPPER (line 174) | pub(super) const IMAGE_STORAGE_LOAD_SCALAR_WRAPPER: &str = "LoadedStorag...
function write_image_type (line 177) | pub(super) fn write_image_type(
function write_wrapped_array_length_function_name (line 213) | pub(super) fn write_wrapped_array_length_function_name(
function write_wrapped_array_length_function (line 226) | pub(super) fn write_wrapped_array_length_function(
function write_convert_yuv_to_rgb_and_return (line 274) | fn write_convert_yuv_to_rgb_and_return(
function write_wrapped_image_load_function (line 322) | pub(super) fn write_wrapped_image_load_function(
function write_wrapped_image_sample_function (line 416) | pub(super) fn write_wrapped_image_sample_function(
function write_wrapped_image_query_function_name (line 563) | pub(super) fn write_wrapped_image_query_function_name(
function write_wrapped_image_query_function (line 593) | pub(super) fn write_wrapped_image_query_function(
function write_wrapped_constructor_function_name (line 735) | pub(super) fn write_wrapped_constructor_function_name(
function write_wrapped_constructor_function (line 746) | fn write_wrapped_constructor_function(
function write_loaded_scalar_to_storage_loaded_value (line 897) | fn write_loaded_scalar_to_storage_loaded_value(
function write_wrapped_struct_matrix_get_function_name (line 949) | pub(super) fn write_wrapped_struct_matrix_get_function_name(
function write_wrapped_struct_matrix_get_function (line 960) | pub(super) fn write_wrapped_struct_matrix_get_function(
function write_wrapped_struct_matrix_set_function_name (line 1013) | pub(super) fn write_wrapped_struct_matrix_set_function_name(
function write_wrapped_struct_matrix_set_function (line 1024) | pub(super) fn write_wrapped_struct_matrix_set_function(
function write_wrapped_struct_matrix_set_vec_function_name (line 1073) | pub(super) fn write_wrapped_struct_matrix_set_vec_function_name(
function write_wrapped_struct_matrix_set_vec_function (line 1084) | pub(super) fn write_wrapped_struct_matrix_set_vec_function(
function write_wrapped_struct_matrix_set_scalar_function_name (line 1151) | pub(super) fn write_wrapped_struct_matrix_set_scalar_function_name(
function write_wrapped_struct_matrix_set_scalar_function (line 1162) | pub(super) fn write_wrapped_struct_matrix_set_scalar_function(
function write_special_functions (line 1229) | pub(super) fn write_special_functions(&mut self, module: &crate::Module)...
function write_wrapped_expression_functions (line 1285) | pub(super) fn write_wrapped_expression_functions(
function write_wrapped_zero_value_functions (line 1341) | pub(super) fn write_wrapped_zero_value_functions(
function write_wrapped_math_functions (line 1357) | pub(super) fn write_wrapped_math_functions(
function write_wrapped_unary_ops (line 1532) | pub(super) fn write_wrapped_unary_ops(
function write_wrapped_binary_ops (line 1580) | pub(super) fn write_wrapped_binary_ops(
function write_wrapped_cast_functions (line 1737) | fn write_wrapped_cast_functions(
function write_wrapped_functions (line 1829) | pub(super) fn write_wrapped_functions(
function write_sampler_heaps (line 2010) | pub(super) fn write_sampler_heaps(&mut self) -> BackendResult {
function write_wrapped_sampler_buffer (line 2039) | pub(super) fn write_wrapped_sampler_buffer(
function write_texture_coordinates (line 2088) | pub(super) fn write_texture_coordinates(
function write_mat_cx2_typedef_and_functions (line 2140) | pub(super) fn write_mat_cx2_typedef_and_functions(
function write_all_mat_cx2_typedefs_and_functions (line 2201) | pub(super) fn write_all_mat_cx2_typedefs_and_functions(
function write_wrapped_zero_value_function_name (line 2246) | pub(super) fn write_wrapped_zero_value_function_name(
function write_wrapped_zero_value_function (line 2271) | fn write_wrapped_zero_value_function(
function single_component (line 2314) | pub(super) const fn single_component(&self) -> bool {
FILE: naga/src/back/hlsl/keywords.rs
constant RESERVED_CASE_INSENSITIVE (line 8) | pub const RESERVED_CASE_INSENSITIVE: &[&str] = &[
constant RESERVED (line 19) | pub const RESERVED: &[&str] = &[
constant TYPES (line 843) | pub const TYPES: &[&str] = &{
constant RESERVED_PREFIXES (line 935) | pub const RESERVED_PREFIXES: &[&str] = &[
FILE: naga/src/back/hlsl/mod.rs
type BindTarget (line 192) | pub struct BindTarget {
type OffsetsBindTarget (line 213) | pub struct OffsetsBindTarget {
type BindingMapSerialization (line 221) | struct BindingMapSerialization {
function deserialize_binding_map (line 227) | fn deserialize_binding_map<'de, D>(deserializer: D) -> Result<BindingMap...
type BindingMap (line 242) | pub type BindingMap = alloc::collections::BTreeMap<crate::ResourceBindin...
type ShaderModel (line 248) | pub enum ShaderModel {
method to_str (line 264) | pub const fn to_str(self) -> &'static str {
function to_hlsl_str (line 283) | pub const fn to_hlsl_str(self) -> &'static str {
function to_hlsl_str (line 296) | const fn to_hlsl_str(self) -> &'static str {
type SamplerIndexBufferKey (line 309) | pub struct SamplerIndexBufferKey {
type SamplerHeapBindTargets (line 317) | pub struct SamplerHeapBindTargets {
method default (line 323) | fn default() -> Self {
type SamplerIndexBufferBindingSerialization (line 345) | struct SamplerIndexBufferBindingSerialization {
function deserialize_sampler_index_buffer_bindings (line 351) | fn deserialize_sampler_index_buffer_bindings<'de, D>(
type SamplerIndexBufferBindingMap (line 371) | pub type SamplerIndexBufferBindingMap =
type DynamicStorageBufferOffsetTargetSerialization (line 376) | struct DynamicStorageBufferOffsetTargetSerialization {
function deserialize_storage_buffer_offsets (line 382) | fn deserialize_storage_buffer_offsets<'de, D>(
type DynamicStorageBufferOffsetsTargets (line 398) | pub type DynamicStorageBufferOffsetsTargets = alloc::collections::BTreeM...
type ExternalTextureBindTarget (line 409) | pub struct ExternalTextureBindTarget {
type ExternalTextureBindingMapSerialization (line 431) | struct ExternalTextureBindingMapSerialization {
function deserialize_external_texture_binding_map (line 437) | fn deserialize_external_texture_binding_map<'de, D>(
type ExternalTextureBindingMap (line 452) | pub type ExternalTextureBindingMap =
type BackendResult (line 456) | type BackendResult = Result<(), Error>;
type EntryPointError (line 461) | pub enum EntryPointError {
type Options (line 471) | pub struct Options {
method resolve_resource_binding (line 572) | fn resolve_resource_binding(
method resolve_external_texture_resource_binding (line 589) | fn resolve_external_texture_resource_binding(
method default (line 552) | fn default() -> Self {
type ReflectionInfo (line 615) | pub struct ReflectionInfo {
type PipelineOptions (line 630) | pub struct PipelineOptions {
type Error (line 642) | pub enum Error {
type WrappedType (line 662) | enum WrappedType {
type Wrapped (line 679) | struct Wrapped {
method insert (line 688) | fn insert(&mut self, r#type: WrappedType) -> bool {
method clear (line 692) | fn clear(&mut self) {
type FragmentEntryPoint (line 705) | pub struct FragmentEntryPoint<'a> {
function new (line 713) | pub fn new(module: &'a crate::Module, ep_name: &'a str) -> Option<Self> {
type Writer (line 726) | pub struct Writer<'a, W> {
function supported_capabilities (line 764) | pub fn supported_capabilities() -> crate::valid::Capabilities {
FILE: naga/src/back/hlsl/ray.rs
function write_not_finite (line 17) | fn write_not_finite(&mut self, expr: &str) -> BackendResult {
function write_nan (line 21) | fn write_nan(&mut self, expr: &str) -> BackendResult {
function write_contains_flags (line 28) | fn write_contains_flags(&mut self, expr: &str, flags: u32) -> BackendRes...
function write_ray_desc_from_ray_desc_constructor_function (line 34) | pub(super) fn write_ray_desc_from_ray_desc_constructor_function(
function write_committed_intersection_function (line 51) | pub(super) fn write_committed_intersection_function(
function write_candidate_intersection_function (line 143) | pub(super) fn write_candidate_intersection_function(
function write_initialize_function (line 246) | pub(super) fn write_initialize_function(
function write_proceed (line 389) | pub(super) fn write_proceed(
function write_generate_intersection (line 445) | pub(super) fn write_generate_intersection(
function write_confirm_intersection (line 498) | pub(super) fn write_confirm_intersection(
function write_terminate (line 536) | pub(super) fn write_terminate(
FILE: naga/src/back/hlsl/storage.rs
constant STORE_TEMP_NAME (line 67) | const STORE_TEMP_NAME: &str = "_value";
type SubAccess (line 79) | pub(super) enum SubAccess {
type StoreValue (line 99) | pub(super) enum StoreValue {
function write_storage_address (line 121) | pub(super) fn write_storage_address(
function write_storage_load_sequence (line 150) | fn write_storage_load_sequence<I: Iterator<Item = (TypeResolution, u32)>>(
function write_storage_load (line 179) | pub(super) fn write_storage_load(
function write_store_value (line 279) | fn write_store_value(
function write_storage_store (line 314) | pub(super) fn write_storage_store(
function fill_access_chain (line 568) | pub(super) fn fill_access_chain(
FILE: naga/src/back/hlsl/writer.rs
constant LOCATION_SEMANTIC (line 24) | const LOCATION_SEMANTIC: &str = "LOC";
constant SPECIAL_CBUF_TYPE (line 25) | const SPECIAL_CBUF_TYPE: &str = "NagaConstants";
constant SPECIAL_CBUF_VAR (line 26) | const SPECIAL_CBUF_VAR: &str = "_NagaConstants";
constant SPECIAL_FIRST_VERTEX (line 27) | const SPECIAL_FIRST_VERTEX: &str = "first_vertex";
constant SPECIAL_FIRST_INSTANCE (line 28) | const SPECIAL_FIRST_INSTANCE: &str = "first_instance";
constant SPECIAL_OTHER (line 29) | const SPECIAL_OTHER: &str = "other";
constant MODF_FUNCTION (line 31) | pub(crate) const MODF_FUNCTION: &str = "naga_modf";
constant FREXP_FUNCTION (line 32) | pub(crate) const FREXP_FUNCTION: &str = "naga_frexp";
constant EXTRACT_BITS_FUNCTION (line 33) | pub(crate) const EXTRACT_BITS_FUNCTION: &str = "naga_extractBits";
constant INSERT_BITS_FUNCTION (line 34) | pub(crate) const INSERT_BITS_FUNCTION: &str = "naga_insertBits";
constant SAMPLER_HEAP_VAR (line 35) | pub(crate) const SAMPLER_HEAP_VAR: &str = "nagaSamplerHeap";
constant COMPARISON_SAMPLER_HEAP_VAR (line 36) | pub(crate) const COMPARISON_SAMPLER_HEAP_VAR: &str = "nagaComparisonSamp...
constant SAMPLE_EXTERNAL_TEXTURE_FUNCTION (line 37) | pub(crate) const SAMPLE_EXTERNAL_TEXTURE_FUNCTION: &str = "nagaSampleExt...
constant ABS_FUNCTION (line 38) | pub(crate) const ABS_FUNCTION: &str = "naga_abs";
constant DIV_FUNCTION (line 39) | pub(crate) const DIV_FUNCTION: &str = "naga_div";
constant MOD_FUNCTION (line 40) | pub(crate) const MOD_FUNCTION: &str = "naga_mod";
constant NEG_FUNCTION (line 41) | pub(crate) const NEG_FUNCTION: &str = "naga_neg";
constant F2I32_FUNCTION (line 42) | pub(crate) const F2I32_FUNCTION: &str = "naga_f2i32";
constant F2U32_FUNCTION (line 43) | pub(crate) const F2U32_FUNCTION: &str = "naga_f2u32";
constant F2I64_FUNCTION (line 44) | pub(crate) const F2I64_FUNCTION: &str = "naga_f2i64";
constant F2U64_FUNCTION (line 45) | pub(crate) const F2U64_FUNCTION: &str = "naga_f2u64";
constant IMAGE_SAMPLE_BASE_CLAMP_TO_EDGE_FUNCTION (line 46) | pub(crate) const IMAGE_SAMPLE_BASE_CLAMP_TO_EDGE_FUNCTION: &str =
constant IMAGE_LOAD_EXTERNAL_FUNCTION (line 48) | pub(crate) const IMAGE_LOAD_EXTERNAL_FUNCTION: &str = "nagaTextureLoadEx...
constant RAY_QUERY_TRACKER_VARIABLE_PREFIX (line 49) | pub(crate) const RAY_QUERY_TRACKER_VARIABLE_PREFIX: &str = "naga_query_i...
constant INTERNAL_PREFIX (line 51) | pub(crate) const INTERNAL_PREFIX: &str = "naga_";
type Index (line 53) | enum Index {
type EpStructMember (line 58) | struct EpStructMember {
type EntryPointBinding (line 69) | struct EntryPointBinding {
type EntryPointInterface (line 80) | pub(super) struct EntryPointInterface {
type InterfaceKey (line 93) | enum InterfaceKey {
method new (line 100) | const fn new(binding: Option<&crate::Binding>) -> Self {
type Io (line 110) | enum Io {
function is_subgroup_builtin_binding (line 115) | const fn is_subgroup_builtin_binding(binding: &Option<crate::Binding>) -...
type BindingArraySamplerInfo (line 129) | struct BindingArraySamplerInfo {
function new (line 139) | pub fn new(out: W, options: &'a Options, pipeline_options: &'a PipelineO...
function reset (line 157) | fn reset(&mut self, module: &Module) {
function gen_force_bounded_loop_statements (line 183) | fn gen_force_bounded_loop_statements(
function update_expressions_to_bake (line 209) | fn update_expressions_to_bake(
function write (line 297) | pub fn write(
function write_modifier (line 540) | fn write_modifier(&mut self, binding: &crate::Binding) -> BackendResult {
function write_semantic (line 573) | fn write_semantic(
function write_interface_struct (line 609) | fn write_interface_struct(
function write_ep_input_struct (line 682) | fn write_ep_input_struct(
function write_ep_output_struct (line 729) | fn write_ep_output_struct(
function write_ep_interface (line 805) | fn write_ep_interface(
function write_ep_argument_initialization (line 834) | fn write_ep_argument_initialization(
function write_ep_arguments_initialization (line 869) | fn write_ep_arguments_initialization(
function write_global (line 935) | fn write_global(
function write_global_sampler (line 1136) | fn write_global_sampler(
function write_global_external_texture (line 1199) | fn write_global_external_texture(
function write_global_constant (line 1264) | fn write_global_constant(
function write_array_size (line 1284) | pub(super) fn write_array_size(
function write_struct (line 1317) | fn write_struct(
function write_global_type (line 1422) | pub(super) fn write_global_type(
function write_type (line 1456) | pub(super) fn write_type(&mut self, module: &Module, ty: Handle<crate::T...
function write_value_type (line 1474) | pub(super) fn write_value_type(&mut self, module: &Module, inner: &TypeI...
function write_function (line 1541) | fn write_function(
function write_function_argument (line 1754) | fn write_function_argument(
function write_function_external_texture_argument (line 1794) | fn write_function_external_texture_argument(
function need_workgroup_variables_initialization (line 1822) | fn need_workgroup_variables_initialization(
function write_workgroup_variables_initialization (line 1834) | fn write_workgroup_variables_initialization(
function write_switch (line 1863) | fn write_switch(
function write_index (line 2007) | fn write_index(
function write_stmt (line 2028) | fn write_stmt(
function write_const_expression (line 2846) | fn write_const_expression(
function write_literal (line 2857) | pub(super) fn write_literal(&mut self, literal: crate::Literal) -> Backe...
function write_possibly_const_expression (line 2891) | fn write_possibly_const_expression<E>(
function write_expr (line 2965) | pub(super) fn write_expr(
function write_image_load (line 4403) | fn write_image_load(
function sampler_binding_array_info_from_expression (line 4472) | fn sampler_binding_array_info_from_expression(
function write_named_expr (line 4516) | fn write_named_expr(
function write_default_init (line 4557) | pub(super) fn write_default_init(
function write_control_barrier (line 4571) | fn write_control_barrier(
function write_memory_barrier (line 4591) | fn write_memory_barrier(
function emit_hlsl_atomic_tail (line 4612) | fn emit_hlsl_atomic_tail(
type MatrixType (line 4644) | pub(super) struct MatrixType {
function get_inner_matrix_data (line 4650) | pub(super) fn get_inner_matrix_data(
function find_matrix_in_access_chain (line 4672) | fn find_matrix_in_access_chain(
function get_inner_matrix_of_struct_array_member (line 4711) | pub(super) fn get_inner_matrix_of_struct_array_member(
function get_global_uniform_matrix (line 4767) | fn get_global_uniform_matrix(
function get_inner_matrix_of_global_uniform (line 4799) | fn get_inner_matrix_of_global_uniform(
FILE: naga/src/back/mod.rs
constant COMPONENTS (line 34) | pub const COMPONENTS: &[char] = &['x', 'y', 'z', 'w'];
constant INDENT (line 36) | pub const INDENT: &str = " ";
type NeedBakeExpressions (line 39) | pub type NeedBakeExpressions = crate::FastHashSet<crate::Handle<crate::E...
type Baked (line 56) | struct Baked(crate::Handle<crate::Expression>);
method fmt (line 59) | fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
type PipelineConstants (line 91) | pub type PipelineConstants = hashbrown::HashMap<String, f64>;
type Level (line 95) | pub struct Level(pub usize);
method next (line 98) | pub const fn next(&self) -> Self {
method fmt (line 104) | fn fmt(&self, formatter: &mut core::fmt::Formatter<'_>) -> Result<(), ...
function get_entry_points (line 116) | fn get_entry_points(
type FunctionType (line 152) | pub enum FunctionType {
method is_compute_like_entry_point (line 164) | pub fn is_compute_like_entry_point(&self, module: &crate::Module) -> b...
type FunctionCtx (line 175) | pub struct FunctionCtx<'a> {
function resolve_type (line 188) | pub fn resolve_type<'a>(
function name_key (line 197) | pub const fn name_key(
function argument_key (line 211) | pub const fn argument_key(&self, arg: u32) -> crate::proc::NameKey {
function external_texture_argument_key (line 226) | pub const fn external_texture_argument_key(
function is_fixed_function_input (line 250) | pub fn is_fixed_function_input(
function bake_ref_count (line 296) | pub const fn bake_ref_count(&self) -> usize {
function binary_operation_str (line 315) | pub const fn binary_operation_str(op: crate::BinaryOperator) -> &'static...
function is_handle (line 341) | pub const fn is_handle(&self) -> bool {
function is_terminator (line 353) | pub const fn is_terminator(&self) -> bool {
type RayIntersectionType (line 391) | pub enum RayIntersectionType {
type TaskDispatchLimits (line 399) | pub struct TaskDispatchLimits {
FILE: naga/src/back/msl/keywords.rs
constant RESERVED (line 10) | const RESERVED: &[&str] = &[
FILE: naga/src/back/msl/mod.rs
type Slot (line 86) | pub type Slot = u8;
type InlineSamplerIndex (line 87) | pub type InlineSamplerIndex = u8;
type BindSamplerTarget (line 92) | pub enum BindSamplerTarget {
type BindExternalTextureTarget (line 105) | pub struct BindExternalTextureTarget {
type BindTarget (line 114) | pub struct BindTarget {
type BindingMapSerialization (line 124) | struct BindingMapSerialization {
function deserialize_binding_map (line 130) | fn deserialize_binding_map<'de, D>(deserializer: D) -> Result<BindingMap...
type BindingMap (line 145) | pub type BindingMap = alloc::collections::BTreeMap<crate::ResourceBindin...
type EntryPointResources (line 151) | pub struct EntryPointResources {
type EntryPointResourceMap (line 166) | pub type EntryPointResourceMap = alloc::collections::BTreeMap<String, En...
type ResolvedBinding (line 168) | enum ResolvedBinding {
method as_inline_sampler (line 667) | fn as_inline_sampler<'a>(&self, options: &'a Options) -> Option<&'a sa...
method try_fmt (line 677) | fn try_fmt<W: Write>(&self, out: &mut W) -> Result<(), Error> {
type ResolvedInterpolation (line 184) | enum ResolvedInterpolation {
method from_binding (line 783) | const fn from_binding(interpolation: crate::Interpolation, sampling: c...
method try_fmt (line 799) | fn try_fmt<W: Write>(self, out: &mut W) -> Result<(), Error> {
type Error (line 197) | pub enum Error {
type EntryPointError (line 247) | pub enum EntryPointError {
type LocationMode (line 267) | enum LocationMode {
type Options (line 288) | pub struct Options {
method resolve_local_binding (line 505) | fn resolve_local_binding(
method get_entry_point_resources (line 593) | fn get_entry_point_resources(&self, ep: &crate::EntryPoint) -> Option<...
method get_resource_binding_target (line 597) | fn get_resource_binding_target(
method resolve_resource_binding (line 606) | fn resolve_resource_binding(
method resolve_immediates (line 623) | fn resolve_immediates(
method resolve_sizes_buffer (line 644) | fn resolve_sizes_buffer(
method default (line 309) | fn default() -> Self {
type VertexFormat (line 329) | pub enum VertexFormat {
type VertexBufferStepMode (line 426) | pub enum VertexBufferStepMode {
type AttributeMapping (line 438) | pub struct AttributeMapping {
type VertexBufferMapping (line 456) | pub struct VertexBufferMapping {
type PipelineOptions (line 472) | pub struct PipelineOptions {
type TranslationInfo (line 816) | pub struct TranslationInfo {
function write_string (line 824) | pub fn write_string(
function supported_capabilities (line 835) | pub fn supported_capabilities() -> crate::valid::Capabilities {
function test_error_size (line 882) | fn test_error_size() {
FILE: naga/src/back/msl/sampler.rs
type Coord (line 11) | pub enum Coord {
method as_str (line 18) | pub const fn as_str(&self) -> &'static str {
type Address (line 29) | pub enum Address {
method as_str (line 39) | pub const fn as_str(&self) -> &'static str {
type BorderColor (line 53) | pub enum BorderColor {
method as_str (line 61) | pub const fn as_str(&self) -> &'static str {
type Filter (line 73) | pub enum Filter {
method as_str (line 80) | pub const fn as_str(&self) -> &'static str {
type CompareFunc (line 91) | pub enum CompareFunc {
method as_str (line 104) | pub const fn as_str(&self) -> &'static str {
type InlineSampler (line 121) | pub struct InlineSampler {
method hash (line 136) | fn hash<H: core::hash::Hasher>(&self, hasher: &mut H) {
FILE: naga/src/back/msl/writer.rs
type BackendResult (line 33) | type BackendResult = Result<(), Error>;
constant NAMESPACE (line 35) | const NAMESPACE: &str = "metal";
constant WRAPPED_ARRAY_FIELD (line 39) | const WRAPPED_ARRAY_FIELD: &str = "inner";
constant ATOMIC_REFERENCE (line 43) | const ATOMIC_REFERENCE: &str = "&";
constant RT_NAMESPACE (line 45) | const RT_NAMESPACE: &str = "metal::raytracing";
constant RAY_QUERY_TYPE (line 46) | const RAY_QUERY_TYPE: &str = "_RayQuery";
constant RAY_QUERY_FIELD_INTERSECTOR (line 47) | const RAY_QUERY_FIELD_INTERSECTOR: &str = "intersector";
constant RAY_QUERY_FIELD_INTERSECTION (line 48) | const RAY_QUERY_FIELD_INTERSECTION: &str = "intersection";
constant RAY_QUERY_MODERN_SUPPORT (line 49) | const RAY_QUERY_MODERN_SUPPORT: bool = false;
constant RAY_QUERY_FIELD_READY (line 50) | const RAY_QUERY_FIELD_READY: &str = "ready";
constant RAY_QUERY_FUN_MAP_INTERSECTION (line 51) | const RAY_QUERY_FUN_MAP_INTERSECTION: &str = "_map_intersection_type";
constant ATOMIC_COMP_EXCH_FUNCTION (line 53) | pub(crate) const ATOMIC_COMP_EXCH_FUNCTION: &str = "naga_atomic_compare_...
constant MODF_FUNCTION (line 54) | pub(crate) const MODF_FUNCTION: &str = "naga_modf";
constant FREXP_FUNCTION (line 55) | pub(crate) const FREXP_FUNCTION: &str = "naga_frexp";
constant ABS_FUNCTION (line 56) | pub(crate) const ABS_FUNCTION: &str = "naga_abs";
constant DIV_FUNCTION (line 57) | pub(crate) const DIV_FUNCTION: &str = "naga_div";
constant DOT_FUNCTION_PREFIX (line 58) | pub(crate) const DOT_FUNCTION_PREFIX: &str = "naga_dot";
constant MOD_FUNCTION (line 59) | pub(crate) const MOD_FUNCTION: &str = "naga_mod";
constant NEG_FUNCTION (line 60) | pub(crate) const NEG_FUNCTION: &str = "naga_neg";
constant F2I32_FUNCTION (line 61) | pub(crate) const F2I32_FUNCTION: &str = "naga_f2i32";
constant F2U32_FUNCTION (line 62) | pub(crate) const F2U32_FUNCTION: &str = "naga_f2u32";
constant F2I64_FUNCTION (line 63) | pub(crate) const F2I64_FUNCTION: &str = "naga_f2i64";
constant F2U64_FUNCTION (line 64) | pub(crate) const F2U64_FUNCTION: &str = "naga_f2u64";
constant IMAGE_LOAD_EXTERNAL_FUNCTION (line 65) | pub(crate) const IMAGE_LOAD_EXTERNAL_FUNCTION: &str = "nagaTextureLoadEx...
constant IMAGE_SIZE_EXTERNAL_FUNCTION (line 66) | pub(crate) const IMAGE_SIZE_EXTERNAL_FUNCTION: &str = "nagaTextureDimens...
constant IMAGE_SAMPLE_BASE_CLAMP_TO_EDGE_FUNCTION (line 67) | pub(crate) const IMAGE_SAMPLE_BASE_CLAMP_TO_EDGE_FUNCTION: &str =
constant ARGUMENT_BUFFER_WRAPPER_STRUCT (line 76) | pub(crate) const ARGUMENT_BUFFER_WRAPPER_STRUCT: &str = "NagaArgumentBuf...
constant EXTERNAL_TEXTURE_WRAPPER_STRUCT (line 81) | pub(crate) const EXTERNAL_TEXTURE_WRAPPER_STRUCT: &str = "NagaExternalTe...
constant COOPERATIVE_LOAD_FUNCTION (line 82) | pub(crate) const COOPERATIVE_LOAD_FUNCTION: &str = "NagaCooperativeLoad";
constant COOPERATIVE_MULTIPLY_ADD_FUNCTION (line 83) | pub(crate) const COOPERATIVE_MULTIPLY_ADD_FUNCTION: &str = "NagaCooperat...
function put_numeric_type (line 93) | fn put_numeric_type(
function scalar_is_int (line 125) | const fn scalar_is_int(scalar: crate::Scalar) -> bool {
constant CLAMPED_LOD_LOAD_PREFIX (line 134) | const CLAMPED_LOD_LOAD_PREFIX: &str = "clamped_lod_e";
constant REINTERPRET_PREFIX (line 137) | const REINTERPRET_PREFIX: &str = "reinterpreted_";
type ClampedLod (line 144) | struct ClampedLod(Handle<crate::Expression>);
method fmt (line 147) | fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
type ArraySizeMember (line 166) | struct ArraySizeMember(Handle<crate::GlobalVariable>);
method fmt (line 169) | fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
type Reinterpreted (line 179) | struct Reinterpreted<'a> {
function new (line 185) | const fn new(target_type: &'a str, orig: Handle<crate::Expression>) -> S...
method fmt (line 191) | fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
type TypeContext (line 198) | struct TypeContext<'a> {
function scalar (line 207) | fn scalar(&self) -> Option<crate::Scalar> {
function vector_size (line 212) | fn vector_size(&self) -> Option<crate::VectorSize> {
method fmt (line 222) | fn fmt(&self, out: &mut Formatter<'_>) -> Result<(), FmtError> {
type TypedGlobalVariable (line 390) | struct TypedGlobalVariable<'a> {
function try_fmt (line 399) | fn try_fmt<W: Write>(&self, out: &mut W) -> BackendResult {
type WrappedFunction (line 468) | enum WrappedFunction {
type Writer (line 512) | pub struct Writer<W> {
function to_msl_name (line 530) | pub(super) fn to_msl_name(self) -> &'static str {
function separate (line 570) | const fn separate(need_separator: bool) -> &'static str {
function should_pack_struct_member (line 578) | fn should_pack_struct_member(
function needs_array_length (line 603) | fn needs_array_length(ty: Handle<crate::Type>, arena: &crate::UniqueAren...
function needs_pass_through (line 629) | const fn needs_pass_through(&self) -> bool {
function needs_access_qualifier (line 644) | const fn needs_access_qualifier(&self) -> bool {
function to_msl_name (line 661) | const fn to_msl_name(self) -> Option<&'static str> {
function needs_alias (line 679) | const fn needs_alias(&self) -> bool {
type FunctionOrigin (line 704) | enum FunctionOrigin {
type NameKeyExt (line 709) | trait NameKeyExt {
method local (line 710) | fn local(origin: FunctionOrigin, local_handle: Handle<crate::LocalVari...
method oob_local_for_type (line 721) | fn oob_local_for_type(origin: FunctionOrigin, ty: Handle<crate::Type>)...
type LevelOfDetail (line 741) | enum LevelOfDetail {
type TexelAddress (line 755) | struct TexelAddress {
type ExpressionContext (line 762) | struct ExpressionContext<'a> {
function resolve_type (line 781) | fn resolve_type(&self, handle: Handle<crate::Expression>) -> &'a crate::...
function image_needs_lod (line 791) | fn image_needs_lod(&self, image: Handle<crate::Expression>) -> bool {
function choose_bounds_check_policy (line 800) | fn choose_bounds_check_policy(
function access_needs_check (line 809) | fn access_needs_check(
function bounds_check_iter (line 824) | fn bounds_check_iter(
function oob_local_types (line 832) | fn oob_local_types(&self) -> FastHashSet<Handle<crate::Type>> {
function get_packed_vec_kind (line 836) | fn get_packed_vec_kind(&self, expr_handle: Handle<crate::Expression>) ->...
type StatementContext (line 855) | struct StatementContext<'a> {
function new (line 862) | pub fn new(out: W) -> Self {
function finish (line 880) | pub fn finish(self) -> W {
function gen_force_bounded_loop_statements (line 990) | fn gen_force_bounded_loop_statements(
function put_call_parameters (line 1012) | fn put_call_parameters(
function put_call_parameters_impl (line 1022) | fn put_call_parameters_impl<C, E>(
function put_locals (line 1047) | fn put_locals(&mut self, context: &ExpressionContext) -> BackendResult {
function put_level_of_detail (line 1095) | fn put_level_of_detail(
function put_image_query (line 1107) | fn put_image_query(
function put_image_size_query (line 1123) | fn put_image_size_query(
function put_cast_to_uint_scalar_or_vector (line 1189) | fn put_cast_to_uint_scalar_or_vector(
function put_image_sample_level (line 1215) | fn put_image_sample_level(
function put_image_coordinate_limits (line 1251) | fn put_image_coordinate_limits(
function put_restricted_scalar_image_index (line 1279) | fn put_restricted_scalar_image_index(
function put_restricted_texel_address (line 1294) | fn put_restricted_texel_address(
function put_image_access_bounds_check (line 1330) | fn put_image_access_bounds_check(
function put_image_load (line 1391) | fn put_image_load(
function put_unchecked_image_load (line 1443) | fn put_unchecked_image_load(
function put_image_atomic (line 1472) | fn put_image_atomic(
function put_image_store (line 1527) | fn put_image_store(
function put_dynamic_array_max_index (line 1561) | fn put_dynamic_array_max_index(
function put_dot_product (line 1624) | fn put_dot_product<T: Copy>(
function put_pack4x8 (line 1650) | fn put_pack4x8(
function put_isign (line 1703) | fn put_isign(
function put_const_expression (line 1731) | fn put_const_expression(
function put_literal (line 1749) | fn put_literal(&mut self, literal: crate::Literal) -> BackendResult {
function put_possibly_const_expression (line 1823) | fn put_possibly_const_expression<C, I, E>(
function put_expression (line 1945) | fn put_expression(
function put_binop (line 2940) | fn put_binop<F>(
function put_wrapped_expression_for_packed_vec3_access (line 3000) | fn put_wrapped_expression_for_packed_vec3_access<F>(
function put_bitcasted_expression (line 3022) | fn put_bitcasted_expression<F>(
function put_index (line 3047) | fn put_index(
function put_bounds_checks (line 3091) | fn put_bounds_checks(
function put_access_chain (line 3155) | fn put_access_chain(
function put_subscripted_access_chain (line 3242) | fn put_subscripted_access_chain(
function put_load (line 3301) | fn put_load(
function put_unchecked_load (line 3332) | fn put_unchecked_load(
function put_return_value (line 3359) | fn put_return_value(
function update_expressions_to_bake (line 3445) | fn update_expressions_to_bake(
function start_baking_expression (line 3534) | fn start_baking_expression(
function put_cache_restricted_level (line 3603) | fn put_cache_restricted_level(
function put_casting_to_packed_chars (line 3641) | fn put_casting_to_packed_chars(
function put_block (line 3668) | fn put_block(
function put_store (line 4352) | fn put_store(
function put_unchecked_store (line 4373) | fn put_unchecked_store(
function write (line 4406) | pub fn write(
function put_default_constructible (line 4527) | fn put_default_constructible(&mut self) -> BackendResult {
function put_ray_query_type (line 4538) | fn put_ray_query_type(&mut self) -> BackendResult {
function write_type_defs (line 4564) | fn write_type_defs(&mut self, module: &crate::Module) -> BackendResult {
function write_global_constants (line 4813) | fn write_global_constants(
function put_inline_sampler_properties (line 4837) | fn put_inline_sampler_properties(
function write_unpacking_function (line 4915) | fn write_unpacking_function(
function write_wrapped_unary_op (line 5721) | fn write_wrapped_unary_op(
function write_wrapped_binary_op (line 5781) | fn write_wrapped_binary_op(
function get_dot_wrapper_function_helper_name (line 5948) | fn get_dot_wrapper_function_helper_name(
function write_wrapped_math_function (line 5962) | fn write_wrapped_math_function(
function write_wrapped_cast (line 6060) | fn write_wrapped_cast(
function write_convert_yuv_to_rgb_and_return (line 6145) | fn write_convert_yuv_to_rgb_and_return(
function write_wrapped_image_load (line 6190) | fn write_wrapped_image_load(
function write_wrapped_image_sample (line 6276) | fn write_wrapped_image_sample(
function write_wrapped_image_query (line 6407) | fn write_wrapped_image_query(
function write_wrapped_cooperative_load (line 6452) | fn write_wrapped_cooperative_load(
function write_wrapped_cooperative_multiply_add (line 6501) | fn write_wrapped_cooperative_multiply_add(
function write_wrapped_functions (line 6552) | pub(super) fn write_wrapped_functions(
function write_functions (line 6652) | fn write_functions(
function write_barrier (line 7917) | fn write_barrier(&mut self, flags: crate::Barrier, level: back::Level) -...
type Access (line 7961) | enum Access {
method write (line 7968) | fn write<W: Write>(
type AccessStack (line 7985) | struct AccessStack {
method new (line 7991) | const fn new() -> Self {
method enter_array (line 7998) | fn enter_array<R>(&mut self, cb: impl FnOnce(&mut Self, usize) -> R) -...
method enter (line 8008) | fn enter<R>(&mut self, new: Access, cb: impl FnOnce(&mut Self) -> R) -...
method write (line 8015) | fn write<W: Write>(
function need_workgroup_variables_initialization (line 8028) | pub(super) fn need_workgroup_variables_initialization(
function write_workgroup_variables_initialization (line 8042) | pub(super) fn write_workgroup_variables_initialization(
function write_workgroup_variable_initialization (line 8084) | fn write_workgroup_variable_initialization(
function to_msl (line 8154) | const fn to_msl(self) -> &'static str {
function to_msl_64_bit (line 8168) | fn to_msl_64_bit(self) -> Result<&'static str, Error> {
FILE: naga/src/back/pipeline_constants.rs
type PipelineConstantError (line 28) | pub enum PipelineConstantError {
function process_overrides (line 66) | pub fn process_overrides<'a>(
function revalidate (line 288) | fn revalidate(
function process_workgroup_size_override (line 296) | fn process_workgroup_size_override(
function process_mesh_shader_overrides (line 331) | fn process_mesh_shader_overrides(
function process_override (line 356) | fn process_override(
function process_function (line 415) | fn process_function(
function adjust_expr (line 483) | fn adjust_expr(new_pos: &HandleVec<Expression, Handle<Expression>>, expr...
function adjust_block (line 708) | fn adjust_block(new_pos: &HandleVec<Expression, Handle<Expression>>, blo...
function adjust_stmt (line 716) | fn adjust_stmt(new_pos: &HandleVec<Expression, Handle<Expression>>, stmt...
function filter_emits_in_block (line 948) | fn filter_emits_in_block(block: &mut Block, expressions: &Arena<Expressi...
function map_value_to_literal (line 1021) | fn map_value_to_literal(value: f64, scalar: Scalar) -> Result<Literal, P...
function test_map_value_to_literal (line 1099) | fn test_map_value_to_literal() {
FILE: naga/src/back/spv/block.rs
function get_dimension (line 20) | fn get_dimension(type_inner: &crate::TypeInner) -> Dimension {
type AccessTypeAdjustment (line 42) | enum AccessTypeAdjustment {
type ExpressionPointer (line 93) | enum ExpressionPointer {
type BlockExit (line 110) | enum BlockExit {
type BlockExitDisposition (line 142) | enum BlockExitDisposition {
type LoopContext (line 156) | struct LoopContext {
type DebugInfoInner (line 162) | pub(crate) struct DebugInfoInner<'a> {
method write_epilogue_position_y_flip (line 172) | fn write_epilogue_position_y_flip(
method write_epilogue_frag_depth_clamp (line 204) | fn write_epilogue_frag_depth_clamp(
method write_entry_point_return (line 234) | fn write_entry_point_return(
function write_force_bounded_loop_instructions (line 293) | fn write_force_bounded_loop_instructions(&mut self, mut block: Block, me...
function maybe_write_uniform_matcx2_dynamic_access (line 448) | fn maybe_write_uniform_matcx2_dynamic_access(
function maybe_write_load_uniform_matcx2_struct_member (line 587) | fn maybe_write_load_uniform_matcx2_struct_member(
function cache_expression_value (line 703) | pub(super) fn cache_expression_value(
function write_as_expression (line 2198) | fn write_as_expression(
function write_access_chain (line 2476) | fn write_access_chain(
function is_nonuniform_binding_array_access (line 2662) | fn is_nonuniform_binding_array_access(
function write_access_chain_index (line 2691) | fn write_access_chain_index(
function extend_bounds_check_condition_chain (line 2736) | fn extend_bounds_check_condition_chain(
function write_checked_load (line 2761) | fn write_checked_load(
function spill_to_internal_variable (line 2885) | fn spill_to_internal_variable(&mut self, base: Handle<crate::Expression>...
function maybe_access_spilled_composite (line 2958) | fn maybe_access_spilled_composite(
function write_matrix_matrix_column_op (line 2986) | fn write_matrix_matrix_column_op(
function write_vector_scalar_mult (line 3041) | fn write_vector_scalar_mult(
function write_dot_product (line 3089) | fn write_dot_product(
function write_pack4x8_optimized (line 3137) | fn write_pack4x8_optimized(
function write_pack4x8_polyfill (line 3218) | fn write_pack4x8_polyfill(
function write_unpack4x8_optimized (line 3324) | fn write_unpack4x8_optimized(
function write_unpack4x8_polyfill (line 3362) | fn write_unpack4x8_polyfill(
function write_block (line 3434) | fn write_block(
function write_function_body (line 4214) | pub(super) fn write_function_body(
FILE: naga/src/back/spv/f16_polyfill.rs
type F16IoPolyfill (line 17) | pub(in crate::back::spv) struct F16IoPolyfill {
method new (line 23) | pub fn new(use_storage_input_output_16: bool) -> Self {
method needs_polyfill (line 30) | pub fn needs_polyfill(&self, ty_inner: &crate::TypeInner) -> bool {
method register_io_var (line 45) | pub fn register_io_var(&mut self, variable_id: Word, f32_type_id: Word) {
method get_f32_io_type (line 49) | pub fn get_f32_io_type(&self, variable_id: Word) -> Option<Word> {
method emit_f16_to_f32_conversion (line 53) | pub fn emit_f16_to_f32_conversion(
method emit_f32_to_f16_conversion (line 67) | pub fn emit_f32_to_f16_conversion(
method create_polyfill_type (line 81) | pub fn create_polyfill_type(ty_inner: &crate::TypeInner) -> Option<Loc...
method reclaim (line 100) | fn reclaim(mut self) -> Self {
FILE: naga/src/back/spv/helpers.rs
function bytes_to_words (line 8) | pub(super) fn bytes_to_words(bytes: &[u8]) -> Vec<Word> {
function string_to_words (line 15) | pub(super) fn string_to_words(input: &str) -> Vec<Word> {
function str_bytes_to_words (line 21) | pub(super) fn str_bytes_to_words(bytes: &[u8]) -> Vec<Word> {
function string_to_byte_chunks (line 33) | pub(super) fn string_to_byte_chunks(input: &str, limit: usize) -> Vec<&[...
function map_storage_class (line 49) | pub(super) const fn map_storage_class(space: crate::AddressSpace) -> spi...
function contains_builtin (line 63) | pub(super) fn contains_builtin(
function to_spirv_semantics_and_scope (line 81) | pub(super) const fn to_spirv_semantics_and_scope(
function global_needs_wrapper (line 99) | pub fn global_needs_wrapper(ir_module: &crate::Module, var: &crate::Glob...
function is_uniform_matcx2_struct_member_access (line 129) | pub fn is_uniform_matcx2_struct_member_access(
type U8Internal (line 167) | trait U8Internal {
method is_utf8_char_boundary_polyfill (line 168) | fn is_utf8_char_boundary_polyfill(&self) -> bool;
method is_utf8_char_boundary_polyfill (line 172) | fn is_utf8_char_boundary_polyfill(&self) -> bool {
type StrUnstable (line 178) | trait StrUnstable {
method floor_char_boundary_polyfill (line 179) | fn floor_char_boundary_polyfill(&self, index: usize) -> usize;
method floor_char_boundary_polyfill (line 183) | fn floor_char_boundary_polyfill(&self, index: usize) -> usize {
type BindingDecorations (line 198) | pub enum BindingDecorations {
FILE: naga/src/back/spv/image.rs
type ImageCoordinates (line 23) | struct ImageCoordinates {
type Access (line 51) | trait Access {
method generate (line 74) | fn generate(
method result_type (line 86) | fn result_type(&self) -> Self::Output;
method out_of_bounds_value (line 91) | fn out_of_bounds_value(&self, ctx: &mut BlockContext<'_>) -> Self::Out...
type Output (line 146) | type Output = Word;
method generate (line 149) | fn generate(
method result_type (line 185) | fn result_type(&self) -> Word {
method out_of_bounds_value (line 189) | fn out_of_bounds_value(&self, ctx: &mut BlockContext<'_>) -> Word {
type Output (line 207) | type Output = ();
method generate (line 209) | fn generate(
method result_type (line 225) | fn result_type(&self) {}
method out_of_bounds_value (line 228) | fn out_of_bounds_value(&self, _ctx: &mut BlockContext<'_>) {}
type Load (line 97) | struct Load {
method from_image_expr (line 110) | fn from_image_expr(
type Store (line 197) | struct Store {
function write_image_coordinates (line 258) | fn write_image_coordinates(
function get_handle_id (line 375) | pub(super) fn get_handle_id(&mut self, expr_handle: Handle<crate::Expres...
function write_coordinate_one (line 403) | fn write_coordinate_one(&mut self, coordinates: &ImageCoordinates) -> Re...
function restrict_scalar (line 426) | fn restrict_scalar(
function write_coordinate_bounds (line 464) | fn write_coordinate_bounds(
function write_restricted_coordinates (line 513) | fn write_restricted_coordinates(
function write_conditional_image_access (line 594) | fn write_conditional_image_access<A: Access>(
function write_image_load (line 723) | pub(super) fn write_image_load(
function write_image_sample (line 803) | pub(super) fn write_image_sample(
function write_image_query (line 1116) | pub(super) fn write_image_query(
function write_image_store (line 1269) | pub(super) fn write_image_store(
function write_image_atomic (line 1309) | pub(super) fn write_image_atomic(
FILE: naga/src/back/spv/index.rs
type BoundsCheckResult (line 21) | pub(super) enum BoundsCheckResult {
type MaybeKnown (line 54) | pub(super) enum MaybeKnown<T> {
function write_runtime_array_length (line 89) | pub(super) fn write_runtime_array_length(
function write_sequence_length (line 265) | fn write_sequence_length(
function write_sequence_max_index (line 295) | fn write_sequence_max_index(
function write_restricted_index (line 341) | pub(super) fn write_restricted_index(
function write_index_comparison (line 398) | fn write_index_comparison(
function write_conditional_indexed_load (line 453) | pub(super) fn write_conditional_indexed_load<F>(
function write_bounds_check (line 509) | pub(super) fn write_bounds_check(
function write_vector_access (line 542) | pub(super) fn write_vector_access(
FILE: naga/src/back/spv/instructions.rs
type Signedness (line 7) | pub(super) enum Signedness {
type SampleLod (line 12) | pub(super) enum SampleLod {
type Case (line 17) | pub(super) struct Case {
function string (line 27) | pub(super) fn string(name: &str, id: Word) -> Self {
function source (line 34) | pub(super) fn source(
function source_continued (line 49) | pub(super) fn source_continued(source: &[u8]) -> Self {
function source_auto_continued (line 55) | pub(super) fn source_auto_continued(
function name (line 85) | pub(super) fn name(target_id: Word, name: &str) -> Self {
function member_name (line 92) | pub(super) fn member_name(target_id: Word, member: Word, name: &str) -> ...
function line (line 100) | pub(super) fn line(file: Word, line: Word, column: Word) -> Self {
function decorate (line 112) | pub(super) fn decorate(
function member_decorate (line 126) | pub(super) fn member_decorate(
function extension (line 146) | pub(super) fn extension(name: &str) -> Self {
function ext_inst_import (line 152) | pub(super) fn ext_inst_import(id: Word, name: &str) -> Self {
function ext_inst_gl_op (line 159) | pub(super) fn ext_inst_gl_op(
function ext_inst (line 169) | pub(super) fn ext_inst(
function memory_model (line 191) | pub(super) fn memory_model(
function entry_point (line 201) | pub(super) fn entry_point(
function execution_mode (line 219) | pub(super) fn execution_mode(
function capability (line 233) | pub(super) fn capability(capability: spirv::Capability) -> Self {
function type_void (line 243) | pub(super) fn type_void(id: Word) -> Self {
function type_bool (line 249) | pub(super) fn type_bool(id: Word) -> Self {
function type_int (line 255) | pub(super) fn type_int(id: Word, width: Word, signedness: Signedness) ->...
function type_float (line 263) | pub(super) fn type_float(id: Word, width: Word) -> Self {
function type_vector (line 270) | pub(super) fn type_vector(
function type_matrix (line 282) | pub(super) fn type_matrix(
function type_coop_matrix (line 294) | pub(super) fn type_coop_matrix(
function type_image (line 312) | pub(super) fn type_image(
function type_sampler (line 335) | pub(super) fn type_sampler(id: Word) -> Self {
function type_acceleration_structure (line 341) | pub(super) fn type_acceleration_structure(id: Word) -> Self {
function type_ray_query (line 347) | pub(super) fn type_ray_query(id: Word) -> Self {
function type_sampled_image (line 353) | pub(super) fn type_sampled_image(id: Word, image_type_id: Word) -> Self {
function type_array (line 360) | pub(super) fn type_array(id: Word, element_type_id: Word, length_id: Wor...
function type_runtime_array (line 368) | pub(super) fn type_runtime_array(id: Word, element_type_id: Word) -> Self {
function type_struct (line 375) | pub(super) fn type_struct(id: Word, member_ids: &[Word]) -> Self {
function type_pointer (line 386) | pub(super) fn type_pointer(
function type_function (line 398) | pub(super) fn type_function(id: Word, return_type_id: Word, parameter_id...
function constant_null (line 414) | pub(super) fn constant_null(result_type_id: Word, id: Word) -> Self {
function constant_true (line 421) | pub(super) fn constant_true(result_type_id: Word, id: Word) -> Self {
function constant_false (line 428) | pub(super) fn constant_false(result_type_id: Word, id: Word) -> Self {
function constant_16bit (line 435) | pub(super) fn constant_16bit(result_type_id: Word, id: Word, low: Word) ...
function constant_32bit (line 439) | pub(super) fn constant_32bit(result_type_id: Word, id: Word, value: Word...
function constant_64bit (line 443) | pub(super) fn constant_64bit(result_type_id: Word, id: Word, low: Word, ...
function constant (line 447) | pub(super) fn constant(result_type_id: Word, id: Word, values: &[Word]) ...
function constant_composite (line 459) | pub(super) fn constant_composite(
function variable (line 479) | pub(super) fn variable(
function load (line 497) | pub(super) fn load(
function atomic_load (line 515) | pub(super) fn atomic_load(
function store (line 531) | pub(super) fn store(
function atomic_store (line 547) | pub(super) fn atomic_store(
function access_chain (line 561) | pub(super) fn access_chain(
function array_length (line 579) | pub(super) fn array_length(
function function (line 597) | pub(super) fn function(
function function_parameter (line 611) | pub(super) fn function_parameter(result_type_id: Word, id: Word) -> Self {
function function_end (line 618) | pub(super) const fn function_end() -> Self {
function function_call (line 622) | pub(super) fn function_call(
function sampled_image (line 644) | pub(super) fn sampled_image(
function image_sample (line 658) | pub(super) fn image_sample(
function image_gather (line 685) | pub(super) fn image_gather(
function image_fetch_or_read (line 712) | pub(super) fn image_fetch_or_read(
function image_write (line 727) | pub(super) fn image_write(image: Word, coordinates: Word, value: Word) -...
function image_texel_pointer (line 735) | pub(super) fn image_texel_pointer(
function image_atomic (line 751) | pub(super) fn image_atomic(
function image_query (line 770) | pub(super) fn image_query(op: Op, result_type_id: Word, id: Word, image:...
function ray_query_initialize (line 782) | pub(super) fn ray_query_initialize(
function ray_query_proceed (line 804) | pub(super) fn ray_query_proceed(result_type_id: Word, id: Word, query: W...
function ray_query_generate_intersection (line 812) | pub(super) fn ray_query_generate_intersection(query: Word, hit: Word) ->...
function ray_query_confirm_intersection (line 819) | pub(super) fn ray_query_confirm_intersection(query: Word) -> Self {
function ray_query_return_vertex_position (line 825) | pub(super) fn ray_query_return_vertex_position(
function ray_query_get_intersection (line 839) | pub(super) fn ray_query_get_intersection(
function ray_query_get_t_min (line 854) | pub(super) fn ray_query_get_t_min(result_type_id: Word, id: Word, query:...
function ray_query_terminate (line 862) | pub(super) fn ray_query_terminate(query: Word) -> Self {
function unary (line 871) | pub(super) fn unary(op: Op, result_type_id: Word, id: Word, value: Word)...
function composite_construct (line 883) | pub(super) fn composite_construct(
function composite_extract (line 899) | pub(super) fn composite_extract(
function vector_extract_dynamic (line 917) | pub(super) fn vector_extract_dynamic(
function vector_shuffle (line 933) | pub(super) fn vector_shuffle(
function binary (line 956) | pub(super) fn binary(
function ternary (line 971) | pub(super) fn ternary(
function quaternary (line 988) | pub(super) fn quaternary(
function relational (line 1007) | pub(super) fn relational(op: Op, result_type_id: Word, id: Word, expr_id...
function atomic_binary (line 1015) | pub(super) fn atomic_binary(
function derivative (line 1046) | pub(super) fn derivative(op: Op, result_type_id: Word, id: Word, expr_id...
function phi (line 1058) | pub(super) fn phi(
function selection_merge (line 1073) | pub(super) fn selection_merge(
function loop_merge (line 1083) | pub(super) fn loop_merge(
function label (line 1095) | pub(super) fn label(id: Word) -> Self {
function branch (line 1101) | pub(super) fn branch(id: Word) -> Self {
function branch_conditional (line 1108) | pub(super) fn branch_conditional(
function switch (line 1120) | pub(super) fn switch(selector_id: Word, default_id: Word, cases: &[Case]...
function select (line 1131) | pub(super) fn select(
function kill (line 1147) | pub(super) const fn kill() -> Self {
function return_void (line 1151) | pub(super) const fn return_void() -> Self {
function return_value (line 1155) | pub(super) fn return_value(value_id: Word) -> Self {
function control_barrier (line 1171) | pub(super) fn control_barrier(
function memory_barrier (line 1182) | pub(super) fn memory_barrier(mem_scope_id: Word, semantics_id: Word) -> ...
function group_non_uniform_ballot (line 1191) | pub(super) fn group_non_uniform_ballot(
function group_non_uniform_broadcast_first (line 1205) | pub(super) fn group_non_uniform_broadcast_first(
function group_non_uniform_gather (line 1219) | pub(super) fn group_non_uniform_gather(
function group_non_uniform_arithmetic (line 1236) | pub(super) fn group_non_uniform_arithmetic(
function group_non_uniform_quad_swap (line 1255) | pub(super) fn group_non_uniform_quad_swap(
function coop_load (line 1273) | pub(super) fn coop_load(
function coop_store (line 1288) | pub(super) fn coop_store(id: Word, pointer_id: Word, layout_id: Word, st...
function coop_mul_add (line 1296) | pub(super) fn coop_mul_add(result_type_id: Word, id: Word, a: Word, b: W...
function from (line 1309) | fn from(format: crate::StorageFormat) -> Self {
function from (line 1358) | fn from(dim: crate::ImageDimension) -> Self {
function from (line 1370) | fn from(role: crate::CooperativeRole) -> Self {
FILE: naga/src/back/spv/layout.rs
constant GENERATOR (line 12) | const GENERATOR: Word = 28;
method new (line 15) | pub(super) const fn new(major_version: u8, minor_version: u8) -> Self {
method in_words (line 26) | pub(super) fn in_words(&self, sink: &mut impl Extend<Word>) {
method lang_version (line 35) | pub(super) const fn lang_version(&self) -> (u8, u8) {
method reclaim (line 43) | fn reclaim(self) -> Self {
method in_words (line 55) | pub(super) fn in_words(&self, sink: &mut impl Extend<Word>) {
method reclaim (line 71) | fn reclaim(self) -> Self {
method new (line 89) | pub(super) const fn new(op: Op) -> Self {
method set_type (line 99) | pub(super) fn set_type(&mut self, id: Word) {
method set_result (line 105) | pub(super) fn set_result(&mut self, id: Word) {
method add_operand (line 111) | pub(super) fn add_operand(&mut self, operand: Word) {
method add_operands (line 116) | pub(super) fn add_operands(&mut self, operands: Vec<Word>) {
method to_words (line 122) | pub(super) fn to_words(&self, sink: &mut impl Extend<Word>) {
method validate (line 132) | fn validate(&self, words: &[Word]) {
function test_physical_layout_in_words (line 157) | fn test_physical_layout_in_words() {
function test_logical_layout_in_words (line 174) | fn test_logical_layout_in_words() {
FILE: naga/src/back/spv/mesh_shader.rs
type MeshReturnMember (line 14) | pub struct MeshReturnMember {
type PerOutputTypeMeshReturnInfo (line 19) | struct PerOutputTypeMeshReturnInfo {
type MeshReturnInfo (line 33) | pub struct MeshReturnInfo {
function write_mesh_return_global_variable (line 53) | pub(super) fn write_mesh_return_global_variable(
function write_entry_point_mesh_shader_info (line 70) | pub(super) fn write_entry_point_mesh_shader_info(
function write_entry_point_task_return (line 412) | pub(super) fn write_entry_point_task_return(
function write_mesh_copy_loop (line 443) | fn write_mesh_copy_loop(
function write_mesh_copy_body (line 513) | fn write_mesh_copy_body(
function write_mesh_shader_return (line 632) | pub(super) fn write_mesh_shader_return(
function write_mesh_shader_wrapper (line 783) | pub(super) fn write_mesh_shader_wrapper(
function write_task_shader_wrapper (line 854) | pub(super) fn write_task_shader_wrapper(
FILE: naga/src/back/spv/mod.rs
type PhysicalLayout (line 127) | struct PhysicalLayout {
type LogicalLayout (line 136) | struct LogicalLayout {
type Instruction (line 151) | struct Instruction {
constant BITS_PER_BYTE (line 159) | const BITS_PER_BYTE: crate::Bytes = 8;
type Error (line 162) | pub enum Error {
type IdGenerator (line 184) | struct IdGenerator(Word);
method next (line 187) | const fn next(&mut self) -> Word {
type DebugInfo (line 194) | pub struct DebugInfo<'a> {
type Block (line 211) | struct Block {
method new (line 223) | const fn new(label_id: Word) -> Self {
type TerminatedBlock (line 217) | struct TerminatedBlock {
type LocalVariable (line 231) | struct LocalVariable {
type ResultMember (line 236) | struct ResultMember {
type EntryPointContext (line 242) | struct EntryPointContext {
type Function (line 250) | struct Function {
method consume (line 307) | fn consume(&mut self, mut block: Block, termination: Instruction) {
method parameter_id (line 315) | fn parameter_id(&self, index: u32) -> Word {
type LocalImageType (line 335) | struct LocalImageType {
method from_inner (line 355) | fn from_inner(dim: crate::ImageDimension, arrayed: bool, class: crate:...
type NumericType (line 394) | enum NumericType {
method from_inner (line 408) | const fn from_inner(inner: &crate::TypeInner) -> Option<Self> {
method scalar (line 427) | const fn scalar(self) -> crate::Scalar {
method with_scalar (line 435) | const fn with_scalar(self, scalar: crate::Scalar) -> Self {
type CooperativeType (line 450) | enum CooperativeType {
method from_inner (line 460) | const fn from_inner(inner: &crate::TypeInner) -> Option<Self> {
type LocalType (line 524) | enum LocalType {
type LookupType (line 568) | enum LookupType {
method from (line 574) | fn from(local: LocalType) -> Self {
type LookupFunctionType (line 580) | struct LookupFunctionType {
type LookupRayQueryFunction (line 586) | enum LookupRayQueryFunction {
type Dimension (line 597) | enum Dimension {
type WrappedFunction (line 608) | enum WrappedFunction {
type CachedExpressions (line 631) | struct CachedExpressions {
method reset (line 635) | fn reset(&mut self, length: usize) {
type Output (line 641) | type Output = Word;
method index (line 642) | fn index(&self, h: Handle<crate::Expression>) -> &Word {
method index_mut (line 651) | fn index_mut(&mut self, h: Handle<crate::Expression>) -> &mut Word {
method reclaim (line 660) | fn reclaim(self) -> Self {
type CachedConstant (line 668) | enum CachedConstant {
type GlobalVariable (line 708) | struct GlobalVariable {
method dummy (line 750) | const fn dummy() -> Self {
method new (line 758) | const fn new(id: Word) -> Self {
method reset_for_function (line 767) | const fn reset_for_function(&mut self) {
type FunctionArgument (line 773) | struct FunctionArgument {
type ExpressionConstnessTracker (line 785) | struct ExpressionConstnessTracker {
method from_arena (line 790) | fn from_arena(arena: &crate::Arena<crate::Expression>) -> Self {
method is_const (line 810) | fn is_const(&self, value: Handle<crate::Expression>) -> bool {
type BlockContext (line 816) | struct BlockContext<'w> {
type RayQueryTrackers (line 850) | struct RayQueryTrackers {
function gen_id (line 861) | const fn gen_id(&mut self) -> Word {
function get_type_id (line 865) | fn get_type_id(&mut self, lookup_type: LookupType) -> Word {
function get_handle_type_id (line 869) | fn get_handle_type_id(&mut self, handle: Handle<crate::Type>) -> Word {
function get_expression_type_id (line 873) | fn get_expression_type_id(&mut self, tr: &TypeResolution) -> Word {
function get_index_constant (line 877) | fn get_index_constant(&mut self, index: Word) -> Word {
function get_scope_constant (line 881) | fn get_scope_constant(&mut self, scope: Word) -> Word {
function get_pointer_type_id (line 886) | fn get_pointer_type_id(&mut self, base: Word, class: spirv::StorageClass...
function get_numeric_type_id (line 890) | fn get_numeric_type_id(&mut self, numeric: NumericType) -> Word {
type Std140CompatTypeInfo (line 901) | pub struct Std140CompatTypeInfo {
type Writer (line 909) | pub struct Writer {
type BindingInfo (line 1026) | pub struct BindingInfo {
type BindingMap (line 1034) | pub type BindingMap = alloc::collections::BTreeMap<crate::ResourceBindin...
type ZeroInitializeWorkgroupMemoryMode (line 1037) | pub enum ZeroInitializeWorkgroupMemoryMode {
type Options (line 1046) | pub struct Options<'a> {
method default (line 1093) | fn default() -> Self {
type PipelineOptions (line 1122) | pub struct PipelineOptions {
function write_vec (line 1131) | pub fn write_vec(
function supported_capabilities (line 1150) | pub fn supported_capabilities() -> crate::valid::Capabilities {
FILE: naga/src/back/spv/ray/query.rs
function write_ray_flags_contains_flags (line 14) | fn write_ray_flags_contains_flags(
method write_logical_and (line 48) | fn write_logical_and(
method write_reduce_and (line 66) | fn write_reduce_and(&mut self, block: &mut Block, mut bools: Vec<spirv::...
method write_function_signature (line 76) | fn write_function_signature(
method write_ray_query_get_intersection_function (line 109) | pub(in super::super) fn write_ray_query_get_intersection_function(
method write_ray_query_initialize (line 596) | fn write_ray_query_initialize(&mut self, ir_module: &crate::Module) -> s...
method write_ray_query_proceed (line 1037) | fn write_ray_query_proceed(&mut self) -> spirv::Word {
method write_ray_query_generate_intersection (line 1162) | fn write_ray_query_generate_intersection(&mut self) -> spirv::Word {
method write_ray_query_confirm_intersection (line 1460) | fn write_ray_query_confirm_intersection(&mut self) -> spirv::Word {
method write_ray_query_get_vertex_positions (line 1592) | fn write_ray_query_get_vertex_positions(
method write_ray_query_terminate (line 1784) | fn write_ray_query_terminate(&mut self) -> spirv::Word {
function write_ray_query_function (line 1876) | pub(in super::super) fn write_ray_query_function(
function write_ray_query_return_vertex_position (line 1969) | pub(in super::super) fn write_ray_query_return_vertex_position(
FILE: naga/src/back/spv/reclaimable.rs
type Reclaimable (line 25) | pub trait Reclaimable {
method reclaim (line 31) | fn reclaim(self) -> Self;
method reclaim (line 37) | fn reclaim(mut self) -> Self {
method reclaim (line 44) | fn reclaim(mut self) -> Self {
method reclaim (line 51) | fn reclaim(mut self) -> Self {
method reclaim (line 58) | fn reclaim(mut self) -> Self {
method reclaim (line 65) | fn reclaim(mut self) -> Self {
method reclaim (line 72) | fn reclaim(mut self) -> Self {
FILE: naga/src/back/spv/selection.rs
type Selection (line 67) | pub(super) struct Selection<'b, M: MergeTuple> {
function start (line 105) | pub(super) const fn start(block: &'b mut Block, merge_types: M) -> Self {
function block (line 114) | pub(super) const fn block(&mut self) -> &mut Block {
function if_true (line 125) | pub(super) fn if_true(&mut self, ctx: &mut BlockContext, cond: Word, val...
function finish (line 146) | pub(super) fn finish(self, ctx: &mut BlockContext, final_values: M) -> M {
function make_merge_label (line 177) | fn make_merge_label(&mut self, ctx: &mut BlockContext) -> Word {
type MergeTuple (line 219) | pub(super) trait MergeTuple: Sized {
method write_phis (line 225) | fn write_phis(
method write_phis (line 238) | fn write_phis(
method write_phis (line 259) | fn write_phis(self, _: &mut BlockContext, _: &mut Block, _: &[((), Wor...
FILE: naga/src/back/spv/subgroup.rs
function write_subgroup_ballot (line 5) | pub(super) fn write_subgroup_ballot(
function write_subgroup_operation (line 35) | pub(super) fn write_subgroup_operation(
function write_subgroup_gather (line 121) | pub(super) fn write_subgroup_gather(
FILE: naga/src/back/spv/writer.rs
type FunctionInterface (line 27) | pub struct FunctionInterface<'a> {
method to_words (line 36) | pub(super) fn to_words(&self, sink: &mut impl Extend<Word>) {
method new (line 69) | pub fn new(options: &Options) -> Result<Self, Error> {
method set_options (line 123) | pub fn set_options(&mut self, options: &Options) -> Result<(), Error> {
method lang_version (line 144) | pub const fn lang_version(&self) -> (u8, u8) {
method reset (line 157) | fn reset(&mut self) {
method require_any (line 229) | pub(super) fn require_any(
method require_all (line 278) | pub(super) fn require_all(
method use_extension (line 298) | pub(super) fn use_extension(&mut self, extension: &'static str) {
method get_type_id (line 302) | pub(super) fn get_type_id(&mut self, lookup_ty: LookupType) -> Word {
method get_handle_type_id (line 319) | pub(super) fn get_handle_type_id(&mut self, handle: Handle<crate::Type>)...
method get_expression_lookup_type (line 323) | pub(super) fn get_expression_lookup_type(&mut self, tr: &TypeResolution)...
method get_expression_type_id (line 333) | pub(super) fn get_expression_type_id(&mut self, tr: &TypeResolution) -> ...
method get_localtype_id (line 338) | pub(super) fn get_localtype_id(&mut self, local: LocalType) -> Word {
method get_pointer_type_id (line 342) | pub(super) fn get_pointer_type_id(&mut self, base: Word, class: spirv::S...
method get_handle_pointer_type_id (line 346) | pub(super) fn get_handle_pointer_type_id(
method get_ray_query_pointer_id (line 355) | pub(super) fn get_ray_query_pointer_id(&mut self) -> Word {
method get_resolution_pointer_id (line 364) | pub(super) fn get_resolution_pointer_id(
method get_numeric_type_id (line 373) | pub(super) fn get_numeric_type_id(&mut self, numeric: NumericType) -> Wo...
method get_u32_type_id (line 377) | pub(super) fn get_u32_type_id(&mut self) -> Word {
method get_f32_type_id (line 381) | pub(super) fn get_f32_type_id(&mut self) -> Word {
method get_vec2u_type_id (line 385) | pub(super) fn get_vec2u_type_id(&mut self) -> Word {
method get_vec2f_type_id (line 392) | pub(super) fn get_vec2f_type_id(&mut self) -> Word {
method get_vec3u_type_id (line 399) | pub(super) fn get_vec3u_type_id(&mut self) -> Word {
method get_f32_pointer_type_id (line 406) | pub(super) fn get_f32_pointer_type_id(&mut self, class: spirv::StorageCl...
method get_vec2u_pointer_type_id (line 411) | pub(super) fn get_vec2u_pointer_type_id(&mut self, class: spirv::Storage...
method get_bool_type_id (line 419) | pub(super) fn get_bool_type_id(&mut self) -> Word {
method get_vec2_bool_type_id (line 423) | pub(super) fn get_vec2_bool_type_id(&mut self) -> Word {
method get_vec3_bool_type_id (line 430) | pub(super) fn get_vec3_bool_type_id(&mut self) -> Word {
method get_tuple_of_u32s_ty_id (line 441) | pub(super) fn get_tuple_of_u32s_ty_id(&mut self) -> Word {
method decorate (line 454) | pub(super) fn decorate(&mut self, id: Word, decoration: spirv::Decoratio...
method localtype_from_inner (line 466) | fn localtype_from_inner(&mut self, inner: &crate::TypeInner) -> Option<L...
method resolve_resource_binding (line 519) | fn resolve_resource_binding(
method write_wrapped_functions (line 536) | fn write_wrapped_functions(
method write_wrapped_binary_op (line 642) | fn write_wrapped_binary_op(
method write_wrapped_convert_from_std140_compat_type (line 820) | fn write_wrapped_convert_from_std140_compat_type(
method write_wrapped_matcx2_get_column (line 1045) | fn write_wrapped_matcx2_get_column(
method write_function (line 1189) | fn write_function(
method write_execution_mode (line 1711) | fn write_execution_mode(
method write_entry_point (line 1723) | fn write_entry_point(
method make_scalar (line 1864) | fn make_scalar(&mut self, id: Word, scalar: crate::Scalar) -> Instruction {
method request_type_capabilities (line 1910) | fn request_type_capabilities(&mut self, inner: &crate::TypeInner) -> Res...
method write_numeric_type_declaration_local (line 1998) | fn write_numeric_type_declaration_local(&mut self, id: Word, numeric: Nu...
method write_cooperative_type_declaration_local (line 2019) | fn write_cooperative_type_declaration_local(&mut self, id: Word, coop: C...
method write_type_declaration_local (line 2041) | fn write_type_declaration_local(&mut self, id: Word, local_ty: LocalType) {
method write_type_declaration_arena (line 2073) | fn write_type_declaration_arena(
method write_std140_compat_type_declaration (line 2227) | fn write_std140_compat_type_declaration(
method request_image_format_capabilities (line 2433) | fn request_image_format_capabilities(
method get_index_constant (line 2492) | pub(super) fn get_index_constant(&mut self, index: Word) -> Word {
method get_constant_scalar_with (line 2496) | pub(super) fn get_constant_scalar_with(
method get_constant_scalar (line 2508) | pub(super) fn get_constant_scalar(&mut self, value: crate::Literal) -> W...
method write_constant_scalar (line 2519) | fn write_constant_scalar(
method get_constant_composite (line 2559) | pub(super) fn get_constant_composite(
method write_constant_composite (line 2577) | fn write_constant_composite(
method get_constant_null (line 2594) | pub(super) fn get_constant_null(&mut self, type_id: Word) -> Word {
method write_constant_null (line 2604) | pub(super) fn write_constant_null(&mut self, type_id: Word) -> Word {
method write_constant_expr (line 2611) | fn write_constant_expr(
method write_control_barrier (line 2656) | pub(super) fn write_control_barrier(
method write_memory_barrier (line 2699) | pub(super) fn write_memory_barrier(&mut self, flags: crate::Barrier, blo...
method generate_workgroup_vars_init_block (line 2730) | fn generate_workgroup_vars_init_block(
method write_varying (line 2848) | fn write_varying(
method write_binding (line 2893) | pub fn write_binding(&mut self, id: Word, binding: BindingDecorations) {
method write_binding_struct_member (line 2918) | pub fn write_binding_struct_member(
method map_binding (line 2973) | pub fn map_binding(
method load_io_with_f16_polyfill (line 3238) | pub(super) fn load_io_with_f16_polyfill(
Copy disabled (too large)
Download .json
Condensed preview — 2164 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (16,350K chars).
[
{
"path": ".cargo/config.toml",
"chars": 39,
"preview": "[alias]\nxtask = \"run -p wgpu-xtask --\"\n"
},
{
"path": ".claude/skills/cts-triage/SKILL.md",
"chars": 9859,
"preview": "---\nname: cts-triage\ndescription: Run CTS test suites and investigate failures\n---\n\n# Triage Process\n\nWhen working on a "
},
{
"path": ".claude/skills/webgpu-specs/SKILL.md",
"chars": 1235,
"preview": "---\nname: webgpu-specs\ndescription: Download WebGPU and WGSL specifications for use as a reference\nallowed-tools: \"Bash("
},
{
"path": ".claude/skills/webgpu-specs/download.sh",
"chars": 1010,
"preview": "#!/bin/sh\n\nset -e\n\nTARGET_DIR=\"$(cargo metadata --format-version 1 | jq -r \".target_directory\")\"\n\nWEBGPU=\"$TARGET_DIR/cl"
},
{
"path": ".config/nextest.toml",
"chars": 1681,
"preview": "# None of our tests should take longer than 45s, and if they've gone 2x that,\n# terminate them to prevent infinite run-o"
},
{
"path": ".deny.toml",
"chars": 3332,
"preview": "[bans]\nmultiple-versions = \"deny\"\nskip-tree = [\n { name = \"rustc-hash\", version = \"1.1.0\" },\n\n # introduced by Den"
},
{
"path": ".gitattributes",
"chars": 88,
"preview": "*.mtl binary\n*.obj binary\nwgpu/src/backend/webgpu/webgpu_sys/** linguist-generated=true\n"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 859,
"preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: bug\nassignees: ''\n\n---\n\n<!-- Thank you "
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 199,
"preview": "blank_issues_enabled: false\ncontact_links:\n - name: Question about wgpu\n url: https://github.com/gfx-rs/wgpu/discuss"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 604,
"preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: enhancement\nassignees: ''\n\n---\n\n**Is"
},
{
"path": ".github/ISSUE_TEMPLATE/other.md",
"chars": 103,
"preview": "---\nname: Other\nabout: Strange things you want to tell us\ntitle: ''\nlabels: question\nassignees: ''\n---\n"
},
{
"path": ".github/actions/install-agility-sdk/action.yml",
"chars": 312,
"preview": "name: \"Install Agility SDK\"\ndescription: \"Install the D3D12 Agility SDK and export its environment variables\"\nruns:\n us"
},
{
"path": ".github/actions/install-dxc/action.yml",
"chars": 565,
"preview": "name: \"Install DXC\"\ndescription: \"Install DXC\"\nruns:\n using: \"composite\"\n steps:\n - shell: bash\n run: |\n "
},
{
"path": ".github/actions/install-mesa/action.yml",
"chars": 2453,
"preview": "name: \"Install Mesa\"\ndescription: \"Install Mesa\"\ninputs:\n # Sourced from https://archive.mesa3d.org/. Bumping this requ"
},
{
"path": ".github/actions/install-vulkan-sdk/action.yml",
"chars": 2487,
"preview": "name: \"Install Vulkan SDK\"\ndescription: \"Install Vulkan SDK\"\ninputs:\n # Sourced from https://vulkan.lunarg.com/sdk/home"
},
{
"path": ".github/actions/install-warp/action.yml",
"chars": 313,
"preview": "name: \"Install WARP\"\ndescription: \"Install WARP\"\ninputs:\n target-dir:\n description: \"The directory into which to ins"
},
{
"path": ".github/pull_request_template.md",
"chars": 1510,
"preview": "**Connections**\n_Link to the issues addressed by this PR, or dependent PRs in other repositories_\n\n_When one pull reques"
},
{
"path": ".github/workflows/changelog.yml",
"chars": 1083,
"preview": "name: changelog\n\non:\n pull_request:\n paths:\n - \".github/workflows/changelog.yml\"\n - \"CHANGELOG.md\"\n -"
},
{
"path": ".github/workflows/ci.yml",
"chars": 27645,
"preview": "name: CI\n\non:\n push:\n branches-ignore: [\n # Renovate branches are always PRs, so they will be covered\n "
},
{
"path": ".github/workflows/cts.yml",
"chars": 5330,
"preview": "name: CTS\n\non:\n push:\n branches-ignore: [\n # Renovate branches are always PRs, so they will be covered\n "
},
{
"path": ".github/workflows/docs.yml",
"chars": 2065,
"preview": "name: Docs\n\non:\n push:\n branches-ignore: [\n # Renovate branches are always PRs, so they will be covered\n "
},
{
"path": ".github/workflows/generate.yml",
"chars": 2526,
"preview": "name: cargo-generate\n\non:\n push:\n branches-ignore: [\n # Renovate branches are always PRs, so they will be cov"
},
{
"path": ".github/workflows/lazy.yml",
"chars": 5028,
"preview": "# Non-critical jobs\nname: Lazy\n\non:\n push:\n branches-ignore: [\n # Renovate branches are always PRs, so they w"
},
{
"path": ".github/workflows/publish.yml",
"chars": 2270,
"preview": "name: Publish\n\non:\n push:\n branches-ignore: [\n # Renovate branches are always PRs, so they will be covered\n "
},
{
"path": ".github/workflows/shaders.yml",
"chars": 3185,
"preview": "name: Shaders\n\non:\n push:\n branches-ignore: [\n # Renovate branches are always PRs, so they will be covered\n "
},
{
"path": ".gitignore",
"chars": 1143,
"preview": "# Jujutsu\n#\n# When using the wgpu repository through [Jujutsu](https://github.com/martinvonz/jj), `.jj/` dirs.\n# are ign"
},
{
"path": ".prettierignore",
"chars": 51,
"preview": "**/*.frag\n**/*.vert\nnaga/tests/in/\nnaga/tests/out/\n"
},
{
"path": "AGENTS.md",
"chars": 8571,
"preview": "# Global instructions\n\n## Code Style\n- Limit the amount of comments you put in the code to a strict minimum. You should "
},
{
"path": "CHANGELOG.md",
"chars": 318192,
"preview": "# Change Log\n\n<!--\nPlease add your PR to the changelog! Choose from a top level and bottom\nlevel category, then write yo"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 5070,
"preview": "# Code of Conduct\n\n_This Code of Conduct is based on the [Rust Code of Conduct](https://www.rust-lang.org/policies/code-"
},
{
"path": "CONTRIBUTING.md",
"chars": 11886,
"preview": "This document is a guide for contributions to the wgpu project.\n\n## Welcome!\n\nFirst of all, welcome to the wgpu communit"
},
{
"path": "Cargo.toml",
"chars": 9688,
"preview": "[workspace]\nresolver = \"2\"\nmembers = [\n \"cts_runner\",\n \"deno_webgpu\",\n\n # default members\n \"benches\",\n \"e"
},
{
"path": "GOVERNANCE.md",
"chars": 2377,
"preview": "The **wgpu project** is a set of open-source libraries that _enables application\nauthors to write portable and performan"
},
{
"path": "LICENSE.APACHE",
"chars": 10173,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "LICENSE.MIT",
"chars": 1078,
"preview": "MIT License\n\nCopyright (c) 2025 The gfx-rs developers\n\nPermission is hereby granted, free of charge, to any person obtai"
},
{
"path": "README.md",
"chars": 9199,
"preview": "# wgpu\n<img align=\"right\" width=\"20%\" src=\"logo.png\">\n\n[ @binding(0)\nvar tex: binding_array<texture_2d<f32>>;\n\n@group(0) @binding(1)\n// TODO(https://github.com/gfx-rs/"
},
{
"path": "benches/benches/wgpu-benchmark/computepass.rs",
"chars": 22469,
"preview": "use std::{\n num::{NonZeroU32, NonZeroU64},\n time::{Duration, Instant},\n};\n\nuse nanorand::{Rng, WyRand};\nuse rayon:"
},
{
"path": "benches/benches/wgpu-benchmark/computepass.wgsl",
"chars": 728,
"preview": "@group(0) @binding(0)\nvar tex_0: texture_2d<f32>;\n\n@group(0) @binding(1)\nvar tex_1: texture_2d<f32>;\n\n@group(0) @binding"
},
{
"path": "benches/benches/wgpu-benchmark/main.rs",
"chars": 2693,
"preview": "#![cfg_attr(target_arch = \"wasm32\", no_main)]\n#![cfg(not(target_arch = \"wasm32\"))]\nuse pollster::block_on;\nuse wgpu_benc"
},
{
"path": "benches/benches/wgpu-benchmark/renderpass-bindless.wgsl",
"chars": 941,
"preview": "@group(0) @binding(0)\nvar tex: binding_array<texture_2d<f32>>;\n\nstruct VertexOutput {\n @builtin(position) position: v"
},
{
"path": "benches/benches/wgpu-benchmark/renderpass.rs",
"chars": 20434,
"preview": "use std::{\n num::NonZeroU32,\n time::{Duration, Instant},\n};\n\nuse nanorand::{Rng, WyRand};\nuse rayon::iter::{IntoPa"
},
{
"path": "benches/benches/wgpu-benchmark/renderpass.wgsl",
"chars": 813,
"preview": "@group(0) @binding(0)\nvar tex_1: texture_2d<f32>;\n\n@group(0) @binding(1)\nvar tex_2: texture_2d<f32>;\n\n@group(0) @binding"
},
{
"path": "benches/benches/wgpu-benchmark/resource_creation.rs",
"chars": 1892,
"preview": "use std::time::Instant;\n\nuse rayon::iter::{IntoParallelIterator, ParallelIterator};\nuse wgpu_benchmark::{iter, Benchmark"
},
{
"path": "benches/benches/wgpu-benchmark/shader.rs",
"chars": 15751,
"preview": "use std::{fs, process::Command};\nuse wgpu_benchmark::{iter_auto, BenchmarkContext, SubBenchResult};\n\nconst DIR_IN: &str "
},
{
"path": "benches/src/context.rs",
"chars": 748,
"preview": "use std::time::Duration;\n\n#[derive(Clone, Copy)]\npub enum LoopControl {\n Iterations(u32),\n Time(Duration),\n}\n\nimpl"
},
{
"path": "benches/src/file.rs",
"chars": 980,
"preview": "use anyhow::Context as _;\n\nuse crate::BenchmarkFile;\n\nconst FILE_PREFIX: &str = concat!(env!(\"CARGO_MANIFEST_DIR\"), \"/.."
},
{
"path": "benches/src/iter.rs",
"chars": 2654,
"preview": "use std::time::Duration;\n\nuse crate::{BenchmarkContext, LoopControl, SubBenchResult};\n\npub fn iter(\n ctx: &BenchmarkC"
},
{
"path": "benches/src/lib.rs",
"chars": 8463,
"preview": "#![cfg(not(target_arch = \"wasm32\"))]\n#![expect(clippy::disallowed_types)] // We're outside of the main wgpu codebase\n\n//"
},
{
"path": "benches/src/print.rs",
"chars": 6307,
"preview": "use std::collections::HashMap;\nuse std::io::Write;\n\nuse termcolor::{Color, ColorSpec, StandardStream, WriteColor};\n\nuse "
},
{
"path": "clippy.toml",
"chars": 432,
"preview": "# NOTE: Other global Clippy config (severity overrides) is in top-level Cargo.toml.\n\ndisallowed-types = [\n { path = \""
},
{
"path": "codecov.yml",
"chars": 243,
"preview": "coverage:\n status:\n project:\n default:\n informational: true\n if_ci_failed: success\n patch:\n "
},
{
"path": "cts_runner/Cargo.toml",
"chars": 775,
"preview": "[package]\nname = \"cts_runner\"\nversion.workspace = true\nauthors = [\"Luca Casonato <hello@lcas.dev>\"]\nedition.workspace = "
},
{
"path": "cts_runner/README.md",
"chars": 727,
"preview": "# cts_runner\n\nThis crate contains infrastructure for running the WebGPU conformance tests on\nDeno's `wgpu`-based impleme"
},
{
"path": "cts_runner/examples/hello-compute.js",
"chars": 3180,
"preview": "const adapter = await navigator.gpu.requestAdapter();\n\nconst numbers = [1, 4, 3, 295];\n\nconst device = await adapter.req"
},
{
"path": "cts_runner/fail.lst",
"chars": 19216,
"preview": "// CTS test selectors that are not expected to pass.\n//\n// At present this only includes tests in the `api,validation` a"
},
{
"path": "cts_runner/revision.txt",
"chars": 41,
"preview": "e9adcf85f5d3698da4dbd7d0e2de0ef0350c3d90\n"
},
{
"path": "cts_runner/skip.lst",
"chars": 1851,
"preview": "// CTS test selectors that are entirely or nearly entirely skipped.\n//\n// The `cts_runner` integration test `lst_files_a"
},
{
"path": "cts_runner/src/bootstrap.js",
"chars": 11572,
"preview": "// Adapted from https://github.com/denoland/deno/blob/6abf126c2a7a451cded8c6b5e6ddf1b69c84055d/runtime/js/99_main.js\n\n//"
},
{
"path": "cts_runner/src/main.rs",
"chars": 5659,
"preview": "#![cfg_attr(target_arch = \"wasm32\", no_main)]\n#![cfg(not(target_arch = \"wasm32\"))]\n\nuse std::sync::Arc;\nuse std::{\n e"
},
{
"path": "cts_runner/test.lst",
"chars": 35143,
"preview": "// CTS test selectors that are expected to pass. These are run in CI.\n//\n// The following may be useful to generate list"
},
{
"path": "cts_runner/tests/integration.rs",
"chars": 6605,
"preview": "use std::{\n ffi::OsStr,\n fs,\n io::Write,\n path::PathBuf,\n process::{Command, Output},\n str,\n};\n\nuse te"
},
{
"path": "deno_webgpu/00_init.js",
"chars": 194,
"preview": "// Copyright 2018-2025 the Deno authors. MIT license.\n\nimport { core } from \"ext:core/mod.js\";\n\nconst loadWebGPU = core."
},
{
"path": "deno_webgpu/01_webgpu.js",
"chars": 23252,
"preview": "// Copyright 2018-2025 the Deno authors. MIT license.\n\n// @ts-check\n/// <reference path=\"../../core/lib.deno_core.d.ts\" "
},
{
"path": "deno_webgpu/02_surface.js",
"chars": 1058,
"preview": "// Copyright 2018-2025 the Deno authors. MIT license.\n\n// @ts-check\n/// <reference path=\"../../core/lib.deno_core.d.ts\" "
},
{
"path": "deno_webgpu/Cargo.toml",
"chars": 1474,
"preview": "# Copyright 2018-2025 the Deno authors. MIT license.\n\n[package]\nname = \"deno_webgpu\"\nversion = \"0.181.0\"\nauthors = [\"the"
},
{
"path": "deno_webgpu/LICENSE.md",
"chars": 1074,
"preview": "MIT License\n\nCopyright 2018-2024 the Deno authors\n\nPermission is hereby granted, free of charge, to any person obtaining"
},
{
"path": "deno_webgpu/README.md",
"chars": 1553,
"preview": "# deno_webgpu\n\nThis op crate implements the WebGPU API as defined in\nhttps://gpuweb.github.io/gpuweb/ in Deno. The imple"
},
{
"path": "deno_webgpu/adapter.rs",
"chars": 14792,
"preview": "// Copyright 2018-2025 the Deno authors. MIT license.\n\nuse std::ops::BitOr;\nuse std::rc::Rc;\n\nuse deno_core::cppgc::Same"
},
{
"path": "deno_webgpu/bind_group.rs",
"chars": 3760,
"preview": "// Copyright 2018-2025 the Deno authors. MIT license.\n\nuse std::borrow::Cow;\n\nuse deno_core::cppgc::Ptr;\nuse deno_core::"
},
{
"path": "deno_webgpu/bind_group_layout.rs",
"chars": 5072,
"preview": "// Copyright 2018-2025 the Deno authors. MIT license.\n\nuse deno_core::op2;\nuse deno_core::GarbageCollected;\nuse deno_cor"
},
{
"path": "deno_webgpu/buffer.rs",
"chars": 6674,
"preview": "// Copyright 2018-2025 the Deno authors. MIT license.\n\nuse std::cell::RefCell;\nuse std::rc::Rc;\nuse std::time::Duration;"
},
{
"path": "deno_webgpu/byow.rs",
"chars": 10373,
"preview": "// Copyright 2018-2025 the Deno authors. MIT license.\n\nuse std::cell::RefCell;\nuse std::ffi::c_void;\n#[cfg(any(\n target"
},
{
"path": "deno_webgpu/command_buffer.rs",
"chars": 1234,
"preview": "// Copyright 2018-2025 the Deno authors. MIT license.\n\nuse deno_core::op2;\nuse deno_core::GarbageCollected;\nuse deno_cor"
},
{
"path": "deno_webgpu/command_encoder.rs",
"chars": 13672,
"preview": "// Copyright 2018-2025 the Deno authors. MIT license.\n\nuse std::borrow::Cow;\nuse std::cell::RefCell;\nuse std::num::NonZe"
},
{
"path": "deno_webgpu/compute_pass.rs",
"chars": 6452,
"preview": "// Copyright 2018-2025 the Deno authors. MIT license.\n\nuse std::borrow::Cow;\nuse std::cell::RefCell;\n\nuse deno_core::cpp"
},
{
"path": "deno_webgpu/compute_pipeline.rs",
"chars": 2271,
"preview": "// Copyright 2018-2025 the Deno authors. MIT license.\n\nuse deno_core::cppgc::Ptr;\nuse deno_core::op2;\nuse deno_core::web"
},
{
"path": "deno_webgpu/device.rs",
"chars": 30624,
"preview": "// Copyright 2018-2025 the Deno authors. MIT license.\n\nuse std::borrow::Cow;\nuse std::cell::RefCell;\nuse std::num::NonZe"
},
{
"path": "deno_webgpu/error.rs",
"chars": 11522,
"preview": "// Copyright 2018-2025 the Deno authors. MIT license.\n\nuse std::fmt::Display;\nuse std::fmt::Formatter;\nuse std::sync::Mu"
},
{
"path": "deno_webgpu/lib.rs",
"chars": 8275,
"preview": "// Copyright 2018-2025 the Deno authors. MIT license.\n#![cfg(not(target_arch = \"wasm32\"))]\n#![warn(unsafe_op_in_unsafe_f"
},
{
"path": "deno_webgpu/pipeline_layout.rs",
"chars": 1432,
"preview": "// Copyright 2018-2025 the Deno authors. MIT license.\n\nuse deno_core::cppgc::Ptr;\nuse deno_core::op2;\nuse deno_core::web"
},
{
"path": "deno_webgpu/query_set.rs",
"chars": 2162,
"preview": "// Copyright 2018-2025 the Deno authors. MIT license.\n\nuse deno_core::op2;\nuse deno_core::webidl::WebIdlInterfaceConvert"
},
{
"path": "deno_webgpu/queue.rs",
"chars": 5164,
"preview": "// Copyright 2018-2025 the Deno authors. MIT license.\n\nuse std::cell::RefCell;\nuse std::rc::Rc;\nuse std::time::Duration;"
},
{
"path": "deno_webgpu/render_bundle.rs",
"chars": 12623,
"preview": "// Copyright 2018-2025 the Deno authors. MIT license.\n\nuse std::borrow::Cow;\nuse std::cell::RefCell;\nuse std::num::NonZe"
},
{
"path": "deno_webgpu/render_pass.rs",
"chars": 14918,
"preview": "// Copyright 2018-2025 the Deno authors. MIT license.\n\nuse std::borrow::Cow;\nuse std::cell::RefCell;\nuse std::num::NonZe"
},
{
"path": "deno_webgpu/render_pipeline.rs",
"chars": 15342,
"preview": "// Copyright 2018-2025 the Deno authors. MIT license.\n\nuse deno_core::cppgc::Ptr;\nuse deno_core::op2;\nuse deno_core::web"
},
{
"path": "deno_webgpu/rustfmt.toml",
"chars": 47,
"preview": "max_width = 80\ntab_spaces = 2\nedition = \"2021\"\n"
},
{
"path": "deno_webgpu/sampler.rs",
"chars": 3724,
"preview": "// Copyright 2018-2025 the Deno authors. MIT license.\n\nuse deno_core::op2;\nuse deno_core::webidl::WebIdlInterfaceConvert"
},
{
"path": "deno_webgpu/shader.rs",
"chars": 5044,
"preview": "// Copyright 2018-2025 the Deno authors. MIT license.\n\nuse deno_core::cppgc::make_cppgc_object;\nuse deno_core::op2;\nuse "
},
{
"path": "deno_webgpu/surface.rs",
"chars": 6935,
"preview": "// Copyright 2018-2025 the Deno authors. MIT license.\n\nuse std::cell::RefCell;\n\nuse deno_core::GarbageCollected;\nuse den"
},
{
"path": "deno_webgpu/texture.rs",
"chars": 21337,
"preview": "// Copyright 2018-2025 the Deno authors. MIT license.\n\nuse std::sync::OnceLock;\n\nuse deno_core::op2;\nuse deno_core::webi"
},
{
"path": "deno_webgpu/webidl.rs",
"chars": 13223,
"preview": "// Copyright 2018-2025 the Deno authors. MIT license.\n\nuse std::borrow::Cow;\n\nuse deno_core::cppgc::Ptr;\nuse deno_core::"
},
{
"path": "docs/api-specs/cooperative_matrix.md",
"chars": 15551,
"preview": "# Cooperative Matrix Extensions\n\n🧪Experimental🧪\n\n`wgpu` supports an experimental cooperative matrix feature when `Featur"
},
{
"path": "docs/api-specs/mesh_shading.md",
"chars": 17736,
"preview": "# Mesh Shader Extensions\n\n🧪Experimental🧪\n\n`wgpu` supports an experimental version of mesh shading when `Features::EXPERI"
},
{
"path": "docs/api-specs/ray_tracing.md",
"chars": 15937,
"preview": "# Ray Tracing Extensions\n\n🧪Experimental🧪\n\n`wgpu` supports an experimental version of ray tracing which is subject to cha"
},
{
"path": "docs/big-picture.xml",
"chars": 4856,
"preview": "<mxfile host=\"app.diagrams.net\" modified=\"2023-12-04T19:38:59.956Z\" agent=\"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:"
},
{
"path": "docs/broadcast_license.nu",
"chars": 576,
"preview": "# Quick maintenance script which broadcasts the license files to all crates\n# that are released on crates.io\n\n# Change t"
},
{
"path": "docs/release-checklist.md",
"chars": 5173,
"preview": "This is an overview of how to run wgpu releases.\n\n## Structure\n\nWe do a major breaking release every 12 weeks. This happ"
},
{
"path": "docs/review-checklist.md",
"chars": 2913,
"preview": "# Review Checklist\n\nThis is a collection of notes on things to watch out for when\nreviewing pull requests submitted to w"
},
{
"path": "docs/testing.md",
"chars": 9807,
"preview": "# Testing in `wgpu` and `naga`\n\nThere exist a large variety of tests within the `wgpu` repository\nto make sure we can ea"
},
{
"path": "examples/README.md",
"chars": 7726,
"preview": "> [!NOTE] \n> These are the examples for the development version of wgpu. If you want to see the examples for the latest"
},
{
"path": "examples/bug-repro/01_texture_atomic_bug/Cargo.toml",
"chars": 197,
"preview": "[package]\nname = \"wgpu-bug-repro-01-texture-atomic-bug\"\nedition = \"2021\"\nrust-version = \"1.87\"\npublish = false\n\n[depende"
},
{
"path": "examples/bug-repro/01_texture_atomic_bug/src/main.rs",
"chars": 12221,
"preview": "//! Repro for Metal driver bug where fragment shader texture atomic writes randomly drop unless\n//! a compute pass with "
},
{
"path": "examples/bug-repro/01_texture_atomic_bug/src/shader.wgsl",
"chars": 1006,
"preview": "@group(0) @binding(0)\nvar tex: texture_storage_2d<r32uint, atomic>;\n\n@compute @workgroup_size(8, 8, 1)\nfn clear(@builtin"
},
{
"path": "examples/features/Cargo.toml",
"chars": 2031,
"preview": "[package]\nname = \"wgpu-examples\"\nversion.workspace = true\nauthors.workspace = true\nedition.workspace = true\ndescription "
},
{
"path": "examples/features/src/big_compute_buffers/README.md",
"chars": 2091,
"preview": "# big-compute-buffers\n\n*NOTE: `binding_array` is Vulkan only.*\n\nThis example assumes you're familiar with the other GP-G"
},
{
"path": "examples/features/src/big_compute_buffers/mod.rs",
"chars": 8060,
"preview": "//! This example shows you a potential course for when your 'data' is too large\n//! for a single Buffer.\n//!\n//! A lot o"
},
{
"path": "examples/features/src/big_compute_buffers/shader.wgsl",
"chars": 950,
"preview": "const OFFSET: u32 = 1u << 8u;\nconst BUFFER_MAX_ELEMENTS: u32 = 1u << 25u; // Think `buffer.len()`\nconst NUM_BUFFERS: u32"
},
{
"path": "examples/features/src/big_compute_buffers/tests.rs",
"chars": 1823,
"preview": "use super::*;\nuse wgpu_test::{gpu_test, GpuTestConfiguration, TestParameters};\n\n#[gpu_test]\npub static TWO_BUFFERS: GpuT"
},
{
"path": "examples/features/src/boids/README.md",
"chars": 169,
"preview": "# boids\n\nFlocking boids example with gpu compute update pass\n\n## To Run\n\n```\ncargo run --bin wgpu-examples boids\n```\n\n##"
},
{
"path": "examples/features/src/boids/compute.wgsl",
"chars": 2291,
"preview": "struct Particle {\n pos : vec2<f32>,\n vel : vec2<f32>,\n};\n\nstruct SimParams {\n deltaT : f32,\n rule1Distance : f32,\n "
},
{
"path": "examples/features/src/boids/draw.wgsl",
"chars": 533,
"preview": "@vertex\nfn main_vs(\n @location(0) particle_pos: vec2<f32>,\n @location(1) particle_vel: vec2<f32>,\n @location(2)"
},
{
"path": "examples/features/src/boids/mod.rs",
"chars": 13303,
"preview": "// Flocking boids example with gpu compute update pass\n// adapted from https://github.com/austinEng/webgpu-samples/blob/"
},
{
"path": "examples/features/src/bunnymark/README.md",
"chars": 129,
"preview": "# bunnymark\n\n\n## To Run\n\n```\ncargo run --bin wgpu-examples bunnymark\n```\n\n## Example output\n\n vertex_index: u32) -> @builtin(position) vec4<f32> {\n let i: i32 = i32(vert"
},
{
"path": "examples/features/src/conservative_raster/upscale.wgsl",
"chars": 703,
"preview": "struct VertexOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) tex_coords: vec2<f32>,\n};\n\n@vertex\nfn"
},
{
"path": "examples/features/src/cooperative_matrix/README.md",
"chars": 1391,
"preview": "# Cooperative Matrix Multiplication\n\nThis example demonstrates how to use cooperative matrix operations (also known as t"
},
{
"path": "examples/features/src/cooperative_matrix/mod.rs",
"chars": 16378,
"preview": "//! Cooperative Matrix Multiplication Example\n//!\n//! This example demonstrates how to use cooperative matrix operations"
},
{
"path": "examples/features/src/cooperative_matrix/shader.wgsl",
"chars": 1992,
"preview": "// Cooperative Matrix Multiplication Example\n//\n// This shader demonstrates using cooperative matrix operations to perfo"
},
{
"path": "examples/features/src/cooperative_matrix/shader_f16_16x16.wgsl",
"chars": 2300,
"preview": "// Cooperative Matrix Multiplication Example (16x16 f16 variant)\n//\n// This shader demonstrates using cooperative matrix"
},
{
"path": "examples/features/src/cooperative_matrix/tests.rs",
"chars": 1420,
"preview": "use super::*;\nuse wgpu_test::{gpu_test, GpuTestConfiguration, TestParameters};\n\n#[gpu_test]\npub static COOPERATIVE_MATRI"
},
{
"path": "examples/features/src/cube/README.md",
"chars": 152,
"preview": "# cube\n\nThis example renders a textured cube.\n\n## To Run\n\n```\ncargo run --bin wgpu-examples cube\n```\n\n## Screenshots\n\n!["
},
{
"path": "examples/features/src/cube/mod.rs",
"chars": 14990,
"preview": "use bytemuck::{Pod, Zeroable};\nuse std::f32::consts;\nuse wgpu::util::DeviceExt;\n\n#[repr(C)]\n#[derive(Clone, Copy, Pod, Z"
},
{
"path": "examples/features/src/cube/shader.wgsl",
"chars": 846,
"preview": "struct VertexOutput {\n @location(0) tex_coord: vec2<f32>,\n @builtin(position) position: vec4<f32>,\n};\n\n@group(0)\n@"
},
{
"path": "examples/features/src/framework.rs",
"chars": 26880,
"preview": "use std::future::Future;\nuse std::sync::Arc;\n\nuse wgpu::{Instance, Surface};\nuse winit::{\n application::ApplicationHa"
},
{
"path": "examples/features/src/hello_synchronization/README.md",
"chars": 3118,
"preview": "# hello_synchronization\n\nThis example is \n1. A small demonstration of the importance of synchronization.\n2. How basic sy"
},
{
"path": "examples/features/src/hello_synchronization/mod.rs",
"chars": 7182,
"preview": "const ARR_SIZE: usize = 128;\n\nstruct ExecuteResults {\n patient_workgroup_results: Vec<u32>,\n hasty_workgroup_resul"
},
{
"path": "examples/features/src/hello_synchronization/shaders.wgsl",
"chars": 670,
"preview": "@group(0)\n@binding(0)\nvar<storage, read_write> output: array<u32>;\n\nvar<workgroup> count: atomic<u32>;\n\n@compute\n@workgr"
},
{
"path": "examples/features/src/hello_synchronization/tests.rs",
"chars": 664,
"preview": "use super::*;\nuse wgpu_test::{gpu_test, GpuTestConfiguration, TestParameters};\n\n#[gpu_test]\npub static SYNC: GpuTestConf"
},
{
"path": "examples/features/src/hello_triangle/README.md",
"chars": 182,
"preview": "# hello_triangle\n\nThis example renders a triangle to a window.\n\n## To Run\n\n```\ncargo run --bin wgpu-examples hello_trian"
},
{
"path": "examples/features/src/hello_triangle/mod.rs",
"chars": 12202,
"preview": "use std::{borrow::Cow, future::Future, sync::Arc};\nuse wgpu::CurrentSurfaceTexture;\nuse winit::{\n application::Applic"
},
{
"path": "examples/features/src/hello_triangle/shader.wgsl",
"chars": 329,
"preview": "@vertex\nfn vs_main(@builtin(vertex_index) in_vertex_index: u32) -> @builtin(position) vec4<f32> {\n let x = f32(i32(in"
},
{
"path": "examples/features/src/hello_windows/README.md",
"chars": 210,
"preview": "# hello_windows\n\nThis example renders a set of 16 windows, with a differently colored background\n\n## To Run\n\n```\ncargo r"
},
{
"path": "examples/features/src/hello_windows/mod.rs",
"chars": 10134,
"preview": "#![cfg_attr(target_arch = \"wasm32\", allow(dead_code, unused_imports))]\n\nuse std::{collections::HashMap, sync::Arc};\nuse "
},
{
"path": "examples/features/src/hello_workgroups/README.md",
"chars": 7706,
"preview": "# hello_workgroups\n\nNow you finally know what that silly little `@workgroup_size(1)` means!\n\nThis example is an extremel"
},
{
"path": "examples/features/src/hello_workgroups/mod.rs",
"chars": 6810,
"preview": "//! This example assumes that you've seen hello-compute and or repeated-compute\n//! and thus have a general understandin"
},
{
"path": "examples/features/src/hello_workgroups/shader.wgsl",
"chars": 647,
"preview": "// This is useful because we can't use, say, vec2<array<i32>> because\n// of array<T> being unsized. Normally we would in"
},
{
"path": "examples/features/src/lib.rs",
"chars": 2416,
"preview": "#![allow(clippy::arc_with_non_send_sync)] // False positive on wasm\n#![warn(clippy::allow_attributes)]\n\npub mod framewor"
},
{
"path": "examples/features/src/main.rs",
"chars": 8418,
"preview": "struct ExampleDesc {\n name: &'static str,\n function: fn(),\n #[cfg_attr(not(target_arch = \"wasm32\"), expect(dead"
},
{
"path": "examples/features/src/mesh_shader/README.md",
"chars": 235,
"preview": "# mesh_shader\n\nThis example renders a triangle to a window with mesh shaders, while showcasing most mesh shader related "
},
{
"path": "examples/features/src/mesh_shader/mod.rs",
"chars": 8266,
"preview": "// Same as in mesh shader tests\nfn compile_wgsl(device: &wgpu::Device) -> wgpu::ShaderModule {\n // Workgroup memory z"
},
{
"path": "examples/features/src/mesh_shader/shader.hlsl",
"chars": 1603,
"preview": "struct OutVertex {\n float4 Position : SV_POSITION;\n float4 Color: COLOR;\n};\nstruct OutPrimitive {\n float4 Color"
},
{
"path": "examples/features/src/mesh_shader/shader.metal",
"chars": 1729,
"preview": "using namespace metal;\n\nstruct OutVertex {\n float4 Position [[position]];\n float4 Color [[user(locn0)]];\n};\n\nstruc"
},
{
"path": "examples/features/src/mesh_shader/shader.wgsl",
"chars": 2214,
"preview": "enable wgpu_mesh_shader;\n\nconst positions = array(\n vec4(0., 1., 0., 1.),\n vec4(-1., -1., 0., 1.),\n vec4(1., -1"
},
{
"path": "examples/features/src/mipmap/README.md",
"chars": 174,
"preview": "# mipmap\n\nThis example shows how to generate and make use of mipmaps.\n\n## To Run\n\n```\ncargo run --bin wgpu-examples mipm"
},
{
"path": "examples/features/src/mipmap/blit.wgsl",
"chars": 1250,
"preview": "struct VertexOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) tex_coords: vec2<f32>,\n};\n\n// meant t"
},
{
"path": "examples/features/src/mipmap/draw.wgsl",
"chars": 821,
"preview": "struct VertexOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) tex_coords: vec2<f32>,\n};\n\nstruct Loc"
},
{
"path": "examples/features/src/mipmap/mod.rs",
"chars": 20679,
"preview": "use bytemuck::{Pod, Zeroable};\nuse std::f32::consts;\nuse wgpu::util::DeviceExt;\n\nconst TEXTURE_FORMAT: wgpu::TextureForm"
},
{
"path": "examples/features/src/msaa_line/README.md",
"chars": 172,
"preview": "# msaa_line\n\nThis example shows how to render lines using MSAA.\n\n## To Run\n\n```\ncargo run --bin wgpu-examples msaa_line\n"
},
{
"path": "examples/features/src/msaa_line/mod.rs",
"chars": 11926,
"preview": "//! The parts of this example enabling MSAA are:\n//! * The render pipeline is created with a sample_count > 1.\n//! * "
},
{
"path": "examples/features/src/msaa_line/shader.wgsl",
"chars": 447,
"preview": "struct VertexOutput {\n @location(0) color: vec4<f32>,\n @builtin(position) position: vec4<f32>,\n};\n\n@vertex\nfn vs_m"
},
{
"path": "examples/features/src/multiple_render_targets/README.md",
"chars": 728,
"preview": "# multiple_render_targets\n\nThis example demonstrates how to use fragment shader to output to two color attachments of a "
},
{
"path": "examples/features/src/multiple_render_targets/mod.rs",
"chars": 19432,
"preview": "const EXAMPLE_NAME: &str = \"multiple_render_targets\";\n\n/// Renderer that draws its outputs to two output texture targets"
},
{
"path": "examples/features/src/multiple_render_targets/shader.wgsl",
"chars": 1097,
"preview": "struct VertexOutput {\n @builtin(position) clip_position: vec4<f32>,\n @location(0) uv: vec2<f32>,\n};\n\n@vertex\nfn vs"
},
{
"path": "examples/features/src/multiview/mod.rs",
"chars": 6369,
"preview": "//! Renders different content to different layers of an array texture using multiview,\n//! a feature commonly used for V"
},
{
"path": "examples/features/src/multiview/shader.wgsl",
"chars": 436,
"preview": "const triangles = array<vec2f, 3>(vec2f(-1.0, -1.0), vec2f(3.0, -1.0), vec2f(-1.0, 3.0));\n\n@vertex\nfn vs_main(@builtin(v"
},
{
"path": "examples/features/src/ray_cube_compute/README.md",
"chars": 258,
"preview": "# ray-cube\n\nThis example renders a ray traced cube with hardware acceleration.\nA separate compute shader is used to perf"
},
{
"path": "examples/features/src/ray_cube_compute/blit.wgsl",
"chars": 1250,
"preview": "struct VertexOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) tex_coords: vec2<f32>,\n};\n\n// meant t"
},
{
"path": "examples/features/src/ray_cube_compute/mod.rs",
"chars": 16035,
"preview": "use std::{borrow::Cow, iter, mem};\n\nuse bytemuck::{Pod, Zeroable};\nuse glam::{Affine3A, Mat4, Quat, Vec3};\nuse wgpu::uti"
},
{
"path": "examples/features/src/ray_cube_compute/shader.wgsl",
"chars": 2393,
"preview": "/*\nThe contents of the RayQuery struct are roughly as follows\nlet RAY_FLAG_NONE = 0x00u;\nlet RAY_FLAG_OPAQUE = 0x01u;\nle"
},
{
"path": "examples/features/src/ray_cube_fragment/README.md",
"chars": 196,
"preview": "# ray-cube\n\nThis example renders a ray traced cube with hardware acceleration.\n\n## To Run\n\n```\ncargo run --bin wgpu-exam"
},
{
"path": "examples/features/src/ray_cube_fragment/mod.rs",
"chars": 12206,
"preview": "use crate::utils;\nuse bytemuck::{Pod, Zeroable};\nuse glam::{Mat4, Quat, Vec3};\nuse std::ops::IndexMut;\nuse std::{borrow:"
},
{
"path": "examples/features/src/ray_cube_fragment/shader.wgsl",
"chars": 2030,
"preview": "enable wgpu_ray_query;\n\nstruct VertexOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) tex_coords: v"
},
{
"path": "examples/features/src/ray_cube_normals/README.md",
"chars": 258,
"preview": "# ray-cube\n\nThis example renders a ray traced cube with hardware acceleration.\nA separate compute shader is used to perf"
},
{
"path": "examples/features/src/ray_cube_normals/blit.wgsl",
"chars": 1250,
"preview": "struct VertexOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) tex_coords: vec2<f32>,\n};\n\n// meant t"
},
{
"path": "examples/features/src/ray_cube_normals/mod.rs",
"chars": 16017,
"preview": "use std::{borrow::Cow, iter, mem};\n\nuse bytemuck::{Pod, Zeroable};\nuse glam::{Affine3A, Mat4, Quat, Vec3};\nuse wgpu::uti"
},
{
"path": "examples/features/src/ray_cube_normals/shader.wgsl",
"chars": 2720,
"preview": "/*\nlet RAY_FLAG_NONE = 0x00u;\nlet RAY_FLAG_OPAQUE = 0x01u;\nlet RAY_FLAG_NO_OPAQUE = 0x02u;\nlet RAY_FLAG_TERMINATE_ON_FIR"
},
{
"path": "examples/features/src/ray_scene/cube.mtl",
"chars": 306,
"preview": "# Blender MTL File: 'None'\n# Material Count: 2\n\nnewmtl Material\nNs 250.000000\nKa 1.000000 1.000000 1.000000\nKd 0.000000 "
},
{
"path": "examples/features/src/ray_scene/cube.obj",
"chars": 75949,
"preview": "# Blender v3.3.1 OBJ File: ''\n# www.blender.org\nmtllib cube.mtl\no Cube\nv 1.000000 1.000000 -1.000000\nv 1.000000 -1.00000"
},
{
"path": "examples/features/src/ray_scene/mod.rs",
"chars": 18258,
"preview": "use crate::utils;\nuse bytemuck::{Pod, Zeroable};\nuse glam::{Mat4, Quat, Vec3};\nuse std::f32::consts::PI;\nuse std::ops::I"
},
{
"path": "examples/features/src/ray_scene/shader.wgsl",
"chars": 4295,
"preview": "enable wgpu_ray_query;\n\nstruct VertexOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) tex_coords: v"
},
{
"path": "examples/features/src/ray_shadows/README.md",
"chars": 197,
"preview": "# ray-shadows\n\nThis example renders a ray traced shadow with hardware acceleration.\n\n## To Run\n\n```\ncargo run --bin wgpu"
},
{
"path": "examples/features/src/ray_shadows/mod.rs",
"chars": 12473,
"preview": "use std::{borrow::Cow, iter, mem};\n\nuse bytemuck::{Pod, Zeroable};\nuse glam::{Mat4, Vec3};\nuse wgpu::util::DeviceExt;\nus"
},
{
"path": "examples/features/src/ray_shadows/shader.wgsl",
"chars": 2080,
"preview": "enable wgpu_ray_query;\n\nstruct VertexOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) tex_coords: v"
},
{
"path": "examples/features/src/ray_traced_triangle/README.md",
"chars": 268,
"preview": "# ray-traced-triangle\n\nThis example renders three triangles with hardware acceleration.\nThis is the same scene set-up as"
},
{
"path": "examples/features/src/ray_traced_triangle/blit.wgsl",
"chars": 1289,
"preview": "// same as ray_cube_compute/blit.wgsl\n\nstruct VertexOutput {\n @builtin(position) position: vec4<f32>,\n @location(0"
},
{
"path": "examples/features/src/ray_traced_triangle/mod.rs",
"chars": 15968,
"preview": "use glam::{Mat4, Vec3};\nuse std::mem;\nuse wgpu::util::{BufferInitDescriptor, DeviceExt};\nuse wgpu::{include_wgsl, Buffer"
},
{
"path": "examples/features/src/ray_traced_triangle/shader.wgsl",
"chars": 1353,
"preview": "// duplicate of hal's ray-traced triangle shader\n\nenable wgpu_ray_query;\n\nstruct Uniforms {\n view_inv: mat4x4<f32>,\n "
},
{
"path": "examples/features/src/render_to_texture/README.md",
"chars": 372,
"preview": "# render_to_texture\n\nSimilar to hello-triangle but instead of rendering to a window or canvas, renders to a texture that"
},
{
"path": "examples/features/src/render_to_texture/mod.rs",
"chars": 6341,
"preview": "#[cfg(not(target_arch = \"wasm32\"))]\nuse crate::utils::output_image_native;\n#[cfg(target_arch = \"wasm32\")]\nuse crate::uti"
},
{
"path": "examples/features/src/render_to_texture/shader.wgsl",
"chars": 400,
"preview": "@vertex\nfn vs_main(@builtin(vertex_index) in_vertex_index: u32) -> @builtin(position) vec4<f32> {\n var vertices = arr"
},
{
"path": "examples/features/src/render_with_compute/mod.rs",
"chars": 6871,
"preview": "//! This renders to the screen with compute shaders. Note that due to limitations in Firefox,\n//! the wait will cause FP"
},
{
"path": "examples/features/src/render_with_compute/shader.wgsl",
"chars": 5178,
"preview": "// This shader has gone through several stages of derived work:\n//\n// 1. Originally authored by a user named `dynamite`,"
},
{
"path": "examples/features/src/repeated_compute/README.md",
"chars": 3658,
"preview": "# repeated_compute\n\nRepeatedly performs the Collatz calculation used in `hello-compute` on sets of random numbers.\n\n## T"
},
{
"path": "examples/features/src/repeated_compute/mod.rs",
"chars": 10170,
"preview": "//! See hello-compute example main.rs for more details\n//! as similar items here are not explained.\n//!\n//! This example"
},
{
"path": "examples/features/src/repeated_compute/shader.wgsl",
"chars": 1140,
"preview": "@group(0)\n@binding(0)\nvar<storage, read_write> v_indices: array<u32>; // this is used as both input and output for conve"
},
{
"path": "examples/features/src/shadow/README.md",
"chars": 171,
"preview": "# shadow\n\nThis animated example demonstrates shadow mapping.\n\n## To Run\n\n```\ncargo run --bin wgpu-examples shadow\n```\n\n#"
},
{
"path": "examples/features/src/shadow/mod.rs",
"chars": 32353,
"preview": "use std::{f32::consts, iter, ops::Range};\n\nuse bytemuck::{Pod, Zeroable};\nuse wgpu::util::{align_to, DeviceExt};\n\n#[repr"
},
{
"path": "examples/features/src/shadow/shader.wgsl",
"chars": 3782,
"preview": "struct Globals {\n view_proj: mat4x4<f32>,\n num_lights: vec4<u32>,\n};\n\n@group(0)\n@binding(0)\nvar<uniform> u_globals"
},
{
"path": "examples/features/src/skybox/README.md",
"chars": 318,
"preview": "# skybox\n\nThis animated example demonstrates loading a Wavefront OBJ model, and rendering it with skybox and simple refl"
},
{
"path": "examples/features/src/skybox/images/generation.bash",
"chars": 1923,
"preview": "# Needs montage from ImageMagick in PATH\n# Needs compressonatorcli.exe from https://github.com/GPUOpen-Tools/compressona"
},
{
"path": "examples/features/src/skybox/mod.rs",
"chars": 19746,
"preview": "use bytemuck::{Pod, Zeroable};\nuse std::f32::consts;\nuse wgpu::{util::DeviceExt, AstcBlock, AstcChannel};\n\nconst IMAGE_S"
},
{
"path": "examples/features/src/skybox/models/rustacean-3d.mtl",
"chars": 796,
"preview": "# Blender MTL File: 'ferris.blend'\n# Material Count: 4\n\nnewmtl ferris_belly\nNs 96.078431\nKa 1.000000 1.000000 1.000000\nK"
}
]
// ... and 1964 more files (download for full content)
About this extraction
This page contains the full source code of the gfx-rs/wgpu GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2164 files (17.7 MB), approximately 4.0M tokens, and a symbol index with 9543 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.