Extra2D/Extra2D/include/extra2d/gfx/opengl/GLCommandBuffer.h

181 lines
4.5 KiB
C++

#include <extra2d/gfx/GFXCommandBuffer.h>
namespace extra2d {
namespace gfx {
/**
* @brief OpenGL 命令缓冲区实现
*/
class GLCommandBuffer : public CommandBuffer {
public:
/**
* @brief 构造函数
*/
GLCommandBuffer();
/**
* @brief 析构函数
*/
~GLCommandBuffer() override;
// ==================== 生命周期 ====================
/**
* @brief 初始化命令缓冲区
* @return 成功返回 true
*/
bool initialize();
/**
* @brief 销毁命令缓冲区
*/
void destroy();
// ==================== 开始/结束 ====================
/**
* @brief 开始录制命令
*/
void begin() override;
/**
* @brief 结束录制命令
*/
void end() override;
// ==================== 渲染通道 ====================
/**
* @brief 开始渲染通道
* @param renderPass 渲染通道
* @param framebuffer 帧缓冲
* @param viewport 视口
* @param clearFlags 清除标志
* @param clearColor 清除颜色
* @param clearDepth 清除深度
* @param clearStencil 清除模板
*/
void beginRenderPass(RenderPass* renderPass, Framebuffer* framebuffer,
const Viewport& viewport,
ClearFlagBit clearFlags,
const Color& clearColor,
float clearDepth, u32 clearStencil) override;
/**
* @brief 结束渲染通道
*/
void endRenderPass() override;
// ==================== 绑定命令 ====================
/**
* @brief 绑定管线状态
* @param pipelineState 管线状态
*/
void bindPipelineState(PipelineState* pipelineState) override;
/**
* @brief 绑定输入装配器
* @param inputAssembler 输入装配器
*/
void bindInputAssembler(InputAssembler* inputAssembler) override;
/**
* @brief 绑定描述符集
* @param descriptorSet 描述符集
* @param setIndex 集合索引
*/
void bindDescriptorSet(DescriptorSet* descriptorSet, u32 setIndex) override;
// ==================== 状态设置 ====================
/**
* @brief 设置视口
* @param viewport 视口
*/
void setViewport(const Viewport& viewport) override;
/**
* @brief 设置矩形区域
* @param rect 矩形区域
*/
void setScissor(const Rect& rect) override;
/**
* @brief 设置混合常量
* @param constants 常量数组
*/
void setBlendConstants(const float* constants) override;
/**
* @brief 设置深度偏移
* @param bias 偏移值
*/
void setDepthBias(float bias, float slope, float clamp) override;
/**
* @brief 设置模板参考值
* @param front 前面参考值
* @param back 后面参考值
*/
void setStencilReference(u32 front, u32 back) override;
// ==================== 绘制命令 ====================
/**
* @brief 绘制数组
* @param vertexCount 顶点数量
* @param firstVertex 起始顶点
* @param instanceCount 实例数量
* @param firstInstance 起始实例
*/
void drawArrays(u32 vertexCount, u32 firstVertex = 0,
u32 instanceCount = 1, u32 firstInstance = 0) override;
/**
* @brief 绘制索引
* @param indexCount 索引数量
* @param firstIndex 起始索引
* @param instanceCount 实例数量
* @param firstInstance 起始实例
*/
void drawIndexed(u32 indexCount, u32 firstIndex = 0,
u32 instanceCount = 1, u32 firstInstance = 0) override;
// ==================== 更新命令 ====================
/**
* @brief 更新缓冲区
* @param buffer 缓冲区
* @param offset 偏移量
* @param data 数据指针
* @param size 数据大小
*/
void updateBuffer(Buffer* buffer, u32 offset, const void* data, u32 size) override;
/**
* @brief 复制缓冲区
* @param src 源缓冲区
* @param srcOffset 源偏移量
* @param dst 目标缓冲区
* @param dstOffset 目标偏移量
* @param size 大小
*/
void copyBuffer(Buffer* src, u32 srcOffset, Buffer* dst, u32 dstOffset, u32 size) override;
/**
* @brief 复制纹理
* @param src 源纹理
* @param dst 目标纹理
*/
void copyTexture(Texture* src, Texture* dst) override;
private:
bool recording_{false};
RenderPass* currentRenderPass_{nullptr};
Framebuffer* currentFramebuffer_{nullptr};
};
} // namespace gfx
} // namespace extra2d