ID3D12CommandList-Schnittstelle (d3d12.h)
Eine Schnittstelle, von der ID3D12GraphicsCommandList erbt. Es stellt einen geordneten Satz von Befehlen dar, die von der GPU ausgeführt werden, während die Erweiterung andere Befehlslisten als nur für Grafiken (z. B. Compute und Kopieren) unterstützt.
Vererbung
Die ID3D12CommandList-Schnittstelle erbt von ID3D12DeviceChild. ID3D12CommandList verfügt auch über folgende Membertypen:
Methoden
Die ID3D12CommandList-Schnittstelle verfügt über diese Methoden.
ID3D12CommandList::GetType Ruft den Typ der Befehlsliste ab, z. B. direct, bundle, compute oder copy. |
Hinweise
Verwenden Sie ID3D12Device::CreateCommandList , um ein Befehlslistenobjekt zu erstellen.
Siehe auch ID3D12GraphicsCommandList, die von ID3D12CommandList abgeleitet ist.
Eine Befehlsliste entspricht einer Reihe von Befehlen, die von der Grafikverarbeitungseinheit (GPU) ausgeführt werden. Befehle legen Zustand, Zeichnen, Löschen, Kopieren usw. fest.
Direct3D 12-Befehlslisten unterstützen nur diese 2 Dereferenzierungsebenen:
- Eine direkte Befehlsliste entspricht einem Befehlspuffer, den die GPU ausführen kann.
- Ein Bundle kann nur direkt über eine direkte Befehlsliste ausgeführt werden.
Beispiele
Im D3D12nBodyGravity-Beispiel wird ID3D12CommandList wie folgt verwendet:
DWORD D3D12nBodyGravity::AsyncComputeThreadProc(int threadIndex)
{
ID3D12CommandQueue* pCommandQueue = m_computeCommandQueue[threadIndex].Get();
ID3D12CommandAllocator* pCommandAllocator = m_computeAllocator[threadIndex].Get();
ID3D12GraphicsCommandList* pCommandList = m_computeCommandList[threadIndex].Get();
ID3D12Fence* pFence = m_threadFences[threadIndex].Get();
while (0 == InterlockedGetValue(&m_terminating))
{
// Run the particle simulation.
Simulate(threadIndex);
// Close and execute the command list.
ThrowIfFailed(pCommandList->Close());
ID3D12CommandList* ppCommandLists[] = { pCommandList };
pCommandQueue->ExecuteCommandLists(1, ppCommandLists);
// Wait for the compute shader to complete the simulation.
UINT64 threadFenceValue = InterlockedIncrement(&m_threadFenceValues[threadIndex]);
ThrowIfFailed(pCommandQueue->Signal(pFence, threadFenceValue));
ThrowIfFailed(pFence->SetEventOnCompletion(threadFenceValue, m_threadFenceEvents[threadIndex]));
WaitForSingleObject(m_threadFenceEvents[threadIndex], INFINITE);
// Wait for the render thread to be done with the SRV so that
// the next frame in the simulation can run.
UINT64 renderContextFenceValue = InterlockedGetValue(&m_renderContextFenceValues[threadIndex]);
if (m_renderContextFence->GetCompletedValue() < renderContextFenceValue)
{
ThrowIfFailed(pCommandQueue->Wait(m_renderContextFence.Get(), renderContextFenceValue));
InterlockedExchange(&m_renderContextFenceValues[threadIndex], 0);
}
// Swap the indices to the SRV and UAV.
m_srvIndex[threadIndex] = 1 - m_srvIndex[threadIndex];
// Prepare for the next frame.
ThrowIfFailed(pCommandAllocator->Reset());
ThrowIfFailed(pCommandList->Reset(pCommandAllocator, m_computeState.Get()));
}
return 0;
}
Weitere Informationen finden Sie im Beispielcode in der D3D12-Referenz.
Anforderungen
Zielplattform | Windows |
Kopfzeile | d3d12.h |