Поделиться через


Метод ID3D12CommandAllocator::Reset (d3d12.h)

Указывает повторно использовать память, связанную с распределителем команд.

Синтаксис

HRESULT Reset();

Возвращаемое значение

Тип: HRESULT

Этот метод возвращает E_FAIL, если есть активно записывающий список команд, ссылающийся на распределитель команд. Слой отладки также выдает ошибку в этом случае.
Дополнительные возможные значения возвращаемых значений см. в Direct3D 12 Return Code.

Замечания

Приложение вызывает сброс для повторного использования памяти, связанной с распределителем команд. Из этого вызова сбросасреда выполнения и драйвер предполагают, что модуль обработки графики (GPU) больше не выполняет списки команд с записанными командами с помощью распределителя команд. Поэтому следует убедиться, что вы не вызываете сброс, пока gpu не будет выполнена выполнение списков команд, связанных с распределителем.

Не определено поведение вызова сброса на распределителе команд во время выполнения списка команд.

Слой отладки выдает предупреждение, если он не может доказать, что нет ожидающих ссылок GPU на списки команд, которые записывают команды в распределителе.

Уровень отладки выдает ошибку, если сброс вызывается одновременно несколькими потоками (в одном объекте распределителя).

Примеры

В примере 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