次の方法で共有


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

新しいコマンド リストが作成されたかのように、コマンド リストを初期状態に戻します。

構文

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

パラメーター

[in] pAllocator

型: ID3D12CommandAllocator*

デバイスがコマンド リストを作成する ID3D12CommandAllocator オブジェクトへのポインター。

[in, optional] pInitialState

型: ID3D12PipelineState*

コマンド リストの初期パイプライン状態を含む ID3D12PipelineState オブジェクトへのポインター。 これは省略可能で、NULL にすることができます。 NULL の場合、ドライバーが未定義の状態を処理する必要がないように、ランタイムによってダミーの初期パイプライン状態が設定されます。 このためのオーバーヘッドは低く、特にコマンド リストの場合、コマンド リストを記録する全体的なコストは、1 つの初期状態設定のコストを小さくする可能性があります。 そのため、最初のパイプライン状態パラメーターを設定しないと便利でない場合、コストはほとんど発生しません。

一方、バンドルの場合、バンドルは全体的に小さく、頻繁に再利用できるため、初期状態パラメーターの設定を試みる方が理にかなっている可能性があります。

戻り値

型: HRESULT

成功した場合は S_OK を返します。それ以外の場合は、次のいずれかの値を返します。

  • E_FAILリセット 呼び出しが行われたときにコマンド リストが "閉じられている" 状態になっていないか、デバイスごとの制限を超えた可能性があります。
  • オペレーティング システムのメモリ不足が発生した場合に E_OUTOFMEMORY します。
  • E_INVALIDARG アロケーターが現在、"記録" 状態の別のコマンド リストで使用されている場合、または指定したアロケーターが間違った型で作成された場合です。
その他 戻り値については、Direct3D 12 リターン コード を参照してください。

備考

リセットを使用すると、割り当てなしでコマンド リスト追跡構造を再利用できます。 ID3D12CommandAllocator::Resetとは異なり、コマンド リストの実行中に Reset を呼び出すことができます。

直接コマンド リストとバンドルの両方 リセット を使用できます。

Reset に渡されたコマンド アロケーターは、現在記録されている他のコマンド リストに関連付けることができません。 アロケーターの種類であるダイレクト コマンド リストまたはバンドルは、作成されるコマンド リストの種類と一致する必要があります。

バンドルでリソース ヒープが指定されていない場合、どの記述子テーブルがバインドされているかを変更することはできません。 いずれの場合も、バンドルはバンドル内のリソース ヒープを変更できません。 バンドルにヒープが指定されている場合、ヒープは呼び出し元の 'parent' コマンド リストのヒープと一致する必要があります。

ランタイム検証

アプリがリセット呼び出す前に、コマンド 一覧が "閉じている" 状態である必要があります。 コマンド リストが "closed" 状態でない場合、 のリセットは失敗します。
ID3D12GraphicsCommandList::Close の呼び出しが失敗した場合、コマンド リストをリセットすることはできません。 リセット 呼び出すと、ID3D12GraphicsCommandList::Close が返されたのと同じエラーが返されます。
 
リセット が成功すると、コマンド リストは "記録" 状態になります。 リセット は、デバイスの作成時に指定された同時記録コマンド リストの上限を超えると失敗します。

アプリでは、コマンド リスト アロケーターを指定する必要があります。 ランタイムによって、アロケーターが複数の記録コマンド リストに同時に関連付けられることはありません。

リセット は、まだ送信されていないコマンド リストによって参照されているバンドルに対して失敗します。

デバッグ レイヤー

また、デバッグ レイヤーはグラフィックス処理装置 (GPU) の進行状況を追跡し、コマンド リストの未処理の実行がないことを証明できない場合はエラーを発行します。

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

関連項目

ID3D12CommandAllocator::Reset

ID3D12Device::CreateCommandList

ID3D12GraphicsCommandList