/** * Copyright (c) 2025, Jayden Grubb * * SPDX-License-Identifier: BSD-3-Clause */ #pragma once #include #include #include #include #include #include namespace Nova { class NOVA_API RenderDriver { public: static RenderDriver* create(RenderAPI api, WindowDriver* window_driver = nullptr); virtual ~RenderDriver() = default; [[nodiscard]] virtual RenderAPI get_api() const = 0; [[nodiscard]] virtual u32 get_api_version() const = 0; [[nodiscard]] virtual std::string get_api_name() const = 0; [[nodiscard]] virtual std::string get_api_version_string() const = 0; [[nodiscard]] virtual u32 get_device_count() const = 0; [[nodiscard]] virtual const RenderDevice& get_device(u32 index) const = 0; [[nodiscard]] virtual bool get_device_supports_surface(u32 index, SurfaceID surface) const = 0; virtual void select_device(u32 index) = 0; [[nodiscard]] virtual SurfaceID create_surface(WindowID window) = 0; virtual void destroy_surface(SurfaceID surface) = 0; [[nodiscard]] virtual SwapchainID create_swapchain(SurfaceID surface) = 0; virtual void resize_swapchain(SwapchainID swapchain) = 0; [[nodiscard]] virtual RenderPassID get_swapchain_render_pass(SwapchainID swapchain) const = 0; virtual void destroy_swapchain(SwapchainID swapchain) = 0; [[nodiscard]] virtual ShaderID create_shader(const std::span bytes, ShaderStage stage) = 0; virtual void destroy_shader(ShaderID shader) = 0; [[nodiscard]] virtual RenderPassID create_render_pass(RenderPassParams& params) = 0; virtual void destroy_render_pass(RenderPassID render_pass) = 0; [[nodiscard]] virtual PipelineID create_pipeline(GraphicsPipelineParams& params) = 0; [[nodiscard]] virtual PipelineID create_pipeline(ComputePipelineParams& params) = 0; virtual void destroy_pipeline(PipelineID pipeline) = 0; [[nodiscard]] virtual QueueID create_queue() = 0; virtual void destroy_queue(QueueID queue) = 0; [[nodiscard]] virtual CommandPoolID create_command_pool(QueueID queue) = 0; virtual void destroy_command_pool(CommandPoolID command_pool) = 0; [[nodiscard]] virtual CommandBufferID create_command_buffer(CommandPoolID pool) = 0; virtual void begin_command_buffer(CommandBufferID command_buffer) = 0; virtual void end_command_buffer(CommandBufferID command_buffer) = 0; }; } // namespace Nova