管線狀態建立
如需這些 API 的使用範例,請參閱 Mesh Shader 管線使用方式。 下列程式碼範例顯示 Mesh Shader 功能支援 API。typedef enum D3D12_FEATURE {
...
D3D12_FEATURE_D3D12_OPTIONS7,
} D3D12_FEATURE;
typedef enum D3D12_MESH_SHADER_TIER
{
D3D12_MESH_SHADER_TIER_NOT_SUPPORTED,
D3D12_MESH_SHADER_TIER_1
} D3D12_MESH_SHADER_TIER;
typedef struct D3D12_FEATURE_DATA_D3D12_OPTIONS7
{
_Out_ D3D12_MESH_SHADER_TIER MeshShaderTier;
_Out_ D3D12_SAMPLER_FEEDBACK_TIER SamplerFeedbackTier;
} D3D12_FEATURE_DATA_D3D12_OPTIONS7;
HRESULT ID3D12Device::CheckFeatureSupport(
D3D12_FEATURE Feature,
void* pFeatureSupportData,
UINT FeatureSupportDataSize
);
typedef struct D3D12_PIPELINE_STATE_STREAM_DESC {
_In_ SIZE_T SizeInBytes;
_In_ void* pPipelineStateSubobjectStream;
} D3D12_PIPELINE_STATE_STREAM_DESC;
HRESULT ID3D12Device2::CreatePipelineState(
const D3D12_PIPELINE_STATE_STREAM_DESC* pDesc,
REFIID riid,
void** ppPipelineState
);
void ID3D12GraphicsCommandList::DispatchMesh(uint groupCountX, uint groupCountY, uint groupCountZ);
typedef enum D3D12_INDIRECT_ARGUMENT_TYPE {
...
D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH_MESH
} D3D12_INDIRECT_ARGUMENT_TYPE;
typedef struct D3D12_INDIRECT_ARGUMENT_DESC
{
D3D12_INDIRECT_ARGUMENT_TYPE Type; // = D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH_MESH
union
{
...
struct
{
UINT ThreadGroupCountX;
UINT ThreadGroupCountY;
UINT ThreadGroupCountZ;
} D3D12_DISPATCH_MESH_ARGUMENTS;
}
} D3D12_INDIRECT_ARGUMENT_DESC;
void ID3D12GraphicsCommandList::ExecuteIndirect(
ID3D12CommandSignature* pCommandSignature,
UINT MaxCommandCount,
ID3D12Resource* pArgumentBuffer,
UINT64 ArgumentBufferOffset,
ID3D12Resource* pCountBuffer,
UINT64 CountBufferOffset
);
struct MyPsoStreamDesc
{
CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature;
CD3DX12_PIPELINE_STATE_STREAM_AS AS;
CD3DX12_PIPELINE_STATE_STREAM_MS MS;
CD3DX12_PIPELINE_STATE_STREAM_PS PS;
CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState;
CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1 DepthStencilState;
CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER RasterizerState;
CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTFormats;
CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DepthFormat;
CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc;
CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask;
}
void CreatePipelineState(ID3D12Device* d3dDevice)
{
// Check Mesh Shader pipeline feature support.
D3D12_FEATURE_DATA_D3D12_OPTIONS7 options;
device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS7, &options, sizeof(options));
if (options.MeshShaderTier == D3D12_MESH_SHADER_TIER_NOT_SUPPORTED)
throw std::exception("Mesh Shaders not supported!");
// Set up PSO Stream Desc.
MyPsoStreamDesc psoDesc;
psoDesc.AS = D3D12_SHADER_BYTECODE{ ... };
psoDesc.MS = D3D12_SHADER_BYTECODE{ ... };
...
// Create Pipeline State Object with stream desc.
D3D12_PIPELINE_STATE_STREAM_DESC desc = { sizeof(psoDesc), &psoDesc };
device->CreatePipelineState(&desc, IID_PPV_ARGS(&msPso));
}
void Draw(ID3D12GraphicsCommandList* commandList)
{
// Set up pipeline and root signature parameters.
commandList->SetPipelineState(&msPso);
commandList->SetGraphicsRootSignature(&msRootSig);
...
// Dispatch threadgroups.
commandList->DispatchMesh(someGroupCount, 1, 1);
}
Mesh Shader 內建函式
屬性
| 名稱 | 描述 |
|---|---|
| OutputTopology | 指定著色器匯出的基本型別類型,可以是 “line” 或 “triangle”。必須與 indices 共用輸出陣列類型相符 (線條為 uint2,三角形為 uint3)。 |
函式
| 名稱 | SetMeshOutputCounts |
| 參數 | uint numVerts uint numPrims |
| 描述 | 宣告執行緒群組要匯出的頂點和基本型別數量;若未呼叫,計數預設為零。必須小於或等於共用輸出陣列長度,且必須從非分歧的執行內容呼叫,並假設參數值在執行緒群組內為常數。必須在所有寫入輸出陣列的作業之前呼叫。 |
參數
| 名稱 | 修飾詞 | 描述 |
|---|---|---|
| payload | in | 從 Amplification Shader 傳遞至其 Mesh Shader 執行個體叢集的自訂類型承載資料,最多 16 KB。此資料由叢集中的所有執行個體共用。如果管線中 Mesh Shader 之前沒有 Amplification Shader 階段,則不適用。 |
| vertices 陣列 | out | 用來匯出頂點屬性的共用輸出陣列。定義自訂頂點屬性類型,並以陣列長度定義最大頂點匯出數量。 |
| indices 陣列 | out | 用來匯出基本型別索引的共用輸出陣列。定義要匯出的基本型別類型,並以陣列長度定義最大基本型別匯出數量。這些基本型別索引會直接索引至 vertices 陣列。線條的類型應為 uint2,三角形則為 uint3。 |
| primitives 陣列 | out | 用來匯出基本型別屬性的共用輸出陣列。定義使用者定義的基本型別屬性類型。其長度必須等於 indices 陣列的長度。 |
Amplification Shader 內建函式
函式
| 名稱 | DispatchMesh |
| 參數 | uint groupsX uint groupsY uint groupsZ groupshared payload_t payload |
| 描述 | 分派 Mesh Shader 執行緒群組叢集,並可選擇附帶承載資料。最多只能從非分歧的程式碼路徑呼叫一次。若未呼叫,則不會分派任何執行緒群組。後續 Mesh Shader 執行緒群組的 GroupID 和 DispatchThreadID 會在其所屬叢集內進行在地化。 |
