export module renderer.frontend; import renderer.data; import renderer.components; import math.components; import assets.shader; import ecs.entity; import math.vec2; import memory.scope; import std; export namespace lt::renderer { enum class Api : std::uint8_t { none = 0u, vulkan, direct_x, metal, }; class IInstance { public: // [[nodiscard]] static auto get(Api target_api) -> IInstance *; IInstance() = default; virtual ~IInstance() = default; IInstance(IInstance &&) = default; IInstance(const IInstance &) = delete; auto operator=(IInstance &&) -> IInstance & = default; auto operator=(const IInstance &) -> IInstance & = delete; }; class IGpu { public: IGpu() = default; virtual ~IGpu() = default; IGpu(IGpu &&) = default; IGpu(const IGpu &) = delete; auto operator=(IGpu &&) -> IGpu & = default; auto operator=(const IGpu &) -> IGpu & = delete; }; class IDevice { public: IDevice() = default; virtual ~IDevice() = default; IDevice(IDevice &&) = default; IDevice(const IDevice &) = delete; auto operator=(IDevice &&) -> IDevice & = default; auto operator=(const IDevice &) -> IDevice & = delete; }; class ISurface { public: ISurface() = default; virtual ~ISurface() = default; ISurface(ISurface &&) = default; ISurface(const ISurface &) = delete; auto operator=(ISurface &&) -> ISurface & = default; auto operator=(const ISurface &) -> ISurface & = delete; [[nodiscard]] virtual auto get_framebuffer_size() const -> math::uvec2 = 0; }; class ISwapchain { public: ISwapchain() = default; virtual ~ISwapchain() = default; ISwapchain(ISwapchain &&) = default; ISwapchain(const ISwapchain &) = delete; auto operator=(ISwapchain &&) -> ISwapchain & = default; auto operator=(const ISwapchain &) -> ISwapchain & = delete; }; class IBuffer { public: enum class Usage : std::uint8_t { vertex, index, storage, staging, }; struct CreateInfo { Usage usage; std::size_t size; std::string debug_name; }; struct CopyInfo { std::size_t offset; std::size_t size; }; IBuffer() = default; virtual ~IBuffer() = default; IBuffer(IBuffer &&) = default; IBuffer(const IBuffer &) = delete; auto operator=(IBuffer &&) -> IBuffer & = default; auto operator=(const IBuffer &) -> IBuffer & = delete; [[nodiscard]] virtual auto map() -> std::span = 0; virtual void unmap() = 0; [[nodiscard]] virtual auto get_size() const -> std::size_t = 0; private: }; class IPass { public: IPass() = default; virtual ~IPass() = default; IPass(IPass &&) = default; IPass(const IPass &) = delete; auto operator=(IPass &&) -> IPass & = default; auto operator=(const IPass &) -> IPass & = delete; }; class IRenderer { public: static constexpr auto frames_in_flight_upper_limit = 5u; static constexpr auto frames_in_flight_lower_limit = 1u; enum class Result : std::uint8_t { success = 0, invalid_swapchain, error, }; IRenderer() = default; virtual ~IRenderer() = default; IRenderer(IRenderer &&) = default; IRenderer(const IRenderer &) = delete; auto operator=(IRenderer &&) -> IRenderer & = default; auto operator=(const IRenderer &) -> IRenderer & = delete; virtual auto frame(std::uint32_t frame_idx, std::function submit_scene) -> Result = 0; virtual void replace_swapchain(class ISwapchain *swapchain) = 0; virtual void set_frame_constants(FrameConstants constants) = 0; virtual void submit_sprite( const components::Sprite &sprite, const math::components::Transform &transform ) = 0; }; // class IDebugger // { // public: // enum class MessageSeverity : std::uint8_t // { // none = 0u, // // verbose = bitwise::bit(0u), // info = bitwise::bit(1u), // warning = bitwise::bit(2u), // error = bitwise::bit(3u), // // all = verbose | info | warning | error, // }; // // enum class MessageType : std::uint8_t // { // none = 0u, // general = bitwise::bit(0u), // validation = bitwise::bit(1u), // performance = bitwise::bit(2u), // // all = general | validation | performance, // }; // // struct MessageData // { // std::string message; // }; // // using Callback_T = std::function; // // struct CreateInfo // { // MessageSeverity severities; // // MessageType types; // // Callback_T callback; // // std::any user_data; // }; // // [[nodiscard]] static auto create(Api target_api, class IInstance *instance, CreateInfo info) // -> memory::Scope; // // IDebugger() = default; // // virtual ~IDebugger() = default; // // IDebugger(IDebugger &&) = default; // // IDebugger(const IDebugger &) = delete; // // auto operator=(IDebugger &&) -> IDebugger & = default; // // auto operator=(const IDebugger &) -> IDebugger & = delete; // }; } // namespace lt::renderer