Skip to content

Commit e114d2f

Browse files
authored
Add support for gaps in bind group layouts & update relevant validation (gfx-rs#9034)
* [wgpu-core] add support for optional BG & BGL entries * [wgpu] allow gaps in bind group layouts And allow unbinding in the web backend. * adapt tests * add changelog entry * [wgpu] remove generic from `PipelineLayoutDescriptor`
1 parent aad2a00 commit e114d2f

90 files changed

Lines changed: 569 additions & 399 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,25 @@ Bottom level categories:
4444

4545
### Major Changes
4646

47+
#### Bind group layouts now optional in `PipelineLayoutDescriptor`
48+
49+
Allow gaps in bind group layouts and added full support for unbinding. As a result of this `PipelineLayoutDescriptor`'s `bind_group_layouts` field now has type of `&[Option<&BindGroupLayout>]`, making this a breaking change. To migrate wrap bind group layout references in `Some`:
50+
51+
```diff
52+
let pl_desc = wgpu::PipelineLayoutDescriptor {
53+
label: None,
54+
bind_group_layouts: &[
55+
- &bind_group_layout
56+
+ Some(&bind_group_layout)
57+
],
58+
immediate_size: 0,
59+
});
60+
```
61+
62+
By @teoxoy in [#9034](https://github.com/gfx-rs/wgpu/pull/9034).
63+
64+
#### MSRV update
65+
4766
`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.
4867

4968
By @cwfitzgerald in [#8999](https://github.com/gfx-rs/wgpu/pull/8999).

benches/benches/wgpu-benchmark/computepass.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ impl ComputepassState {
250250
.device
251251
.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
252252
label: None,
253-
bind_group_layouts: &[&bind_group_layout],
253+
bind_group_layouts: &[Some(&bind_group_layout)],
254254
immediate_size: 0,
255255
});
256256

@@ -345,7 +345,7 @@ impl ComputepassState {
345345
.device
346346
.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
347347
label: None,
348-
bind_group_layouts: &[&bindless_bind_group_layout],
348+
bind_group_layouts: &[Some(&bindless_bind_group_layout)],
349349
immediate_size: 0,
350350
});
351351

benches/benches/wgpu-benchmark/renderpass.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ impl RenderpassState {
150150
.device
151151
.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
152152
label: None,
153-
bind_group_layouts: &[&bind_group_layout],
153+
bind_group_layouts: &[Some(&bind_group_layout)],
154154
immediate_size: 0,
155155
});
156156

@@ -286,7 +286,7 @@ impl RenderpassState {
286286
.device
287287
.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
288288
label: None,
289-
bind_group_layouts: &[&bindless_bind_group_layout],
289+
bind_group_layouts: &[Some(&bindless_bind_group_layout)],
290290
immediate_size: 0,
291291
});
292292

cts_runner/fail.lst

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ webgpu:api,validation,createBindGroupLayout:max_resources_per_stage,in_pipeline_
2727
webgpu:api,validation,createBindGroupLayout:visibility,VERTEX_shader_stage_buffer_type:* // 25%, writable storage buffers not allowed in VERTEX
2828
webgpu:api,validation,createBindGroupLayout:visibility,VERTEX_shader_stage_storage_texture_access:* // 25%, write-access storage textures not allowed in VERTEX
2929
webgpu:api,validation,createBindGroupLayout:visibility:* // 25%, missing per-stage storage limits
30-
webgpu:api,validation,createPipelineLayout:* // 33%, https://github.com/gfx-rs/wgpu/issues/4738, and at least 1 more issue
30+
webgpu:api,validation,createPipelineLayout:number_of_dynamic_buffers_exceeds_the_maximum_value:* // limits issue
3131
webgpu:api,validation,createView:texture_state:* // 0%, https://github.com/gfx-rs/wgpu/issues/7881
3232
webgpu:api,validation,encoding,cmds,copyTextureToTexture:copy_ranges:* // ***, https://github.com/gfx-rs/wgpu/issues/8118
3333
webgpu:api,validation,encoding,cmds,debug:* // 92%, https://github.com/gfx-rs/wgpu/issues/8039
@@ -40,13 +40,8 @@ webgpu:api,validation,encoding,cmds,setBindGroup:u32array_start_and_length:* //
4040
webgpu:api,validation,encoding,cmds,setImmediates:* // 0%, feature not implemented
4141
webgpu:api,validation,encoding,createRenderBundleEncoder:* // 26%, empty attachments, format compatibility
4242
webgpu:api,validation,encoding,encoder_open_state:* // https://github.com/gfx-rs/wgpu/issues/7857
43-
webgpu:api,validation,encoding,programmable,pipeline_bind_group_compat:default_bind_group_layouts_never_match,compute_pass:* // 75%, empty bind group layouts compatibility
44-
webgpu:api,validation,encoding,programmable,pipeline_bind_group_compat:default_bind_group_layouts_never_match,render_pass:* // 75%, empty bind group layouts compatibility
45-
webgpu:api,validation,encoding,programmable,pipeline_bind_group_compat:empty_bind_group_layouts_never_requires_empty_bind_groups,compute_pass:* // 17%, null bind groups, https://github.com/gfx-rs/wgpu/issues/4738
46-
webgpu:api,validation,encoding,programmable,pipeline_bind_group_compat:empty_bind_group_layouts_never_requires_empty_bind_groups,render_pass:* // 17%, null bind groups, https://github.com/gfx-rs/wgpu/issues/4738
4743
webgpu:api,validation,encoding,queries,resolveQuerySet:* // 93%, https://github.com/gfx-rs/wgpu/issues/7881
4844
webgpu:api,validation,encoding,render_bundle:* // 81%, readonly flag normalization mismatch
49-
webgpu:api,validation,getBindGroupLayout:* // 29%, rejects valid indices beyond defined layouts
5045
webgpu:api,validation,image_copy,buffer_texture_copies:* // https://github.com/gfx-rs/wgpu/issues/7946
5146
webgpu:api,validation,layout_shader_compat:pipeline_layout_shader_exact_match:* // 99%, storage texture read-write bindings not compatible with write-only shaders
5247
webgpu:api,validation,non_filterable_texture:non_filterable_texture_with_filtering_sampler:* // 80%, depth textures with filtering samplers

cts_runner/test.lst

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,11 @@ webgpu:api,validation,createBindGroupLayout:maximum_binding_limit:*
107107
webgpu:api,validation,createBindGroupLayout:multisampled_validation:*
108108
webgpu:api,validation,createBindGroupLayout:storage_texture,formats:*
109109
webgpu:api,validation,createBindGroupLayout:storage_texture,layout_dimension:*
110+
webgpu:api,validation,createPipelineLayout:bind_group_layouts,create_pipeline_with_null_bind_group_layouts:*
111+
webgpu:api,validation,createPipelineLayout:bind_group_layouts,device_mismatch:*
112+
webgpu:api,validation,createPipelineLayout:bind_group_layouts,null_bind_group_layouts:*
113+
webgpu:api,validation,createPipelineLayout:bind_group_layouts,set_pipeline_with_null_bind_group_layouts:*
114+
webgpu:api,validation,createPipelineLayout:number_of_bind_group_layouts_exceeds_the_maximum_value:*
110115
webgpu:api,validation,createSampler:*
111116
webgpu:api,validation,createTexture:*
112117
webgpu:api,validation,createView:array_layers:*
@@ -169,15 +174,11 @@ webgpu:api,validation,encoding,encoder_open_state:non_pass_commands:*
169174
// https://github.com/gfx-rs/wgpu/issues/7857
170175
webgpu:api,validation,encoding,encoder_open_state:render_pass_commands:*
171176
webgpu:api,validation,encoding,encoder_state:*
172-
webgpu:api,validation,encoding,programmable,pipeline_bind_group_compat:bgl_binding_mismatch:*
173-
webgpu:api,validation,encoding,programmable,pipeline_bind_group_compat:bgl_resource_type_mismatch:*
174-
webgpu:api,validation,encoding,programmable,pipeline_bind_group_compat:bgl_visibility_mismatch:*
175-
webgpu:api,validation,encoding,programmable,pipeline_bind_group_compat:bind_groups_and_pipeline_layout_mismatch:*
176-
webgpu:api,validation,encoding,programmable,pipeline_bind_group_compat:buffer_binding,render_pipeline:*
177-
webgpu:api,validation,encoding,programmable,pipeline_bind_group_compat:sampler_binding,render_pipeline:*
177+
webgpu:api,validation,encoding,programmable,pipeline_bind_group_compat:*
178178
webgpu:api,validation,encoding,queries,begin_end:occlusion_query,*
179179
webgpu:api,validation,encoding,queries,general:occlusion_query,*
180180
webgpu:api,validation,error_scope:*
181+
webgpu:api,validation,getBindGroupLayout:*
181182
webgpu:api,validation,image_copy,buffer_related:*
182183
// image_copy depth/stencil failures on dx12: https://github.com/gfx-rs/wgpu/issues/8133
183184
fails-if(dx12) webgpu:api,validation,image_copy,buffer_texture_copies:depth_stencil_format,copy_buffer_offset:format="depth24plus-stencil8";aspect="stencil-only";copyType="CopyB2T"

deno_webgpu/device.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,11 @@ impl GPUDevice {
379379
let bind_group_layouts = descriptor
380380
.bind_group_layouts
381381
.into_iter()
382-
.map(|bind_group_layout| bind_group_layout.id)
382+
.map(|bind_group_layout| {
383+
bind_group_layout
384+
.into_option()
385+
.map(|bind_group_layout| bind_group_layout.id)
386+
})
383387
.collect();
384388

385389
let wgpu_descriptor = wgpu_core::binding_model::PipelineLayoutDescriptor {

deno_webgpu/pipeline_layout.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
use deno_core::cppgc::Ptr;
44
use deno_core::op2;
5+
use deno_core::webidl::Nullable;
56
use deno_core::webidl::WebIdlInterfaceConverter;
67
use deno_core::GarbageCollected;
78
use deno_core::WebIDL;
@@ -58,5 +59,5 @@ pub(crate) struct GPUPipelineLayoutDescriptor {
5859
pub label: String,
5960

6061
pub bind_group_layouts:
61-
Vec<Ptr<super::bind_group_layout::GPUBindGroupLayout>>,
62+
Vec<Nullable<Ptr<super::bind_group_layout::GPUBindGroupLayout>>>,
6263
}

examples/features/src/big_compute_buffers/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ fn setup_pipeline(
126126
) -> wgpu::ComputePipeline {
127127
let pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
128128
label: Some("Compute Pipeline Layout"),
129-
bind_group_layouts: &[&bind_group_layout],
129+
bind_group_layouts: &[Some(&bind_group_layout)],
130130
immediate_size: 0,
131131
});
132132

examples/features/src/boids/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ impl crate::framework::Example for Example {
106106
let compute_pipeline_layout =
107107
device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
108108
label: Some("compute"),
109-
bind_group_layouts: &[&compute_bind_group_layout],
109+
bind_group_layouts: &[Some(&compute_bind_group_layout)],
110110
immediate_size: 0,
111111
});
112112

examples/features/src/bunnymark/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,10 @@ impl crate::framework::Example for Example {
200200
});
201201
let pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
202202
label: None,
203-
bind_group_layouts: &[&global_bind_group_layout, &local_bind_group_layout],
203+
bind_group_layouts: &[
204+
Some(&global_bind_group_layout),
205+
Some(&local_bind_group_layout),
206+
],
204207
immediate_size: 0,
205208
});
206209

0 commit comments

Comments
 (0)