277 lines
6.5 KiB
C++
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
|