Extra2D/Extra2D/include/extra2d/render/backends/opengl/gl_rhi_device.h

212 lines
8.0 KiB
C++

#pragma once
#include <extra2d/render/rhi/rhi_device.h>
#include <extra2d/render/rhi/rhi_framebuffer.h>
#include <glad/glad.h>
#include <string>
namespace extra2d {
class IWindow;
namespace rhi {
/**
* @brief OpenGL RHI 设备实现
*
* 使用 OpenGL 4.5 Core Profile + DSA 特性
*/
class GLRHIDevice : public RHIDevice {
public:
/**
* @brief 构造函数
*/
GLRHIDevice();
/**
* @brief 析构函数
*/
~GLRHIDevice() override;
// ========================================================================
// 生命周期
// ========================================================================
bool init(IWindow *window) override;
void shutdown() override;
bool isValid() const override { return initialized_; }
GraphicsAPI getAPI() const override { return GraphicsAPI::OpenGL; }
const DeviceCaps &getCaps() const override { return caps_; }
// ========================================================================
// 帧管理
// ========================================================================
void beginFrame() override;
void endFrame() override;
void present() override;
void setVSync(bool enabled) override;
bool isVSyncEnabled() const override { return vsyncEnabled_; }
void setDefaultFramebufferSize(uint32_t width, uint32_t height) override;
// ========================================================================
// 资源创建 - 缓冲区
// ========================================================================
Ptr<RHIBuffer> createBuffer(const BufferDesc &desc) override;
Ptr<RHIVertexBuffer>
createVertexBuffer(size_t size, BufferUsage usage = BufferUsage::Static,
const void *data = nullptr) override;
Ptr<RHIIndexBuffer> createIndexBuffer(size_t size,
BufferUsage usage = BufferUsage::Static,
const void *data = nullptr) override;
Ptr<RHIUniformBuffer>
createUniformBuffer(size_t size,
BufferUsage usage = BufferUsage::Dynamic) override;
// ========================================================================
// 资源创建 - 纹理
// ========================================================================
Ptr<RHITexture> createTexture(const TextureDesc &desc) override;
Ptr<RHITexture> createTexture2D(uint32_t width, uint32_t height,
Format format,
const void *data = nullptr) override;
Ptr<RHISampler> createSampler(const SamplerDesc &desc) override;
Ptr<RHITextureView> createTextureView(Ptr<RHITexture> texture,
const TextureViewDesc &desc) override;
// ========================================================================
// 资源创建 - 着色器
// ========================================================================
Ptr<RHIShader> createShader(const ShaderDesc &desc) override;
Ptr<RHIShader>
createShaderFromSource(const std::string &name,
const std::string &vertexSource,
const std::string &fragmentSource) override;
Ptr<RHIShader> createShaderFromFile(const std::string &vertexPath,
const std::string &fragmentPath) override;
// ========================================================================
// 资源创建 - 管线
// ========================================================================
Ptr<RHIPipeline> createPipeline(const PipelineDesc &desc,
Ptr<RHIShader> shader) override;
Ptr<RHIPipeline> createPipeline(const PipelineBuilder &builder) override;
// ========================================================================
// 资源创建 - 帧缓冲
// ========================================================================
Ptr<RHIFramebuffer> createFramebuffer(const FramebufferDesc &desc) override;
Ptr<RHIFramebuffer>
createFramebuffer(const FramebufferBuilder &builder) override;
// ========================================================================
// 渲染状态设置
// ========================================================================
void setViewport(const Viewport &viewport) override;
void setScissorRect(const ScissorRect &rect) override;
void setScissorEnabled(bool enabled) override;
// ========================================================================
// 渲染命令 - 绑定资源
// ========================================================================
void setPipeline(Ptr<RHIPipeline> pipeline) override;
void setShader(Ptr<RHIShader> shader) override;
void setVertexBuffer(uint32_t slot, Ptr<RHIBuffer> buffer,
uint32_t offset = 0) override;
void setIndexBuffer(Ptr<RHIBuffer> buffer, IndexFormat format) override;
void setTexture(uint32_t slot, Ptr<RHITexture> texture,
Ptr<RHISampler> sampler = nullptr) override;
void setUniformBuffer(uint32_t slot, Ptr<RHIBuffer> buffer) override;
void setFramebuffer(Ptr<RHIFramebuffer> framebuffer) override;
void setDefaultFramebuffer() override;
// ========================================================================
// 渲染命令 - Uniform 设置
// ========================================================================
void setUniformFloat(const std::string &name, float value) override;
void setUniformVec2(const std::string &name, const glm::vec2 &value) override;
void setUniformVec3(const std::string &name, const glm::vec3 &value) override;
void setUniformVec4(const std::string &name, const glm::vec4 &value) override;
void setUniformMat4(const std::string &name, const glm::mat4 &value) override;
void setUniformInt(const std::string &name, int value) override;
// ========================================================================
// 渲染命令 - 绘制
// ========================================================================
void draw(const DrawCommand &cmd) override;
void drawIndexed(const DrawIndexedCommand &cmd) override;
void drawIndirect(Ptr<RHIBuffer> indirectBuffer, size_t offset) override;
void drawIndexedIndirect(Ptr<RHIBuffer> indirectBuffer,
size_t offset) override;
// ========================================================================
// 渲染命令 - 清除
// ========================================================================
void clearColor(const ColorValue &color) override;
void clearDepth(float depth = 1.0f) override;
void clearStencil(uint8_t stencil = 0) override;
void clear(const ColorValue &color, float depth = 1.0f,
uint8_t stencil = 0) override;
// ========================================================================
// 统计与调试
// ========================================================================
const DeviceStats &getStats() const override { return stats_; }
void resetStats() override;
bool checkError() override;
const std::string &getDebugName() const override { return debugName_; }
void setDebugName(const std::string &name) override { debugName_ = name; }
private:
bool initialized_ = false;
bool vsyncEnabled_ = true;
IWindow *window_ = nullptr;
DeviceCaps caps_;
DeviceStats stats_;
std::string debugName_;
// 当前绑定的资源
Ptr<RHIPipeline> currentPipeline_;
Ptr<RHIShader> currentShader_;
Ptr<RHIFramebuffer> currentFramebuffer_;
IndexFormat currentIndexFormat_ = IndexFormat::UInt16;
// 默认帧缓冲尺寸
uint32_t defaultFBWidth_ = 0;
uint32_t defaultFBHeight_ = 0;
// 裁剪测试状态
bool scissorEnabled_ = false;
/**
* @brief 初始化设备能力
*/
void initCaps();
/**
* @brief 设置默认状态
*/
void setDefaultState();
/**
* @brief 应用管线状态
*/
void applyPipelineState(const BlendState &blend,
const DepthStencilState &depthStencil,
const RasterizerState &rasterizer);
};
} // namespace rhi
} // namespace extra2d