105 lines
3.5 KiB
Markdown
105 lines
3.5 KiB
Markdown
# RHICommandQueue
|
|
|
|
**命名空间**: `XCEngine::RHI`
|
|
|
|
**类型**: `class (abstract)`
|
|
|
|
**头文件**: `XCEngine/RHI/RHICommandQueue.h`
|
|
|
|
**描述**: 抽象命令提交队列,负责执行命令列表、管理 GPU 同步以及暴露基础队列信息。
|
|
|
|
## 角色概述
|
|
|
|
`RHICommandQueue` 对应的是原生图形 API 里的提交队列概念。当前接口主要承担三类职责:
|
|
|
|
- 提交命令列表
|
|
- 和 [RHIFence](../RHIFence/RHIFence.md) 协作完成 GPU 同步
|
|
- 暴露队列类型、帧索引和时间戳频率等队列级信息
|
|
|
|
在抽象层里,它位于 [RHIDevice](../RHIDevice/RHIDevice.md) 和 [RHICommandList](../RHICommandList/RHICommandList.md) 之间,是“录制好的 GPU 工作真正被执行”的入口。
|
|
|
|
## 当前接口语义
|
|
|
|
### 提交
|
|
|
|
- [ExecuteCommandLists](ExecuteCommandLists.md)
|
|
|
|
这是队列最核心的方法。但要注意,当前签名是 `ExecuteCommandLists(uint32_t count, void** lists)`,而不是 `RHICommandList**`。这说明抽象层在提交阶段仍保留了一定后端适配痕迹,接口类型安全性不算强。
|
|
|
|
### 同步
|
|
|
|
- [Signal](Signal.md)
|
|
- [Wait](Wait.md)
|
|
- [GetCompletedValue](GetCompletedValue.md)
|
|
- [WaitForIdle](WaitForIdle.md)
|
|
|
|
这组接口提供了最基础的 GPU timeline / fence 同步语义。
|
|
|
|
### 队列与帧信息
|
|
|
|
- [GetType](GetType.md)
|
|
- [GetTimestampFrequency](GetTimestampFrequency.md)
|
|
- [GetNativeHandle](GetNativeHandle.md)
|
|
- [WaitForPreviousFrame](WaitForPreviousFrame.md)
|
|
- [GetCurrentFrame](GetCurrentFrame.md)
|
|
|
|
其中 `WaitForPreviousFrame()` 和 `GetCurrentFrame()` 暗示当前抽象层除了通用队列语义,还兼顾了交换链驱动的 frame-loop 使用场景。
|
|
|
|
## 队列类型
|
|
|
|
队列类型由 [CommandQueueType](../RHIEnums/RHIEnums.md) 表达,当前枚举包括:
|
|
|
|
- `Direct`
|
|
- `Compute`
|
|
- `Copy`
|
|
|
|
但从当前测试覆盖和接口成熟度看,最常见、最稳定的仍是 `Direct` 路径。
|
|
|
|
## 生命周期与所有权
|
|
|
|
`RHICommandQueue` 通常由 [RHIDevice](../RHIDevice/RHIDevice.md) 创建,并以裸指针形式返回。和本模块其他对象一样,推荐使用模式是:
|
|
|
|
1. `RHIDevice::CreateCommandQueue()`
|
|
2. 使用队列提交命令或等待同步
|
|
3. `queue->Shutdown()`
|
|
4. `delete queue`
|
|
|
|
## 设计理解
|
|
|
|
从商业引擎实践看,把 queue 抽象单独暴露出来是合理的:
|
|
|
|
- 它让 renderer 可以明确区分“录制命令”和“提交命令”。
|
|
- 它为多队列或异步计算扩展保留了接口形状。
|
|
- 它便于测试在设备层之上直接验证提交和同步行为。
|
|
|
|
但当前实现仍然比较早期:
|
|
|
|
- 提交接口还不够类型安全。
|
|
- 队列抽象还没有扩展到更复杂的 submission batch、timeline semaphore 或跨队列调度模型。
|
|
- `WaitForPreviousFrame()` 这类接口说明它同时背负了一些具体 frame-loop 约定,而不是完全最小化的 queue 抽象。
|
|
|
|
## 公共方法
|
|
|
|
- [ExecuteCommandLists](ExecuteCommandLists.md)
|
|
- [Signal](Signal.md)
|
|
- [Wait](Wait.md)
|
|
- [GetCompletedValue](GetCompletedValue.md)
|
|
- [WaitForIdle](WaitForIdle.md)
|
|
- [GetType](GetType.md)
|
|
- [GetTimestampFrequency](GetTimestampFrequency.md)
|
|
- [GetNativeHandle](GetNativeHandle.md)
|
|
- [WaitForPreviousFrame](WaitForPreviousFrame.md)
|
|
- [GetCurrentFrame](GetCurrentFrame.md)
|
|
|
|
## 相关指南
|
|
|
|
- [Devices, Queues, Command Lists, And Resource Creation](../../../_guides/RHI/Devices-Queues-CommandLists-And-Resource-Creation.md)
|
|
|
|
## 相关文档
|
|
|
|
- [当前模块](../RHI.md)
|
|
- [RHIDevice](../RHIDevice/RHIDevice.md)
|
|
- [RHICommandList](../RHICommandList/RHICommandList.md)
|
|
- [RHIFence](../RHIFence/RHIFence.md)
|
|
- [API 总索引](../../../main.md)
|