Extra2D/include/renderer/rhi/rhi_command_list.h

230 lines
6.9 KiB
C
Raw Normal View History

#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
* @param stride 0使
*/
virtual void setVertexBuffer(uint32_t slot, RHIBuffer* buffer, uint32_t offset = 0, uint32_t stride = 0) = 0;
/**
* @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;
/**
* @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;
/**
* @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;
/**
* @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;
//===========================================================================
// 绘制命令
//===========================================================================
/**
* @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