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 |