Skip to content

Commit 9a41de4

Browse files
cwfitzgeraldJMS55
andauthored
Move subgroup size info to AdapterInfo (#8609)
Co-authored-by: JMS55 <47158642+JMS55@users.noreply.github.com>
1 parent 57a6cc1 commit 9a41de4

File tree

16 files changed

+122
-89
lines changed

16 files changed

+122
-89
lines changed

CHANGELOG.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,23 @@ event happens. Our new log policy is as follows:
140140

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

143+
#### `subgroup_{min,max}_size` renamed and moved from `Limits` -> `AdapterInfo`
144+
145+
To bring our code in line with the WebGPU spec, we have moved information about subgroup size
146+
from limits to adapter info. Limits was not the correct place for this anyway, and we had some
147+
code special casing those limits.
148+
149+
Additionally we have renamed the fields to match the spec.
150+
151+
```diff
152+
- let min = limits.min_subgroup_size;
153+
+ let min = info.subgroup_min_size;
154+
- let max = limits.max_subgroup_size;
155+
+ let max = info.subgroup_max_size;
156+
```
157+
158+
By @cwfitzgerald in [#8609](https://github.com/gfx-rs/wgpu/pull/8609).
159+
143160
### New Features
144161

145162
- Added support for transient textures on Vulkan and Metal. By @opstic in [#8247](https://github.com/gfx-rs/wgpu/pull/8247)

deno_webgpu/adapter.rs

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,8 @@ impl GPUAdapter {
8080
fn info(&self, scope: &mut v8::HandleScope) -> v8::Global<v8::Object> {
8181
self.info.get(scope, |_| {
8282
let info = self.instance.adapter_get_info(self.id);
83-
let limits = self.instance.adapter_limits(self.id);
8483

85-
GPUAdapterInfo {
86-
info,
87-
subgroup_min_size: limits.min_subgroup_size,
88-
subgroup_max_size: limits.max_subgroup_size,
89-
}
84+
GPUAdapterInfo { info }
9085
})
9186
}
9287

@@ -429,8 +424,6 @@ impl GPUSupportedFeatures {
429424

430425
pub struct GPUAdapterInfo {
431426
pub info: wgpu_types::AdapterInfo,
432-
pub subgroup_min_size: u32,
433-
pub subgroup_max_size: u32,
434427
}
435428

436429
impl GarbageCollected for GPUAdapterInfo {
@@ -473,12 +466,12 @@ impl GPUAdapterInfo {
473466

474467
#[getter]
475468
fn subgroup_min_size(&self) -> u32 {
476-
self.subgroup_min_size
469+
self.info.subgroup_min_size
477470
}
478471

479472
#[getter]
480473
fn subgroup_max_size(&self) -> u32 {
481-
self.subgroup_max_size
474+
self.info.subgroup_max_size
482475
}
483476

484477
#[getter]

deno_webgpu/device.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -119,13 +119,8 @@ impl GPUDevice {
119119
) -> v8::Global<v8::Object> {
120120
self.adapter_info.get(scope, |_| {
121121
let info = self.instance.adapter_get_info(self.adapter);
122-
let limits = self.instance.adapter_limits(self.adapter);
123122

124-
GPUAdapterInfo {
125-
info,
126-
subgroup_min_size: limits.min_subgroup_size,
127-
subgroup_max_size: limits.max_subgroup_size,
128-
}
123+
GPUAdapterInfo { info }
129124
})
130125
}
131126

wgpu-core/src/pipeline_cache.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,8 @@ mod tests {
323323
driver: String::new(),
324324
driver_info: String::new(),
325325
backend: wgt::Backend::Vulkan,
326+
subgroup_min_size: 32,
327+
subgroup_max_size: 32,
326328
transient_saves_memory: true,
327329
};
328330

wgpu-hal/src/dx12/adapter.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,15 @@ impl super::Adapter {
116116
}
117117
.unwrap();
118118

119+
let mut features1 = Direct3D12::D3D12_FEATURE_DATA_D3D12_OPTIONS1::default();
120+
let hr = unsafe {
121+
device.CheckFeatureSupport(
122+
Direct3D12::D3D12_FEATURE_D3D12_OPTIONS1,
123+
<*mut _>::cast(&mut features1),
124+
size_of_val(&features1) as u32,
125+
)
126+
};
127+
119128
let driver_version = unsafe { adapter.CheckInterfaceSupport(&Dxgi::IDXGIDevice::IID) }
120129
.ok()
121130
.map(|i| {
@@ -156,6 +165,8 @@ impl super::Adapter {
156165
driver_version.0, driver_version.1, driver_version.2, driver_version.3
157166
),
158167
driver_info: String::new(),
168+
subgroup_min_size: features1.WaveLaneCountMin,
169+
subgroup_max_size: features1.WaveLaneCountMax,
159170
transient_saves_memory: false,
160171
};
161172

@@ -483,15 +494,6 @@ impl super::Adapter {
483494
};
484495
features.set(wgt::Features::TEXTURE_FORMAT_P010, p010_format_supported);
485496

486-
let mut features1 = Direct3D12::D3D12_FEATURE_DATA_D3D12_OPTIONS1::default();
487-
let hr = unsafe {
488-
device.CheckFeatureSupport(
489-
Direct3D12::D3D12_FEATURE_D3D12_OPTIONS1,
490-
<*mut _>::cast(&mut features1),
491-
size_of_val(&features1) as u32,
492-
)
493-
};
494-
495497
features.set(
496498
wgt::Features::SHADER_INT64,
497499
shader_model >= naga::back::hlsl::ShaderModel::V6_0
@@ -694,8 +696,6 @@ impl super::Adapter {
694696
.min(crate::MAX_VERTEX_BUFFERS as u32),
695697
max_vertex_attributes: Direct3D12::D3D12_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT,
696698
max_vertex_buffer_array_stride: Direct3D12::D3D12_SO_BUFFER_MAX_STRIDE_IN_BYTES,
697-
min_subgroup_size: 4, // Not using `features1.WaveLaneCountMin` as it is unreliable
698-
max_subgroup_size: 128,
699699
// The immediates are part of the root signature which
700700
// has a limit of 64 DWORDS (256 bytes), but other resources
701701
// also share the root signature:

wgpu-hal/src/gles/adapter.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,8 @@ impl super::Adapter {
190190
device_pci_bus_id: String::new(),
191191
driver_info: version,
192192
backend: wgt::Backend::Gl,
193+
subgroup_min_size: wgt::MINIMUM_SUBGROUP_MIN_SIZE,
194+
subgroup_max_size: wgt::MAXIMUM_SUBGROUP_MAX_SIZE,
193195
transient_saves_memory: false,
194196
}
195197
}
@@ -751,8 +753,6 @@ impl super::Adapter {
751753
} else {
752754
!0
753755
},
754-
min_subgroup_size: 0,
755-
max_subgroup_size: 0,
756756
max_immediate_size: super::MAX_IMMEDIATES as u32 * 4,
757757
min_uniform_buffer_offset_alignment,
758758
min_storage_buffer_offset_alignment,

wgpu-hal/src/metal/adapter.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1100,8 +1100,6 @@ impl super::PrivateCapabilities {
11001100
max_vertex_buffers: self.max_vertex_buffers,
11011101
max_vertex_attributes: 31,
11021102
max_vertex_buffer_array_stride: base.max_vertex_buffer_array_stride,
1103-
min_subgroup_size: 4,
1104-
max_subgroup_size: 64,
11051103
max_immediate_size: 0x1000,
11061104
min_uniform_buffer_offset_alignment: self.buffer_alignment as u32,
11071105
min_storage_buffer_offset_alignment: self.buffer_alignment as u32,

wgpu-hal/src/metal/mod.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,12 @@ impl crate::Instance for Instance {
160160
driver: String::new(),
161161
driver_info: String::new(),
162162
backend: wgt::Backend::Metal,
163+
// These are hardcoded based on typical values for Metal devices
164+
//
165+
// See <https://github.com/gpuweb/gpuweb/blob/main/proposals/subgroups.md#adapter-info>
166+
// for more information.
167+
subgroup_min_size: 4,
168+
subgroup_max_size: 64,
163169
transient_saves_memory: shared.private_caps.supports_memoryless_storage,
164170
},
165171
features: shared.private_caps.features(),

wgpu-hal/src/noop/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,8 @@ pub fn adapter_info() -> wgt::AdapterInfo {
141141
driver: String::from("wgpu"),
142142
driver_info: String::new(),
143143
backend: wgt::Backend::Noop,
144+
subgroup_min_size: wgt::MINIMUM_SUBGROUP_MIN_SIZE,
145+
subgroup_max_size: wgt::MAXIMUM_SUBGROUP_MAX_SIZE,
144146
transient_saves_memory: false,
145147
}
146148
}
@@ -189,8 +191,6 @@ pub const CAPABILITIES: crate::Capabilities = {
189191
max_compute_workgroup_size_y: ALLOC_MAX_U32,
190192
max_compute_workgroup_size_z: ALLOC_MAX_U32,
191193
max_compute_workgroups_per_dimension: ALLOC_MAX_U32,
192-
min_subgroup_size: 1,
193-
max_subgroup_size: ALLOC_MAX_U32,
194194
max_immediate_size: ALLOC_MAX_U32,
195195
max_non_sampler_bindings: ALLOC_MAX_U32,
196196

wgpu-hal/src/vulkan/adapter.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1331,14 +1331,6 @@ impl PhysicalDeviceProperties {
13311331
.min(crate::MAX_VERTEX_BUFFERS as u32),
13321332
max_vertex_attributes: limits.max_vertex_input_attributes,
13331333
max_vertex_buffer_array_stride: limits.max_vertex_input_binding_stride,
1334-
min_subgroup_size: self
1335-
.subgroup_size_control
1336-
.map(|subgroup_size| subgroup_size.min_subgroup_size)
1337-
.unwrap_or(0),
1338-
max_subgroup_size: self
1339-
.subgroup_size_control
1340-
.map(|subgroup_size| subgroup_size.max_subgroup_size)
1341-
.unwrap_or(0),
13421334
max_immediate_size: limits.max_push_constants_size,
13431335
min_uniform_buffer_offset_alignment: limits.min_uniform_buffer_offset_alignment as u32,
13441336
min_storage_buffer_offset_alignment: limits.min_storage_buffer_offset_alignment as u32,
@@ -1776,6 +1768,14 @@ impl super::Instance {
17761768
.to_owned()
17771769
},
17781770
backend: wgt::Backend::Vulkan,
1771+
subgroup_min_size: phd_capabilities
1772+
.subgroup_size_control
1773+
.map(|subgroup_size| subgroup_size.min_subgroup_size)
1774+
.unwrap_or(wgt::MINIMUM_SUBGROUP_MIN_SIZE),
1775+
subgroup_max_size: phd_capabilities
1776+
.subgroup_size_control
1777+
.map(|subgroup_size| subgroup_size.max_subgroup_size)
1778+
.unwrap_or(wgt::MAXIMUM_SUBGROUP_MAX_SIZE),
17791779
transient_saves_memory: supports_lazily_allocated,
17801780
};
17811781
let (available_features, mut downlevel_flags) =

0 commit comments

Comments
 (0)