パイプライン ステートの作成
これらの API の使用例については、メッシュ シェーダー パイプラインの使用方法を参照してください。 以下のコード例は、メッシュ シェーダー機能サポート 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);
}
メッシュ シェーダー組み込み関数
属性
| 名前 | 説明 |
|---|---|
| OutputTopology | シェーダーからエクスポートされるプリミティブ型を指定します。“line” または “triangle” のいずれかです。共有出力配列 indices の型 (line なら uint2、triangle なら uint3) と一致する必要があります。 |
関数
| 名前 | SetMeshOutputCounts |
| パラメーター | uint numVerts uint numPrims |
| 説明 | スレッドグループがエクスポートする頂点数とプリミティブ数を宣言します。呼び出されなかった場合、カウントは既定でゼロになります。共有出力配列の長さ以下でなければならず、非分岐な実行コンテキストから呼び出す必要があり、パラメーター値はスレッドグループ内で定数であるとみなされます。すべての出力配列への書き込みに先立って呼び出す必要があります。 |
パラメーター
| 名前 | 修飾子 | 説明 |
|---|---|---|
| payload | in | Amplification Shader からそのメッシュ シェーダー インスタンスのクラスターに渡される、最大 16 KB のカスタム型ペイロード データ。このデータはクラスター内のすべてのインスタンスで共有されます。パイプラインでメッシュ シェーダーの前段に Amplification Shader ステージがない場合には該当しません。 |
| vertices 配列 | out | 頂点属性をエクスポートするための共有出力配列。カスタム頂点属性型と、配列長による最大頂点エクスポート数を定義します。 |
| indices 配列 | out | プリミティブ インデックスをエクスポートするための共有出力配列。エクスポートするプリミティブ型と、配列長による最大プリミティブ エクスポート数を定義します。これらのプリミティブ インデックスは vertices 配列を直接インデックス指定します。型は line なら uint2、triangle なら uint3 とする必要があります。 |
| primitives 配列 | out | プリミティブ属性をエクスポートするための共有出力配列。ユーザー定義のプリミティブ属性型を定義します。その長さは indices 配列と等しくなければなりません。 |
Amplification Shader 組み込み関数
関数
| 名前 | DispatchMesh |
| パラメーター | uint groupsX uint groupsY uint groupsZ groupshared payload_t payload |
| 説明 | オプションのペイロード データを伴って、メッシュ シェーダー スレッドグループのクラスターをディスパッチします。非分岐なコード パスから最大 1 回だけ呼び出せます。呼び出されなかった場合はゼロ個のスレッドグループがディスパッチされます。後続のメッシュ シェーダー スレッドグループでは、GroupID および DispatchThreadID が自身のクラスター内でローカル化されます。 |
