Skip to content

Commit ec2df3a

Browse files
committed
Add max_binding_array_acceleration_structure_elements_per_shader_stage limit
1 parent 760032a commit ec2df3a

File tree

9 files changed

+55
-3
lines changed

9 files changed

+55
-3
lines changed

wgpu-core/src/binding_model.rs

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

@@ -355,6 +356,9 @@ impl BindingTypeMaxCountErrorKind {
355356
BindingTypeMaxCountErrorKind::BindingArraySamplerElements => {
356357
"max_binding_array_sampler_elements_per_shader_stage"
357358
}
359+
BindingTypeMaxCountErrorKind::BindingArrayAccelerationStructureElements => {
360+
"max_binding_array_acceleration_structure_elements_per_shader_stage"
361+
}
358362
BindingTypeMaxCountErrorKind::AccelerationStructures => {
359363
"max_acceleration_structures_per_shader_stage"
360364
}
@@ -434,6 +438,7 @@ pub(crate) struct BindingTypeMaxCountValidator {
434438
acceleration_structures: PerStageBindingTypeCounter,
435439
binding_array_elements: PerStageBindingTypeCounter,
436440
binding_array_sampler_elements: PerStageBindingTypeCounter,
441+
binding_array_acceleration_structure_elements: PerStageBindingTypeCounter,
437442
has_bindless_array: bool,
438443
}
439444

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

448-
if let wgt::BindingType::Sampler(_) = binding.ty {
449-
self.binding_array_sampler_elements
450-
.add(binding.visibility, count);
453+
match binding.ty {
454+
wgt::BindingType::Sampler(_) => {
455+
self.binding_array_sampler_elements
456+
.add(binding.visibility, count);
457+
}
458+
wgt::BindingType::AccelerationStructure { .. } => {
459+
self.binding_array_acceleration_structure_elements
460+
.add(binding.visibility, count);
461+
}
462+
_ => {}
451463
}
452464
} else {
453465
match binding.ty {
@@ -514,6 +526,8 @@ impl BindingTypeMaxCountValidator {
514526
.merge(&other.binding_array_elements);
515527
self.binding_array_sampler_elements
516528
.merge(&other.binding_array_sampler_elements);
529+
self.binding_array_acceleration_structure_elements
530+
.merge(&other.binding_array_acceleration_structure_elements);
517531
}
518532

519533
pub(crate) fn validate(&self, limits: &wgt::Limits) -> Result<(), BindingTypeMaxCountError> {
@@ -561,6 +575,11 @@ impl BindingTypeMaxCountValidator {
561575
limits.max_binding_array_sampler_elements_per_shader_stage,
562576
BindingTypeMaxCountErrorKind::BindingArraySamplerElements,
563577
)?;
578+
self.binding_array_acceleration_structure_elements
579+
.validate(
580+
limits.max_binding_array_acceleration_structure_elements_per_shader_stage,
581+
BindingTypeMaxCountErrorKind::BindingArrayAccelerationStructureElements,
582+
)?;
564583
self.acceleration_structures.validate(
565584
limits.max_acceleration_structures_per_shader_stage,
566585
BindingTypeMaxCountErrorKind::AccelerationStructures,

wgpu-hal/src/dx12/adapter.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -809,6 +809,7 @@ impl super::Adapter {
809809
max_uniform_buffers_per_shader_stage: full_heap_count,
810810
max_binding_array_elements_per_shader_stage: full_heap_count,
811811
max_binding_array_sampler_elements_per_shader_stage: full_heap_count,
812+
max_binding_array_acceleration_structure_elements_per_shader_stage: 0,
812813
max_uniform_buffer_binding_size:
813814
Direct3D12::D3D12_REQ_CONSTANT_BUFFER_ELEMENT_COUNT * 16,
814815
max_storage_buffer_binding_size: auxil::MAX_I32_BINDING_SIZE,
@@ -915,6 +916,12 @@ impl super::Adapter {
915916
} else {
916917
0
917918
},
919+
max_binding_array_acceleration_structure_elements_per_shader_stage:
920+
if supports_ray_tracing {
921+
max_srv_count / 2
922+
} else {
923+
0
924+
},
918925

919926
max_multiview_view_count,
920927
}),

wgpu-hal/src/gles/adapter.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -705,6 +705,7 @@ impl super::Adapter {
705705
max_uniform_buffers_per_shader_stage,
706706
max_binding_array_elements_per_shader_stage: 0,
707707
max_binding_array_sampler_elements_per_shader_stage: 0,
708+
max_binding_array_acceleration_structure_elements_per_shader_stage: 0,
708709
max_uniform_buffer_binding_size: unsafe {
709710
gl.get_parameter_i32(glow::MAX_UNIFORM_BLOCK_SIZE)
710711
} as u32,

wgpu-hal/src/metal/adapter.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1188,6 +1188,7 @@ impl super::PrivateCapabilities {
11881188
max_binding_array_elements_per_shader_stage: self.max_binding_array_elements,
11891189
max_binding_array_sampler_elements_per_shader_stage: self
11901190
.max_sampler_binding_array_elements,
1191+
max_binding_array_acceleration_structure_elements_per_shader_stage: 0,
11911192
// Note: any adjustment here will not be reflected in the stored `PrivateCapabilities`.
11921193
max_uniform_buffer_binding_size: self.max_buffer_size.min(!0u32 as u64) as u32,
11931194
max_storage_buffer_binding_size: self.max_buffer_size.min(!0u32 as u64) as u32

wgpu-hal/src/noop/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ pub const CAPABILITIES: crate::Capabilities = {
176176
max_uniform_buffers_per_shader_stage: ALLOC_MAX_U32,
177177
max_binding_array_elements_per_shader_stage: ALLOC_MAX_U32,
178178
max_binding_array_sampler_elements_per_shader_stage: ALLOC_MAX_U32,
179+
max_binding_array_acceleration_structure_elements_per_shader_stage: ALLOC_MAX_U32,
179180
max_uniform_buffer_binding_size: ALLOC_MAX_U32,
180181
max_storage_buffer_binding_size: ALLOC_MAX_U32,
181182
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
@@ -1449,6 +1449,14 @@ impl PhysicalDeviceProperties {
14491449
max_uniform_buffers_per_shader_stage: limits.max_per_stage_descriptor_uniform_buffers,
14501450
max_binding_array_elements_per_shader_stage: max_binding_array_elements,
14511451
max_binding_array_sampler_elements_per_shader_stage: max_sampler_binding_array_elements,
1452+
max_binding_array_acceleration_structure_elements_per_shader_stage: if self
1453+
.descriptor_indexing
1454+
.is_some()
1455+
{
1456+
max_acceleration_structures_per_shader_stage
1457+
} else {
1458+
0
1459+
},
14521460
max_uniform_buffer_binding_size: limits
14531461
.max_uniform_buffer_range
14541462
.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
@@ -802,6 +802,7 @@ fn map_wgt_limits(limits: webgpu_sys::GpuSupportedLimits) -> wgt::Limits {
802802
max_uniform_buffers_per_shader_stage: limits.max_uniform_buffers_per_shader_stage(),
803803
max_binding_array_elements_per_shader_stage: 0,
804804
max_binding_array_sampler_elements_per_shader_stage: 0,
805+
max_binding_array_acceleration_structure_elements_per_shader_stage: 0,
805806
max_uniform_buffer_binding_size: limits.max_uniform_buffer_binding_size() as u32,
806807
max_storage_buffer_binding_size: limits.max_storage_buffer_binding_size() as u32,
807808
max_vertex_buffers: limits.max_vertex_buffers(),

0 commit comments

Comments
 (0)