Création de l’état de pipeline
Pour des exemples d’utilisation de ces API, consultez Utilisation du pipeline de nuanceurs de maillage. L’exemple de code suivant présente les API de prise en charge de la fonctionnalité de nuanceurs de maillage.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);
}
Intrinsèques des nuanceurs de maillage
Attributs
| Nom | Description |
|---|---|
| OutputTopology | Spécifie le type de primitive exporté par le nuanceur, soit « line », soit « triangle ». Doit correspondre au type du tableau de sortie partagé indices (uint2 pour les lignes ou uint3 pour les triangles). |
Fonctions
| Nom | SetMeshOutputCounts |
| Paramètres | uint numVerts uint numPrims |
| Description | Déclare le nombre de sommets et de primitives que le groupe de threads doit exporter; les nombres sont nuls par défaut si la fonction n’est pas appelée. Ils doivent être inférieurs ou égaux aux longueurs des tableaux de sortie partagés; la fonction doit être appelée à partir d’un contexte d’exécution non divergent et suppose des valeurs de paramètres constantes pour le groupe de threads. Doit précéder toutes les écritures dans les tableaux de sortie. |
Paramètres
| Nom | Modificateur | Description |
|---|---|---|
| payload | in | Données de charge utile de type personnalisé, jusqu’à 16 Ko, transmises par un nuanceur d’amplification à son groupe d’instances de nuanceurs de maillage. Ces données sont partagées entre toutes les instances du groupe. Non applicable si aucune étape de nuanceur d’amplification ne précède le nuanceur de maillage dans le pipeline. |
| Tableau vertices | out | Le tableau de sortie partagé dans lequel exporter les attributs des sommets. Définit le type d’attribut de sommet personnalisé et, par la longueur du tableau, le nombre maximal de sommets exportés. |
| Tableau indices | out | Le tableau de sortie partagé dans lequel exporter les index des primitives. Définit le type de primitive à exporter et, par la longueur du tableau, le nombre maximal de primitives exportées. Ces index de primitives indexent directement le tableau vertices. Le type doit être uint2 pour les lignes ou uint3 pour les triangles. |
| Tableau primitives | out | Le tableau de sortie partagé dans lequel exporter les attributs des primitives. Définit le type d’attribut de primitive défini par l’utilisateur. Sa longueur doit être égale à celle du tableau indices. |
Intrinsèques des nuanceurs d’amplification
Fonctions
| Nom | DispatchMesh |
| Paramètres | uint groupsX uint groupsY uint groupsZ groupshared payload_t payload |
| Description | Répartit un groupe de groupes de threads de nuanceurs de maillage avec des données de charge utile facultatives. Peut être appelée au plus une fois à partir d’un chemin de code non divergent. Aucun groupe de threads n’est réparti si la fonction n’est pas appelée. Les groupes de threads de nuanceurs de maillage subséquents ont leurs GroupID et DispatchThreadID localisés à leur propre groupe. |
