Método ID3D12GraphicsCommandList::Reset (d3d12.h)
Redefine uma lista de comandos de volta ao estado inicial como se uma nova lista de comandos tivesse sido criada.
Sintaxe
HRESULT Reset(
[in] ID3D12CommandAllocator *pAllocator,
[in, optional] ID3D12PipelineState *pInitialState
);
Parâmetros
[in] pAllocator
Tipo: ID3D12CommandAllocator*
Um ponteiro para o objeto ID3D12CommandAllocator do qual o dispositivo cria listas de comandos.
[in, optional] pInitialState
Tipo: ID3D12PipelineState*
Um ponteiro para o objeto ID3D12PipelineState que contém o estado inicial do pipeline para a lista de comandos. Isso é opcional e pode ser NULL. Se NULL, o runtime definirá um estado de pipeline inicial fictício para que os drivers não precisem lidar com o estado indefinido. A sobrecarga para isso é baixa, especialmente para uma lista de comandos, para a qual o custo geral da gravação da lista de comandos provavelmente reduz o custo de uma configuração de estado inicial. Portanto, há pouco custo em não definir o parâmetro de estado do pipeline inicial se não for conveniente.
Para pacotes por outro lado, pode fazer mais sentido tentar definir o parâmetro de estado inicial, pois os pacotes provavelmente são menores no geral e podem ser reutilizados com frequência.
Valor de retorno
Retorna S_OK se bem-sucedido; caso contrário, retorna um dos seguintes valores:
- E_FAIL se a lista de comandos não estava no estado "fechado" quando a chamada Redefinir foi feita ou o limite por dispositivo teria sido excedido.
- E_OUTOFMEMORY se o sistema operacional ficou sem memória.
- E_INVALIDARG se o alocador estiver sendo usado com outra lista de comandos no estado "gravação" ou se o alocador especificado tiver sido criado com o tipo errado.
Observações
Usando Redefinir, você pode reutilizá-la sem alocações. Ao contrário de ID3D12CommandAllocator::Reset, você pode chamar Redefinir enquanto a lista de comandos ainda está sendo executada.
Você pode usar Redefinir para listas de comandos diretos e pacotes.
O alocador de comandos passado para Redefinir não pode ser associado a nenhuma outra lista de comandos de gravação no momento. O tipo de alocador, lista de comandos direta ou pacote deve corresponder ao tipo de lista de comandos que está sendo criada.
Se um pacote não especificar um heap de recursos, ele não poderá fazer alterações às quais as tabelas de descritor estão associadas. De qualquer forma, os pacotes não podem alterar o heap de recursos dentro do pacote. Se um heap for especificado para um pacote, o heap deverá corresponder ao heap da lista de comandos "pai" de chamada.
Validação do runtime do
Antes que um aplicativo chame Redefinir, a lista de comandos deve estar no estado "fechado". Redefinir falhará se a lista de comandos não estiver no estado "fechado".Os aplicativos devem especificar um alocador de lista de comandos. O runtime garantirá que um alocador nunca esteja associado a mais de uma lista de comandos de gravação ao mesmo tempo.
de Redefinição falha em pacotes referenciados por uma lista de comandos ainda não enviada.
camada de depuração
A camada de depuração também acompanhará o progresso da GPU (unidade de processamento gráfico) e emitirá um erro se não puder provar que não há execuções pendentes da lista de comandos.Exemplos
O exemplo D3D12HelloTriangle usa ID3D12GraphicsCommandList::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;
void D3D12HelloTriangle::PopulateCommandList()
{
// 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 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 |