Extra2D/include/renderer/rhi/opengl/gl_command_list.h

101 lines
3.7 KiB
C
Raw Normal View History

#pragma once
#include <glad/glad.h>
#include <renderer/rhi/rhi.h>
namespace extra2d {
// 前向声明
class GLPipeline;
class GLBuffer;
class GLTexture;
class GLFramebuffer;
/**
* @brief OpenGL
*/
class GLCommandList : public RHICommandList {
public:
GLCommandList();
~GLCommandList() override;
//===========================================================================
// 命令列表生命周期
//===========================================================================
void begin() override;
void end() override;
void submit() override;
//===========================================================================
// 渲染通道
//===========================================================================
void beginRenderPass(RHIFramebuffer *framebuffer,
ClearFlags clearFlags = ClearFlags::Color,
const Color &clearColor = Color::Black,
float clearDepth = 1.0f,
uint8_t clearStencil = 0) override;
void endRenderPass() override;
//===========================================================================
// 状态设置
//===========================================================================
void setViewport(const Viewport &viewport) override;
void setScissor(const ScissorRect &scissor) override;
void setPipeline(RHIPipeline *pipeline) override;
//===========================================================================
// 资源绑定
//===========================================================================
void setVertexBuffer(uint32_t slot, RHIBuffer *buffer,
uint32_t offset = 0, uint32_t stride = 0) override;
void setIndexBuffer(RHIBuffer *buffer, IndexType type,
uint32_t offset = 0) override;
void setUniformBuffer(uint32_t slot, RHIBuffer *buffer) override;
void setUniformBuffer(uint32_t slot, RHIBuffer *buffer, uint32_t offset, uint32_t size = 0) override;
void setTexture(uint32_t slot, RHITexture *texture) override;
void setSampler(uint32_t slot, TextureFilter minFilter,
TextureFilter magFilter, TextureWrap wrapS,
TextureWrap wrapT) override;
//===========================================================================
// 绘制命令
//===========================================================================
void draw(uint32_t vertexCount, uint32_t firstVertex = 0,
uint32_t instanceCount = 1, uint32_t firstInstance = 0) override;
void drawIndexed(uint32_t indexCount, uint32_t firstIndex = 0,
int32_t vertexOffset = 0, uint32_t instanceCount = 1,
uint32_t firstInstance = 0) override;
//===========================================================================
// 工具方法
//===========================================================================
void clear(ClearFlags flags, const Color &color = Color::Black,
float depth = 1.0f, uint8_t stencil = 0) override;
bool isRecording() const override;
// 设置 uniform 变量
void setUniform(const char* name, float value) override;
void setUniform(const char* name, const Vec2& value) override;
void setUniform(const char* name, const Vec3& value) override;
void setUniform(const char* name, const Color& value) override;
void setUniform(const char* name, const Mat4& value) override;
private:
bool recording_ = false;
GLPipeline *currentPipeline_ = nullptr;
GLBuffer *currentVertexBuffer_ = nullptr;
GLBuffer *currentIndexBuffer_ = nullptr;
GLFramebuffer *currentFramebuffer_ = nullptr;
GLuint currentShaderProgram_ = 0;
};
} // namespace extra2d