181 lines
4.5 KiB
C++
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
|