3.0 KiB
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 等对象
生命周期
支持两种典型用法:
- 通过
Initialize让设备自己创建隐藏窗口和上下文 - 通过
InitializeWithExistingWindow绑定到现有窗口
当前实现的真实行为
上下文与窗口管理
- 若走
Initialize(),设备会创建一个隐藏窗口,再附着像素格式并建立上下文 - 若走
InitializeWithExistingWindow(),设备会直接接管调用方窗口 - 会先用临时 context 探测
WGL_ARB_create_context,再尝试创建 OpenGL 4.6 debug context - 若高级上下文创建失败,会回退到
wglCreateContext()
能力和设备信息
vendor、renderer、version来自glGetString(...)vendorId由厂商字符串启发式推断deviceId由 renderer 字符串哈希得到,不是真实 PCI device iddedicatedVideoMemory在非软件渲染器情况下被写成1,这只是“非零哨兵值”,不是显存探测结果
工厂行为
CreateShader与CreatePipelineState会显式MakeContextCurrent()CreateTexture的带初始数据路径也会显式切当前上下文CreateCommandList()和CreateCommandQueue()当前只是构造轻量对象,不做和设备的深度关联CreateDescriptorPool()会把OpenGLTextureUnitAllocator注入 pool
设计说明
OpenGL 后端的“设备”更多是上下文拥有者和运行环境协调者。它不可能像 D3D12 那样把提交、队列、同步都做成显式对象,因此文档必须把“上下文当前性”当成使用前提讲清楚。
当前限制
- 平台路径目前是 Win32/WGL
- 某些设备信息字段是推断值或哨兵值,不可当作驱动级精确数据
CreateCommandQueue()/CreateCommandList()仍是轻量门面,不要用 D3D12/Vulkan 的思维期待它们承担真实提交调度