新しいコマンド リストが作成されたかのように、コマンド リストを初期状態に戻します。
構文
HRESULT Reset(
[in] ID3D12CommandAllocator *pAllocator,
[in, optional] ID3D12PipelineState *pInitialState
);
パラメーター
[in] pAllocator
型: ID3D12CommandAllocator*
デバイスがコマンド リストを作成する ID3D12CommandAllocator オブジェクトへのポインター。
[in, optional] pInitialState
型: ID3D12PipelineState*
コマンド リストの初期パイプライン状態を含む ID3D12PipelineState オブジェクトへのポインター。 これは省略可能で、NULL にすることができます。 NULL の場合、ドライバーが未定義の状態を処理する必要がないように、ランタイムによってダミーの初期パイプライン状態が設定されます。 このためのオーバーヘッドは低く、特にコマンド リストの場合、コマンド リストを記録する全体的なコストは、1 つの初期状態設定のコストを小さくする可能性があります。 そのため、最初のパイプライン状態パラメーターを設定しないと便利でない場合、コストはほとんど発生しません。
一方、バンドルの場合、バンドルは全体的に小さく、頻繁に再利用できるため、初期状態パラメーターの設定を試みる方が理にかなっている可能性があります。
戻り値
成功した場合 はS_OK を返します。それ以外の場合は、次のいずれかの値を返します。
- E_FAILリセット呼び出しが行われたときにコマンド リストが "closed" 状態になっていないか、デバイスごとの制限を超えた可能性があります。
- オペレーティング システムのメモリ不足が発生した場合にE_OUTOFMEMORYします。
- E_INVALIDARG アロケーターが現在、"記録" 状態の別のコマンド リストで使用されている場合、または指定されたアロケーターが間違った型で作成された場合です。
備考
Reset を使用すると、割り当てなしでコマンド リスト追跡構造を再利用できます。 ID3D12CommandAllocator::Reset とは異なり、コマンド リストの実行中に ID3D12GraphicsCommandList::Reset を呼び出すことができます。
直接コマンド リストとバンドルの両方に Reset を使用できます。
Reset に渡されたコマンド アロケーターは、現在記録されている他のコマンド リストに関連付けることはできません。 アロケーターの種類であるダイレクト コマンド リストまたはバンドルは、作成されるコマンド リストの種類と一致する必要があります。
バンドルでリソース ヒープが指定されていない場合、どの記述子テーブルがバインドされているかを変更することはできません。 いずれの場合も、バンドルはバンドル内のリソース ヒープを変更できません。 バンドルにヒープが指定されている場合、ヒープは呼び出し元の 'parent' コマンド リストのヒープと一致する必要があります。
ランタイムの検証
アプリが Reset を呼び出す前に、コマンド リストは "closed" 状態である必要があります。 コマンド リストが "closed" 状態でない場合、リセットは失敗します。アプリでは、コマンド リスト アロケーターを指定する必要があります。 ランタイムによって、アロケーターが複数の記録コマンド リストに同時に関連付けられることはありません。
まだ送信されていないコマンド リストによって参照されているバンドルのリセットは失敗します。
例
D3D12HelloTriangle サンプルでは、ID3D12GraphicsCommandList::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;
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());
}
D3D12 リファレンスのコード例を参照してください。
必要条件
要件 | 価値 |
---|---|
ターゲット プラットフォーム の | ウィンドウズ |
ヘッダー | d3d12.h |
図書館 | D3d12.lib |
DLL | D3d12.dll |