Files
XCEngine/docs/api/XCEngine/RHI/OpenGL/OpenGLTextureUnitAllocator/OpenGLTextureUnitAllocator.md

2.4 KiB
Raw Blame History

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 系统消费。

生命周期

线程语义

  • 无锁。
  • 涉及 OpenGL 绑定状态和活动纹理单元切换,应在持有当前上下文的线程使用。

当前实现的真实行为

  • 采用线性 first-fit 分配策略。
  • 绑定和解绑都会调用 glActiveTexture(),但不会恢复之前的活动纹理单元。
  • GetBoundTexture() 只是分配器内部缓存,不是实际 GL 状态查询。
  • 解绑逻辑固定使用 GL_TEXTURE_2D 清空当前 unit这对非 2D 目标来说是简化实现。
  • OpenGLDevice::Initialize(...) 会先查询 GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS,再用该值初始化它。

当前限制

  • 没有引用计数或多方共享语义。
  • 没有检测 OpenGL 真实最大纹理单元数。
  • 重复 Initialize() 不是完全安全的“重置”路径。

关键方法

相关文档