Files
XCEngine/docs/api/rhi/d3d12/d3d12-command-queue.md

2.7 KiB
Raw Blame History

D3D12CommandQueue

DirectX 12 命令队列的 D3D12 实现,封装了 ID3D12CommandQueue

头文件

#include <XCEngine/RHI/D3D12/D3D12CommandQueue.h>

继承关系

RHICommandQueue (interface)
└── D3D12CommandQueue (implementation)

公共成员函数

构造函数与析构函数

D3D12CommandQueue()

默认构造函数。

~D3D12CommandQueue() override

析构函数,确保调用 Shutdown()

初始化与销毁

bool Initialize(ID3D12Device* device, CommandQueueType type = CommandQueueType::Direct)

初始化命令队列。

  • device: D3D12 设备
  • type: 命令队列类型
  • 返回: 初始化是否成功

void Shutdown() override

关闭命令队列。

命令执行

void ExecuteCommandLists(uint32_t count, void** lists)

执行命令列表(接口实现)。

void ExecuteCommandListsInternal(uint32_t count, ID3D12CommandList** lists)

执行命令列表(内部实现,接受 D3D12 原生类型)。

同步操作

void Signal(RHIFence* fence, uint64_t value)

发送信号量到栅栏。

void Wait(RHIFence* fence, uint64_t value)

等待栅栏达到指定值。

void WaitForIdle()

等待命令队列空闲。

uint64_t GetCompletedValue() override

获取已完成信号值。

void Signal(ID3D12Fence* fence, uint64_t value)

发送信号(内部版本)。

void Wait(ID3D12Fence* fence, uint64_t value)

等待(内部版本)。

属性查询

CommandQueueType GetType() const override

获取命令队列类型。

uint64_t GetTimestampFrequency() const override

获取时间戳频率Hz

ID3D12CommandQueue* GetCommandQueue() const

获取底层 ID3D12CommandQueue 指针。

void* GetNativeHandle() override

返回原生句柄。

内部成员

成员 类型 描述
m_commandQueue ComPtr<ID3D12CommandQueue> D3D12 命令队列
m_type CommandQueueType 命令队列类型
m_timestampFrequency uint64_t 时间戳频率

使用示例

D3D12CommandQueue cmdQueue;
cmdQueue.Initialize(device->GetDevice(), CommandQueueType::Direct);

// Execute command list
ID3D12CommandList* lists[] = { cmdList->GetCommandList() };
cmdQueue.ExecuteCommandListsInternal(1, lists);

// Sync with fence
D3D12Fence fence;
fence.Initialize(device->GetDevice());
cmdQueue.Signal(fence.GetFence(), 1);
fence.Wait(1);

// Wait for idle
cmdQueue.WaitForIdle();

备注

  • 三种命令队列类型Direct图形/计算、Compute计算、Copy复制
  • 时间戳频率用于将 GPU 时间戳转换为实际时间
  • WaitForIdle 会阻塞 CPU 直到所有已提交命令完成