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.1
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 debug layer performs the following checks for compute dispatches (see the Runtime enforcement note below for how violations are handled):
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:
The runtime does not drop, clamp, or otherwise modify an oversized dispatch. When the conditions above are not met, the debug layer reports an error, but the dispatch is still passed to the driver unchanged — issuing a debug-layer error does not, by itself, alter runtime behaviour. This is intentional: dropping the dispatch would be a compatibility risk for existing applications.
In addition, when a command list is recorded through the runtime-bypass path, the debug layer validation above does not run at all, so no error is produced and the driver receives the dispatch regardless. Drivers must therefore not rely on the runtime to reject dispatches that exceed the reported Max1DDispatchSize / Max1DDispatchMeshSize — validating and correctly handling such dispatches is the driver’s responsibility.
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 |
| 1.1 | July 2026 | Clarified runtime enforcement: oversized 1D dispatches produce a debug-layer error but are still passed to the driver unchanged (not dropped); noted that the runtime-bypass path skips this validation entirely |