共用方式為


ID3D12GraphicsCommandList::Reset 方法 (d3d12.h)

將命令清單重設為其初始狀態,就像剛建立新的命令清單一樣。

語法

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

參數

[in] pAllocator

類型:ID3D12CommandAllocator*

裝置從中建立命令清單 ID3D12CommandAllocator 物件的指標。

[in, optional] pInitialState

類型:ID3D12PipelineState*

ID3D12PipelineState 物件的指標,其中包含命令清單的初始管線狀態。 這是選擇性的,可以是 NULL。 如果為 NULL,運行時間會設定虛擬初始管線狀態,讓驅動程式不必處理未定義的狀態。 這個的額外負荷很低,特別是針對命令清單,記錄命令清單的整體成本可能會使一個初始狀態設定的成本相形見絀。 因此,如果不方便,則不會設定初始管線狀態參數的成本很少。

另一方面,對於套件組合而言,嘗試設定初始狀態參數可能更合理,因為套件組合可能比較小,而且可以經常重複使用。

傳回值

類型:HRESULT

如果成功,則傳回 S_OK;否則,會傳回下列其中一個值:

  • E_FAIL 如果命令清單在進行 重設 呼叫時未處於「已關閉」狀態,或超過每個裝置的限制。
  • 如果操作系統記憶體不足,E_OUTOFMEMORY
  • E_INVALIDARG,如果配置器目前正與處於「錄製」狀態的另一個命令清單搭配使用,或者指定的配置器是以錯誤類型建立的。
如需其他可能的傳回值,請參閱 Direct3D 12 傳回碼

言論

藉由使用 Reset,您可以重複使用命令列表追蹤結構,而不需要任何配置。 不同於 ID3D12CommandAllocator::Reset,您可以在命令清單仍在執行時呼叫 Reset

您可以針對直接命令清單和套件組合使用 重設

傳遞至 Reset 的命令配置器無法與任何其他目前錄製的命令清單相關聯。 配置器類型、直接命令清單或配套必須符合所建立的命令清單類型。

如果套件組合未指定資源堆積,就無法對系結描述元數據表進行變更。 無論哪種方式,套件組合都無法變更套件組合內的資源堆積。 如果為套件組合指定堆積,堆積必須符合呼叫的 『parent』 命令清單堆積。

執行時間驗證

在應用程式呼叫 Reset之前,命令清單必須處於「已關閉」狀態。 如果命令清單不是處於「已關閉」狀態,重設 將會失敗。
注意 如果呼叫 ID3D12GraphicsCommandList::Close 失敗,則永遠無法重設命令清單。 呼叫 Reset 會導致傳回 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