Skip to content

Commit adc3534

Browse files
kvarkjimblandy
authored andcommitted
Add max_binding_array_acceleration_structure_elements_per_shader_stage limit
1 parent e39b3ae commit adc3534

11 files changed

Lines changed: 70 additions & 22 deletions

File tree

tests/tests/wgpu-gpu/binding_array/tlas.rs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,11 @@ static BINDING_ARRAY_TLAS: GpuTestConfiguration = GpuTestConfiguration::new()
1919
.features(
2020
Features::EXPERIMENTAL_RAY_QUERY | Features::ACCELERATION_STRUCTURE_BINDING_ARRAY,
2121
)
22-
.limits({
23-
let mut limits =
24-
Limits::default().using_minimum_supported_acceleration_structure_values();
25-
// Keep this small; we only need a couple of array elements.
26-
limits.max_binding_array_elements_per_shader_stage = 8;
27-
limits.max_acceleration_structures_per_shader_stage = 8;
28-
limits
22+
.limits(Limits {
23+
max_binding_array_elements_per_shader_stage: 8,
24+
max_acceleration_structures_per_shader_stage: 8,
25+
max_binding_array_acceleration_structure_elements_per_shader_stage: 8,
26+
..Limits::default().using_minimum_supported_acceleration_structure_values()
2927
})
3028
// As of writing, Metal's HAL does not implement binding acceleration structures.
3129
.skip(FailureCase::backend(Backends::METAL)),
@@ -163,9 +161,7 @@ async fn binding_array_tlas(ctx: TestingContext) {
163161
transform_buffer_offset: None,
164162
}]),
165163
}),
166-
std::iter::empty::<&wgpu::Tlas>()
167-
.chain(std::iter::once(&tlas_a))
168-
.chain(std::iter::once(&tlas_b)),
164+
[&tlas_a, &tlas_b],
169165
);
170166

171167
ctx.queue.submit(Some(encoder.finish()));

wgpu-core/src/binding_model.rs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,7 @@ pub enum BindingTypeMaxCountErrorKind {
327327
UniformBuffers,
328328
BindingArrayElements,
329329
BindingArraySamplerElements,
330+
BindingArrayAccelerationStructureElements,
330331
AccelerationStructures,
331332
}
332333

@@ -354,6 +355,9 @@ impl BindingTypeMaxCountErrorKind {
354355
BindingTypeMaxCountErrorKind::BindingArraySamplerElements => {
355356
"max_binding_array_sampler_elements_per_shader_stage"
356357
}
358+
BindingTypeMaxCountErrorKind::BindingArrayAccelerationStructureElements => {
359+
"max_binding_array_acceleration_structure_elements_per_shader_stage"
360+
}
357361
BindingTypeMaxCountErrorKind::AccelerationStructures => {
358362
"max_acceleration_structures_per_shader_stage"
359363
}
@@ -433,6 +437,7 @@ pub(crate) struct BindingTypeMaxCountValidator {
433437
acceleration_structures: PerStageBindingTypeCounter,
434438
binding_array_elements: PerStageBindingTypeCounter,
435439
binding_array_sampler_elements: PerStageBindingTypeCounter,
440+
binding_array_acceleration_structure_elements: PerStageBindingTypeCounter,
436441
has_bindless_array: bool,
437442
}
438443

@@ -444,9 +449,16 @@ impl BindingTypeMaxCountValidator {
444449
self.binding_array_elements.add(binding.visibility, count);
445450
self.has_bindless_array = true;
446451

447-
if let wgt::BindingType::Sampler(_) = binding.ty {
448-
self.binding_array_sampler_elements
449-
.add(binding.visibility, count);
452+
match binding.ty {
453+
wgt::BindingType::Sampler(_) => {
454+
self.binding_array_sampler_elements
455+
.add(binding.visibility, count);
456+
}
457+
wgt::BindingType::AccelerationStructure { .. } => {
458+
self.binding_array_acceleration_structure_elements
459+
.add(binding.visibility, count);
460+
}
461+
_ => {}
450462
}
451463
} else {
452464
match binding.ty {
@@ -513,6 +525,8 @@ impl BindingTypeMaxCountValidator {
513525
.merge(&other.binding_array_elements);
514526
self.binding_array_sampler_elements
515527
.merge(&other.binding_array_sampler_elements);
528+
self.binding_array_acceleration_structure_elements
529+
.merge(&other.binding_array_acceleration_structure_elements);
516530
}
517531

518532
pub(crate) fn validate(&self, limits: &wgt::Limits) -> Result<(), BindingTypeMaxCountError> {
@@ -560,6 +574,11 @@ impl BindingTypeMaxCountValidator {
560574
limits.max_binding_array_sampler_elements_per_shader_stage,
561575
BindingTypeMaxCountErrorKind::BindingArraySamplerElements,
562576
)?;
577+
self.binding_array_acceleration_structure_elements
578+
.validate(
579+
limits.max_binding_array_acceleration_structure_elements_per_shader_stage,
580+
BindingTypeMaxCountErrorKind::BindingArrayAccelerationStructureElements,
581+
)?;
563582
self.acceleration_structures.validate(
564583
limits.max_acceleration_structures_per_shader_stage,
565584
BindingTypeMaxCountErrorKind::AccelerationStructures,

wgpu-hal/src/dx12/adapter.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -925,7 +925,12 @@ impl super::Adapter {
925925
} else {
926926
0
927927
},
928-
928+
max_binding_array_acceleration_structure_elements_per_shader_stage:
929+
if supports_ray_tracing {
930+
max_srv_count / 2
931+
} else {
932+
0
933+
},
929934
max_multiview_view_count,
930935
}),
931936
alignments: crate::Alignments {

wgpu-hal/src/gles/adapter.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -715,6 +715,7 @@ impl super::Adapter {
715715
max_uniform_buffers_per_shader_stage,
716716
max_binding_array_elements_per_shader_stage: 0,
717717
max_binding_array_sampler_elements_per_shader_stage: 0,
718+
max_binding_array_acceleration_structure_elements_per_shader_stage: 0,
718719
max_uniform_buffer_binding_size: unsafe {
719720
gl.get_parameter_i32(glow::MAX_UNIFORM_BLOCK_SIZE)
720721
} as u64,

wgpu-hal/src/metal/adapter.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1178,6 +1178,7 @@ impl super::PrivateCapabilities {
11781178
max_binding_array_elements_per_shader_stage: self.max_binding_array_elements,
11791179
max_binding_array_sampler_elements_per_shader_stage: self
11801180
.max_sampler_binding_array_elements,
1181+
max_binding_array_acceleration_structure_elements_per_shader_stage: 0,
11811182
// Note: any adjustment here will not be reflected in the stored `PrivateCapabilities`.
11821183
max_uniform_buffer_binding_size: self.max_buffer_size.min(!0u32 as u64),
11831184
max_storage_buffer_binding_size: self.max_buffer_size.min(!0u32 as u64)

wgpu-hal/src/noop/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ pub const CAPABILITIES: crate::Capabilities = {
179179
max_uniform_buffers_per_shader_stage: ALLOC_MAX_U32,
180180
max_binding_array_elements_per_shader_stage: ALLOC_MAX_U32,
181181
max_binding_array_sampler_elements_per_shader_stage: ALLOC_MAX_U32,
182+
max_binding_array_acceleration_structure_elements_per_shader_stage: ALLOC_MAX_U32,
182183
max_uniform_buffer_binding_size: ALLOC_MAX_U64,
183184
max_storage_buffer_binding_size: ALLOC_MAX_U64,
184185
max_vertex_buffers: ALLOC_MAX_U32,

wgpu-hal/src/vulkan/adapter.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1478,6 +1478,14 @@ impl PhysicalDeviceProperties {
14781478
max_uniform_buffers_per_shader_stage: limits.max_per_stage_descriptor_uniform_buffers,
14791479
max_binding_array_elements_per_shader_stage: max_binding_array_elements,
14801480
max_binding_array_sampler_elements_per_shader_stage: max_sampler_binding_array_elements,
1481+
max_binding_array_acceleration_structure_elements_per_shader_stage: if self
1482+
.descriptor_indexing
1483+
.is_some()
1484+
{
1485+
max_acceleration_structures_per_shader_stage
1486+
} else {
1487+
0
1488+
},
14811489
max_uniform_buffer_binding_size: limits
14821490
.max_uniform_buffer_range
14831491
.min(crate::auxil::MAX_I32_BINDING_SIZE)

wgpu-info/src/human.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ fn print_adapter(output: &mut impl io::Write, report: &AdapterReport, idx: usize
158158
max_uniform_buffers_per_shader_stage,
159159
max_binding_array_elements_per_shader_stage,
160160
max_binding_array_sampler_elements_per_shader_stage,
161+
max_binding_array_acceleration_structure_elements_per_shader_stage,
161162
max_uniform_buffer_binding_size,
162163
max_storage_buffer_binding_size,
163164
max_vertex_buffers,
@@ -212,6 +213,7 @@ fn print_adapter(output: &mut impl io::Write, report: &AdapterReport, idx: usize
212213
writeln!(output, "\t\t Max Uniform Buffers Per Shader Stage: {max_uniform_buffers_per_shader_stage}")?;
213214
writeln!(output, "\t\t Max Binding Array Elements Per Shader Stage: {max_binding_array_elements_per_shader_stage}")?;
214215
writeln!(output, "\t\tMax Binding Array Sampler Elements Per Shader Stage: {max_binding_array_sampler_elements_per_shader_stage}")?;
216+
writeln!(output, "\t\t Max Binding Array AS Elements Per Shader Stage: {max_binding_array_acceleration_structure_elements_per_shader_stage}")?;
215217
writeln!(output, "\t\t Max Uniform Buffer Binding Size: {max_uniform_buffer_binding_size}")?;
216218
writeln!(output, "\t\t Max Storage Buffer Binding Size: {max_storage_buffer_binding_size}")?;
217219
writeln!(output, "\t\t Max Buffer Size: {max_buffer_size}")?;

wgpu-types/src/limits.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ macro_rules! with_limits {
3838
$macro_name!(max_storage_textures_per_shader_stage, Ordering::Less);
3939
$macro_name!(max_uniform_buffers_per_shader_stage, Ordering::Less);
4040
$macro_name!(max_binding_array_elements_per_shader_stage, Ordering::Less);
41+
$macro_name!(
42+
max_binding_array_acceleration_structure_elements_per_shader_stage,
43+
Ordering::Less
44+
);
4145
$macro_name!(max_uniform_buffer_binding_size, Ordering::Less);
4246
$macro_name!(max_storage_buffer_binding_size, Ordering::Less);
4347
$macro_name!(max_vertex_buffers, Ordering::Less);
@@ -155,6 +159,10 @@ pub struct Limits {
155159
///
156160
/// This "defaults" to 0. However if binding arrays are supported, all devices can support 500,000. Higher is "better".
157161
pub max_binding_array_elements_per_shader_stage: u32,
162+
/// Amount of individual acceleration structures within binding arrays that can be accessed in a single shader stage.
163+
///
164+
/// This "defaults" to 0. Higher is "better".
165+
pub max_binding_array_acceleration_structure_elements_per_shader_stage: u32,
158166
/// Amount of individual samplers within binding arrays that can be accessed in a single shader stage.
159167
///
160168
/// This "defaults" to 0. However if binding arrays are supported, all devices can support 1,000. Higher is "better".
@@ -318,6 +326,7 @@ impl Limits {
318326
/// max_storage_textures_per_shader_stage: 4,
319327
/// max_uniform_buffers_per_shader_stage: 12,
320328
/// max_binding_array_elements_per_shader_stage: 0,
329+
/// max_binding_array_acceleration_structure_elements_per_shader_stage: 0,
321330
/// max_binding_array_sampler_elements_per_shader_stage: 0,
322331
/// max_uniform_buffer_binding_size: 64 << 10, // (64 KiB)
323332
/// max_storage_buffer_binding_size: 128 << 20, // (128 MiB)
@@ -376,6 +385,7 @@ impl Limits {
376385
max_storage_textures_per_shader_stage: 4,
377386
max_uniform_buffers_per_shader_stage: 12,
378387
max_binding_array_elements_per_shader_stage: 0,
388+
max_binding_array_acceleration_structure_elements_per_shader_stage: 0,
379389
max_binding_array_sampler_elements_per_shader_stage: 0,
380390
max_uniform_buffer_binding_size: 64 << 10, // (64 KiB)
381391
max_storage_buffer_binding_size: 128 << 20, // (128 MiB)
@@ -438,6 +448,7 @@ impl Limits {
438448
/// max_storage_textures_per_shader_stage: 4,
439449
/// max_uniform_buffers_per_shader_stage: 12,
440450
/// max_binding_array_elements_per_shader_stage: 0,
451+
/// max_binding_array_acceleration_structure_elements_per_shader_stage: 0,
441452
/// max_binding_array_sampler_elements_per_shader_stage: 0,
442453
/// max_uniform_buffer_binding_size: 16 << 10, // * (16 KiB)
443454
/// max_storage_buffer_binding_size: 128 << 20, // (128 MiB)
@@ -516,6 +527,7 @@ impl Limits {
516527
/// max_storage_textures_per_shader_stage: 0, // +
517528
/// max_uniform_buffers_per_shader_stage: 11, // +
518529
/// max_binding_array_elements_per_shader_stage: 0,
530+
/// max_binding_array_acceleration_structure_elements_per_shader_stage: 0,
519531
/// max_binding_array_sampler_elements_per_shader_stage: 0,
520532
/// max_uniform_buffer_binding_size: 16 << 10, // * (16 KiB)
521533
/// max_storage_buffer_binding_size: 0, // * +

wgpu/src/backend/webgpu.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -804,6 +804,7 @@ fn map_wgt_limits(limits: webgpu_sys::GpuSupportedLimits) -> wgt::Limits {
804804
max_uniform_buffers_per_shader_stage: limits.max_uniform_buffers_per_shader_stage(),
805805
max_binding_array_elements_per_shader_stage: 0,
806806
max_binding_array_sampler_elements_per_shader_stage: 0,
807+
max_binding_array_acceleration_structure_elements_per_shader_stage: 0,
807808
max_uniform_buffer_binding_size: limits.max_uniform_buffer_binding_size() as u64,
808809
max_storage_buffer_binding_size: limits.max_storage_buffer_binding_size() as u64,
809810
max_vertex_buffers: limits.max_vertex_buffers(),

0 commit comments

Comments
 (0)