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

114 lines
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# D3D12CommandQueue
DirectX 12 命令队列的 D3D12 实现,封装了 `ID3D12CommandQueue`
## 头文件
```cpp
#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` | 时间戳频率 |
## 使用示例
```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 直到所有已提交命令完成