2026-03-03 02:16:29 +08:00
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
|
|
#include <renderer/rhi/rhi_types.h>
|
|
|
|
|
|
#include <renderer/rhi/rhi_buffer.h>
|
|
|
|
|
|
#include <renderer/rhi/rhi_shader.h>
|
|
|
|
|
|
#include <renderer/rhi/rhi_framebuffer.h>
|
|
|
|
|
|
|
|
|
|
|
|
namespace extra2d {
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief RHI 命令列表接口
|
|
|
|
|
|
*
|
|
|
|
|
|
* 抽象 GPU 命令录制和执行
|
|
|
|
|
|
*/
|
|
|
|
|
|
class RHICommandList {
|
|
|
|
|
|
public:
|
|
|
|
|
|
virtual ~RHICommandList() = default;
|
|
|
|
|
|
|
|
|
|
|
|
//===========================================================================
|
|
|
|
|
|
// 命令列表生命周期
|
|
|
|
|
|
//===========================================================================
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 开始录制命令
|
|
|
|
|
|
*/
|
|
|
|
|
|
virtual void begin() = 0;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 结束录制命令
|
|
|
|
|
|
*/
|
|
|
|
|
|
virtual void end() = 0;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 提交命令到 GPU
|
|
|
|
|
|
*/
|
|
|
|
|
|
virtual void submit() = 0;
|
|
|
|
|
|
|
|
|
|
|
|
//===========================================================================
|
|
|
|
|
|
// 渲染通道
|
|
|
|
|
|
//===========================================================================
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 开始渲染通道
|
|
|
|
|
|
* @param framebuffer 帧缓冲
|
|
|
|
|
|
* @param clearFlags 清除标志
|
|
|
|
|
|
* @param clearColor 清除颜色(当包含 Color 标志时)
|
|
|
|
|
|
* @param clearDepth 清除深度值(当包含 Depth 标志时)
|
|
|
|
|
|
* @param clearStencil 清除模板值(当包含 Stencil 标志时)
|
|
|
|
|
|
*/
|
|
|
|
|
|
virtual void beginRenderPass(RHIFramebuffer* framebuffer,
|
|
|
|
|
|
ClearFlags clearFlags = ClearFlags::Color,
|
|
|
|
|
|
const Color& clearColor = Color::Black,
|
|
|
|
|
|
float clearDepth = 1.0f,
|
|
|
|
|
|
uint8_t clearStencil = 0) = 0;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 结束渲染通道
|
|
|
|
|
|
*/
|
|
|
|
|
|
virtual void endRenderPass() = 0;
|
|
|
|
|
|
|
|
|
|
|
|
//===========================================================================
|
|
|
|
|
|
// 状态设置
|
|
|
|
|
|
//===========================================================================
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 设置视口
|
|
|
|
|
|
* @param viewport 视口
|
|
|
|
|
|
*/
|
|
|
|
|
|
virtual void setViewport(const Viewport& viewport) = 0;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 设置裁剪矩形
|
|
|
|
|
|
* @param scissor 裁剪矩形
|
|
|
|
|
|
*/
|
|
|
|
|
|
virtual void setScissor(const ScissorRect& scissor) = 0;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 设置图形管线
|
|
|
|
|
|
* @param pipeline 管线
|
|
|
|
|
|
*/
|
|
|
|
|
|
virtual void setPipeline(RHIPipeline* pipeline) = 0;
|
|
|
|
|
|
|
|
|
|
|
|
//===========================================================================
|
|
|
|
|
|
// 资源绑定
|
|
|
|
|
|
//===========================================================================
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 设置顶点缓冲区
|
|
|
|
|
|
* @param slot 槽位
|
|
|
|
|
|
* @param buffer 缓冲区
|
|
|
|
|
|
* @param offset 偏移(字节)
|
2026-03-03 03:48:55 +08:00
|
|
|
|
* @param stride 步长(字节,0表示使用布局中的步长)
|
2026-03-03 02:16:29 +08:00
|
|
|
|
*/
|
2026-03-03 03:48:55 +08:00
|
|
|
|
virtual void setVertexBuffer(uint32_t slot, RHIBuffer* buffer, uint32_t offset = 0, uint32_t stride = 0) = 0;
|
2026-03-03 02:16:29 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 设置索引缓冲区
|
|
|
|
|
|
* @param buffer 缓冲区
|
|
|
|
|
|
* @param type 索引类型
|
|
|
|
|
|
* @param offset 偏移(字节)
|
|
|
|
|
|
*/
|
|
|
|
|
|
virtual void setIndexBuffer(RHIBuffer* buffer, IndexType type, uint32_t offset = 0) = 0;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 设置 Uniform 缓冲区
|
|
|
|
|
|
* @param slot 槽位
|
|
|
|
|
|
* @param buffer 缓冲区
|
|
|
|
|
|
*/
|
|
|
|
|
|
virtual void setUniformBuffer(uint32_t slot, RHIBuffer* buffer) = 0;
|
|
|
|
|
|
|
2026-03-03 03:48:55 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 设置 Uniform 缓冲区(带偏移)
|
|
|
|
|
|
* @param slot 槽位
|
|
|
|
|
|
* @param buffer 缓冲区
|
|
|
|
|
|
* @param offset 缓冲区偏移(字节)
|
|
|
|
|
|
* @param size 绑定大小(字节,0 表示整个缓冲区)
|
|
|
|
|
|
*/
|
|
|
|
|
|
virtual void setUniformBuffer(uint32_t slot, RHIBuffer* buffer, uint32_t offset, uint32_t size = 0) = 0;
|
|
|
|
|
|
|
2026-03-03 02:16:29 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 设置纹理
|
|
|
|
|
|
* @param slot 槽位
|
|
|
|
|
|
* @param texture 纹理
|
|
|
|
|
|
*/
|
|
|
|
|
|
virtual void setTexture(uint32_t slot, RHITexture* texture) = 0;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 设置采样器
|
|
|
|
|
|
* @param slot 槽位
|
|
|
|
|
|
* @param minFilter 最小过滤
|
|
|
|
|
|
* @param magFilter 最大过滤
|
|
|
|
|
|
* @param wrapS S 轴环绕
|
|
|
|
|
|
* @param wrapT T 轴环绕
|
|
|
|
|
|
*/
|
|
|
|
|
|
virtual void setSampler(uint32_t slot,
|
|
|
|
|
|
TextureFilter minFilter,
|
|
|
|
|
|
TextureFilter magFilter,
|
|
|
|
|
|
TextureWrap wrapS,
|
|
|
|
|
|
TextureWrap wrapT) = 0;
|
|
|
|
|
|
|
2026-03-03 03:48:55 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 设置 float 类型的 uniform 变量
|
|
|
|
|
|
* @param name 变量名
|
|
|
|
|
|
* @param value 值
|
|
|
|
|
|
*/
|
|
|
|
|
|
virtual void setUniform(const char* name, float value) = 0;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 设置 vec2 类型的 uniform 变量
|
|
|
|
|
|
* @param name 变量名
|
|
|
|
|
|
* @param value 值
|
|
|
|
|
|
*/
|
|
|
|
|
|
virtual void setUniform(const char* name, const Vec2& value) = 0;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 设置 vec3 类型的 uniform 变量
|
|
|
|
|
|
* @param name 变量名
|
|
|
|
|
|
* @param value 值
|
|
|
|
|
|
*/
|
|
|
|
|
|
virtual void setUniform(const char* name, const Vec3& value) = 0;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 设置 vec4/Color 类型的 uniform 变量
|
|
|
|
|
|
* @param name 变量名
|
|
|
|
|
|
* @param value 值
|
|
|
|
|
|
*/
|
|
|
|
|
|
virtual void setUniform(const char* name, const Color& value) = 0;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 设置 mat4 类型的 uniform 变量
|
|
|
|
|
|
* @param name 变量名
|
|
|
|
|
|
* @param value 值
|
|
|
|
|
|
*/
|
|
|
|
|
|
virtual void setUniform(const char* name, const Mat4& value) = 0;
|
|
|
|
|
|
|
2026-03-03 02:16:29 +08:00
|
|
|
|
//===========================================================================
|
|
|
|
|
|
// 绘制命令
|
|
|
|
|
|
//===========================================================================
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 绘制顶点
|
|
|
|
|
|
* @param vertexCount 顶点数量
|
|
|
|
|
|
* @param firstVertex 起始顶点
|
|
|
|
|
|
* @param instanceCount 实例数量
|
|
|
|
|
|
* @param firstInstance 起始实例
|
|
|
|
|
|
*/
|
|
|
|
|
|
virtual void draw(uint32_t vertexCount,
|
|
|
|
|
|
uint32_t firstVertex = 0,
|
|
|
|
|
|
uint32_t instanceCount = 1,
|
|
|
|
|
|
uint32_t firstInstance = 0) = 0;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 绘制索引
|
|
|
|
|
|
* @param indexCount 索引数量
|
|
|
|
|
|
* @param firstIndex 起始索引
|
|
|
|
|
|
* @param vertexOffset 顶点偏移
|
|
|
|
|
|
* @param instanceCount 实例数量
|
|
|
|
|
|
* @param firstInstance 起始实例
|
|
|
|
|
|
*/
|
|
|
|
|
|
virtual void drawIndexed(uint32_t indexCount,
|
|
|
|
|
|
uint32_t firstIndex = 0,
|
|
|
|
|
|
int32_t vertexOffset = 0,
|
|
|
|
|
|
uint32_t instanceCount = 1,
|
|
|
|
|
|
uint32_t firstInstance = 0) = 0;
|
|
|
|
|
|
|
|
|
|
|
|
//===========================================================================
|
|
|
|
|
|
// 工具方法
|
|
|
|
|
|
//===========================================================================
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 清除当前帧缓冲
|
|
|
|
|
|
* @param flags 清除标志
|
|
|
|
|
|
* @param color 清除颜色
|
|
|
|
|
|
* @param depth 清除深度值
|
|
|
|
|
|
* @param stencil 清除模板值
|
|
|
|
|
|
*/
|
|
|
|
|
|
virtual void clear(ClearFlags flags,
|
|
|
|
|
|
const Color& color = Color::Black,
|
|
|
|
|
|
float depth = 1.0f,
|
|
|
|
|
|
uint8_t stencil = 0) = 0;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 检查是否在录制状态
|
|
|
|
|
|
* @return 是否在录制
|
|
|
|
|
|
*/
|
|
|
|
|
|
virtual bool isRecording() const = 0;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
} // namespace extra2d
|