Extra2D/Extra2D/include/extra2d/gfx/GFXDevice.h

277 lines
6.5 KiB
C++

#pragma once
#include <extra2d/gfx/GFXDef.h>
#include <extra2d/gfx/GFXObject.h>
#include <extra2d/gfx/GFXBuffer.h>
#include <extra2d/gfx/GFXTexture.h>
#include <string>
#include <vector>
namespace extra2d {
namespace gfx {
class Shader;
class PipelineState;
class PipelineLayout;
class RenderPass;
class Framebuffer;
class InputAssembler;
class CommandBuffer;
class DescriptorSet;
class DescriptorSetLayout;
/**
* @brief 设备创建信息
*/
struct DeviceInfo {
std::string windowHandle;
u32 width{1280};
u32 height{720};
bool debug{false};
};
/**
* @brief GFX 设备抽象基类
*
* 图形设备的抽象接口,管理所有 GPU 资源的创建和生命周期。
* 参考 Cocos Creator 的 GFXDevice 设计。
*/
class Device : public GFXObject {
public:
/**
* @brief 获取单例实例
* @return 设备实例
*/
static Device* getInstance();
/**
* @brief 构造函数
*/
Device();
/**
* @brief 析构函数
*/
~Device() override;
/**
* @brief 初始化设备
* @param info 设备信息
* @return 成功返回 true
*/
bool initialize(const DeviceInfo& info);
/**
* @brief 销毁设备
*/
void destroy();
/**
* @brief 帧同步
*
* 等待 GPU 完成当前帧的所有工作
*/
virtual void frameSync() = 0;
/**
* @brief 呈现帧
*/
virtual void present() = 0;
// ==================== 资源创建工厂方法 ====================
/**
* @brief 创建缓冲区
* @param info 缓冲区信息
* @return 缓冲区指针
*/
virtual Buffer* createBuffer(const BufferInfo& info) = 0;
/**
* @brief 创建纹理
* @param info 纹理信息
* @return 纹理指针
*/
virtual Texture* createTexture(const TextureInfo& info) = 0;
/**
* @brief 创建着色器
* @param name 着色器名称
* @param vertexSource 顶点着色器源码
* @param fragmentSource 片段着色器源码
* @return 着色器指针
*/
virtual Shader* createShader(const std::string& name,
const std::string& vertexSource,
const std::string& fragmentSource) = 0;
/**
* @brief 创建管线状态
* @param info 管线状态信息
* @return 管线状态指针
*/
virtual PipelineState* createPipelineState(const PipelineStateInfo& info) = 0;
/**
* @brief 创建输入装配器
* @param info 输入装配器信息
* @return 输入装配器指针
*/
virtual InputAssembler* createInputAssembler(const InputAssemblerInfo& info) = 0;
// ==================== 数据传输 ====================
/**
* @brief 复制缓冲区数据到纹理
* @param buffers 缓冲区数组
* @param dst 目标纹理
* @param regions 复制区域
* @param count 区域数量
*/
virtual void copyBuffersToTexture(const u8* const* buffers, Texture* dst,
const BufferTextureCopy* regions, u32 count) = 0;
// ==================== 设备能力查询 ====================
/**
* @brief 获取设备能力
* @return 设备能力信息
*/
const DeviceCaps& getCapabilities() const;
/**
* @brief 获取图形 API 类型
* @return API 类型
*/
API getGfxAPI() const;
/**
* @brief 检查是否支持指定特性
* @param feature 特性
* @return 如果支持返回 true
*/
bool hasFeature(Feature feature) const;
/**
* @brief 获取格式特性
* @param format 格式
* @return 格式特性标志
*/
FormatFeature getFormatFeatures(Format format) const;
/**
* @brief 获取类型名称
* @return "Device"
*/
const char* getTypeName() const override { return "Device"; }
// ==================== 状态管理 ====================
/**
* @brief 设置视口
* @param x X 坐标
* @param y Y 坐标
* @param width 宽度
* @param height 高度
*/
virtual void setViewport(float x, float y, float width, float height) = 0;
/**
* @brief 设置裁剪区域
* @param x X 坐标
* @param y Y 坐标
* @param width 宽度
* @param height 高度
*/
virtual void setScissor(i32 x, i32 y, u32 width, u32 height) = 0;
/**
* @brief 清除颜色缓冲区
* @param r 红色分量
* @param g 绿色分量
* @param b 蓝色分量
* @param a 透明度
*/
virtual void clearColor(float r, float g, float b, float a) = 0;
/**
* @brief 清除深度和模板缓冲区
* @param depth 深度值
* @param stencil 模板值
*/
virtual void clearDepthStencil(float depth, u8 stencil) = 0;
/**
* @brief 开始渲染通道
*/
virtual void beginRenderPass() = 0;
/**
* @brief 结束渲染通道
*/
virtual void endRenderPass() = 0;
/**
* @brief 绑定管线状态
* @param pipeline 管线状态
*/
virtual void bindPipelineState(PipelineState* pipeline) = 0;
/**
* @brief 绑定输入装配器
* @param ia 输入装配器
*/
virtual void bindInputAssembler(InputAssembler* ia) = 0;
/**
* @brief 绘制
* @param firstVertex 起始顶点
* @param vertexCount 顶点数量
*/
virtual void draw(u32 firstVertex, u32 vertexCount) = 0;
/**
* @brief 绘制索引
* @param firstIndex 起始索引
* @param indexCount 索引数量
* @param vertexOffset 顶点偏移
*/
virtual void drawIndexed(u32 firstIndex, u32 indexCount, i32 vertexOffset) = 0;
/**
* @brief 绘制实例
* @param firstVertex 起始顶点
* @param vertexCount 顶点数量
* @param instanceCount 实例数量
*/
virtual void drawInstanced(u32 firstVertex, u32 vertexCount, u32 instanceCount) = 0;
/**
* @brief 绘制索引实例
* @param firstIndex 起始索引
* @param indexCount 索引数量
* @param instanceCount 实例数量
* @param vertexOffset 顶点偏移
*/
virtual void drawIndexedInstanced(u32 firstIndex, u32 indexCount,
u32 instanceCount, i32 vertexOffset) = 0;
protected:
/**
* @brief 子类实现初始化
*/
virtual bool doInit(const DeviceInfo& info) = 0;
/**
* @brief 子类实现销毁
*/
virtual void doDestroy() = 0;
static Device* instance_;
DeviceCaps caps_;
bool initialized_{false};
};
} // namespace gfx
} // namespace extra2d