#pragma once #include #include #include #include #include #include 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