Partager via


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

Indique de réutiliser la mémoire associée à l’allocateur de commande.

Syntaxe

HRESULT Reset();

Valeur de retour

Type : HRESULT

Cette méthode retourne E_FAIL s’il existe une liste de commandes en cours d’enregistrement faisant référence à l’allocateur de commandes. La couche de débogage émet également une erreur dans ce cas.
Consultez Codes de retour Direct3D 12 pour obtenir d’autres valeurs de retour possibles.

Remarques

Votre application appelle réinitialiser pour réutiliser la mémoire associée à un allocateur de commande. De cet appel à Réinitialiser, le runtime et le pilote supposent que l’unité de traitement graphique (GPU) n’exécute plus de listes de commandes qui ont enregistré des commandes avec l’allocateur de commande. Vous devez donc vous assurer que vous n’appelez pas Réinitialiser tant que le GPU n’a pas terminé d’exécuter des listes de commandes associées à l’allocateur.

Il n’est pas défini de comportement pour appeler Réinitialiser sur un allocateur de commandes alors qu’une liste de commandes est toujours en cours d’exécution.

La couche de débogage émet un avertissement s’il ne peut pas prouver qu’il n’existe aucune référence GPU en attente aux listes de commandes qui ont enregistré des commandes dans l’allocateur.

La couche de débogage génère une erreur si Réinitialiser est appelée simultanément par plusieurs threads (sur le même objet allocator).

Exemples

L’exemple D3D12HelloTriangle utilise ID3D12CommandAllocator ::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;
// 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());

Reportez-vous à l’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