Avoid breaking change: set_bind_group now takes Into<Option<...>> rather than Option<...> (#6452)

This commit is contained in:
Andreas Reich 2024-10-23 21:29:42 +02:00 committed by GitHub
parent a8c9356023
commit e23146aa3e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
41 changed files with 76 additions and 74 deletions

View File

@ -69,9 +69,11 @@ By @teoxoy [#6134](https://github.com/gfx-rs/wgpu/pull/6134).
#### `set_bind_group` now takes an `Option` for the bind group argument. #### `set_bind_group` now takes an `Option` for the bind group argument.
https://gpuweb.github.io/gpuweb/#programmable-passes-bind-groups specifies that bindGroup https://gpuweb.github.io/gpuweb/#programmable-passes-bind-groups specifies that bindGroup
is nullable. This change is the start of implementing this part of the spec. Callers that is nullable. This change is the start of implementing this part of the spec.
specify a `Some()` value should have unchanged behavior. Handling of `None` values still Callers that specify a `Some()` value should have unchanged behavior. Handling of `None` values still
needs to be implemented by backends. needs to be implemented by backends.
For convenience, the `set_bind_group` on compute/render passes & encoders takes `impl Into<Option<&BindGroup>>`,
so most code should still work the same.
By @bradwerth [#6216](https://github.com/gfx-rs/wgpu/pull/6216). By @bradwerth [#6216](https://github.com/gfx-rs/wgpu/pull/6216).

View File

@ -389,7 +389,7 @@ impl ComputepassState {
let end_idx = start_idx + dispatch_per_pass; let end_idx = start_idx + dispatch_per_pass;
for dispatch_idx in start_idx..end_idx { for dispatch_idx in start_idx..end_idx {
compute_pass.set_pipeline(&self.pipeline); compute_pass.set_pipeline(&self.pipeline);
compute_pass.set_bind_group(0, Some(&self.bind_groups[dispatch_idx]), &[]); compute_pass.set_bind_group(0, &self.bind_groups[dispatch_idx], &[]);
compute_pass.dispatch_workgroups(1, 1, 1); compute_pass.dispatch_workgroups(1, 1, 1);
} }

View File

@ -367,7 +367,7 @@ impl RenderpassState {
let end_idx = start_idx + draws_per_pass; let end_idx = start_idx + draws_per_pass;
for draw_idx in start_idx..end_idx { for draw_idx in start_idx..end_idx {
render_pass.set_pipeline(&self.pipeline); render_pass.set_pipeline(&self.pipeline);
render_pass.set_bind_group(0, Some(&self.bind_groups[draw_idx]), &[]); render_pass.set_bind_group(0, &self.bind_groups[draw_idx], &[]);
for i in 0..VERTEX_BUFFERS_PER_DRAW { for i in 0..VERTEX_BUFFERS_PER_DRAW {
render_pass.set_vertex_buffer( render_pass.set_vertex_buffer(
i as u32, i as u32,

View File

@ -292,7 +292,7 @@ impl crate::framework::Example for Example {
timestamp_writes: None, timestamp_writes: None,
}); });
cpass.set_pipeline(&self.compute_pipeline); cpass.set_pipeline(&self.compute_pipeline);
cpass.set_bind_group(0, Some(&self.particle_bind_groups[self.frame_num % 2]), &[]); cpass.set_bind_group(0, &self.particle_bind_groups[self.frame_num % 2], &[]);
cpass.dispatch_workgroups(self.work_group_count, 1, 1); cpass.dispatch_workgroups(self.work_group_count, 1, 1);
} }
command_encoder.pop_debug_group(); command_encoder.pop_debug_group();

View File

@ -128,11 +128,11 @@ impl Example {
occlusion_query_set: None, occlusion_query_set: None,
}); });
rpass.set_pipeline(&self.pipeline); rpass.set_pipeline(&self.pipeline);
rpass.set_bind_group(0, Some(&self.global_group), &[]); rpass.set_bind_group(0, &self.global_group, &[]);
for i in 0..self.bunnies.len() { for i in 0..self.bunnies.len() {
let offset = let offset =
(i as wgpu::DynamicOffset) * (uniform_alignment as wgpu::DynamicOffset); (i as wgpu::DynamicOffset) * (uniform_alignment as wgpu::DynamicOffset);
rpass.set_bind_group(1, Some(&self.local_group), &[offset]); rpass.set_bind_group(1, &self.local_group, &[offset]);
rpass.draw(0..4, 0..1); rpass.draw(0..4, 0..1);
} }
} }

View File

@ -296,7 +296,7 @@ impl crate::framework::Example for Example {
}); });
rpass.set_pipeline(&self.pipeline_upscale); rpass.set_pipeline(&self.pipeline_upscale);
rpass.set_bind_group(0, Some(&self.bind_group_upscale), &[]); rpass.set_bind_group(0, &self.bind_group_upscale, &[]);
rpass.draw(0..3, 0..1); rpass.draw(0..3, 0..1);
if let Some(pipeline_lines) = &self.pipeline_lines { if let Some(pipeline_lines) = &self.pipeline_lines {

View File

@ -358,7 +358,7 @@ impl crate::framework::Example for Example {
}); });
rpass.push_debug_group("Prepare data for draw."); rpass.push_debug_group("Prepare data for draw.");
rpass.set_pipeline(&self.pipeline); rpass.set_pipeline(&self.pipeline);
rpass.set_bind_group(0, Some(&self.bind_group), &[]); rpass.set_bind_group(0, &self.bind_group, &[]);
rpass.set_index_buffer(self.index_buf.slice(..), wgpu::IndexFormat::Uint16); rpass.set_index_buffer(self.index_buf.slice(..), wgpu::IndexFormat::Uint16);
rpass.set_vertex_buffer(0, self.vertex_buf.slice(..)); rpass.set_vertex_buffer(0, self.vertex_buf.slice(..));
rpass.pop_debug_group(); rpass.pop_debug_group();

View File

@ -132,7 +132,7 @@ async fn execute_gpu_inner(
timestamp_writes: None, timestamp_writes: None,
}); });
cpass.set_pipeline(&compute_pipeline); cpass.set_pipeline(&compute_pipeline);
cpass.set_bind_group(0, Some(&bind_group), &[]); cpass.set_bind_group(0, &bind_group, &[]);
cpass.insert_debug_marker("compute collatz iterations"); cpass.insert_debug_marker("compute collatz iterations");
cpass.dispatch_workgroups(numbers.len() as u32, 1, 1); // Number of cells to run, the (x,y,z) size of item being processed cpass.dispatch_workgroups(numbers.len() as u32, 1, 1); // Number of cells to run, the (x,y,z) size of item being processed
} }

View File

@ -125,7 +125,7 @@ async fn execute(
timestamp_writes: None, timestamp_writes: None,
}); });
compute_pass.set_pipeline(&patient_pipeline); compute_pass.set_pipeline(&patient_pipeline);
compute_pass.set_bind_group(0, Some(&bind_group), &[]); compute_pass.set_bind_group(0, &bind_group, &[]);
compute_pass.dispatch_workgroups(local_patient_workgroup_results.len() as u32, 1, 1); compute_pass.dispatch_workgroups(local_patient_workgroup_results.len() as u32, 1, 1);
} }
queue.submit(Some(command_encoder.finish())); queue.submit(Some(command_encoder.finish()));
@ -147,7 +147,7 @@ async fn execute(
timestamp_writes: None, timestamp_writes: None,
}); });
compute_pass.set_pipeline(&hasty_pipeline); compute_pass.set_pipeline(&hasty_pipeline);
compute_pass.set_bind_group(0, Some(&bind_group), &[]); compute_pass.set_bind_group(0, &bind_group, &[]);
compute_pass.dispatch_workgroups(local_patient_workgroup_results.len() as u32, 1, 1); compute_pass.dispatch_workgroups(local_patient_workgroup_results.len() as u32, 1, 1);
} }
queue.submit(Some(command_encoder.finish())); queue.submit(Some(command_encoder.finish()));

View File

@ -124,7 +124,7 @@ async fn run() {
timestamp_writes: None, timestamp_writes: None,
}); });
compute_pass.set_pipeline(&pipeline); compute_pass.set_pipeline(&pipeline);
compute_pass.set_bind_group(0, Some(&bind_group), &[]); compute_pass.set_bind_group(0, &bind_group, &[]);
/* Note that since each workgroup will cover both arrays, we only need to /* Note that since each workgroup will cover both arrays, we only need to
cover the length of one array. */ cover the length of one array. */
compute_pass.dispatch_workgroups(local_a.len() as u32, 1, 1); compute_pass.dispatch_workgroups(local_a.len() as u32, 1, 1);

View File

@ -177,7 +177,7 @@ impl Example {
); );
} }
rpass.set_pipeline(&pipeline); rpass.set_pipeline(&pipeline);
rpass.set_bind_group(0, Some(&bind_group), &[]); rpass.set_bind_group(0, &bind_group, &[]);
rpass.draw(0..3, 0..1); rpass.draw(0..3, 0..1);
if let Some(ref query_sets) = query_sets { if let Some(ref query_sets) = query_sets {
rpass.write_timestamp(&query_sets.timestamp, timestamp_query_index_base + 1); rpass.write_timestamp(&query_sets.timestamp, timestamp_query_index_base + 1);
@ -491,7 +491,7 @@ impl crate::framework::Example for Example {
occlusion_query_set: None, occlusion_query_set: None,
}); });
rpass.set_pipeline(&self.draw_pipeline); rpass.set_pipeline(&self.draw_pipeline);
rpass.set_bind_group(0, Some(&self.bind_group), &[]); rpass.set_bind_group(0, &self.bind_group, &[]);
rpass.draw(0..4, 0..1); rpass.draw(0..4, 0..1);
} }

View File

@ -59,7 +59,7 @@ async fn compute(local_buffer: &mut [u32], context: &WgpuContext) {
timestamp_writes: None, timestamp_writes: None,
}); });
compute_pass.set_pipeline(&context.pipeline); compute_pass.set_pipeline(&context.pipeline);
compute_pass.set_bind_group(0, Some(&context.bind_group), &[]); compute_pass.set_bind_group(0, &context.bind_group, &[]);
compute_pass.dispatch_workgroups(local_buffer.len() as u32, 1, 1); compute_pass.dispatch_workgroups(local_buffer.len() as u32, 1, 1);
} }
// We finish the compute pass by dropping it. // We finish the compute pass by dropping it.

View File

@ -776,10 +776,10 @@ impl crate::framework::Example for Example {
occlusion_query_set: None, occlusion_query_set: None,
}); });
pass.set_pipeline(&self.shadow_pass.pipeline); pass.set_pipeline(&self.shadow_pass.pipeline);
pass.set_bind_group(0, Some(&self.shadow_pass.bind_group), &[]); pass.set_bind_group(0, &self.shadow_pass.bind_group, &[]);
for entity in &self.entities { for entity in &self.entities {
pass.set_bind_group(1, Some(&self.entity_bind_group), &[entity.uniform_offset]); pass.set_bind_group(1, &self.entity_bind_group, &[entity.uniform_offset]);
pass.set_index_buffer(entity.index_buf.slice(..), entity.index_format); pass.set_index_buffer(entity.index_buf.slice(..), entity.index_format);
pass.set_vertex_buffer(0, entity.vertex_buf.slice(..)); pass.set_vertex_buffer(0, entity.vertex_buf.slice(..));
pass.draw_indexed(0..entity.index_count as u32, 0, 0..1); pass.draw_indexed(0..entity.index_count as u32, 0, 0..1);
@ -820,10 +820,10 @@ impl crate::framework::Example for Example {
occlusion_query_set: None, occlusion_query_set: None,
}); });
pass.set_pipeline(&self.forward_pass.pipeline); pass.set_pipeline(&self.forward_pass.pipeline);
pass.set_bind_group(0, Some(&self.forward_pass.bind_group), &[]); pass.set_bind_group(0, &self.forward_pass.bind_group, &[]);
for entity in &self.entities { for entity in &self.entities {
pass.set_bind_group(1, Some(&self.entity_bind_group), &[entity.uniform_offset]); pass.set_bind_group(1, &self.entity_bind_group, &[entity.uniform_offset]);
pass.set_index_buffer(entity.index_buf.slice(..), entity.index_format); pass.set_index_buffer(entity.index_buf.slice(..), entity.index_format);
pass.set_vertex_buffer(0, entity.vertex_buf.slice(..)); pass.set_vertex_buffer(0, entity.vertex_buf.slice(..));
pass.draw_indexed(0..entity.index_count as u32, 0, 0..1); pass.draw_indexed(0..entity.index_count as u32, 0, 0..1);

View File

@ -448,7 +448,7 @@ impl crate::framework::Example for Example {
occlusion_query_set: None, occlusion_query_set: None,
}); });
rpass.set_bind_group(0, Some(&self.bind_group), &[]); rpass.set_bind_group(0, &self.bind_group, &[]);
rpass.set_pipeline(&self.entity_pipeline); rpass.set_pipeline(&self.entity_pipeline);
for entity in self.entities.iter() { for entity in self.entities.iter() {

View File

@ -199,7 +199,7 @@ impl<const SRGB: bool> crate::framework::Example for Example<SRGB> {
}); });
rpass.push_debug_group("Prepare data for draw."); rpass.push_debug_group("Prepare data for draw.");
rpass.set_pipeline(&self.pipeline); rpass.set_pipeline(&self.pipeline);
rpass.set_bind_group(0, Some(&self.bind_group), &[]); rpass.set_bind_group(0, &self.bind_group, &[]);
rpass.set_index_buffer(self.index_buf.slice(..), wgpu::IndexFormat::Uint16); rpass.set_index_buffer(self.index_buf.slice(..), wgpu::IndexFormat::Uint16);
rpass.set_vertex_buffer(0, self.vertex_buf.slice(..)); rpass.set_vertex_buffer(0, self.vertex_buf.slice(..));
rpass.pop_debug_group(); rpass.pop_debug_group();

View File

@ -114,7 +114,7 @@ async fn run(_path: Option<String>) {
label: None, label: None,
timestamp_writes: None, timestamp_writes: None,
}); });
compute_pass.set_bind_group(0, Some(&bind_group), &[]); compute_pass.set_bind_group(0, &bind_group, &[]);
compute_pass.set_pipeline(&pipeline); compute_pass.set_pipeline(&pipeline);
compute_pass.dispatch_workgroups(TEXTURE_DIMS.0 as u32, TEXTURE_DIMS.1 as u32, 1); compute_pass.dispatch_workgroups(TEXTURE_DIMS.0 as u32, TEXTURE_DIMS.1 as u32, 1);
} }

View File

@ -391,12 +391,12 @@ impl crate::framework::Example for Example {
rpass.set_vertex_buffer(0, self.vertex_buffer.slice(..)); rpass.set_vertex_buffer(0, self.vertex_buffer.slice(..));
rpass.set_index_buffer(self.index_buffer.slice(..), self.index_format); rpass.set_index_buffer(self.index_buffer.slice(..), self.index_format);
if self.uniform_workaround { if self.uniform_workaround {
rpass.set_bind_group(0, Some(&self.bind_group), &[0]); rpass.set_bind_group(0, &self.bind_group, &[0]);
rpass.draw_indexed(0..6, 0, 0..1); rpass.draw_indexed(0..6, 0, 0..1);
rpass.set_bind_group(0, Some(&self.bind_group), &[256]); rpass.set_bind_group(0, &self.bind_group, &[256]);
rpass.draw_indexed(6..12, 0, 0..1); rpass.draw_indexed(6..12, 0, 0..1);
} else { } else {
rpass.set_bind_group(0, Some(&self.bind_group), &[0]); rpass.set_bind_group(0, &self.bind_group, &[0]);
rpass.draw_indexed(0..12, 0, 0..1); rpass.draw_indexed(0..12, 0, 0..1);
} }

View File

@ -321,7 +321,7 @@ fn compute_pass(
}); });
*next_unused_query += 2; *next_unused_query += 2;
cpass.set_pipeline(&compute_pipeline); cpass.set_pipeline(&compute_pipeline);
cpass.set_bind_group(0, Some(&bind_group), &[]); cpass.set_bind_group(0, &bind_group, &[]);
cpass.dispatch_workgroups(1, 1, 1); cpass.dispatch_workgroups(1, 1, 1);
if device if device
.features() .features()

View File

@ -624,7 +624,7 @@ impl crate::framework::Example for Example {
multiview: None, multiview: None,
}); });
encoder.set_pipeline(&terrain_pipeline); encoder.set_pipeline(&terrain_pipeline);
encoder.set_bind_group(0, Some(&terrain_flipped_bind_group), &[]); encoder.set_bind_group(0, &terrain_flipped_bind_group, &[]);
encoder.set_vertex_buffer(0, terrain_vertex_buf.slice(..)); encoder.set_vertex_buffer(0, terrain_vertex_buf.slice(..));
encoder.draw(0..terrain_vertices.len() as u32, 0..1); encoder.draw(0..terrain_vertices.len() as u32, 0..1);
encoder.finish(&wgpu::RenderBundleDescriptor::default()) encoder.finish(&wgpu::RenderBundleDescriptor::default())
@ -778,7 +778,7 @@ impl crate::framework::Example for Example {
occlusion_query_set: None, occlusion_query_set: None,
}); });
rpass.set_pipeline(&self.terrain_pipeline); rpass.set_pipeline(&self.terrain_pipeline);
rpass.set_bind_group(0, Some(&self.terrain_normal_bind_group), &[]); rpass.set_bind_group(0, &self.terrain_normal_bind_group, &[]);
rpass.set_vertex_buffer(0, self.terrain_vertex_buf.slice(..)); rpass.set_vertex_buffer(0, self.terrain_vertex_buf.slice(..));
rpass.draw(0..self.terrain_vertex_count as u32, 0..1); rpass.draw(0..self.terrain_vertex_count as u32, 0..1);
} }
@ -805,7 +805,7 @@ impl crate::framework::Example for Example {
}); });
rpass.set_pipeline(&self.water_pipeline); rpass.set_pipeline(&self.water_pipeline);
rpass.set_bind_group(0, Some(&self.water_bind_group), &[]); rpass.set_bind_group(0, &self.water_bind_group, &[]);
rpass.set_vertex_buffer(0, self.water_vertex_buf.slice(..)); rpass.set_vertex_buffer(0, self.water_vertex_buf.slice(..));
rpass.draw(0..self.water_vertex_count as u32, 0..1); rpass.draw(0..self.water_vertex_count as u32, 0..1);
} }

View File

@ -376,7 +376,7 @@ fn copy_via_compute(
let mut pass = encoder.begin_compute_pass(&ComputePassDescriptor::default()); let mut pass = encoder.begin_compute_pass(&ComputePassDescriptor::default());
pass.set_pipeline(&pipeline_copy); pass.set_pipeline(&pipeline_copy);
pass.set_bind_group(0, Some(&bg), &[]); pass.set_bind_group(0, &bg, &[]);
pass.dispatch_workgroups(1, 1, 1); pass.dispatch_workgroups(1, 1, 1);
} }

View File

@ -110,7 +110,7 @@ static BGRA8_UNORM_STORAGE: GpuTestConfiguration = GpuTestConfiguration::new()
timestamp_writes: None, timestamp_writes: None,
}); });
pass.set_bind_group(0, Some(&bg), &[]); pass.set_bind_group(0, &bg, &[]);
pass.set_pipeline(&pipeline); pass.set_pipeline(&pipeline);
pass.dispatch_workgroups(256, 256, 1); pass.dispatch_workgroups(256, 256, 1);
} }

View File

@ -92,11 +92,11 @@ async fn bgl_dedupe(ctx: TestingContext) {
timestamp_writes: None, timestamp_writes: None,
}); });
pass.set_bind_group(0, Some(&bg_1b), &[]); pass.set_bind_group(0, &bg_1b, &[]);
pass.set_pipeline(&pipeline); pass.set_pipeline(&pipeline);
pass.dispatch_workgroups(1, 1, 1); pass.dispatch_workgroups(1, 1, 1);
pass.set_bind_group(0, Some(&bg_1a), &[]); pass.set_bind_group(0, &bg_1a, &[]);
pass.dispatch_workgroups(1, 1, 1); pass.dispatch_workgroups(1, 1, 1);
drop(pass); drop(pass);
@ -179,7 +179,7 @@ fn bgl_dedupe_with_dropped_user_handle(ctx: TestingContext) {
timestamp_writes: None, timestamp_writes: None,
}); });
pass.set_bind_group(0, Some(&bg), &[]); pass.set_bind_group(0, &bg, &[]);
pass.set_pipeline(&pipeline); pass.set_pipeline(&pipeline);
pass.dispatch_workgroups(1, 1, 1); pass.dispatch_workgroups(1, 1, 1);
@ -250,10 +250,10 @@ fn get_derived_bgl(ctx: TestingContext) {
pass.set_pipeline(&pipeline); pass.set_pipeline(&pipeline);
pass.set_bind_group(0, Some(&bg1), &[]); pass.set_bind_group(0, &bg1, &[]);
pass.dispatch_workgroups(1, 1, 1); pass.dispatch_workgroups(1, 1, 1);
pass.set_bind_group(0, Some(&bg2), &[]); pass.set_bind_group(0, &bg2, &[]);
pass.dispatch_workgroups(1, 1, 1); pass.dispatch_workgroups(1, 1, 1);
drop(pass); drop(pass);
@ -313,7 +313,7 @@ fn separate_pipelines_have_incompatible_derived_bgls(ctx: TestingContext) {
pass.set_pipeline(&pipeline1); pass.set_pipeline(&pipeline1);
// We use the wrong bind group for this pipeline here. This should fail. // We use the wrong bind group for this pipeline here. This should fail.
pass.set_bind_group(0, Some(&bg2), &[]); pass.set_bind_group(0, &bg2, &[]);
pass.dispatch_workgroups(1, 1, 1); pass.dispatch_workgroups(1, 1, 1);
fail( fail(
@ -385,7 +385,7 @@ fn derived_bgls_incompatible_with_regular_bgls(ctx: TestingContext) {
pass.set_pipeline(&pipeline); pass.set_pipeline(&pipeline);
pass.set_bind_group(0, Some(&bg), &[]); pass.set_bind_group(0, &bg, &[]);
pass.dispatch_workgroups(1, 1, 1); pass.dispatch_workgroups(1, 1, 1);
fail( fail(
@ -476,8 +476,8 @@ fn bgl_dedupe_derived(ctx: TestingContext) {
timestamp_writes: None, timestamp_writes: None,
}); });
pass.set_pipeline(&pipeline); pass.set_pipeline(&pipeline);
pass.set_bind_group(0, Some(&bind_group_0), &[]); pass.set_bind_group(0, &bind_group_0, &[]);
pass.set_bind_group(1, Some(&bind_group_1), &[]); pass.set_bind_group(1, &bind_group_1, &[]);
pass.dispatch_workgroups(1, 1, 1); pass.dispatch_workgroups(1, 1, 1);
drop(pass); drop(pass);

View File

@ -328,7 +328,7 @@ static MINIMUM_BUFFER_BINDING_SIZE_DISPATCH: GpuTestConfiguration = GpuTestConfi
timestamp_writes: None, timestamp_writes: None,
}); });
pass.set_bind_group(0, Some(&bind_group), &[]); pass.set_bind_group(0, &bind_group, &[]);
pass.set_pipeline(&pipeline); pass.set_pipeline(&pipeline);
pass.dispatch_workgroups(1, 1, 1); pass.dispatch_workgroups(1, 1, 1);

View File

@ -45,7 +45,7 @@ async fn compute_pass_resource_ownership(ctx: TestingContext) {
{ {
let mut cpass = encoder.begin_compute_pass(&wgpu::ComputePassDescriptor::default()); let mut cpass = encoder.begin_compute_pass(&wgpu::ComputePassDescriptor::default());
cpass.set_pipeline(&pipeline); cpass.set_pipeline(&pipeline);
cpass.set_bind_group(0, Some(&bind_group), &[]); cpass.set_bind_group(0, &bind_group, &[]);
cpass.dispatch_workgroups_indirect(&indirect_buffer, 0); cpass.dispatch_workgroups_indirect(&indirect_buffer, 0);
// Now drop all resources we set. Then do a device poll to make sure the resources are really not dropped too early, no matter what. // Now drop all resources we set. Then do a device poll to make sure the resources are really not dropped too early, no matter what.
@ -95,7 +95,7 @@ async fn compute_pass_query_set_ownership_pipeline_statistics(ctx: TestingContex
{ {
let mut cpass = encoder.begin_compute_pass(&wgpu::ComputePassDescriptor::default()); let mut cpass = encoder.begin_compute_pass(&wgpu::ComputePassDescriptor::default());
cpass.set_pipeline(&pipeline); cpass.set_pipeline(&pipeline);
cpass.set_bind_group(0, Some(&bind_group), &[]); cpass.set_bind_group(0, &bind_group, &[]);
cpass.begin_pipeline_statistics_query(&query_set, 0); cpass.begin_pipeline_statistics_query(&query_set, 0);
cpass.dispatch_workgroups(1, 1, 1); cpass.dispatch_workgroups(1, 1, 1);
cpass.end_pipeline_statistics_query(); cpass.end_pipeline_statistics_query();
@ -153,7 +153,7 @@ async fn compute_pass_query_set_ownership_timestamps(ctx: TestingContext) {
}), }),
}); });
cpass.set_pipeline(&pipeline); cpass.set_pipeline(&pipeline);
cpass.set_bind_group(0, Some(&bind_group), &[]); cpass.set_bind_group(0, &bind_group, &[]);
cpass.write_timestamp(&query_set_write_timestamp, 0); cpass.write_timestamp(&query_set_write_timestamp, 0);
cpass.dispatch_workgroups(1, 1, 1); cpass.dispatch_workgroups(1, 1, 1);
@ -203,7 +203,7 @@ async fn compute_pass_keep_encoder_alive(ctx: TestingContext) {
// Record some draw commands. // Record some draw commands.
cpass.set_pipeline(&pipeline); cpass.set_pipeline(&pipeline);
cpass.set_bind_group(0, Some(&bind_group), &[]); cpass.set_bind_group(0, &bind_group, &[]);
cpass.dispatch_workgroups_indirect(&indirect_buffer, 0); cpass.dispatch_workgroups_indirect(&indirect_buffer, 0);
// Dropping the pass will still execute the pass, even though there's no way to submit it. // Dropping the pass will still execute the pass, even though there's no way to submit it.

View File

@ -82,7 +82,7 @@ static RESET_BIND_GROUPS: GpuTestConfiguration = GpuTestConfiguration::new()
let mut compute_pass = encoder.begin_compute_pass(&Default::default()); let mut compute_pass = encoder.begin_compute_pass(&Default::default());
compute_pass.set_pipeline(&test_resources.pipeline); compute_pass.set_pipeline(&test_resources.pipeline);
compute_pass.set_push_constants(0, &[0, 0, 0, 0]); compute_pass.set_push_constants(0, &[0, 0, 0, 0]);
// compute_pass.set_bind_group(0, Some(&test_resources.bind_group), &[]); // compute_pass.set_bind_group(0, &test_resources.bind_group, &[]);
compute_pass.dispatch_workgroups_indirect(&indirect_buffer, 0); compute_pass.dispatch_workgroups_indirect(&indirect_buffer, 0);
} }
ctx.queue.submit(Some(encoder.finish())); ctx.queue.submit(Some(encoder.finish()));
@ -124,7 +124,7 @@ static ZERO_SIZED_BUFFER: GpuTestConfiguration = GpuTestConfiguration::new()
let mut compute_pass = encoder.begin_compute_pass(&Default::default()); let mut compute_pass = encoder.begin_compute_pass(&Default::default());
compute_pass.set_pipeline(&test_resources.pipeline); compute_pass.set_pipeline(&test_resources.pipeline);
compute_pass.set_push_constants(0, &[0, 0, 0, 0]); compute_pass.set_push_constants(0, &[0, 0, 0, 0]);
compute_pass.set_bind_group(0, Some(&test_resources.bind_group), &[]); compute_pass.set_bind_group(0, &test_resources.bind_group, &[]);
compute_pass.dispatch_workgroups_indirect(&indirect_buffer, 0); compute_pass.dispatch_workgroups_indirect(&indirect_buffer, 0);
} }
ctx.queue.submit(Some(encoder.finish())); ctx.queue.submit(Some(encoder.finish()));
@ -281,7 +281,7 @@ async fn run_test(ctx: &TestingContext, num_workgroups: &[u32; 3]) -> [u32; 3] {
let mut compute_pass = encoder.begin_compute_pass(&Default::default()); let mut compute_pass = encoder.begin_compute_pass(&Default::default());
compute_pass.set_pipeline(&test_resources.pipeline); compute_pass.set_pipeline(&test_resources.pipeline);
compute_pass.set_push_constants(0, &[0, 0, 0, 0]); compute_pass.set_push_constants(0, &[0, 0, 0, 0]);
compute_pass.set_bind_group(0, Some(&test_resources.bind_group), &[]); compute_pass.set_bind_group(0, &test_resources.bind_group, &[]);
compute_pass.dispatch_workgroups_indirect(&indirect_buffer, indirect_offset); compute_pass.dispatch_workgroups_indirect(&indirect_buffer, indirect_offset);
} }

View File

@ -194,7 +194,7 @@ async fn draw_test_with_reports(
}); });
rpass.set_pipeline(&pipeline); rpass.set_pipeline(&pipeline);
rpass.set_bind_group(0, Some(&bg), &[]); rpass.set_bind_group(0, &bg, &[]);
let global_report = ctx.instance.generate_report().unwrap(); let global_report = ctx.instance.generate_report().unwrap();
let report = global_report.hub_report(); let report = global_report.hub_report();

View File

@ -115,7 +115,7 @@ static NV12_TEXTURE_CREATION_SAMPLING: GpuTestConfiguration = GpuTestConfigurati
occlusion_query_set: None, occlusion_query_set: None,
}); });
rpass.set_pipeline(&pipeline); rpass.set_pipeline(&pipeline);
rpass.set_bind_group(0, Some(&bind_group), &[]); rpass.set_bind_group(0, &bind_group, &[]);
rpass.draw(0..4, 0..1); rpass.draw(0..4, 0..1);
drop(rpass); drop(rpass);
ctx.queue.submit(Some(encoder.finish())); ctx.queue.submit(Some(encoder.finish()));

View File

@ -22,7 +22,7 @@ static RESTRICT_WORKGROUP_PRIVATE_FUNCTION_LET: GpuTestConfiguration = GpuTestCo
{ {
let mut compute_pass = encoder.begin_compute_pass(&Default::default()); let mut compute_pass = encoder.begin_compute_pass(&Default::default());
compute_pass.set_pipeline(&test_resources.pipeline); compute_pass.set_pipeline(&test_resources.pipeline);
compute_pass.set_bind_group(0, Some(&test_resources.bind_group), &[]); compute_pass.set_bind_group(0, &test_resources.bind_group, &[]);
compute_pass.dispatch_workgroups(1, 1, 1); compute_pass.dispatch_workgroups(1, 1, 1);
} }

View File

@ -87,7 +87,7 @@ static PARTIALLY_BOUNDED_ARRAY: GpuTestConfiguration = GpuTestConfiguration::new
timestamp_writes: None, timestamp_writes: None,
}); });
cpass.set_pipeline(&compute_pipeline); cpass.set_pipeline(&compute_pipeline);
cpass.set_bind_group(0, Some(&bind_group), &[]); cpass.set_bind_group(0, &bind_group, &[]);
cpass.dispatch_workgroups(1, 1, 1); cpass.dispatch_workgroups(1, 1, 1);
} }

View File

@ -46,7 +46,7 @@ fn generate_dummy_work(ctx: &TestingContext) -> CommandBuffer {
.create_command_encoder(&CommandEncoderDescriptor::default()); .create_command_encoder(&CommandEncoderDescriptor::default());
let mut cpass = cmd_buf.begin_compute_pass(&ComputePassDescriptor::default()); let mut cpass = cmd_buf.begin_compute_pass(&ComputePassDescriptor::default());
cpass.set_bind_group(0, Some(&bind_group), &[]); cpass.set_bind_group(0, &bind_group, &[]);
drop(cpass); drop(cpass);
cmd_buf.finish() cmd_buf.finish()

View File

@ -119,7 +119,7 @@ async fn partial_update_test(ctx: TestingContext) {
timestamp_writes: None, timestamp_writes: None,
}); });
cpass.set_pipeline(&pipeline); cpass.set_pipeline(&pipeline);
cpass.set_bind_group(0, Some(&bind_group), &[]); cpass.set_bind_group(0, &bind_group, &[]);
// -- Dispatch 0 -- // -- Dispatch 0 --

View File

@ -163,7 +163,7 @@ async fn multi_stage_data_binding_test(ctx: TestingContext) {
}); });
rpass.set_pipeline(&pipeline); rpass.set_pipeline(&pipeline);
rpass.set_bind_group(0, Some(&bg), &[]); rpass.set_bind_group(0, &bg, &[]);
rpass.set_push_constants( rpass.set_push_constants(
wgpu::ShaderStages::VERTEX_FRAGMENT, wgpu::ShaderStages::VERTEX_FRAGMENT,
0, 0,

View File

@ -87,7 +87,7 @@ async fn render_pass_resource_ownership(ctx: TestingContext) {
drop(depth_stencil_view); drop(depth_stencil_view);
rpass.set_pipeline(&pipeline); rpass.set_pipeline(&pipeline);
rpass.set_bind_group(0, Some(&bind_group), &[]); rpass.set_bind_group(0, &bind_group, &[]);
rpass.set_vertex_buffer(0, vertex_buffer.slice(..)); rpass.set_vertex_buffer(0, vertex_buffer.slice(..));
rpass.set_index_buffer(index_buffer.slice(..), wgpu::IndexFormat::Uint32); rpass.set_index_buffer(index_buffer.slice(..), wgpu::IndexFormat::Uint32);
rpass.begin_occlusion_query(0); rpass.begin_occlusion_query(0);
@ -163,7 +163,7 @@ async fn render_pass_query_set_ownership_pipeline_statistics(ctx: TestingContext
..Default::default() ..Default::default()
}); });
rpass.set_pipeline(&pipeline); rpass.set_pipeline(&pipeline);
rpass.set_bind_group(0, Some(&bind_group), &[]); rpass.set_bind_group(0, &bind_group, &[]);
rpass.set_vertex_buffer(0, vertex_buffer.slice(..)); rpass.set_vertex_buffer(0, vertex_buffer.slice(..));
rpass.set_index_buffer(index_buffer.slice(..), wgpu::IndexFormat::Uint32); rpass.set_index_buffer(index_buffer.slice(..), wgpu::IndexFormat::Uint32);
rpass.begin_pipeline_statistics_query(&query_set, 0); rpass.begin_pipeline_statistics_query(&query_set, 0);
@ -242,7 +242,7 @@ async fn render_pass_query_set_ownership_timestamps(ctx: TestingContext) {
rpass.write_timestamp(&query_set_write_timestamp, 0); rpass.write_timestamp(&query_set_write_timestamp, 0);
rpass.set_pipeline(&pipeline); rpass.set_pipeline(&pipeline);
rpass.set_bind_group(0, Some(&bind_group), &[]); rpass.set_bind_group(0, &bind_group, &[]);
rpass.set_vertex_buffer(0, vertex_buffer.slice(..)); rpass.set_vertex_buffer(0, vertex_buffer.slice(..));
rpass.set_index_buffer(index_buffer.slice(..), wgpu::IndexFormat::Uint32); rpass.set_index_buffer(index_buffer.slice(..), wgpu::IndexFormat::Uint32);
rpass.draw(0..3, 0..1); rpass.draw(0..3, 0..1);
@ -305,7 +305,7 @@ async fn render_pass_keep_encoder_alive(ctx: TestingContext) {
// Record some a draw command. // Record some a draw command.
rpass.set_pipeline(&pipeline); rpass.set_pipeline(&pipeline);
rpass.set_bind_group(0, Some(&bind_group), &[]); rpass.set_bind_group(0, &bind_group, &[]);
rpass.set_vertex_buffer(0, vertex_buffer.slice(..)); rpass.set_vertex_buffer(0, vertex_buffer.slice(..));
rpass.set_index_buffer(index_buffer.slice(..), wgpu::IndexFormat::Uint32); rpass.set_index_buffer(index_buffer.slice(..), wgpu::IndexFormat::Uint32);
rpass.draw(0..3, 0..1); rpass.draw(0..3, 0..1);

View File

@ -349,7 +349,7 @@ async fn shader_input_output_test(
timestamp_writes: None, timestamp_writes: None,
}); });
cpass.set_pipeline(&pipeline); cpass.set_pipeline(&pipeline);
cpass.set_bind_group(0, Some(&bg), &[]); cpass.set_bind_group(0, &bg, &[]);
if let InputStorageType::PushConstant = storage_type { if let InputStorageType::PushConstant = storage_type {
cpass.set_push_constants(0, bytemuck::cast_slice(&test.input_values)) cpass.set_push_constants(0, bytemuck::cast_slice(&test.input_values))

View File

@ -119,7 +119,7 @@ static ZERO_INIT_WORKGROUP_MEMORY: GpuTestConfiguration = GpuTestConfiguration::
cpass.set_pipeline(&pipeline_read); cpass.set_pipeline(&pipeline_read);
for i in 0..NR_OF_DISPATCHES { for i in 0..NR_OF_DISPATCHES {
cpass.set_bind_group(0, Some(&bg), &[i * BUFFER_BINDING_SIZE]); cpass.set_bind_group(0, &bg, &[i * BUFFER_BINDING_SIZE]);
cpass.dispatch_workgroups(DISPATCH_SIZE.0, DISPATCH_SIZE.1, DISPATCH_SIZE.2); cpass.dispatch_workgroups(DISPATCH_SIZE.0, DISPATCH_SIZE.1, DISPATCH_SIZE.2);
} }
drop(cpass); drop(cpass);

View File

@ -148,7 +148,7 @@ async fn reinterpret(
occlusion_query_set: None, occlusion_query_set: None,
}); });
rpass.set_pipeline(&pipeline); rpass.set_pipeline(&pipeline);
rpass.set_bind_group(0, Some(&bind_group), &[]); rpass.set_bind_group(0, &bind_group, &[]);
rpass.draw(0..3, 0..1); rpass.draw(0..3, 0..1);
drop(rpass); drop(rpass);
ctx.queue.submit(Some(encoder.finish())); ctx.queue.submit(Some(encoder.finish()));

View File

@ -90,7 +90,7 @@ static SUBGROUP_OPERATIONS: GpuTestConfiguration = GpuTestConfiguration::new()
timestamp_writes: None, timestamp_writes: None,
}); });
cpass.set_pipeline(&compute_pipeline); cpass.set_pipeline(&compute_pipeline);
cpass.set_bind_group(0, Some(&bind_group), &[]); cpass.set_bind_group(0, &bind_group, &[]);
cpass.dispatch_workgroups(1, 1, 1); cpass.dispatch_workgroups(1, 1, 1);
} }
ctx.queue.submit(Some(encoder.finish())); ctx.queue.submit(Some(encoder.finish()));

View File

@ -315,7 +315,7 @@ async fn vertex_formats_common(ctx: TestingContext, tests: &[Test<'_>]) {
rpass.set_vertex_buffer(0, buffer_input.slice(..)); rpass.set_vertex_buffer(0, buffer_input.slice(..));
rpass.set_pipeline(&pipeline); rpass.set_pipeline(&pipeline);
rpass.set_bind_group(0, Some(&bg), &[]); rpass.set_bind_group(0, &bg, &[]);
// Draw three vertices and no instance, which is enough to generate the // Draw three vertices and no instance, which is enough to generate the
// checksums. // checksums.

View File

@ -45,13 +45,13 @@ impl<'encoder> ComputePass<'encoder> {
/// If the bind group have dynamic offsets, provide them in the binding order. /// If the bind group have dynamic offsets, provide them in the binding order.
/// These offsets have to be aligned to [`Limits::min_uniform_buffer_offset_alignment`] /// These offsets have to be aligned to [`Limits::min_uniform_buffer_offset_alignment`]
/// or [`Limits::min_storage_buffer_offset_alignment`] appropriately. /// or [`Limits::min_storage_buffer_offset_alignment`] appropriately.
pub fn set_bind_group( pub fn set_bind_group<'a>(
&mut self, &mut self,
index: u32, index: u32,
bind_group: Option<&BindGroup>, bind_group: impl Into<Option<&'a BindGroup>>,
offsets: &[DynamicOffset], offsets: &[DynamicOffset],
) { ) {
let bg = bind_group.map(|x| x.data.as_ref()); let bg = bind_group.into().map(|x| x.data.as_ref());
DynContext::compute_pass_set_bind_group( DynContext::compute_pass_set_bind_group(
&*self.inner.context, &*self.inner.context,
self.inner.data.as_mut(), self.inner.data.as_mut(),

View File

@ -63,13 +63,13 @@ impl<'a> RenderBundleEncoder<'a> {
/// in the active pipeline when any `draw()` function is called must match the layout of this bind group. /// in the active pipeline when any `draw()` function is called must match the layout of this bind group.
/// ///
/// If the bind group have dynamic offsets, provide them in the binding order. /// If the bind group have dynamic offsets, provide them in the binding order.
pub fn set_bind_group( pub fn set_bind_group<'b>(
&mut self, &mut self,
index: u32, index: u32,
bind_group: Option<&'a BindGroup>, bind_group: impl Into<Option<&'a BindGroup>>,
offsets: &[DynamicOffset], offsets: &[DynamicOffset],
) { ) {
let bg = bind_group.map(|x| x.data.as_ref()); let bg = bind_group.into().map(|x| x.data.as_ref());
DynContext::render_bundle_encoder_set_bind_group( DynContext::render_bundle_encoder_set_bind_group(
&*self.parent.context, &*self.parent.context,
self.data.as_mut(), self.data.as_mut(),

View File

@ -74,13 +74,13 @@ impl<'encoder> RenderPass<'encoder> {
/// or [`Limits::min_storage_buffer_offset_alignment`] appropriately. /// or [`Limits::min_storage_buffer_offset_alignment`] appropriately.
/// ///
/// Subsequent draw calls shader executions will be able to access data in these bind groups. /// Subsequent draw calls shader executions will be able to access data in these bind groups.
pub fn set_bind_group( pub fn set_bind_group<'a>(
&mut self, &mut self,
index: u32, index: u32,
bind_group: Option<&BindGroup>, bind_group: impl Into<Option<&'a BindGroup>>,
offsets: &[DynamicOffset], offsets: &[DynamicOffset],
) { ) {
let bg = bind_group.map(|x| x.data.as_ref()); let bg = bind_group.into().map(|x| x.data.as_ref());
DynContext::render_pass_set_bind_group( DynContext::render_pass_set_bind_group(
&*self.inner.context, &*self.inner.context,
self.inner.data.as_mut(), self.inner.data.as_mut(),