Método ID3D12CommandAllocator::Reset (d3d12.h)
Indica a reutilização da memória associada ao alocador de comandos.
Sintaxe
HRESULT Reset();
Valor de retorno
Esse método retornará E_FAIL se houver uma lista de comandos de gravação ativamente referenciando o alocador de comandos. A camada de depuração também emitirá um erro nesse caso.
Consulte códigos de retorno do Direct3D 12 para obter outros valores de retorno possíveis.
Observações
Seu aplicativo chama Redefinir para reutilização da memória associada a um alocador de comandos. Dessa chamada para Redefinir, o runtime e o driver assumem que a GPU (unidade de processamento gráfico) não está mais executando listas de comandos que tenham comandos gravados com o alocador de comandos. Portanto, você deve garantir que não chame Redefinir até que a GPU termine de executar listas de comandos associadas ao alocador.
É um comportamento indefinido chamar Redefinir em um alocador de comandos enquanto ele ainda tem uma lista de comandos sendo executada.
A camada de depuração emitirá um aviso se não puder provar que não há referências de GPU pendentes a listas de comandos que tenham comandos registrados no alocador.
A camada de depuração emitirá um erro se Redefinir for chamado simultaneamente por vários threads (no mesmo objeto alocador).
Exemplos
O exemplo D3D12HelloTriangle usa ID3D12CommandAllocator::Reset da seguinte maneira:
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;
// Command list allocators can only be reset when the associated
// command lists have finished execution on the GPU; apps should use
// fences to determine GPU execution progress.
ThrowIfFailed(m_commandAllocator->Reset());
// However, when ExecuteCommandList() is called on a particular command
// list, that command list can then be reset at any time and must be before
// re-recording.
ThrowIfFailed(m_commandList->Reset(m_commandAllocator.Get(), m_pipelineState.Get()));
// Set necessary state.
m_commandList->SetGraphicsRootSignature(m_rootSignature.Get());
m_commandList->RSSetViewports(1, &m_viewport);
m_commandList->RSSetScissorRects(1, &m_scissorRect);
// Indicate that the back buffer will be used as a render target.
m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET));
CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(m_rtvHeap->GetCPUDescriptorHandleForHeapStart(), m_frameIndex, m_rtvDescriptorSize);
m_commandList->OMSetRenderTargets(1, &rtvHandle, FALSE, nullptr);
// Record commands.
const float clearColor[] = { 0.0f, 0.2f, 0.4f, 1.0f };
m_commandList->ClearRenderTargetView(rtvHandle, clearColor, 0, nullptr);
m_commandList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
m_commandList->IASetVertexBuffers(0, 1, &m_vertexBufferView);
m_commandList->DrawInstanced(3, 1, 0, 0);
// Indicate that the back buffer will now be used to present.
m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT));
ThrowIfFailed(m_commandList->Close());
Consulte o código de exemplo node referência D3D12.
Requisitos
Requisito | Valor |
---|---|
da Plataforma de Destino |
Windows |
cabeçalho | d3d12.h |
biblioteca | D3D12.lib |
de DLL |
D3D12.dll |