Antarmuka ID3D12CommandAllocator (d3d12.h)
Mewakili alokasi penyimpanan untuk perintah unit pemrosesan grafis (GPU).
Warisan
Antarmuka ID3D12CommandAllocator mewarisi dari ID3D12Pageable. ID3D12CommandAllocator juga memiliki jenis anggota berikut:
Metode
Antarmuka ID3D12CommandAllocator memiliki metode ini.
ID3D12CommandAllocator::Reset Menunjukkan untuk menggunakan kembali memori yang terkait dengan alokator perintah. |
Keterangan
Gunakan ID3D12Device::CreateCommandAllocator untuk membuat objek alokator perintah.
Objek alokator perintah sesuai dengan alokasi yang mendasar di mana perintah GPU disimpan. Objek alokator perintah berlaku untuk daftar perintah langsung dan bundel. Anda harus menggunakan objek alokator perintah di aplikasi DirectX 12.
Contoh
Sampel D3D12nBodyGravity menggunakan ID3D12CommandAllocator sebagai berikut:
Deklarasi file header.
D3D12_VIEWPORT m_viewport;
D3D12_RECT m_scissorRect;
ComPtr<IDXGISwapChain3> m_swapChain;
ComPtr<ID3D12Device> m_device;
ComPtr<ID3D12Resource> m_renderTargets[FrameCount];
ComPtr<ID3D12CommandAllocator> m_commandAllocator;
ComPtr<ID3D12CommandQueue> m_commandQueue;
ComPtr<ID3D12RootSignature> m_rootSignature;
ComPtr<ID3D12DescriptorHeap> m_rtvHeap;
ComPtr<ID3D12PipelineState> m_pipelineState;
ComPtr<ID3D12GraphicsCommandList> m_commandList;
UINT m_rtvDescriptorSize;
Utas komputasi asinkron.
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;
}
Lihat Contoh Kode dalam Referensi D3D12.
Persyaratan
Persyaratan | Nilai |
---|---|
Target Platform | Windows |
Header | d3d12.h |