This document specifies a new D3D12 feature that relaxes the maximum 1D dispatch size for compute shaders, allowing hardware to expose larger X-dimension dispatch capabilities beyond the traditional 65,535 thread group limit.
Version 1.0
Modern GPU architectures can support significantly larger dispatch dimensions than the D3D12 specification’s current maximum of 65,535 thread groups per dimension (as defined by D3D12_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION). This limitation constrains workloads that would benefit from expressing large 1D parallelism directly, forcing developers to implement workarounds using multi-dimensional dispatches or multiple dispatch calls.
This feature allows hardware to expose increased maximum dispatch dimensions specifically for 1D dispatches, where the X dimension can exceed the traditional limit while Y and Z dimensions remain 1. Separate limits are provided for Compute Shader dispatches and Mesh Shader dispatches.
The Increased 1D Dispatch Dimensions feature introduces a device capability query that returns the maximum supported X dimension for 1D dispatches. Key design principles:
Max1DDispatchSize and Max1DDispatchMeshSize to determine the maximum X dimension supported by the deviceAdd new feature enumeration value for querying increased dispatch dimensions:
typedef enum D3D12_FEATURE
{
// ... existing values ...
D3D12_FEATURE_D3D12_OPTIONS25 = 68,
} D3D12_FEATURE;
New feature data structure containing the maximum 1D dispatch dimension:
typedef struct D3D12_FEATURE_DATA_D3D12_OPTIONS25
{
UINT Max1DDispatchSize;
UINT Max1DDispatchMeshSize;
} D3D12_FEATURE_DATA_D3D12_OPTIONS25;
Members:
Max1DDispatchSize - The maximum number of thread groups that can be dispatched in the X dimension for Compute Shaders when Y = 1 and Z = 1. Must be at least 65,535 (the value of D3D12_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION). This limit also applies to grids launched in Work Graphs, however Work Graphs are additionally constrained by the maximum total number of thread groups as defined by D3D12_WORK_GRAPHS_DISPATCH_MAX_THREAD_GROUPS_PER_GRID (16,777,215). This means that while Max1DDispatchSize may be larger than 16,777,215, Work Graph dispatches cannot exceed this total thread group limit.
Max1DDispatchMeshSize - The maximum number of thread groups that can be dispatched in the X dimension for Mesh Shaders (via DispatchMesh) when Y = 1 and Z = 1. Must be at least 65,535 (the value of D3D12_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION). This value must not exceed 4,194,303 (the value of D3D12_MS_DISPATCH_MAX_THREAD_GROUPS_PER_GRID), which is the maximum total number of thread groups allowed for Mesh Shader dispatches.
Applications query for the maximum 1D dispatch size using the standard CheckFeatureSupport API:
D3D12_FEATURE_DATA_D3D12_OPTIONS25 options = {};
HRESULT hr = device->CheckFeatureSupport(
D3D12_FEATURE_D3D12_OPTIONS25,
&options,
sizeof(options));
if (SUCCEEDED(hr))
{
printf("Maximum 1D dispatch size (Compute): %u thread groups\n",
options.Max1DDispatchSize);
printf("Maximum 1D dispatch size (Mesh): %u thread groups\n",
options.Max1DDispatchMeshSize);
if (options.Max1DDispatchSize > D3D12_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION)
{
// Device supports increased 1D dispatch dimensions for Compute
}
if (options.Max1DDispatchMeshSize > D3D12_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION)
{
// Device supports increased 1D dispatch dimensions for Mesh
}
}
Guaranteed Minimum:
All D3D12 devices must report:
Max1DDispatchSize >= 65535 (D3D12_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION)Max1DDispatchMeshSize >= 65535 (D3D12_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION)Maximum Constraints:
Max1DDispatchMeshSize <= 4194303 (D3D12_MS_DISPATCH_MAX_THREAD_GROUPS_PER_GRID)Max1DDispatchSize is largerThe D3D12 runtime performs the following validation for compute dispatches:
For Direct Compute Dispatches (Dispatch) and Dispatch Graph (CPU_INPUT):
ThreadGroupCountX > D3D12_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION (65,535):
ThreadGroupCountY == 1ThreadGroupCountZ == 1ThreadGroupCountX <= Max1DDispatchSizeThreadGroupCountX <= D3D12_WORK_GRAPHS_DISPATCH_MAX_THREAD_GROUPS_PER_GRID (16,777,215)ThreadGroupCountX <= 65535:
For Mesh Shader Dispatches (DispatchMesh):
ThreadGroupCountX > D3D12_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION (65,535):
ThreadGroupCountY == 1ThreadGroupCountZ == 1ThreadGroupCountX <= Max1DDispatchMeshSizeThreadGroupCountX <= D3D12_MS_DISPATCH_MAX_THREAD_GROUPS_PER_GRID (4,194,303)ThreadGroupCountX <= 65535:
When queried on an existing driver which doesn’t support OPTIONS25 the D3D runtime will automatically return 65535 for both Max1DDispatchSize and Max1DDispatchMeshSize as defined by D3D12_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION
The DDI exposes the new capability field to drivers:
typedef struct D3D12DDI_D3D12_OPTIONS_DATA_0XXX
{
// ... existing fields ...
UINT Max1DDispatchSize;
UINT Max1DDispatchMeshSize;
} D3D12DDI_D3D12_OPTIONS_DATA_0XXX;
Capability Reporting:
Max1DDispatchMeshSize must not exceed 4,194,303 (D3D12_MS_DISPATCH_MAX_THREAD_GROUPS_PER_GRID)Dispatch Handling:
Max1DDispatchSizeMax1DDispatchMeshSize| Version | Date | Description |
|---|---|---|
| 1.0 | November 2025 | Initial specification for increased 1D dispatch dimensions |