Extra2D/Extra2D/include/extra2d/graphics/opengl/gl_context.h

139 lines
2.7 KiB
C++

#pragma once
#include <glad/glad.h>
#include <string>
namespace extra2d {
// ============================================================================
// OpenGL 版本信息
// ============================================================================
struct GLVersion {
int major = 0;
int minor = 0;
bool es = false; // 是否为 ES 版本
};
// ============================================================================
// OpenGL 上下文管理类
// ============================================================================
class GLContext {
public:
/**
* @brief 获取全局 GLContext 实例
*/
static GLContext &get();
/**
* @brief 初始化 OpenGL 上下文
* @return 成功返回 true
*/
bool init();
/**
* @brief 关闭 OpenGL 上下文
*/
void shutdown();
/**
* @brief 检查上下文是否有效
* @return 有效返回 true
*/
bool isValid() const { return initialized_; }
/**
* @brief 获取 OpenGL 版本信息
*/
const GLVersion &getVersion() const { return version_; }
/**
* @brief 获取 OpenGL 版本字符串
*/
std::string getVersionString() const;
/**
* @brief 获取 GPU 厂商信息
*/
std::string getVendor() const;
/**
* @brief 获取 GPU 渲染器信息
*/
std::string getRenderer() const;
/**
* @brief 检查是否支持指定扩展
* @param extension 扩展名称
* @return 支持返回 true
*/
bool hasExtension(const std::string &extension) const;
/**
* @brief 获取最大纹理尺寸
*/
int getMaxTextureSize() const;
/**
* @brief 获取最大纹理单元数
*/
int getMaxTextureUnits() const;
/**
* @brief 获取最大顶点属性数
*/
int getMaxVertexAttribs() const;
/**
* @brief 获取最大 uniform 缓冲区绑定点数
*/
int getMaxUniformBufferBindings() const;
/**
* @brief 检查是否为 OpenGL ES
*/
bool isGLES() const { return version_.es; }
/**
* @brief 检查是否支持 VAO
*/
bool hasVAO() const;
/**
* @brief 检查是否支持 FBO
*/
bool hasFBO() const;
/**
* @brief 检查是否支持 Shader
*/
bool hasShader() const;
private:
GLContext() = default;
~GLContext() = default;
GLContext(const GLContext &) = delete;
GLContext &operator=(const GLContext &) = delete;
bool initialized_ = false;
GLVersion version_;
// 缓存的限制值
mutable int maxTextureSize_ = -1;
mutable int maxTextureUnits_ = -1;
mutable int maxVertexAttribs_ = -1;
mutable int maxUniformBufferBindings_ = -1;
/**
* @brief 解析 OpenGL 版本
*/
void parseVersion();
/**
* @brief 加载 OpenGL 扩展
*/
bool loadExtensions();
};
} // namespace extra2d