#pragma once #include #include namespace extra2d { /** * @brief RHI 设备接口 * * 抽象图形设备,负责资源创建和上下文管理 */ class RHIDevice { public: virtual ~RHIDevice() = default; /** * @brief 初始化设备 * @param nativeWindow 原生窗口句柄(如 SDL_Window*) * @return 初始化是否成功 */ virtual bool initialize(void* nativeWindow) = 0; /** * @brief 关闭设备 */ virtual void shutdown() = 0; //=========================================================================== // 资源创建 //=========================================================================== /** * @brief 创建缓冲区 * @param desc 缓冲区描述 * @return 缓冲区对象 */ virtual std::unique_ptr createBuffer(const BufferDesc &desc) = 0; /** * @brief 创建纹理 * @param desc 纹理描述 * @return 纹理对象 */ virtual std::unique_ptr createTexture(const TextureDesc &desc) = 0; /** * @brief 创建着色器 * @param desc 着色器描述 * @return 着色器对象 */ virtual std::unique_ptr createShader(const ShaderDesc &desc) = 0; /** * @brief 创建图形管线 * @param desc 管线描述 * @return 管线对象 */ virtual std::unique_ptr createPipeline(const PipelineDesc &desc) = 0; /** * @brief 创建帧缓冲 * @param desc 帧缓冲描述 * @return 帧缓冲对象 */ virtual std::unique_ptr createFramebuffer(const RenderPassDesc &desc) = 0; /** * @brief 创建命令列表 * @return 命令列表对象 */ virtual std::unique_ptr createCommandList() = 0; //=========================================================================== // 上下文管理 //=========================================================================== /** * @brief 获取渲染上下文 * @return 渲染上下文指针 */ virtual RHIContext *getContext() = 0; /** * @brief 获取后端名称 * @return 后端名称(如 "OpenGL", "Vulkan") */ virtual const char *getBackendName() const = 0; /** * @brief 等待 GPU 完成所有操作 */ virtual void waitIdle() = 0; /** * @brief 获取渲染统计 * @return 渲染统计信息 */ virtual const RenderStats &getStats() const = 0; /** * @brief 重置渲染统计 */ virtual void resetStats() = 0; }; /** * @brief RHI 上下文接口 * * 管理渲染上下文和呈现 */ class RHIContext { public: virtual ~RHIContext() = default; /** * @brief 初始化上下文 * @return 初始化是否成功 */ virtual bool initialize() = 0; /** * @brief 关闭上下文 */ virtual void shutdown() = 0; /** * @brief 开始一帧 */ virtual void beginFrame() = 0; /** * @brief 结束一帧并呈现 */ virtual void endFrame() = 0; /** * @brief 设置视口 * @param x 视口 X 坐标 * @param y 视口 Y 坐标 * @param width 视口宽度 * @param height 视口高度 */ virtual void setViewport(int32_t x, int32_t y, uint32_t width, uint32_t height) = 0; /** * @brief 设置默认帧缓冲 */ virtual void bindDefaultFramebuffer() = 0; /** * @brief 获取默认帧缓冲 * @return 默认帧缓冲 */ virtual RHIFramebuffer *getDefaultFramebuffer() = 0; /** * @brief 检查是否支持特性 * @param feature 特性名称 * @return 是否支持 */ virtual bool isFeatureSupported(const char *feature) const = 0; }; } // namespace extra2d