212 lines
8.0 KiB
C++
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
|