Criação do estado de pipeline
Para ver exemplos de uso dessas APIs, consulte Uso do pipeline de Mesh Shader. O exemplo de código a seguir mostra as APIs de suporte ao recurso Mesh Shader.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);
}
Intrínsecos do Mesh Shader
Atributos
| Nome | Descrição |
|---|---|
| OutputTopology | Especifica o tipo de primitivo exportado pelo shader: “line” ou “triangle”. Deve corresponder ao tipo da matriz de saída compartilhada indices (uint2 para linhas ou uint3 para triângulos). |
Funções
| Nome | SetMeshOutputCounts |
| Parâmetros | uint numVerts uint numPrims |
| Descrição | Declara o número de vértices e primitivos do grupo de threads a serem exportados; as contagens assumem zero por padrão se a função não for chamada. Deve ser menor ou igual aos comprimentos das matrizes de saída compartilhadas, deve ser chamada a partir de um contexto de execução não divergente e pressupõe valores de parâmetros constantes no grupo de threads. Deve preceder todas as gravações nas matrizes de saída. |
Parâmetros
| Nome | Modificador | Descrição |
|---|---|---|
| payload | in | Dados de payload de tipo personalizado de até 16 KB passados de um Amplification Shader para seu cluster de instâncias de Mesh Shader. Esses dados são compartilhados entre todas as instâncias do cluster. Não se aplica se nenhum estágio de Amplification Shader preceder o Mesh Shader no pipeline. |
| Matriz vertices | out | A matriz de saída compartilhada na qual os atributos de vértice são exportados. Define o tipo de atributo de vértice personalizado e a contagem máxima de exportação de vértices pelo comprimento da matriz. |
| Matriz indices | out | A matriz de saída compartilhada na qual os índices de primitivos são exportados. Define o tipo de primitivo a ser exportado e a contagem máxima de exportação de primitivos pelo comprimento da matriz. Esses índices de primitivos indexam diretamente a matriz vertices. O tipo deve ser uint2 para linhas ou uint3 para triângulos. |
| Matriz primitives | out | A matriz de saída compartilhada na qual os atributos de primitivos são exportados. Define o tipo de atributo de primitivo definido pelo usuário. Seu comprimento deve ser igual ao da matriz indices. |
Intrínsecos do Amplification Shader
Funções
| Nome | DispatchMesh |
| Parâmetros | uint groupsX uint groupsY uint groupsZ groupshared payload_t payload |
| Descrição | Despacha um cluster de grupos de threads de Mesh Shader com dados de payload opcionais. Pode ser chamada no máximo uma vez a partir de um caminho de código não divergente. Nenhum grupo de threads é despachado se a função não for chamada. Os grupos de threads de Mesh Shader subsequentes têm seus GroupIDs e DispatchThreadIDs localizados em seu próprio cluster. |
