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

3.0 KiB

OpenGLDevice

命名空间: XCEngine::RHI

类型: class

头文件: XCEngine/RHI/OpenGL/OpenGLDevice.h

描述: OpenGL 后端的设备根对象,负责创建或接管 Win32 窗口上的 WGL 上下文、探测 OpenGL 能力,并作为 OpenGL 资源工厂入口。

概览

OpenGLDevice 不是“GPU 设备对象”的严格硬件抽象,而更像“当前 OpenGL 上下文与其周边服务的拥有者”。它负责:

  • 管理窗口句柄、设备上下文和渲染上下文
  • 尝试创建 debug context
  • 初始化 GLAD
  • 收集驱动、版本和能力信息
  • 创建 OpenGL 风格的 buffer、texture、shader、pipeline state、descriptor pool 等对象

生命周期

支持两种典型用法:

  1. 通过 Initialize 让设备自己创建隐藏窗口和上下文
  2. 通过 InitializeWithExistingWindow 绑定到现有窗口

当前实现的真实行为

上下文与窗口管理

  • 若走 Initialize(),设备会创建一个隐藏窗口,再附着像素格式并建立上下文
  • 若走 InitializeWithExistingWindow(),设备会直接接管调用方窗口
  • 会先用临时 context 探测 WGL_ARB_create_context,再尝试创建 OpenGL 4.6 debug context
  • 若高级上下文创建失败,会回退到 wglCreateContext()

能力和设备信息

  • vendorrendererversion 来自 glGetString(...)
  • vendorId 由厂商字符串启发式推断
  • deviceId 由 renderer 字符串哈希得到,不是真实 PCI device id
  • dedicatedVideoMemory 在非软件渲染器情况下被写成 1,这只是“非零哨兵值”,不是显存探测结果

工厂行为

  • CreateShaderCreatePipelineState 会显式 MakeContextCurrent()
  • CreateTexture 的带初始数据路径也会显式切当前上下文
  • CreateCommandList()CreateCommandQueue() 当前只是构造轻量对象,不做和设备的深度关联
  • CreateDescriptorPool() 会把 OpenGLTextureUnitAllocator 注入 pool

设计说明

OpenGL 后端的“设备”更多是上下文拥有者和运行环境协调者。它不可能像 D3D12 那样把提交、队列、同步都做成显式对象,因此文档必须把“上下文当前性”当成使用前提讲清楚。

当前限制

  • 平台路径目前是 Win32/WGL
  • 某些设备信息字段是推断值或哨兵值,不可当作驱动级精确数据
  • CreateCommandQueue() / CreateCommandList() 仍是轻量门面,不要用 D3D12/Vulkan 的思维期待它们承担真实提交调度

重点公共方法

相关文档