# D3D12CommandQueue DirectX 12 命令队列的 D3D12 实现,封装了 `ID3D12CommandQueue`。 ## 头文件 ```cpp #include ``` ## 继承关系 ``` 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` | D3D12 命令队列 | | `m_type` | `CommandQueueType` | 命令队列类型 | | `m_timestampFrequency` | `uint64_t` | 时间戳频率 | ## 使用示例 ```cpp 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 直到所有已提交命令完成