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_FAILReset 호출이 이루어졌을 때 명령 목록이 "닫힌" 상태가 아니거나 디바이스당 제한이 초과된 경우입니다.
- 운영 체제에 메모리가 부족하면 E_OUTOFMEMORY.
- 할당자가 현재 "기록" 상태의 다른 명령 목록과 함께 사용 중이거나 지정된 할당자가 잘못된 형식으로 만들어졌는지 여부를 E_INVALIDARG.
발언
다시 설정사용하면 할당 없이 명령 목록 추적 구조를 다시 사용할 수 있습니다. ID3D12CommandAllocator::Reset달리 명령 목록이 실행되는 동안 다시 설정 호출할 수 있습니다.
직접 명령 목록과 번들 모두에 다시 설정 사용할 수 있습니다.
Reset 전달된 명령 할당자는 현재 기록 중인 다른 명령 목록과 연결할 수 없습니다. 할당자 유형, 직접 명령 목록 또는 번들은 생성되는 명령 목록의 형식과 일치해야 합니다.
번들이 리소스 힙을 지정하지 않으면 설명자 테이블이 바인딩되는 것을 변경할 수 없습니다. 어느 쪽이든 번들은 번들 내에서 리소스 힙을 변경할 수 없습니다. 번들에 대해 힙이 지정된 경우 힙은 호출하는 '부모' 명령 목록의 힙과 일치해야 합니다.
런타임 유효성 검사
앱이다시앱은 명령 목록 할당자를 지정해야 합니다. 런타임은 할당자가 둘 이상의 기록 명령 목록과 동시에 연결되지 않도록 합니다.
아직 제출되지 않은 명령 목록에서 참조하는 번들에 대해 다시 설정 실패합니다.
디버그 계층
또한 디버그 계층은 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 참조
요구 사항
요구 | 값 |
---|---|
대상 플랫폼 | Windows |
헤더 | d3d12.h |
라이브러리 | D3d12.lib |
DLL | D3d12.dll |
참고 항목
ID3D12Device::CreateCommandList
ID3D12GraphicsCommandList