Skip to content

Commit 8b84f2e

Browse files
feat(core): add Limits::max_storage_{buffers,textures}_in_{vertex,fragment}_stage
1 parent 168afa1 commit 8b84f2e

9 files changed

Lines changed: 135 additions & 4 deletions

File tree

wgpu-core/src/instance.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1700,6 +1700,51 @@ fn filter_features_and_limits(
17001700
*features &= wgt::Features::all_webgpu_mask() | limits::EXEMPT_FEATURES;
17011701
limits.zero_native_only();
17021702
}
1703+
1704+
// The next steps are from <https://www.w3.org/TR/webgpu/#a-new-device>.
1705+
1706+
// > 7. Set `limits.maxStorageBuffersPerShaderStage` to
1707+
// > `max(limits.maxStorageBuffersPerShaderStage, limits.maxStorageBuffersInVertexStage,
1708+
// > limits.maxStorageBuffersInFragmentStage)`.
1709+
1710+
limits.max_storage_buffers_per_shader_stage = [
1711+
limits.max_storage_buffers_per_shader_stage,
1712+
limits.max_storage_buffers_in_vertex_stage,
1713+
limits.max_storage_buffers_in_fragment_stage,
1714+
]
1715+
.into_iter()
1716+
.max()
1717+
.unwrap();
1718+
1719+
// > 8. Set `limits.maxStorageTexturesPerShaderStage` to
1720+
// > `max(limits.maxStorageTexturesPerShaderStage, limits.maxStorageTexturesInVertexStage,
1721+
// > limits.maxStorageTexturesInFragmentStage)`.
1722+
1723+
limits.max_storage_textures_per_shader_stage = [
1724+
limits.max_storage_textures_per_shader_stage,
1725+
limits.max_storage_textures_in_vertex_stage,
1726+
limits.max_storage_textures_in_fragment_stage,
1727+
]
1728+
.into_iter()
1729+
.max()
1730+
.unwrap();
1731+
1732+
// > 9. If features contains "core-features-and-limits":
1733+
//
1734+
// NOTE: We don't implement compat (yet?), so we do this unconditionally. See also:
1735+
// <https://github.com/gfx-rs/wgpu/issues/8124>
1736+
1737+
// > 1. Set `limits.maxStorageBuffersInVertexStage` and
1738+
// > `limits.maxStorageBuffersInFragmentStage` to
1739+
// > `limits.maxStorageBuffersPerShaderStage`.
1740+
limits.max_storage_buffers_in_vertex_stage = limits.max_storage_buffers_per_shader_stage;
1741+
limits.max_storage_buffers_in_fragment_stage = limits.max_storage_buffers_per_shader_stage;
1742+
1743+
// > 2. Set `limits.maxStorageTexturesInVertexStage` and
1744+
// > `limits.maxStorageTexturesInFragmentStage` to
1745+
// > `limits.maxStorageTexturesPerShaderStage`.
1746+
limits.max_storage_textures_in_vertex_stage = limits.max_storage_textures_per_shader_stage;
1747+
limits.max_storage_textures_in_fragment_stage = limits.max_storage_textures_per_shader_stage;
17031748
}
17041749

17051750
#[cfg(test)]

wgpu-core/src/limits.rs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -308,12 +308,12 @@ const UPLEVEL: Bucket = Bucket {
308308
// use default max_sampled_textures_per_shader_stage
309309
// use default max_samplers_per_shader_stage
310310
// use default max_storage_buffer_binding_size
311-
// wgpu does not implement max_storage_buffers_in_fragment_stage: 8,
312-
// wgpu does not implement max_storage_buffers_in_vertex_stage: 8,
313311
// use default max_storage_buffers_per_shader_stage
314-
// wgpu does not implement max_storage_textures_in_fragment_stage: 8,
315-
// wgpu does not implement max_storage_textures_in_vertex_stage: 8,
312+
// use default max_storage_buffers_in_vertex_stage
313+
// use default max_storage_buffers_in_fragment_stage
316314
max_storage_textures_per_shader_stage: 8,
315+
// use default max_storage_textures_in_vertex_stage
316+
// use default max_storage_textures_in_fragment_stage
317317
max_texture_array_layers: 2048,
318318
max_texture_dimension_1d: 16384,
319319
max_texture_dimension_2d: 16384,
@@ -363,6 +363,8 @@ const BUCKET_M1: Bucket = Bucket {
363363
max_sampled_textures_per_shader_stage: 48,
364364
max_storage_buffer_binding_size: 1 << 30, // 1 GB,
365365
max_storage_buffers_per_shader_stage: 9,
366+
max_storage_buffers_in_vertex_stage: 9,
367+
max_storage_buffers_in_fragment_stage: 9,
366368
max_vertex_attributes: 31,
367369
..UPLEVEL.limits
368370
},
@@ -389,6 +391,8 @@ const BUCKET_A2: Bucket = Bucket {
389391
max_sampled_textures_per_shader_stage: 48,
390392
max_storage_buffer_binding_size: 1 << 30, // 1 GB,
391393
max_storage_buffers_per_shader_stage: 16,
394+
max_storage_buffers_in_vertex_stage: 16,
395+
max_storage_buffers_in_fragment_stage: 16,
392396
max_vertex_attributes: 30,
393397
..UPLEVEL.limits
394398
},
@@ -408,6 +412,8 @@ const BUCKET_I1: Bucket = Bucket {
408412
max_sampled_textures_per_shader_stage: 48,
409413
max_storage_buffer_binding_size: 1 << 29, // 512 MB,
410414
max_storage_buffers_per_shader_stage: 16,
415+
max_storage_buffers_in_vertex_stage: 16,
416+
max_storage_buffers_in_fragment_stage: 16,
411417
..UPLEVEL.limits
412418
},
413419
info: BucketedAdapterInfo {
@@ -427,6 +433,8 @@ const BUCKET_N1: Bucket = Bucket {
427433
max_sampled_textures_per_shader_stage: 48,
428434
max_storage_buffer_binding_size: 1 << 30, // 1 GB,
429435
max_storage_buffers_per_shader_stage: 16,
436+
max_storage_buffers_in_vertex_stage: 16,
437+
max_storage_buffers_in_fragment_stage: 16,
430438
max_vertex_attributes: 30,
431439
..UPLEVEL.limits
432440
},
@@ -446,6 +454,8 @@ const BUCKET_A1: Bucket = Bucket {
446454
max_sampled_textures_per_shader_stage: 48,
447455
max_storage_buffer_binding_size: 1 << 30, // 1 GB,
448456
max_storage_buffers_per_shader_stage: 16,
457+
max_storage_buffers_in_vertex_stage: 16,
458+
max_storage_buffers_in_fragment_stage: 16,
449459
max_vertex_attributes: 30,
450460
..UPLEVEL.limits
451461
},
@@ -466,6 +476,8 @@ const BUCKET_NO_F16: Bucket = Bucket {
466476
max_sampled_textures_per_shader_stage: 48,
467477
max_storage_buffer_binding_size: 1 << 30, // 1 GB
468478
max_storage_buffers_per_shader_stage: 16,
479+
max_storage_buffers_in_vertex_stage: 16,
480+
max_storage_buffers_in_fragment_stage: 16,
469481
max_vertex_attributes: 30,
470482
..UPLEVEL.limits
471483
},
@@ -483,6 +495,8 @@ const BUCKET_LLVMPIPE: Bucket = Bucket {
483495
max_color_attachment_bytes_per_sample: 128,
484496
max_sampled_textures_per_shader_stage: 48,
485497
max_storage_buffers_per_shader_stage: 16,
498+
max_storage_buffers_in_vertex_stage: 16,
499+
max_storage_buffers_in_fragment_stage: 16,
486500
max_vertex_attributes: 32,
487501
..UPLEVEL.limits
488502
},
@@ -504,6 +518,8 @@ const BUCKET_WARP: Bucket = Bucket {
504518
max_color_attachment_bytes_per_sample: 128,
505519
max_sampled_textures_per_shader_stage: 48,
506520
max_storage_buffers_per_shader_stage: 16,
521+
max_storage_buffers_in_vertex_stage: 16,
522+
max_storage_buffers_in_fragment_stage: 16,
507523
max_vertex_attributes: 30,
508524
..UPLEVEL.limits
509525
},

wgpu-hal/src/dx12/adapter.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -906,7 +906,11 @@ impl super::Adapter {
906906
max_sampled_textures_per_shader_stage,
907907
max_samplers_per_shader_stage,
908908
max_storage_buffers_per_shader_stage,
909+
max_storage_buffers_in_vertex_stage: max_storage_buffers_per_shader_stage,
910+
max_storage_buffers_in_fragment_stage: max_storage_buffers_per_shader_stage,
909911
max_storage_textures_per_shader_stage,
912+
max_storage_textures_in_vertex_stage: max_storage_textures_per_shader_stage,
913+
max_storage_textures_in_fragment_stage: max_storage_textures_per_shader_stage,
910914
max_uniform_buffers_per_shader_stage,
911915
// See `InputSlot` param docs: https://learn.microsoft.com/en-ca/windows/win32/api/d3d12/ns-d3d12-d3d12_input_element_desc
912916
max_vertex_buffers: 16,

wgpu-hal/src/gles/adapter.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -784,7 +784,11 @@ impl super::Adapter {
784784
max_sampled_textures_per_shader_stage: super::MAX_TEXTURE_SLOTS as u32,
785785
max_samplers_per_shader_stage: super::MAX_SAMPLERS as u32,
786786
max_storage_buffers_per_shader_stage,
787+
max_storage_buffers_in_vertex_stage: max_storage_buffers_per_shader_stage,
788+
max_storage_buffers_in_fragment_stage: max_storage_buffers_per_shader_stage,
787789
max_storage_textures_per_shader_stage,
790+
max_storage_textures_in_vertex_stage: max_storage_textures_per_shader_stage,
791+
max_storage_textures_in_fragment_stage: max_storage_textures_per_shader_stage,
788792
max_uniform_buffers_per_shader_stage,
789793
max_binding_array_elements_per_shader_stage: 0,
790794
max_binding_array_sampler_elements_per_shader_stage: 0,

wgpu-hal/src/metal/adapter.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1424,7 +1424,11 @@ impl super::CapabilitiesQuery {
14241424
max_samplers_per_shader_stage: 16,
14251425
max_sampled_textures_per_shader_stage,
14261426
max_storage_buffers_per_shader_stage,
1427+
max_storage_buffers_in_vertex_stage: max_storage_buffers_per_shader_stage,
1428+
max_storage_buffers_in_fragment_stage: max_storage_buffers_per_shader_stage,
14271429
max_storage_textures_per_shader_stage,
1430+
max_storage_textures_in_vertex_stage: max_storage_textures_per_shader_stage,
1431+
max_storage_textures_in_fragment_stage: max_storage_textures_per_shader_stage,
14281432
max_uniform_buffers_per_shader_stage,
14291433
max_vertex_buffers,
14301434
max_buffer_size: self.max_buffer_size,

wgpu-hal/src/vulkan/adapter.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1712,7 +1712,11 @@ impl PhysicalDeviceProperties {
17121712
max_samplers_per_shader_stage,
17131713
max_sampled_textures_per_shader_stage,
17141714
max_storage_buffers_per_shader_stage,
1715+
max_storage_buffers_in_vertex_stage: max_storage_buffers_per_shader_stage,
1716+
max_storage_buffers_in_fragment_stage: max_storage_buffers_per_shader_stage,
17151717
max_storage_textures_per_shader_stage,
1718+
max_storage_textures_in_vertex_stage: max_storage_textures_per_shader_stage,
1719+
max_storage_textures_in_fragment_stage: max_storage_textures_per_shader_stage,
17161720
max_uniform_buffers_per_shader_stage,
17171721
max_vertex_buffers: limits.max_vertex_input_bindings,
17181722
max_buffer_size,

wgpu-info/src/human.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,11 @@ fn print_adapter(output: &mut impl io::Write, report: &AdapterReport, idx: usize
158158
max_sampled_textures_per_shader_stage,
159159
max_samplers_per_shader_stage,
160160
max_storage_buffers_per_shader_stage,
161+
max_storage_buffers_in_vertex_stage,
162+
max_storage_buffers_in_fragment_stage,
161163
max_storage_textures_per_shader_stage,
164+
max_storage_textures_in_vertex_stage,
165+
max_storage_textures_in_fragment_stage,
162166
max_uniform_buffers_per_shader_stage,
163167
max_binding_array_elements_per_shader_stage,
164168
max_binding_array_sampler_elements_per_shader_stage,
@@ -220,7 +224,11 @@ fn print_adapter(output: &mut impl io::Write, report: &AdapterReport, idx: usize
220224
writeln!(output, "\t\t Max Sampled Textures Per Shader Stage: {max_sampled_textures_per_shader_stage}")?;
221225
writeln!(output, "\t\t Max Samplers Per Shader Stage: {max_samplers_per_shader_stage}")?;
222226
writeln!(output, "\t\t Max Storage Buffers Per Shader Stage: {max_storage_buffers_per_shader_stage}")?;
227+
writeln!(output, "\t\t Max Storage Buffers In Vertex Stage: {max_storage_buffers_in_vertex_stage}")?;
228+
writeln!(output, "\t\t Max Storage Buffers In Fragment Stage: {max_storage_buffers_in_fragment_stage}")?;
223229
writeln!(output, "\t\t Max Storage Textures Per Shader Stage: {max_storage_textures_per_shader_stage}")?;
230+
writeln!(output, "\t\t Max Storage Textures In Vertex Stage: {max_storage_textures_in_vertex_stage}")?;
231+
writeln!(output, "\t\t Max Storage Textures In Fragment Stage: {max_storage_textures_in_fragment_stage}")?;
224232
writeln!(output, "\t\t Max Uniform Buffers Per Shader Stage: {max_uniform_buffers_per_shader_stage}")?;
225233
writeln!(output, "\t\t Max Binding Array Elements Per Shader Stage: {max_binding_array_elements_per_shader_stage}")?;
226234
writeln!(output, "\t\tMax Binding Array Sampler Elements Per Shader Stage: {max_binding_array_sampler_elements_per_shader_stage}")?;

wgpu-types/src/limits.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,11 @@ macro_rules! with_limits {
3535
$macro_name!(max_sampled_textures_per_shader_stage, Ordering::Less);
3636
$macro_name!(max_samplers_per_shader_stage, Ordering::Less);
3737
$macro_name!(max_storage_buffers_per_shader_stage, Ordering::Less);
38+
$macro_name!(max_storage_buffers_in_vertex_stage, Ordering::Less);
39+
$macro_name!(max_storage_buffers_in_fragment_stage, Ordering::Less);
3840
$macro_name!(max_storage_textures_per_shader_stage, Ordering::Less);
41+
$macro_name!(max_storage_textures_in_vertex_stage, Ordering::Less);
42+
$macro_name!(max_storage_textures_in_fragment_stage, Ordering::Less);
3943
$macro_name!(max_uniform_buffers_per_shader_stage, Ordering::Less);
4044
$macro_name!(max_binding_array_elements_per_shader_stage, Ordering::Less);
4145
$macro_name!(
@@ -169,8 +173,16 @@ pub struct Limits {
169173
pub max_samplers_per_shader_stage: u32,
170174
/// Amount of storage buffers visible in a single shader stage. Defaults to 8. Higher is "better".
171175
pub max_storage_buffers_per_shader_stage: u32,
176+
/// Amount of storage buffers visible in a vertex shader stage. Defaults to 8. Higher is "better".
177+
pub max_storage_buffers_in_vertex_stage: u32,
178+
/// Amount of storage buffers visible in a fragment shader stage. Defaults to 8. Higher is "better".
179+
pub max_storage_buffers_in_fragment_stage: u32,
172180
/// Amount of storage textures visible in a single shader stage. Defaults to 4. Higher is "better".
173181
pub max_storage_textures_per_shader_stage: u32,
182+
/// Amount of storage textures visible in a vertex shader stage. Defaults to 4. Higher is "better".
183+
pub max_storage_textures_in_vertex_stage: u32,
184+
/// Amount of storage textures visible in a fragment shader stage. Defaults to 4. Higher is "better".
185+
pub max_storage_textures_in_fragment_stage: u32,
174186
/// Amount of uniform buffers visible in a single shader stage. Defaults to 12. Higher is "better".
175187
pub max_uniform_buffers_per_shader_stage: u32,
176188
/// Amount of individual resources within binding arrays that can be accessed in a single shader stage. Applies
@@ -367,7 +379,11 @@ impl Limits {
367379
/// max_sampled_textures_per_shader_stage: 16,
368380
/// max_samplers_per_shader_stage: 16,
369381
/// max_storage_buffers_per_shader_stage: 8,
382+
/// max_storage_buffers_in_vertex_stage: 8,
383+
/// max_storage_buffers_in_fragment_stage: 8,
370384
/// max_storage_textures_per_shader_stage: 4,
385+
/// max_storage_textures_in_vertex_stage: 4,
386+
/// max_storage_textures_in_fragment_stage: 4,
371387
/// max_uniform_buffers_per_shader_stage: 12,
372388
/// max_binding_array_elements_per_shader_stage: 0,
373389
/// max_binding_array_acceleration_structure_elements_per_shader_stage: 0,
@@ -432,7 +448,11 @@ impl Limits {
432448
max_sampled_textures_per_shader_stage: 16,
433449
max_samplers_per_shader_stage: 16,
434450
max_storage_buffers_per_shader_stage: 8,
451+
max_storage_buffers_in_vertex_stage: 8,
452+
max_storage_buffers_in_fragment_stage: 8,
435453
max_storage_textures_per_shader_stage: 4,
454+
max_storage_textures_in_vertex_stage: 4,
455+
max_storage_textures_in_fragment_stage: 4,
436456
max_uniform_buffers_per_shader_stage: 12,
437457
max_binding_array_elements_per_shader_stage: 0,
438458
max_binding_array_acceleration_structure_elements_per_shader_stage: 0,
@@ -502,7 +522,11 @@ impl Limits {
502522
/// max_sampled_textures_per_shader_stage: 16,
503523
/// max_samplers_per_shader_stage: 16,
504524
/// max_storage_buffers_per_shader_stage: 4, // *
525+
/// max_storage_buffers_in_vertex_stage: 4, // *
526+
/// max_storage_buffers_in_fragment_stage: 4, // *
505527
/// max_storage_textures_per_shader_stage: 4,
528+
/// max_storage_textures_in_vertex_stage: 4,
529+
/// max_storage_textures_in_fragment_stage: 4,
506530
/// max_uniform_buffers_per_shader_stage: 12,
507531
/// max_binding_array_elements_per_shader_stage: 0,
508532
/// max_binding_array_acceleration_structure_elements_per_shader_stage: 0,
@@ -560,6 +584,8 @@ impl Limits {
560584
max_texture_dimension_2d: 2048,
561585
max_texture_dimension_3d: 256,
562586
max_storage_buffers_per_shader_stage: 4,
587+
max_storage_buffers_in_vertex_stage: 4,
588+
max_storage_buffers_in_fragment_stage: 4,
563589
max_uniform_buffer_binding_size: 16 << 10, // (16 KiB)
564590
max_inter_stage_shader_variables: 15,
565591
max_color_attachments: 4,
@@ -589,7 +615,11 @@ impl Limits {
589615
/// max_sampled_textures_per_shader_stage: 16,
590616
/// max_samplers_per_shader_stage: 16,
591617
/// max_storage_buffers_per_shader_stage: 0, // * +
618+
/// max_storage_buffers_in_vertex_stage: 0, // * +
619+
/// max_storage_buffers_in_fragment_stage: 0, // * +
592620
/// max_storage_textures_per_shader_stage: 0, // +
621+
/// max_storage_textures_in_vertex_stage: 0, // +
622+
/// max_storage_textures_in_fragment_stage: 0, // +
593623
/// max_uniform_buffers_per_shader_stage: 11, // +
594624
/// max_binding_array_elements_per_shader_stage: 0,
595625
/// max_binding_array_acceleration_structure_elements_per_shader_stage: 0,
@@ -645,7 +675,11 @@ impl Limits {
645675
Self {
646676
max_uniform_buffers_per_shader_stage: 11,
647677
max_storage_buffers_per_shader_stage: 0,
678+
max_storage_buffers_in_vertex_stage: 0,
679+
max_storage_buffers_in_fragment_stage: 0,
648680
max_storage_textures_per_shader_stage: 0,
681+
max_storage_textures_in_vertex_stage: 0,
682+
max_storage_textures_in_fragment_stage: 0,
649683
max_dynamic_storage_buffers_per_pipeline_layout: 0,
650684
max_storage_buffer_binding_size: 0,
651685
max_vertex_buffer_array_stride: 255,
@@ -693,7 +727,11 @@ impl Limits {
693727
max_sampled_textures_per_shader_stage: ALLOC_MAX_U32,
694728
max_samplers_per_shader_stage: ALLOC_MAX_U32,
695729
max_storage_buffers_per_shader_stage: ALLOC_MAX_U32,
730+
max_storage_buffers_in_vertex_stage: ALLOC_MAX_U32,
731+
max_storage_buffers_in_fragment_stage: ALLOC_MAX_U32,
696732
max_storage_textures_per_shader_stage: ALLOC_MAX_U32,
733+
max_storage_textures_in_vertex_stage: ALLOC_MAX_U32,
734+
max_storage_textures_in_fragment_stage: ALLOC_MAX_U32,
697735
max_uniform_buffers_per_shader_stage: ALLOC_MAX_U32,
698736
max_binding_array_elements_per_shader_stage: ALLOC_MAX_U32,
699737
max_binding_array_sampler_elements_per_shader_stage: ALLOC_MAX_U32,
@@ -961,7 +999,11 @@ impl Limits {
961999
max_sampled_textures_per_shader_stage: _,
9621000
max_samplers_per_shader_stage: _,
9631001
max_storage_buffers_per_shader_stage: _,
1002+
max_storage_buffers_in_vertex_stage: _,
1003+
max_storage_buffers_in_fragment_stage: _,
9641004
max_storage_textures_per_shader_stage: _,
1005+
max_storage_textures_in_vertex_stage: _,
1006+
max_storage_textures_in_fragment_stage: _,
9651007
max_uniform_buffers_per_shader_stage: _,
9661008
max_uniform_buffer_binding_size: _,
9671009
max_storage_buffer_binding_size: _,

wgpu/src/backend/webgpu.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -859,7 +859,11 @@ fn map_wgt_limits(limits: webgpu_sys::GpuSupportedLimits) -> wgt::Limits {
859859
max_sampled_textures_per_shader_stage: limits.max_sampled_textures_per_shader_stage(),
860860
max_samplers_per_shader_stage: limits.max_samplers_per_shader_stage(),
861861
max_storage_buffers_per_shader_stage: limits.max_storage_buffers_per_shader_stage(),
862+
max_storage_buffers_in_vertex_stage: limits.max_storage_buffers_in_vertex_stage(),
863+
max_storage_buffers_in_fragment_stage: limits.max_storage_buffers_in_fragment_stage(),
862864
max_storage_textures_per_shader_stage: limits.max_storage_textures_per_shader_stage(),
865+
max_storage_textures_in_vertex_stage: limits.max_storage_textures_in_vertex_stage(),
866+
max_storage_textures_in_fragment_stage: limits.max_storage_textures_in_fragment_stage(),
863867
max_uniform_buffers_per_shader_stage: limits.max_uniform_buffers_per_shader_stage(),
864868
max_binding_array_elements_per_shader_stage: 0,
865869
max_binding_array_sampler_elements_per_shader_stage: 0,

0 commit comments

Comments
 (0)