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

3.4 KiB
Raw Blame History

OpenGLSwapChain

命名空间: XCEngine::RHI

类型: class

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

描述: Win32 OpenGL 后端的交换链包装器;它把默认窗口帧缓冲与一个可选的 back buffer 代理纹理统一到 RHISwapChain 抽象下。

概览

在 D3D12 或 Vulkan 里swap chain 往往意味着“由驱动管理的多张呈现图像”。当前 OpenGLSwapChain 不是这种模型。

它的真实工作方式更接近:

  • 窗口系统拥有默认帧缓冲
  • 引擎另外维护一张 OpenGLTexture 作为 GetCurrentBackBuffer() 的返回对象
  • Present 视情况把这张纹理 blit 到默认帧缓冲
  • 最后调用 Win32 SwapBuffers

这种设计的重点不是模拟一份完整的显式 API 交换链,而是让上层渲染框架、测试基架和截图工具继续通过统一的 RHISwapChain 接口工作。

主要职责

当前实现的真实行为

  • 只覆盖 Win32 路径,GetNativeHandle() 返回 HWND
  • PresentMode / SurfaceFormat 两个枚举当前只停留在头文件层面,没有参与实际创建流程
  • GetCurrentBackBufferIndex 永远返回 0
  • Resize 只更新缓存宽高,不重建 m_backBufferTexture
  • Present 忽略 syncIntervalflags
  • m_backBufferTexture 不满足当前约定条件时,Present() 只会直接交换默认窗口缓冲
  • Shutdown 释放代理纹理并断开设备/窗口引用,但不会把宽高清零

设计背景

OpenGL 的默认窗口帧缓冲由上下文和窗口系统维护,不能像显式 API 那样把每一张 back buffer 都作为标准资源对象稳定暴露。当前实现采用“代理纹理 + Present 时复制”的策略,主要收益有两点:

  • 上层系统仍然可以把 back buffer 当作 RHITexture 使用
  • 资源视图、截图、离屏渲染等路径可以复用统一的纹理与视图抽象

这是一种很典型的跨后端工程折中:先保证 API 统一和可用性,再逐步增强平台特性。

生命周期

当前限制

  • 不是实际多缓冲 swap chain
  • 不提供轮换帧索引
  • 不支持真正的 vsync / mailbox / fifo 策略切换
  • Resize() 与内部纹理尺寸可能失配
  • 缺少严格的错误处理和状态校验

关键方法

相关文档