Partager via


ID3D12GraphicsCommandList ::Reset, méthode (d3d12.h)

Réinitialise une liste de commandes à son état initial comme si une nouvelle liste de commandes vient d’être créée.

Syntaxe

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

Paramètres

[in] pAllocator

Type : ID3D12CommandAllocator*

Pointeur vers l’objet ID3D12CommandAllocator à partir duquel l’appareil crée des listes de commandes.

[in, optional] pInitialState

Type : ID3D12PipelineState*

Pointeur vers l’objet ID3D12PipelineState qui contient l’état initial du pipeline pour la liste de commandes. Cela est facultatif et peut être NULL. Si la valeur EST NULL, le runtime définit un état de pipeline initial factice afin que les pilotes n’aient pas à gérer l’état non défini. La surcharge pour ce problème est faible, en particulier pour une liste de commandes, pour laquelle le coût global d’enregistrement de la liste de commandes n’a probablement plus de coût d’un paramètre d’état initial. Il est donc peu coûteux de ne pas définir le paramètre d’état du pipeline initial s’il n’est pas pratique.

Pour les offres groupées d’un autre côté, il peut être plus judicieux d’essayer de définir le paramètre d’état initial, car les bundles sont probablement plus petits et peuvent être réutilisés fréquemment.

Valeur de retour

Type : HRESULT

Retourne S_OK en cas de réussite ; sinon, retourne l’une des valeurs suivantes :

  • E_FAIL si la liste de commandes n’était pas dans l’état « fermé » lorsque l’appel réinitialiser a été effectué, ou si la limite par appareil aurait été dépassée.
  • E_OUTOFMEMORY si le système d’exploitation n’a plus de mémoire.
  • E_INVALIDARG si l’allocateur est actuellement utilisé avec une autre liste de commandes dans l’état « enregistrement » ou si l’allocateur spécifié a été créé avec le type incorrect.
Consultez Codes de retour Direct3D 12 pour obtenir d’autres valeurs de retour possibles.

Remarques

En utilisant réinitialiser, vous pouvez réutiliser les structures de suivi de liste de commandes sans allocations. Contrairement à ID3D12CommandAllocator ::Reset, vous pouvez appeler Réinitialiser pendant l’exécution de la liste de commandes.

Vous pouvez utiliser réinitialiser pour les listes de commandes directes et les offres groupées.

L’allocateur de commande passé à Réinitialiser ne peut pas être associé à une autre liste de commandes actuellement enregistrée. Le type d’allocator, la liste de commandes directe ou l’offre groupée doivent correspondre au type de liste de commandes en cours de création.

Si un bundle ne spécifie pas de tas de ressources, il ne peut pas apporter de modifications aux tables de descripteur liées. Dans les deux cas, les offres groupées ne peuvent pas modifier le tas de ressources dans le bundle. Si un tas est spécifié pour un bundle, le tas doit correspondre au tas de commandes « parent » appelant.

validation du runtime

Avant qu’une application appelle Réinitialiser, la liste de commandes doit être à l’état « fermé ». réinitialiser échouera si la liste de commandes n’est pas à l’état « fermé ».
Remarque Si un appel à ID3D12GraphicsCommandList ::Close échoue, la liste de commandes ne peut jamais être réinitialisée. L’appel de réinitialiser génère la même erreur que ID3D12GraphicsCommandList ::Close retournée.
 
Une fois réinitialiser réussit, la liste de commandes est laissée à l’état « enregistrement ». Réinitialiser échouera s’il entraînerait le dépassement de la limite maximale de la liste de commandes d’enregistrement simultanée, spécifiée lors de la création de l’appareil.

Les applications doivent spécifier un allocateur de liste de commandes. Le runtime garantit qu’un allocateur n’est jamais associé à plusieurs listes de commandes d’enregistrement en même temps.

Réinitialiser échoue pour les offres groupées référencées par une liste de commandes non encore envoyée.

couche de débogage

La couche de débogage effectue également le suivi de la progression de l’unité de traitement graphique (GPU) et émet une erreur s’il ne peut pas prouver qu’il n’y a pas d’exécutions en attente de la liste de commandes.

Exemples

L’exemple D3D12HelloTriangle utilise ID3D12GraphicsCommandList ::Reset comme suit :

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

Consultez exemple de code dans lade référence D3D12 .

Exigences

Exigence Valeur
plateforme cible Windows
d’en-tête d3d12.h
bibliothèque D3d12.lib
DLL D3d12.dll

Voir aussi

ID3D12CommandAllocator ::Reset

ID3D12Device ::CreateCommandList

ID3D12GraphicsCommandList