Skip to content

Commit b3c6a0b

Browse files
authored
Gate DX12 mesh shader command signature initialization on device support. (#8297)
1 parent 482a983 commit b3c6a0b

File tree

4 files changed

+58
-26
lines changed

4 files changed

+58
-26
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,12 @@ Bottom level categories:
4040

4141
## Unreleased
4242

43+
### Bug Fixes
44+
45+
#### DX12
46+
47+
- Fix device creation failures for devices that do not support mesh shaders. By @vorporeal in [#8297](https://github.com/gfx-rs/wgpu/pull/8297).
48+
4349
## v27.0.0 (2025-10-01)
4450

4551
### Major Changes

wgpu-hal/src/dx12/command.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1338,14 +1338,17 @@ impl crate::CommandEncoder for super::CommandEncoder {
13381338

13391339
let cmd_list6: Direct3D12::ID3D12GraphicsCommandList6 =
13401340
self.list.as_ref().unwrap().cast().unwrap();
1341-
let cmd_signature = &self
1341+
let Some(cmd_signature) = &self
13421342
.pass
13431343
.layout
13441344
.special_constants
13451345
.as_ref()
13461346
.and_then(|sc| sc.indirect_cmd_signatures.as_ref())
13471347
.unwrap_or_else(|| &self.shared.cmd_signatures)
1348-
.draw_mesh;
1348+
.draw_mesh
1349+
else {
1350+
panic!("Feature `MESH_SHADING` not enabled");
1351+
};
13491352
unsafe {
13501353
cmd_list6.ExecuteIndirect(cmd_signature, draw_count, &buffer.resource, offset, None, 0);
13511354
}
@@ -1401,9 +1404,12 @@ impl crate::CommandEncoder for super::CommandEncoder {
14011404
self.prepare_dispatch([0; 3]);
14021405
let cmd_list6: Direct3D12::ID3D12GraphicsCommandList6 =
14031406
self.list.as_ref().unwrap().cast().unwrap();
1407+
let Some(ref command_signature) = self.shared.cmd_signatures.draw_mesh else {
1408+
panic!("Feature `MESH_SHADING` not enabled");
1409+
};
14041410
unsafe {
14051411
cmd_list6.ExecuteIndirect(
1406-
&self.shared.cmd_signatures.draw_mesh,
1412+
command_signature,
14071413
max_count,
14081414
&buffer.resource,
14091415
offset,

wgpu-hal/src/dx12/device.rs

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,24 @@ impl super::Device {
116116
// maximum number of CBV/SRV/UAV descriptors in heap for Tier 1
117117
let capacity_views = limits.max_non_sampler_bindings as u64;
118118

119+
let draw_mesh = if features
120+
.features_wgpu
121+
.contains(wgt::FeaturesWGPU::EXPERIMENTAL_MESH_SHADER)
122+
{
123+
Some(Self::create_command_signature(
124+
&raw,
125+
None,
126+
size_of::<wgt::DispatchIndirectArgs>(),
127+
&[Direct3D12::D3D12_INDIRECT_ARGUMENT_DESC {
128+
Type: Direct3D12::D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH_MESH,
129+
..Default::default()
130+
}],
131+
0,
132+
)?)
133+
} else {
134+
None
135+
};
136+
119137
let shared = super::DeviceShared {
120138
adapter,
121139
zero_buffer,
@@ -140,16 +158,7 @@ impl super::Device {
140158
}],
141159
0,
142160
)?,
143-
draw_mesh: Self::create_command_signature(
144-
&raw,
145-
None,
146-
size_of::<wgt::DispatchIndirectArgs>(),
147-
&[Direct3D12::D3D12_INDIRECT_ARGUMENT_DESC {
148-
Type: Direct3D12::D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH_MESH,
149-
..Default::default()
150-
}],
151-
0,
152-
)?,
161+
draw_mesh,
153162
dispatch: Self::create_command_signature(
154163
&raw,
155164
None,
@@ -1371,47 +1380,58 @@ impl crate::Device for super::Device {
13711380
};
13721381
size_of_val(&first_vertex) + size_of_val(&first_instance) + size_of_val(&other)
13731382
};
1374-
Some(super::CommandSignatures {
1375-
draw: Self::create_command_signature(
1383+
1384+
let draw_mesh = if self
1385+
.features
1386+
.features_wgpu
1387+
.contains(wgt::FeaturesWGPU::EXPERIMENTAL_MESH_SHADER)
1388+
{
1389+
Some(Self::create_command_signature(
13761390
&self.raw,
13771391
Some(&raw),
1378-
special_constant_buffer_args_len + size_of::<wgt::DrawIndirectArgs>(),
1392+
special_constant_buffer_args_len + size_of::<wgt::DispatchIndirectArgs>(),
13791393
&[
13801394
constant_indirect_argument_desc,
13811395
Direct3D12::D3D12_INDIRECT_ARGUMENT_DESC {
1382-
Type: Direct3D12::D3D12_INDIRECT_ARGUMENT_TYPE_DRAW,
1396+
Type: Direct3D12::D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH_MESH,
13831397
..Default::default()
13841398
},
13851399
],
13861400
0,
1387-
)?,
1388-
draw_indexed: Self::create_command_signature(
1401+
)?)
1402+
} else {
1403+
None
1404+
};
1405+
1406+
Some(super::CommandSignatures {
1407+
draw: Self::create_command_signature(
13891408
&self.raw,
13901409
Some(&raw),
1391-
special_constant_buffer_args_len
1392-
+ size_of::<wgt::DrawIndexedIndirectArgs>(),
1410+
special_constant_buffer_args_len + size_of::<wgt::DrawIndirectArgs>(),
13931411
&[
13941412
constant_indirect_argument_desc,
13951413
Direct3D12::D3D12_INDIRECT_ARGUMENT_DESC {
1396-
Type: Direct3D12::D3D12_INDIRECT_ARGUMENT_TYPE_DRAW_INDEXED,
1414+
Type: Direct3D12::D3D12_INDIRECT_ARGUMENT_TYPE_DRAW,
13971415
..Default::default()
13981416
},
13991417
],
14001418
0,
14011419
)?,
1402-
draw_mesh: Self::create_command_signature(
1420+
draw_indexed: Self::create_command_signature(
14031421
&self.raw,
14041422
Some(&raw),
1405-
special_constant_buffer_args_len + size_of::<wgt::DispatchIndirectArgs>(),
1423+
special_constant_buffer_args_len
1424+
+ size_of::<wgt::DrawIndexedIndirectArgs>(),
14061425
&[
14071426
constant_indirect_argument_desc,
14081427
Direct3D12::D3D12_INDIRECT_ARGUMENT_DESC {
1409-
Type: Direct3D12::D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH_MESH,
1428+
Type: Direct3D12::D3D12_INDIRECT_ARGUMENT_TYPE_DRAW_INDEXED,
14101429
..Default::default()
14111430
},
14121431
],
14131432
0,
14141433
)?,
1434+
draw_mesh,
14151435
dispatch: Self::create_command_signature(
14161436
&self.raw,
14171437
Some(&raw),

wgpu-hal/src/dx12/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -659,7 +659,7 @@ struct Idler {
659659
struct CommandSignatures {
660660
draw: Direct3D12::ID3D12CommandSignature,
661661
draw_indexed: Direct3D12::ID3D12CommandSignature,
662-
draw_mesh: Direct3D12::ID3D12CommandSignature,
662+
draw_mesh: Option<Direct3D12::ID3D12CommandSignature>,
663663
dispatch: Direct3D12::ID3D12CommandSignature,
664664
}
665665

0 commit comments

Comments
 (0)