Création de l’état de pipeline
Pour obtenir des exemples d’utilisation de ces API, consultez Utilisation du pipeline Mesh Shader. L’exemple de code suivant présente les API de prise en charge de la fonctionnalité 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);
}
Intrinsèques des Mesh Shaders
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 à exporter par le groupe de threads ; les nombres sont nuls par défaut si la fonction n’est pas appelée. Doit être inférieur ou égal à la longueur des tableaux de sortie partagés, doit être appelée depuis 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 Amplification Shader à son cluster d’instances de Mesh Shader. Ces données sont partagées entre toutes les instances du cluster. Non applicable si aucune étape Amplification Shader ne précède le Mesh Shader dans le pipeline. |
| Tableau vertices | out | Tableau de sortie partagé dans lequel exporter les attributs de 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 | Tableau de sortie partagé dans lequel exporter les indices des primitives. Définit le type de primitive à exporter et, par la longueur du tableau, le nombre maximal de primitives exportées. Ces indices de primitives indexent directement le tableau vertices. Le type doit être uint2 pour les lignes ou uint3 pour les triangles. |
| Tableau primitives | out | 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 Amplification Shaders
Fonctions
| Nom | DispatchMesh |
| Paramètres | uint groupsX uint groupsY uint groupsZ groupshared payload_t payload |
| Description | Distribue un cluster de groupes de threads de Mesh Shader avec des données de charge utile facultatives. Peut être appelée au plus une fois depuis un chemin de code non divergent. Aucun groupe de threads n’est distribué si la fonction n’est pas appelée. Les groupes de threads de Mesh Shader suivants ont leurs GroupID et DispatchThreadID localisés à leur propre cluster. |
