274 lines
4.8 KiB
C++
274 lines
4.8 KiB
C++
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<std::byte> = 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<void()> 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<void(
|
|
// MessageSeverity message_severity,
|
|
// MessageType message_type,
|
|
// const MessageData &data,
|
|
// std::any &user_data
|
|
// )>;
|
|
//
|
|
// 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>;
|
|
//
|
|
// 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
|