2.3 KiB
2.3 KiB
OpenGLUniformBufferManager
命名空间: XCEngine::RHI
类型: class
头文件: XCEngine/RHI/OpenGL/OpenGLUniformBufferManager.h
描述: OpenGL 后端的 uniform buffer 绑定点管理器,负责槽位分配、整块 UBO 绑定和本地缓存维护。
概览
在统一 RHI 语义里,常量缓冲视图看起来像独立的 CBV;但在当前 OpenGL 后端里,这件事最终仍然要落到 uniform buffer binding point。
OpenGLUniformBufferManager 的职责就是管理这些绑定点:
- 分配和释放 binding point
- 把某个
OpenGLBuffer绑定到指定槽位 - 缓存当前绑定关系,供其他后端封装读取
设计定位
它和 OpenGLTextureUnitAllocator 属于同一层级的基础设施:
- 本身不代表高层 descriptor
- 本身也不管理 buffer 生命周期
- 只是把稀缺的后端绑定点做成可复用服务
对于商业引擎式的 RHI 文档来说,关键不是把它包装成“更高级”的东西,而是把它当前真的只做到哪一步说清楚。
生命周期
- 构造后为空。
- Initialize 设置容量。
- Allocate / Free 管理 binding point。
- Shutdown 释放所有已分配槽位并清空缓存。
线程语义
- 无锁。
- 依赖 OpenGL 上下文,应在渲染线程或拥有上下文的线程使用。
当前实现的真实行为
- 使用线性 first-fit 分配策略。
- BindBuffer 固定使用
glBindBufferBase(),不会做范围绑定。 GetBoundBuffer()只是本地缓存查询。OpenGLResourceView::InitializeAsConstantBuffer()会通过它分配绑定点。OpenGLDevice::Initialize(...)会查询GL_MAX_UNIFORM_BUFFER_BINDINGS,并把结果传给 Initialize。
当前限制
- 不支持 offset / size 范围绑定。
- 没有同步验证 OpenGL 真实支持的最大 UBO 绑定点数量。
- 重复
Initialize()不是可靠的重置流程。