2.4 KiB
2.4 KiB
OpenGLTextureUnitAllocator
命名空间: XCEngine::RHI
类型: class
头文件: XCEngine/RHI/OpenGL/OpenGLTextureUnitAllocator.h
描述: OpenGL 后端的轻量 texture unit 分配器,负责分配槽位并缓存每个单元当前绑定的纹理对象。
概览
OpenGL 没有现代图形 API 那样统一的 descriptor heap / descriptor set 机制。很多资源绑定最终都要落到 texture unit。
OpenGLTextureUnitAllocator 的职责就是把这件事做成一个简单、可复用的后端基础设施:
- 分配一个空闲 texture unit
- 把纹理绑定到这个 unit
- 记录当前绑定缓存
- 在释放时做对应解绑
设计定位
它不是一个完整的资源绑定系统,而是一个非常基础的槽位管理器。真正使用它的通常是:
OpenGLResourceView的 UAV 路径OpenGLDescriptorSet的 SRV / UAV / sampler 绑定准备流程
这种设计在商业引擎里也常见: 先把“后端稀缺槽位管理”独立出来,再由更高层的 descriptor / pipeline 系统消费。
生命周期
- 构造后为空。
- Initialize 设置容量。
- Allocate / Free 管理槽位。
- Shutdown 释放所有已分配槽位并清空缓存。
线程语义
- 无锁。
- 涉及 OpenGL 绑定状态和活动纹理单元切换,应在持有当前上下文的线程使用。
当前实现的真实行为
- 采用线性 first-fit 分配策略。
- 绑定和解绑都会调用
glActiveTexture(),但不会恢复之前的活动纹理单元。 GetBoundTexture()只是分配器内部缓存,不是实际 GL 状态查询。- 解绑逻辑固定使用
GL_TEXTURE_2D清空当前 unit,这对非 2D 目标来说是简化实现。 OpenGLDevice::Initialize(...)会先查询GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS,再用该值初始化它。
当前限制
- 没有引用计数或多方共享语义。
- 没有检测 OpenGL 真实最大纹理单元数。
- 重复
Initialize()不是完全安全的“重置”路径。