다음을 통해 공유


ID3D12CommandAllocator::Reset 메서드(d3d12.h)

명령 할당자와 연결된 메모리를 다시 사용하도록 나타냅니다.

통사론

HRESULT Reset();

반환 값

형식: HRESULT

이 메서드는 명령 할당자를 참조하는 현재 기록 명령 목록이 있는 경우 E_FAIL 반환합니다. 이 경우 디버그 계층에서도 오류가 발생합니다.
다른 가능한 반환 값은 Direct3D 12 반환 코드 참조하세요.

발언

앱은 다시 설정 호출하여 명령 할당자와 연결된 메모리를 다시 사용합니다. 이 호출에서 다시 설정런타임 및 드라이버는 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 참조예제 코드를 참조하세요.

요구 사항

요구
대상 플랫폼 Windows
헤더 d3d12.h
라이브러리 D3D12.lib
DLL D3D12.dll

참고 항목

ID3D12CommandAllocator