ID3D12GraphicsCommandList 接口 (d3d12.h)

封装用于呈现的图形命令的列表。 包括用于检测命令列表执行的 API,以及用于设置和清除管道状态的 API。

注意此接口的最新版本是Windows 10 创意者更新中引入的 ID3D12GraphicsCommandList1。 面向Windows 10 创意者更新的应用程序应使用 ID3D12GraphicsCommandList1 接口,而不是 ID3D12GraphicsCommandList
 

继承

ID3D12GraphicsCommandList 接口继承自 ID3D12CommandListID3D12GraphicsCommandList 也包含以下类型的成员:

方法

ID3D12GraphicsCommandList 接口包含以下方法。

 
ID3D12GraphicsCommandList::BeginEvent

请不要直接调用。  使用 PIX 事件运行时将事件插入命令列表。 (ID3D12GraphicsCommandList.BeginEvent)
ID3D12GraphicsCommandList::BeginQuery

启动正在运行的查询。 (ID3D12GraphicsCommandList.BeginQuery)
ID3D12GraphicsCommandList::ClearDepthStencilView

清除深度模具资源。 (ID3D12GraphicsCommandList.ClearDepthStencilView)
ID3D12GraphicsCommandList::ClearRenderTargetView

将呈现器目标中的所有元素设置为一个值。
ID3D12GraphicsCommandList::ClearState

将直接命令列表的状态重置回创建命令列表时的状态。 (ID3D12GraphicsCommandList.ClearState)
ID3D12GraphicsCommandList::ClearUnorderedAccessViewFloat

将无序访问视图中的所有元素设置为指定的浮点值。
ID3D12GraphicsCommandList::ClearUnorderedAccessViewUint

将无序访问视图中的所有元素 (UAV) 设置为指定的整数值。
ID3D12GraphicsCommandList::Close

指示记录到命令列表已完成。 (ID3D12GraphicsCommandList.Close)
ID3D12GraphicsCommandList::CopyBufferRegion

将缓冲区的区域从一个资源复制到另一个资源。
ID3D12GraphicsCommandList::CopyResource

将源资源的整个内容复制到目标资源。
ID3D12GraphicsCommandList::CopyTextureRegion

此方法使用 GPU 在两个位置之间复制纹理数据。 源和目标都可以引用位于缓冲区资源或纹理资源中的纹理数据。
ID3D12GraphicsCommandList::CopyTiles

将磁贴从缓冲区复制到平铺资源,反之亦然。 (ID3D12GraphicsCommandList.CopyTiles)
ID3D12GraphicsCommandList::D iscardResource

放弃资源。
ID3D12GraphicsCommandList::D ispatch

在线程组上执行计算着色器。
ID3D12GraphicsCommandList::D rawIndexedInstanced

绘制索引的实例化基元。
ID3D12GraphicsCommandList::DrawInstanced

绘制未编制索引的实例化基元。
ID3D12GraphicsCommandList::EndEvent

请不要直接调用。  使用 PIX 事件运行时将事件插入命令列表。 (ID3D12GraphicsCommandList.EndEvent)
ID3D12GraphicsCommandList::EndQuery

结束正在运行的查询。
ID3D12GraphicsCommandList::ExecuteBundle

执行捆绑包。
ID3D12GraphicsCommandList::ExecuteIndirect

应用使用 ExecuteIndirect 方法执行间接绘制/调度。
ID3D12GraphicsCommandList::IASetIndexBuffer

设置索引缓冲区的视图。
ID3D12GraphicsCommandList::IASetPrimitiveTopology

绑定有关基元类型的信息,以及描述输入装配器阶段的输入数据的数据顺序。 (ID3D12GraphicsCommandList.IASetPrimitiveTopology)
ID3D12GraphicsCommandList::IASetVertexBuffers

设置顶点缓冲区的 CPU 描述符句柄。
ID3D12GraphicsCommandList::OMSetBlendFactor

设置调节像素着色器值和/或呈现目标值的混合因子。
ID3D12GraphicsCommandList::OMSetRenderTargets

设置呈现目标和深度模具的 CPU 描述符句柄。
ID3D12GraphicsCommandList::OMSetStencilRef

设置深度模具测试的参考值。
ID3D12GraphicsCommandList::Reset

将命令列表重置回其初始状态,就像刚刚创建新命令列表一样。 (ID3D12GraphicsCommandList.Reset)
ID3D12GraphicsCommandList::ResolveQueryData

从查询中提取数据。 ResolveQueryData 可使用所有堆类型(默认、上传和回读)。  ResolveQueryData 可使用所有堆类型(默认、上传和回读)。 .
ID3D12GraphicsCommandList::ResolveSubresource

将多采样资源复制到非多采样资源中。
ID3D12GraphicsCommandList::ResourceBarrier

通知驱动程序它需要同步对资源的多个访问。 (ID3D12GraphicsCommandList.ResourceBarrier)
ID3D12GraphicsCommandList::RSSetScissorRects

将剪刀矩形数组绑定到光栅器阶段。
ID3D12GraphicsCommandList::RSSetViewports

将视区数组绑定到管道的光栅器阶段。 (ID3D12GraphicsCommandList.RSSetViewports)
ID3D12GraphicsCommandList::SetComputeRoot32BitConstant

在计算根签名中设置常量。
ID3D12GraphicsCommandList::SetComputeRoot32BitConstants

在计算根签名中设置一组常量。
ID3D12GraphicsCommandList::SetComputeRootConstantBufferView

为计算根签名中的常量缓冲区设置 CPU 描述符句柄。
ID3D12GraphicsCommandList::SetComputeRootDescriptorTable

将描述符表设置为计算根签名。
ID3D12GraphicsCommandList::SetComputeRootShaderResourceView

为计算根签名中的着色器资源设置 CPU 描述符句柄。
ID3D12GraphicsCommandList::SetComputeRootSignature

设置计算根签名的布局。
ID3D12GraphicsCommandList::SetComputeRootUnorderedAccessView

为计算根签名中的无序访问视图资源设置 CPU 描述符句柄。
ID3D12GraphicsCommandList::SetDescriptorHeaps

更改与命令列表关联的当前绑定描述符堆。
ID3D12GraphicsCommandList::SetGraphicsRoot32BitConstant

在图形根签名中设置常量。
ID3D12GraphicsCommandList::SetGraphicsRoot32BitConstants

在图形根签名中设置一组常量。
ID3D12GraphicsCommandList::SetGraphicsRootConstantBufferView

为图形根签名中的常量缓冲区设置 CPU 描述符句柄。
ID3D12GraphicsCommandList::SetGraphicsRootDescriptorTable

将描述符表设置为图形根签名。
ID3D12GraphicsCommandList::SetGraphicsRootShaderResourceView

为图形根签名中的着色器资源设置 CPU 描述符句柄。
ID3D12GraphicsCommandList::SetGraphicsRootSignature

设置图形根签名的布局。
ID3D12GraphicsCommandList::SetGraphicsRootUnorderedAccessView

为图形根签名中的无序访问视图资源设置 CPU 描述符句柄。
ID3D12GraphicsCommandList::SetMarker

请不要直接调用。  使用 PIX 事件运行时将事件插入命令列表。 (ID3D12GraphicsCommandList.SetMarker)
ID3D12GraphicsCommandList::SetPipelineState

设置图形处理单元的大部分固定函数状态的所有着色器和程序 (GPU) 管道。
ID3D12GraphicsCommandList::SetPredication

设置呈现谓词。
ID3D12GraphicsCommandList::SOSetTargets

设置流输出缓冲区视图。

注解

此接口是 D3D12 的新增功能,封装 了 ID3D11CommandList 接口的大部分功能,并包括 呈现中所述的新功能。

示例

D3D12nBodyGravity 示例使用 ID3D12GraphicsCommandList,如下所示:

声明管道对象。

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;

填充命令列表。

// Fill the command list with all the render commands and dependent state.
void D3D12nBodyGravity::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_commandAllocators[m_frameIndex]->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_commandAllocators[m_frameIndex].Get(), m_pipelineState.Get()));

    // Set necessary state.
    m_commandList->SetPipelineState(m_pipelineState.Get());
    m_commandList->SetGraphicsRootSignature(m_rootSignature.Get());

    m_commandList->SetGraphicsRootConstantBufferView(RootParameterCB, m_constantBufferGS->GetGPUVirtualAddress() + m_frameIndex * sizeof(ConstantBufferGS));

    ID3D12DescriptorHeap* ppHeaps[] = { m_srvUavHeap.Get() };
    m_commandList->SetDescriptorHeaps(_countof(ppHeaps), ppHeaps);

    m_commandList->IASetVertexBuffers(0, 1, &m_vertexBufferView);
    m_commandList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_POINTLIST);
    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.0f, 0.1f, 0.0f };
    m_commandList->ClearRenderTargetView(rtvHandle, clearColor, 0, nullptr);

    // Render the particles.
    float viewportHeight = static_cast<float>(static_cast<UINT>(m_viewport.Height) / m_heightInstances);
    float viewportWidth = static_cast<float>(static_cast<UINT>(m_viewport.Width) / m_widthInstances);
    for (UINT n = 0; n < ThreadCount; n++)
    {
        const UINT srvIndex = n + (m_srvIndex[n] == 0 ? SrvParticlePosVelo0 : SrvParticlePosVelo1);

        D3D12_VIEWPORT viewport;
        viewport.TopLeftX = (n % m_widthInstances) * viewportWidth;
        viewport.TopLeftY = (n / m_widthInstances) * viewportHeight;
        viewport.Width = viewportWidth;
        viewport.Height = viewportHeight;
        viewport.MinDepth = D3D12_MIN_DEPTH;
        viewport.MaxDepth = D3D12_MAX_DEPTH;
        m_commandList->RSSetViewports(1, &viewport);

        CD3DX12_GPU_DESCRIPTOR_HANDLE srvHandle(m_srvUavHeap->GetGPUDescriptorHandleForHeapStart(), srvIndex, m_srvUavDescriptorSize);
        m_commandList->SetGraphicsRootDescriptorTable(RootParameterSRV, srvHandle);

        m_commandList->DrawInstanced(ParticleCount, 1, 0, 0);
    }

    m_commandList->RSSetViewports(1, &m_viewport);

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

另请参阅

核心接口

ID3D12CommandList

ID3D12GraphicsCommandList1