2.6 KiB
2.6 KiB
OpenGLCommandQueue
命名空间: XCEngine::RHI
类型: class
头文件: XCEngine/RHI/OpenGL/OpenGLCommandQueue.h
描述: 为统一 RHI 抽象保留的 OpenGL 命令队列门面;它不是一条真实的 GPU 提交队列,而是一个接口适配层。
概览
OpenGL 没有 D3D12/Vulkan 那种显式 command queue 模型,因此 OpenGLCommandQueue 的存在主要是为了:
- 保持跨后端接口一致
- 给测试和上层 RHI 代码一个统一的
RHICommandQueue入口 - 封装少量
glFlush()/glFinish()/ fence 相关行为
设计定位
这个类应被理解为 shim,而不是调度核心。
它能做的事情很有限:
- 把信号语义桥接到 OpenGLFence
- 提供“等待 GPU 空闲”的同步入口
- 给测试返回一个统一的 queue 类型和 native handle
它当前做不了这些事:
- 真正的命令列表提交
- 真正的跨线程 GPU timeline 管理
- 帧序号推进
当前实现的真实行为
- GetType 永远返回
CommandQueueType::Direct - GetNativeHandle 返回
this - ExecuteCommandLists 是空实现
- Signal 先调用 fence 的
Signal(value),再执行glFlush() - Wait 是空实现
- GetCompletedValue 固定返回
0 - WaitForIdle 调用
glFinish() - WaitForPreviousFrame 是空实现
- GetCurrentFrame 固定返回
0 - GetTimestampFrequency 读取
GL_TIMESTAMP,更像当前时间戳快照,而不是严格意义上的频率
为什么这样设计
这是一种很典型的“为了统一抽象而保留的后端占位层”。
在商业级引擎里,只要继续支持 OpenGL,类似的 shim 往往也不可避免,因为:
- 上层代码想按队列模型组织逻辑
- 但 OpenGL 底层并没有对应对象
当前实现选择了最保守的一条路:保留接口,让测试和基础流程先跑通,再逐步补更多语义。
当前限制
ExecuteCommandLists()、Wait()、WaitForPreviousFrame()都还是占位实现GetCompletedValue()没有真实 GPU 进度含义GetTimestampFrequency()的语义并不精确- 没有自己的资源或生命周期状态