ID3D12CommandQueue::ExecuteCommandLists 方法 (d3d12.h)

提交命令列表数组以供执行。

语法

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

参数

[in] NumCommandLists

要执行的命令列表数。

[in] ppCommandLists

要执行的 ID3D12CommandList 命令列表的数组。

返回值

备注

从同一线程或不同线程 (连续调用 ExecuteCommandLists 两次,或者从不同的线程) 调用 ExecuteCommandList 可确保第一个工作负荷 (A) 在第二个工作负荷 (B) 之前完成。 使用两个命令列表调用 ExecuteCommandLists 允许驱动程序合并这两个命令列表,以便第二个命令列表 (D) 可以在第一个 (C) 的所有工作完成之前开始执行工作。 具体而言,允许应用程序在 A 和 B 之间插入围栏信号或等待,并且驱动程序无法对此进行查看,因此驱动程序必须确保 A 中的所有内容在围栏操作之前都已完成。 在对 API 的单个调用中没有这样的机会,因此驱动程序能够优化该方案。

驱动程序可以免费修补提交的命令列表。 调用应用程序负责确保 GPU (图形处理单元) 当前不会从以前的执行中读取任何提交的命令列表。

建议应用程序将命令列表执行批处理在一起,以减少与将命令提交到 GPU 相关的固定成本。

运行时验证

捆绑包不能直接提交到命令队列。 如果将捆绑包传递给此方法,运行时将删除调用。 如果尚未对一个或多个命令列表调用 Close 函数,运行时也会删除调用。

运行时将检测是否在调用 Close 后重置了与命令列表关联的命令分配器。 在此情况下,运行时将放弃调用并删除设备。

如果命令队列围栏指示任何命令列表的先前执行尚未完成,则运行时将删除调用并删除设备。

运行时将验证 ExecuteCommandLists 内部资源转换屏障的“之前”和“之后”状态。 如果转换的“before”状态与上一个转换的“after”状态不匹配,则运行时将放弃调用并删除设备。

运行时将验证命令列表使用的查询的“before”和“after”状态。 如果检测到错误,运行时将放弃调用并删除设备。

调试层

对于运行时将放弃调用的所有情况,调试层都会发出错误。

如果调试层检测到命令列表引用的任何资源(包括查询)已被销毁,则它将发出错误。

示例

呈现场景。

// 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