Share via


ID3D12CommandQueue::ExecuteCommandLists 메서드(d3d12.h)

실행을 위해 명령 목록 배열을 제출합니다.

구문

void ExecuteCommandLists(
  [in] UINT              NumCommandLists,
  [in] ID3D12CommandList * const *ppCommandLists
);

매개 변수

[in] NumCommandLists

실행할 명령 목록의 수입니다.

[in] ppCommandLists

실행할 ID3D12CommandList 명령 목록의 배열입니다.

반환 값

없음

설명

ExecuteCommandLists를 동일한 스레드 또는 다른 스레드에서 연속으로 두 번 호출하면 첫 번째 워크로드(A)가 두 번째 워크로드(B) 전에 완료됩니다. 두 개의 명령 목록을 사용하여 ExecuteCommandLists를 호출하면 드라이버가 두 명령 목록을 병합하여 두 번째 명령 목록(D)이 첫 번째(C)의 모든 작업이 완료되기 전에 작업 실행을 시작할 수 있습니다. 특히 애플리케이션은 펜스 신호를 삽입하거나 A와 B 사이에 대기할 수 있으며, 드라이버는 이를 파악할 수 없으므로 드라이버는 펜스 작업 전에 A의 모든 것이 완료되었는지 확인해야 합니다. API에 대한 단일 호출에는 이러한 기회가 없으므로 드라이버는 해당 시나리오를 최적화할 수 있습니다.

드라이버는 제출된 명령 목록을 자유롭게 패치할 수 있습니다. GPU(그래픽 처리 장치)가 현재 이전 실행에서 제출된 명령 목록을 읽지 않도록 하는 것은 호출 애플리케이션의 책임입니다.

애플리케이션은 GPU에 제출된 명령과 관련된 고정 비용을 줄이기 위해 명령 목록 실행을 일괄 처리하는 것이 좋습니다.

런타임 유효성 검사

번들은 명령 큐에 직접 제출할 수 없습니다. 번들을 이 메서드에 전달하면 런타임에서 호출을 삭제합니다. 하나 이상의 명령 목록에서 Close 함수가 호출되지 않은 경우에도 런타임이 호출을 삭제합니다.

런타임은 Close 가 호출된 후 명령 목록과 연결된 명령 할당자가 다시 설정되었는지 검색합니다. 런타임은 이 상황에서 호출을 삭제하고 디바이스를 제거합니다.

명령 큐 펜스가 명령 목록의 이전 실행이 아직 완료되지 않았다는 것을 나타내는 경우 런타임은 호출을 삭제하고 디바이스를 제거합니다.

런타임은 ExecuteCommandLists 내에서 리소스 전환 장벽의 "이전" 및 "이후" 상태의 유효성을 검사합니다. 전환의 "이전" 상태가 이전 전환의 "이후" 상태와 일치하지 않는 경우 런타임은 호출을 삭제하고 디바이스를 제거합니다.

런타임은 명령 목록에서 사용하는 쿼리의 "이전" 및 "이후" 상태의 유효성을 검사합니다. 오류가 감지되면 런타임에서 호출을 삭제하고 디바이스를 제거합니다.

디버그 계층

디버그 계층은 런타임이 호출을 삭제하는 모든 경우에 대해 오류를 발생합니다.

디버그 계층은 쿼리를 포함하여 명령 목록에서 참조하는 리소스가 제거되었음을 감지하면 오류를 발생합니다.

예제

장면을 렌더링합니다.

// Pipeline objects.
D3D12_VIEWPORT m_viewport;
ComPtr<IDXGISwapChain3> m_swapChain;
ComPtr<ID3D11DeviceContext> m_d3d11DeviceContext;
ComPtr<ID3D11On12Device> m_d3d11On12Device;
ComPtr<ID3D12Device> m_d3d12Device;
ComPtr<IDWriteFactory> m_dWriteFactory;
ComPtr<ID2D1Factory3> m_d2dFactory;
ComPtr<ID2D1Device2> m_d2dDevice;
ComPtr<ID2D1DeviceContext2> m_d2dDeviceContext;
ComPtr<ID3D12Resource> m_renderTargets[FrameCount];
ComPtr<ID3D11Resource> m_wrappedBackBuffers[FrameCount];
ComPtr<ID2D1Bitmap1> m_d2dRenderTargets[FrameCount];
ComPtr<ID3D12CommandAllocator> m_commandAllocators[FrameCount];
ComPtr<ID3D12CommandQueue> m_commandQueue;
ComPtr<ID3D12RootSignature> m_rootSignature;
ComPtr<ID3D12DescriptorHeap> m_rtvHeap;
ComPtr<ID3D12PipelineState> m_pipelineState;
ComPtr<ID3D12GraphicsCommandList> m_commandList;
D3D12_RECT m_scissorRect;
// Render the scene.
void D3D1211on12::OnRender()
{
    // Record all the commands we need to render the scene into the command list.
    PopulateCommandList();

    // Execute the command list.
    ID3D12CommandList* ppCommandLists[] = { m_commandList.Get() };
    m_commandQueue->ExecuteCommandLists(_countof(ppCommandLists), ppCommandLists);

    RenderUI();

    // Present the frame.
    ThrowIfFailed(m_swapChain->Present(1, 0));

    MoveToNextFrame();
}

D3D12 참조의 예제 코드를 참조하세요.

요구 사항

   
대상 플랫폼 Windows
헤더 d3d12.h

추가 정보

ID3D12CommandQueue