파이프라인 상태 생성
이러한 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 공유 출력 배열 유형과 일치해야 합니다(라인은 uint2, 삼각형은 uint3). |
함수
| 이름 | SetMeshOutputCounts |
| 매개변수 | uint numVerts uint numPrims |
| 설명 | 스레드그룹이 내보낼 정점과 프리미티브의 수를 선언합니다 - 호출되지 않으면 카운트는 기본값 0입니다. 공유 출력 배열 길이보다 작거나 같아야 하며, 비발산 실행 컨텍스트에서 호출해야 하고 스레드그룹 상수 매개변수 값을 가정합니다. 출력 배열에 대한 모든 쓰기보다 앞에 있어야 합니다. |
매개변수
| 이름 | 수정자 | 설명 |
|---|---|---|
| payload | in | 증폭 셰이더에서 메시 셰이더 인스턴스의 클러스터로 전달되는 최대 16 KB의 사용자 정의 유형 페이로드 데이터입니다. 이 데이터는 클러스터의 모든 인스턴스 간에 공유됩니다. 파이프라인에서 메시 셰이더 앞에 증폭 셰이더 스테이지가 없는 경우에는 적용되지 않습니다. |
| vertices array | out | 정점 속성을 내보낼 공유 출력 배열입니다. 사용자 정의 정점 속성 유형과 배열 길이에 의한 최대 정점 내보내기 개수를 정의합니다. |
| indices array | out | 프리미티브 인덱스를 내보낼 공유 출력 배열입니다. 내보낼 프리미티브 유형과 배열 길이에 의한 최대 프리미티브 내보내기 개수를 정의합니다. 이러한 프리미티브 인덱스는 vertices 배열로 직접 인덱싱됩니다. 유형은 라인의 경우 uint2, 삼각형의 경우 uint3이어야 합니다. |
| primitives array | out | 프리미티브 속성을 내보낼 공유 출력 배열입니다. 사용자 정의 프리미티브 속성 유형을 정의합니다. 그 길이는 indices 배열의 길이와 동일해야 합니다. |
증폭 셰이더 내장 함수
함수
| 이름 | DispatchMesh |
| 매개변수 | uint groupsX uint groupsY uint groupsZ groupshared payload_t payload |
| 설명 | 선택적 페이로드 데이터와 함께 메시 셰이더 스레드그룹의 클러스터를 디스패치합니다. 비발산 코드 경로에서 최대 한 번만 호출할 수 있습니다. 호출되지 않으면 0개의 스레드그룹이 디스패치됩니다. 이후 메시 셰이더 스레드그룹은 자체 클러스터로 GroupID와 DispatchThreadID가 로컬화됩니다. |
