Condividi tramite


Metodo ID3D12GraphicsCommandList::Reset (d3d12.h)

Ripristina lo stato iniziale di un elenco di comandi come se fosse stato appena creato un nuovo elenco di comandi.

Sintassi

HRESULT Reset(
  [in]           ID3D12CommandAllocator *pAllocator,
  [in, optional] ID3D12PipelineState    *pInitialState
);

Parametri

[in] pAllocator

Tipo: ID3D12CommandAllocator*

Puntatore al ID3D12CommandAllocator oggetto da cui il dispositivo crea elenchi di comandi.

[in, optional] pInitialState

Tipo: ID3D12PipelineState*

Puntatore all'oggetto ID3D12PipelineState che contiene lo stato iniziale della pipeline per l'elenco di comandi. Questa opzione è facoltativa e può essere NULL. Se NULL, il runtime imposta uno stato fittizio della pipeline iniziale in modo che i driver non devono gestire lo stato non definito. Il sovraccarico per questo è basso, in particolare per un elenco di comandi, per cui il costo complessivo della registrazione dell'elenco di comandi probabilmente riduce il costo di un'impostazione di stato iniziale. Non è quindi necessario impostare il parametro di stato della pipeline iniziale se non è conveniente.

Per i bundle, invece, potrebbe essere più opportuno provare a impostare il parametro di stato iniziale, perché i bundle sono probabilmente più piccoli nel complesso e possono essere riutilizzati di frequente.

Valore restituito

Tipo: HRESULT

Restituisce S_OK se ha esito positivo; in caso contrario, restituisce uno dei valori seguenti:

  • E_FAIL se l'elenco dei comandi non era nello stato "chiuso" quando è stata effettuata la chiamata Reimposta o il limite per dispositivo sarebbe stato superato.
  • E_OUTOFMEMORY se il sistema operativo esaurisce la memoria.
  • E_INVALIDARG se l'allocatore è attualmente in uso con un altro elenco di comandi nello stato di "registrazione" o se l'allocatore specificato è stato creato con il tipo errato.
Per altri possibili valori restituiti, vedere Codici restituiti Direct3D 12.

Osservazioni

Usando Reset, è possibile riutilizzare le strutture di rilevamento dell'elenco di comandi senza allocazioni. A differenza di ID3D12CommandAllocator::Reset, è possibile chiamare Reset mentre l'elenco dei comandi è ancora in esecuzione.

È possibile usare reset sia per gli elenchi di comandi diretti che per i bundle.

L'allocatore del comando passato a Reset non può essere associato a un altro elenco di comandi attualmente registrato. Il tipo di allocatore, l'elenco di comandi diretti o il bundle, deve corrispondere al tipo di elenco di comandi creato.

Se un bundle non specifica un heap delle risorse, non può apportare modifiche alle tabelle del descrittore associate. In entrambi i casi, i bundle non possono modificare l'heap delle risorse all'interno del bundle. Se per un bundle viene specificato un heap, l'heap deve corrispondere all'heap dell'elenco di comandi 'padre'.

convalida runtime

Prima che un'app chiami Reset, l'elenco dei comandi deve trovarsi nello stato "chiuso". La reimpostazione avrà esito negativo se l'elenco dei comandi non è nello stato "chiuso".
Nota Se una chiamata a ID3D12GraphicsCommandList::Close ha esito negativo, l'elenco dei comandi non può mai essere reimpostato. Se si chiama Reset verrà restituito lo stesso errore restituito ID3D12GraphicsCommandList::Close restituito.
 
Dopo che Reimposta ha esito positivo, l'elenco dei comandi viene lasciato nello stato di "registrazione". Reset avrà esito negativo se il limite massimo dell'elenco di comandi di registrazione simultanea, specificato al momento della creazione del dispositivo, verrà superato.

Le app devono specificare un allocatore dell'elenco di comandi. Il runtime garantisce che un allocatore non sia mai associato a più di un elenco di comandi di registrazione contemporaneamente.

La reimpostazione ha esito negativo per i bundle a cui fa riferimento un elenco di comandi non ancora inviato.

livello debug

Il livello di debug tiene traccia anche dello stato di avanzamento dell'unità di elaborazione grafica (GPU) e genera un errore se non riesce a dimostrare che non sono presenti esecuzioni in sospeso dell'elenco di comandi.

Esempi

L'esempio di D3D12HelloTriangle usa ID3D12GraphicsCommandList::Reset come segue:

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());
}

Vedere codice di esempio neldi riferimento D3D12 .

Fabbisogno

Requisito Valore
piattaforma di destinazione Finestre
intestazione d3d12.h
libreria D3d12.lib
dll D3d12.dll

Vedere anche

ID3D12CommandAllocator::Reset

ID3D12Device::CreateCommandList

ID3D12GraphicsCommandList