다음을 통해 공유


ID3D12GraphicsCommandList::D ispatch 메서드(d3d12.h)

스레드 그룹에서 명령 목록을 실행합니다.

구문

void Dispatch(
  [in] UINT ThreadGroupCountX,
  [in] UINT ThreadGroupCountY,
  [in] UINT ThreadGroupCountZ
);

매개 변수

[in] ThreadGroupCountX

형식: UINT

x 방향으로 디스패치된 그룹 수입니다. ThreadGroupCountX 는 D3D11_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION(65535)보다 작거나 같아야 합니다.

[in] ThreadGroupCountY

형식: UINT

y 방향으로 디스패치된 그룹 수입니다. ThreadGroupCountY 는 D3D11_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION(65535)보다 작거나 같아야 합니다.

[in] ThreadGroupCountZ

형식: UINT

z 방향으로 디스패치된 그룹 수입니다. ThreadGroupCountZ 는 D3D11_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION(65535)보다 작거나 같아야 합니다. 기능 수준 10에서 ThreadGroupCountZ 의 값은 1이어야 합니다.

반환 값

없음

설명

Dispatch 메서드를 호출하여 컴퓨팅 셰이더에서 명령을 실행합니다. 컴퓨팅 셰이더는 스레드 그룹 내에서 여러 스레드에서 병렬로 실행할 수 있습니다. (x,y,z)에서 지정한 3D 벡터를 사용하여 스레드 그룹 내에서 특정 스레드를 인덱싱합니다.

예제

D3D12nBodyGravity 샘플은 다음과 같이 ID3D12GraphicsCommandList::D이스패치를 사용합니다.

// Run the particle simulation using the compute shader.
void D3D12nBodyGravity::Simulate(UINT threadIndex)
{
    ID3D12GraphicsCommandList* pCommandList = m_computeCommandList[threadIndex].Get();

    UINT srvIndex;
    UINT uavIndex;
    ID3D12Resource *pUavResource;
    if (m_srvIndex[threadIndex] == 0)
    {
        srvIndex = SrvParticlePosVelo0;
        uavIndex = UavParticlePosVelo1;
        pUavResource = m_particleBuffer1[threadIndex].Get();
    }
    else
    {
        srvIndex = SrvParticlePosVelo1;
        uavIndex = UavParticlePosVelo0;
        pUavResource = m_particleBuffer0[threadIndex].Get();
    }

    pCommandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(pUavResource, D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE, D3D12_RESOURCE_STATE_UNORDERED_ACCESS));

    pCommandList->SetPipelineState(m_computeState.Get());
    pCommandList->SetComputeRootSignature(m_computeRootSignature.Get());

    ID3D12DescriptorHeap* ppHeaps[] = { m_srvUavHeap.Get() };
    pCommandList->SetDescriptorHeaps(_countof(ppHeaps), ppHeaps);

    CD3DX12_GPU_DESCRIPTOR_HANDLE srvHandle(m_srvUavHeap->GetGPUDescriptorHandleForHeapStart(), srvIndex + threadIndex, m_srvUavDescriptorSize);
    CD3DX12_GPU_DESCRIPTOR_HANDLE uavHandle(m_srvUavHeap->GetGPUDescriptorHandleForHeapStart(), uavIndex + threadIndex, m_srvUavDescriptorSize);

    pCommandList->SetComputeRootConstantBufferView(RootParameterCB, m_constantBufferCS->GetGPUVirtualAddress());
    pCommandList->SetComputeRootDescriptorTable(RootParameterSRV, srvHandle);
    pCommandList->SetComputeRootDescriptorTable(RootParameterUAV, uavHandle);

    pCommandList->Dispatch(static_cast<int>(ceil(ParticleCount / 128.0f)), 1, 1);

    pCommandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(pUavResource, D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE));
}

D3D12 참조의 예제 코드를 참조하세요.

요구 사항

요구 사항
대상 플랫폼 Windows
헤더 d3d12.h
라이브러리 D3d12.lib
DLL D3d12.dll

추가 정보

ID3D12GraphicsCommandList