次の方法で共有


ID3D12CommandAllocator::Reset メソッド (d3d12.h)

コマンド アロケーターに関連付けられているメモリを再利用することを示します。

構文

HRESULT Reset();

戻り値

型: HRESULT

このメソッドは、コマンド アロケーターを参照するアクティブな記録コマンド リストがある場合、E_FAIL を返します。 この場合、デバッグ レイヤーでもエラーが発生します。
その他 戻り値については、Direct3D 12 リターン コード を参照してください。

備考

アプリは Reset を呼び出して、コマンド アロケーターに関連付けられているメモリを再利用します。 Resetの呼び出しから、ランタイムとドライバーは、コマンド アロケーターを使用してコマンドを記録したコマンド リストがグラフィックス処理装置 (GPU) によって実行されなくなったことを前提としています。 そのため、GPU がアロケーターに関連付けられているコマンド リストの実行が完了するまで、Reset を呼び出さないようにする必要があります。

コマンド アロケーターで Reset を呼び出すのは未定義の動作ですが、コマンド リストがまだ実行されています。

アロケーターにコマンドを記録したコマンド リストへの保留中の GPU 参照がないことを証明できない場合、デバッグ レイヤーは警告を発行します。

Reset が複数のスレッド (同じアロケーター オブジェクト上) によって同時に呼び出されると、デバッグ レイヤーでエラーが発生します。

D3D12HelloTriangle サンプルでは、次のように ID3D12CommandAllocator::Reset 使用します。

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

D3D12 リファレンスの サンプル コードを参照してください。

必要条件

要件 価値
ターゲット プラットフォーム の ウィンドウズ
ヘッダー d3d12.h
ライブラリ D3D12.lib
DLL D3D12.dll

関連項目

ID3D12CommandAllocator