Partager via


ID3D12GraphicsCommandList ::D ispatch, méthode (d3d12.h)

Exécute une liste de commandes à partir d’un groupe de threads.

Syntaxe

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

Paramètres

[in] ThreadGroupCountX

Type : UINT

Nombre de groupes distribués dans la direction x. ThreadGroupCountX doit être inférieur ou égal à D3D11_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION (65535).

[in] ThreadGroupCountY

Type : UINT

Nombre de groupes distribués dans la direction y. ThreadGroupCountY doit être inférieur ou égal à D3D11_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION (65535).

[in] ThreadGroupCountZ

Type : UINT

Nombre de groupes distribués dans la direction z. ThreadGroupCountZ doit être inférieur ou égal à D3D11_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION (65535). Au niveau de fonctionnalité 10, la valeur de ThreadGroupCountZ doit être 1.

Valeur de retour

None

Remarques

Vous appelez la méthode Dispatch pour exécuter des commandes dans un nuanceur de calcul. Un nuanceur de calcul peut être exécuté sur de nombreux threads en parallèle, au sein d’un groupe de threads. Indexer un thread particulier, dans un groupe de threads à l’aide d’un vecteur 3D donné par (x,y,z).

Exemples

L’exemple D3D12nBodyGravity utilise ID3D12GraphicsCommandList ::D ispatch comme suit :

// 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));
}

Consultez l’exemple de code dans la référence D3D12.

Configuration requise

Condition requise Valeur
Plateforme cible Windows
En-tête d3d12.h
Bibliothèque D3d12.lib
DLL D3d12.dll

Voir aussi

ID3D12GraphicsCommandList