From a58b0c030f422c4342f7a8f3d200ed0038941069 Mon Sep 17 00:00:00 2001 From: light7734 Date: Mon, 22 Sep 2025 18:50:17 +0330 Subject: [PATCH] feat(renderer): wip hello triangle --- modules/renderer/CMakeLists.txt | 44 +----- .../{ => legacy}/private/backend.test.cpp | 0 .../renderer/{ => legacy}/private/blender.cpp | 0 .../renderer/{ => legacy}/private/buffers.cpp | 0 .../{ => legacy}/private/dx/blender.cpp | 0 .../{ => legacy}/private/dx/blender.hpp | 0 .../{ => legacy}/private/dx/buffers.cpp | 0 .../{ => legacy}/private/dx/buffers.hpp | 0 .../{ => legacy}/private/dx/framebuffers.cpp | 0 .../{ => legacy}/private/dx/framebuffers.hpp | 0 .../private/dx/graphics_context.cpp | 0 .../private/dx/graphics_context.hpp | 0 .../private/dx/render_command.cpp | 0 .../private/dx/render_command.hpp | 0 .../{ => legacy}/private/dx/shader.cpp | 0 .../{ => legacy}/private/dx/shader.hpp | 0 .../private/dx/shared_context.hpp | 0 .../{ => legacy}/private/dx/texture.cpp | 0 .../{ => legacy}/private/dx/texture.hpp | 0 .../private/dx/user_interface.hpp | 0 .../{ => legacy}/private/dx/vertex_layout.cpp | 0 .../{ => legacy}/private/dx/vertex_layout.hpp | 0 .../{ => legacy}/private/framebuffer.cpp | 0 .../{ => legacy}/private/gl/blender.cpp | 0 .../{ => legacy}/private/gl/blender.hpp | 0 .../{ => legacy}/private/gl/buffers.cpp | 0 .../{ => legacy}/private/gl/buffers.hpp | 0 .../{ => legacy}/private/gl/framebuffers.cpp | 0 .../{ => legacy}/private/gl/framebuffers.hpp | 0 .../private/gl/graphics_context.cpp | 0 .../private/gl/graphics_context.hpp | 0 .../private/gl/render_command.cpp | 0 .../private/gl/render_command.hpp | 0 .../{ => legacy}/private/gl/shader.cpp | 0 .../{ => legacy}/private/gl/shader.hpp | 0 .../private/gl/shared_context.hpp | 0 .../{ => legacy}/private/gl/texture.cpp | 0 .../{ => legacy}/private/gl/texture.hpp | 0 .../private/gl/user_interface.cpp | 0 .../private/gl/user_interface.hpp | 0 .../{ => legacy}/private/gl/vertex_layout.cpp | 0 .../{ => legacy}/private/gl/vertex_layout.hpp | 0 .../{ => legacy}/private/graphics_context.cpp | 0 .../{ => legacy}/private/programs/quad.cpp | 0 .../{ => legacy}/private/programs/quad.hpp | 0 .../private/programs/renderer_program.hpp | 0 .../{ => legacy}/private/programs/texture.cpp | 0 .../{ => legacy}/private/programs/texture.hpp | 0 .../private/programs/tinted_texture.cpp | 0 .../private/programs/tinted_texture.hpp | 0 .../{ => legacy}/private/render_command.cpp | 0 .../{ => legacy}/private/renderer.cpp | 0 .../renderer/{ => legacy}/private/shader.cpp | 0 modules/renderer/legacy/private/system.cpp | 17 +++ .../renderer/legacy/private/system.test.cpp | 44 ++++++ .../renderer/{ => legacy}/private/texture.cpp | 0 .../{ => legacy}/private/vertex_layout.cpp | 0 .../{ => legacy}/private/vk/device.cpp | 0 .../{ => legacy}/private/vk/device.hpp | 0 .../{ => legacy}/private/vk/device.test.cpp | 0 .../{ => legacy}/private/vk/instance.cpp | 0 .../{ => legacy}/private/vk/instance.hpp | 0 .../{ => legacy}/private/vk/instance.test.cpp | 0 .../renderer/{ => legacy}/public/backend.hpp | 0 .../renderer/{ => legacy}/public/blender.hpp | 0 .../renderer/{ => legacy}/public/buffers.hpp | 0 .../{ => legacy}/public/components.hpp | 0 .../renderer/{ => legacy}/public/context.hpp | 0 .../{ => legacy}/public/framebuffer.hpp | 0 .../{ => legacy}/public/graphics_context.hpp | 0 .../{ => legacy}/public/render_command.hpp | 0 .../renderer/{ => legacy}/public/renderer.hpp | 0 .../renderer/{ => legacy}/public/shader.hpp | 0 .../{ => legacy}/public/shared_context.hpp | 0 modules/renderer/legacy/public/system.hpp | 56 +++++++ .../renderer/{ => legacy}/public/texture.hpp | 0 .../{ => legacy}/public/vertex_layout.hpp | 0 modules/renderer/private/system.cpp | 12 -- modules/renderer/private/system.test.cpp | 139 ++++++++++++++---- .../private/vk/{backend.cpp => context.cpp} | 103 +++++++++---- .../private/vk/{backend.hpp => context.hpp} | 75 ++++++++-- modules/renderer/private/vk/surface.hpp | 26 ++++ modules/renderer/private/vk/swapchain.hpp | 22 +++ modules/renderer/public/system.hpp | 69 +++++---- modules/renderer/public/validation.hpp | 25 ++++ 85 files changed, 484 insertions(+), 148 deletions(-) rename modules/renderer/{ => legacy}/private/backend.test.cpp (100%) rename modules/renderer/{ => legacy}/private/blender.cpp (100%) rename modules/renderer/{ => legacy}/private/buffers.cpp (100%) rename modules/renderer/{ => legacy}/private/dx/blender.cpp (100%) rename modules/renderer/{ => legacy}/private/dx/blender.hpp (100%) rename modules/renderer/{ => legacy}/private/dx/buffers.cpp (100%) rename modules/renderer/{ => legacy}/private/dx/buffers.hpp (100%) rename modules/renderer/{ => legacy}/private/dx/framebuffers.cpp (100%) rename modules/renderer/{ => legacy}/private/dx/framebuffers.hpp (100%) rename modules/renderer/{ => legacy}/private/dx/graphics_context.cpp (100%) rename modules/renderer/{ => legacy}/private/dx/graphics_context.hpp (100%) rename modules/renderer/{ => legacy}/private/dx/render_command.cpp (100%) rename modules/renderer/{ => legacy}/private/dx/render_command.hpp (100%) rename modules/renderer/{ => legacy}/private/dx/shader.cpp (100%) rename modules/renderer/{ => legacy}/private/dx/shader.hpp (100%) rename modules/renderer/{ => legacy}/private/dx/shared_context.hpp (100%) rename modules/renderer/{ => legacy}/private/dx/texture.cpp (100%) rename modules/renderer/{ => legacy}/private/dx/texture.hpp (100%) rename modules/renderer/{ => legacy}/private/dx/user_interface.hpp (100%) rename modules/renderer/{ => legacy}/private/dx/vertex_layout.cpp (100%) rename modules/renderer/{ => legacy}/private/dx/vertex_layout.hpp (100%) rename modules/renderer/{ => legacy}/private/framebuffer.cpp (100%) rename modules/renderer/{ => legacy}/private/gl/blender.cpp (100%) rename modules/renderer/{ => legacy}/private/gl/blender.hpp (100%) rename modules/renderer/{ => legacy}/private/gl/buffers.cpp (100%) rename modules/renderer/{ => legacy}/private/gl/buffers.hpp (100%) rename modules/renderer/{ => legacy}/private/gl/framebuffers.cpp (100%) rename modules/renderer/{ => legacy}/private/gl/framebuffers.hpp (100%) rename modules/renderer/{ => legacy}/private/gl/graphics_context.cpp (100%) rename modules/renderer/{ => legacy}/private/gl/graphics_context.hpp (100%) rename modules/renderer/{ => legacy}/private/gl/render_command.cpp (100%) rename modules/renderer/{ => legacy}/private/gl/render_command.hpp (100%) rename modules/renderer/{ => legacy}/private/gl/shader.cpp (100%) rename modules/renderer/{ => legacy}/private/gl/shader.hpp (100%) rename modules/renderer/{ => legacy}/private/gl/shared_context.hpp (100%) rename modules/renderer/{ => legacy}/private/gl/texture.cpp (100%) rename modules/renderer/{ => legacy}/private/gl/texture.hpp (100%) rename modules/renderer/{ => legacy}/private/gl/user_interface.cpp (100%) rename modules/renderer/{ => legacy}/private/gl/user_interface.hpp (100%) rename modules/renderer/{ => legacy}/private/gl/vertex_layout.cpp (100%) rename modules/renderer/{ => legacy}/private/gl/vertex_layout.hpp (100%) rename modules/renderer/{ => legacy}/private/graphics_context.cpp (100%) rename modules/renderer/{ => legacy}/private/programs/quad.cpp (100%) rename modules/renderer/{ => legacy}/private/programs/quad.hpp (100%) rename modules/renderer/{ => legacy}/private/programs/renderer_program.hpp (100%) rename modules/renderer/{ => legacy}/private/programs/texture.cpp (100%) rename modules/renderer/{ => legacy}/private/programs/texture.hpp (100%) rename modules/renderer/{ => legacy}/private/programs/tinted_texture.cpp (100%) rename modules/renderer/{ => legacy}/private/programs/tinted_texture.hpp (100%) rename modules/renderer/{ => legacy}/private/render_command.cpp (100%) rename modules/renderer/{ => legacy}/private/renderer.cpp (100%) rename modules/renderer/{ => legacy}/private/shader.cpp (100%) create mode 100644 modules/renderer/legacy/private/system.cpp create mode 100644 modules/renderer/legacy/private/system.test.cpp rename modules/renderer/{ => legacy}/private/texture.cpp (100%) rename modules/renderer/{ => legacy}/private/vertex_layout.cpp (100%) rename modules/renderer/{ => legacy}/private/vk/device.cpp (100%) rename modules/renderer/{ => legacy}/private/vk/device.hpp (100%) rename modules/renderer/{ => legacy}/private/vk/device.test.cpp (100%) rename modules/renderer/{ => legacy}/private/vk/instance.cpp (100%) rename modules/renderer/{ => legacy}/private/vk/instance.hpp (100%) rename modules/renderer/{ => legacy}/private/vk/instance.test.cpp (100%) rename modules/renderer/{ => legacy}/public/backend.hpp (100%) rename modules/renderer/{ => legacy}/public/blender.hpp (100%) rename modules/renderer/{ => legacy}/public/buffers.hpp (100%) rename modules/renderer/{ => legacy}/public/components.hpp (100%) rename modules/renderer/{ => legacy}/public/context.hpp (100%) rename modules/renderer/{ => legacy}/public/framebuffer.hpp (100%) rename modules/renderer/{ => legacy}/public/graphics_context.hpp (100%) rename modules/renderer/{ => legacy}/public/render_command.hpp (100%) rename modules/renderer/{ => legacy}/public/renderer.hpp (100%) rename modules/renderer/{ => legacy}/public/shader.hpp (100%) rename modules/renderer/{ => legacy}/public/shared_context.hpp (100%) create mode 100644 modules/renderer/legacy/public/system.hpp rename modules/renderer/{ => legacy}/public/texture.hpp (100%) rename modules/renderer/{ => legacy}/public/vertex_layout.hpp (100%) rename modules/renderer/private/vk/{backend.cpp => context.cpp} (84%) rename modules/renderer/private/vk/{backend.hpp => context.hpp} (74%) create mode 100644 modules/renderer/private/vk/surface.hpp create mode 100644 modules/renderer/private/vk/swapchain.hpp create mode 100644 modules/renderer/public/validation.hpp diff --git a/modules/renderer/CMakeLists.txt b/modules/renderer/CMakeLists.txt index 946569e..0a7a311 100644 --- a/modules/renderer/CMakeLists.txt +++ b/modules/renderer/CMakeLists.txt @@ -1,45 +1,17 @@ add_library_module(renderer system.cpp - blender.cpp - buffers.cpp - framebuffer.cpp - graphics_context.cpp - render_command.cpp - renderer.cpp - shader.cpp - texture.cpp - vertex_layout.cpp - programs/quad.cpp - programs/texture.cpp - programs/tinted_texture.cpp - gl/blender.cpp - gl/buffers.cpp - gl/framebuffers.cpp - gl/graphics_context.cpp - gl/render_command.cpp - gl/shader.cpp - gl/texture.cpp - gl/vertex_layout.cpp - vk/instance.cpp + vk/context.cpp ) -target_link_libraries( - renderer - PUBLIC camera - PUBLIC input - PUBLIC logger - PUBLIC imgui - PUBLIC asset_parser - PRIVATE lt_debug - PRIVATE window - PUBLIC vulkan +target_link_libraries(renderer +PUBLIC + app + ecs + vulkan + memory + surface ) add_test_module(renderer system.test.cpp ) -target_link_libraries( - renderer_tests - PRIVATE lt_debug - PRIVATE window -) diff --git a/modules/renderer/private/backend.test.cpp b/modules/renderer/legacy/private/backend.test.cpp similarity index 100% rename from modules/renderer/private/backend.test.cpp rename to modules/renderer/legacy/private/backend.test.cpp diff --git a/modules/renderer/private/blender.cpp b/modules/renderer/legacy/private/blender.cpp similarity index 100% rename from modules/renderer/private/blender.cpp rename to modules/renderer/legacy/private/blender.cpp diff --git a/modules/renderer/private/buffers.cpp b/modules/renderer/legacy/private/buffers.cpp similarity index 100% rename from modules/renderer/private/buffers.cpp rename to modules/renderer/legacy/private/buffers.cpp diff --git a/modules/renderer/private/dx/blender.cpp b/modules/renderer/legacy/private/dx/blender.cpp similarity index 100% rename from modules/renderer/private/dx/blender.cpp rename to modules/renderer/legacy/private/dx/blender.cpp diff --git a/modules/renderer/private/dx/blender.hpp b/modules/renderer/legacy/private/dx/blender.hpp similarity index 100% rename from modules/renderer/private/dx/blender.hpp rename to modules/renderer/legacy/private/dx/blender.hpp diff --git a/modules/renderer/private/dx/buffers.cpp b/modules/renderer/legacy/private/dx/buffers.cpp similarity index 100% rename from modules/renderer/private/dx/buffers.cpp rename to modules/renderer/legacy/private/dx/buffers.cpp diff --git a/modules/renderer/private/dx/buffers.hpp b/modules/renderer/legacy/private/dx/buffers.hpp similarity index 100% rename from modules/renderer/private/dx/buffers.hpp rename to modules/renderer/legacy/private/dx/buffers.hpp diff --git a/modules/renderer/private/dx/framebuffers.cpp b/modules/renderer/legacy/private/dx/framebuffers.cpp similarity index 100% rename from modules/renderer/private/dx/framebuffers.cpp rename to modules/renderer/legacy/private/dx/framebuffers.cpp diff --git a/modules/renderer/private/dx/framebuffers.hpp b/modules/renderer/legacy/private/dx/framebuffers.hpp similarity index 100% rename from modules/renderer/private/dx/framebuffers.hpp rename to modules/renderer/legacy/private/dx/framebuffers.hpp diff --git a/modules/renderer/private/dx/graphics_context.cpp b/modules/renderer/legacy/private/dx/graphics_context.cpp similarity index 100% rename from modules/renderer/private/dx/graphics_context.cpp rename to modules/renderer/legacy/private/dx/graphics_context.cpp diff --git a/modules/renderer/private/dx/graphics_context.hpp b/modules/renderer/legacy/private/dx/graphics_context.hpp similarity index 100% rename from modules/renderer/private/dx/graphics_context.hpp rename to modules/renderer/legacy/private/dx/graphics_context.hpp diff --git a/modules/renderer/private/dx/render_command.cpp b/modules/renderer/legacy/private/dx/render_command.cpp similarity index 100% rename from modules/renderer/private/dx/render_command.cpp rename to modules/renderer/legacy/private/dx/render_command.cpp diff --git a/modules/renderer/private/dx/render_command.hpp b/modules/renderer/legacy/private/dx/render_command.hpp similarity index 100% rename from modules/renderer/private/dx/render_command.hpp rename to modules/renderer/legacy/private/dx/render_command.hpp diff --git a/modules/renderer/private/dx/shader.cpp b/modules/renderer/legacy/private/dx/shader.cpp similarity index 100% rename from modules/renderer/private/dx/shader.cpp rename to modules/renderer/legacy/private/dx/shader.cpp diff --git a/modules/renderer/private/dx/shader.hpp b/modules/renderer/legacy/private/dx/shader.hpp similarity index 100% rename from modules/renderer/private/dx/shader.hpp rename to modules/renderer/legacy/private/dx/shader.hpp diff --git a/modules/renderer/private/dx/shared_context.hpp b/modules/renderer/legacy/private/dx/shared_context.hpp similarity index 100% rename from modules/renderer/private/dx/shared_context.hpp rename to modules/renderer/legacy/private/dx/shared_context.hpp diff --git a/modules/renderer/private/dx/texture.cpp b/modules/renderer/legacy/private/dx/texture.cpp similarity index 100% rename from modules/renderer/private/dx/texture.cpp rename to modules/renderer/legacy/private/dx/texture.cpp diff --git a/modules/renderer/private/dx/texture.hpp b/modules/renderer/legacy/private/dx/texture.hpp similarity index 100% rename from modules/renderer/private/dx/texture.hpp rename to modules/renderer/legacy/private/dx/texture.hpp diff --git a/modules/renderer/private/dx/user_interface.hpp b/modules/renderer/legacy/private/dx/user_interface.hpp similarity index 100% rename from modules/renderer/private/dx/user_interface.hpp rename to modules/renderer/legacy/private/dx/user_interface.hpp diff --git a/modules/renderer/private/dx/vertex_layout.cpp b/modules/renderer/legacy/private/dx/vertex_layout.cpp similarity index 100% rename from modules/renderer/private/dx/vertex_layout.cpp rename to modules/renderer/legacy/private/dx/vertex_layout.cpp diff --git a/modules/renderer/private/dx/vertex_layout.hpp b/modules/renderer/legacy/private/dx/vertex_layout.hpp similarity index 100% rename from modules/renderer/private/dx/vertex_layout.hpp rename to modules/renderer/legacy/private/dx/vertex_layout.hpp diff --git a/modules/renderer/private/framebuffer.cpp b/modules/renderer/legacy/private/framebuffer.cpp similarity index 100% rename from modules/renderer/private/framebuffer.cpp rename to modules/renderer/legacy/private/framebuffer.cpp diff --git a/modules/renderer/private/gl/blender.cpp b/modules/renderer/legacy/private/gl/blender.cpp similarity index 100% rename from modules/renderer/private/gl/blender.cpp rename to modules/renderer/legacy/private/gl/blender.cpp diff --git a/modules/renderer/private/gl/blender.hpp b/modules/renderer/legacy/private/gl/blender.hpp similarity index 100% rename from modules/renderer/private/gl/blender.hpp rename to modules/renderer/legacy/private/gl/blender.hpp diff --git a/modules/renderer/private/gl/buffers.cpp b/modules/renderer/legacy/private/gl/buffers.cpp similarity index 100% rename from modules/renderer/private/gl/buffers.cpp rename to modules/renderer/legacy/private/gl/buffers.cpp diff --git a/modules/renderer/private/gl/buffers.hpp b/modules/renderer/legacy/private/gl/buffers.hpp similarity index 100% rename from modules/renderer/private/gl/buffers.hpp rename to modules/renderer/legacy/private/gl/buffers.hpp diff --git a/modules/renderer/private/gl/framebuffers.cpp b/modules/renderer/legacy/private/gl/framebuffers.cpp similarity index 100% rename from modules/renderer/private/gl/framebuffers.cpp rename to modules/renderer/legacy/private/gl/framebuffers.cpp diff --git a/modules/renderer/private/gl/framebuffers.hpp b/modules/renderer/legacy/private/gl/framebuffers.hpp similarity index 100% rename from modules/renderer/private/gl/framebuffers.hpp rename to modules/renderer/legacy/private/gl/framebuffers.hpp diff --git a/modules/renderer/private/gl/graphics_context.cpp b/modules/renderer/legacy/private/gl/graphics_context.cpp similarity index 100% rename from modules/renderer/private/gl/graphics_context.cpp rename to modules/renderer/legacy/private/gl/graphics_context.cpp diff --git a/modules/renderer/private/gl/graphics_context.hpp b/modules/renderer/legacy/private/gl/graphics_context.hpp similarity index 100% rename from modules/renderer/private/gl/graphics_context.hpp rename to modules/renderer/legacy/private/gl/graphics_context.hpp diff --git a/modules/renderer/private/gl/render_command.cpp b/modules/renderer/legacy/private/gl/render_command.cpp similarity index 100% rename from modules/renderer/private/gl/render_command.cpp rename to modules/renderer/legacy/private/gl/render_command.cpp diff --git a/modules/renderer/private/gl/render_command.hpp b/modules/renderer/legacy/private/gl/render_command.hpp similarity index 100% rename from modules/renderer/private/gl/render_command.hpp rename to modules/renderer/legacy/private/gl/render_command.hpp diff --git a/modules/renderer/private/gl/shader.cpp b/modules/renderer/legacy/private/gl/shader.cpp similarity index 100% rename from modules/renderer/private/gl/shader.cpp rename to modules/renderer/legacy/private/gl/shader.cpp diff --git a/modules/renderer/private/gl/shader.hpp b/modules/renderer/legacy/private/gl/shader.hpp similarity index 100% rename from modules/renderer/private/gl/shader.hpp rename to modules/renderer/legacy/private/gl/shader.hpp diff --git a/modules/renderer/private/gl/shared_context.hpp b/modules/renderer/legacy/private/gl/shared_context.hpp similarity index 100% rename from modules/renderer/private/gl/shared_context.hpp rename to modules/renderer/legacy/private/gl/shared_context.hpp diff --git a/modules/renderer/private/gl/texture.cpp b/modules/renderer/legacy/private/gl/texture.cpp similarity index 100% rename from modules/renderer/private/gl/texture.cpp rename to modules/renderer/legacy/private/gl/texture.cpp diff --git a/modules/renderer/private/gl/texture.hpp b/modules/renderer/legacy/private/gl/texture.hpp similarity index 100% rename from modules/renderer/private/gl/texture.hpp rename to modules/renderer/legacy/private/gl/texture.hpp diff --git a/modules/renderer/private/gl/user_interface.cpp b/modules/renderer/legacy/private/gl/user_interface.cpp similarity index 100% rename from modules/renderer/private/gl/user_interface.cpp rename to modules/renderer/legacy/private/gl/user_interface.cpp diff --git a/modules/renderer/private/gl/user_interface.hpp b/modules/renderer/legacy/private/gl/user_interface.hpp similarity index 100% rename from modules/renderer/private/gl/user_interface.hpp rename to modules/renderer/legacy/private/gl/user_interface.hpp diff --git a/modules/renderer/private/gl/vertex_layout.cpp b/modules/renderer/legacy/private/gl/vertex_layout.cpp similarity index 100% rename from modules/renderer/private/gl/vertex_layout.cpp rename to modules/renderer/legacy/private/gl/vertex_layout.cpp diff --git a/modules/renderer/private/gl/vertex_layout.hpp b/modules/renderer/legacy/private/gl/vertex_layout.hpp similarity index 100% rename from modules/renderer/private/gl/vertex_layout.hpp rename to modules/renderer/legacy/private/gl/vertex_layout.hpp diff --git a/modules/renderer/private/graphics_context.cpp b/modules/renderer/legacy/private/graphics_context.cpp similarity index 100% rename from modules/renderer/private/graphics_context.cpp rename to modules/renderer/legacy/private/graphics_context.cpp diff --git a/modules/renderer/private/programs/quad.cpp b/modules/renderer/legacy/private/programs/quad.cpp similarity index 100% rename from modules/renderer/private/programs/quad.cpp rename to modules/renderer/legacy/private/programs/quad.cpp diff --git a/modules/renderer/private/programs/quad.hpp b/modules/renderer/legacy/private/programs/quad.hpp similarity index 100% rename from modules/renderer/private/programs/quad.hpp rename to modules/renderer/legacy/private/programs/quad.hpp diff --git a/modules/renderer/private/programs/renderer_program.hpp b/modules/renderer/legacy/private/programs/renderer_program.hpp similarity index 100% rename from modules/renderer/private/programs/renderer_program.hpp rename to modules/renderer/legacy/private/programs/renderer_program.hpp diff --git a/modules/renderer/private/programs/texture.cpp b/modules/renderer/legacy/private/programs/texture.cpp similarity index 100% rename from modules/renderer/private/programs/texture.cpp rename to modules/renderer/legacy/private/programs/texture.cpp diff --git a/modules/renderer/private/programs/texture.hpp b/modules/renderer/legacy/private/programs/texture.hpp similarity index 100% rename from modules/renderer/private/programs/texture.hpp rename to modules/renderer/legacy/private/programs/texture.hpp diff --git a/modules/renderer/private/programs/tinted_texture.cpp b/modules/renderer/legacy/private/programs/tinted_texture.cpp similarity index 100% rename from modules/renderer/private/programs/tinted_texture.cpp rename to modules/renderer/legacy/private/programs/tinted_texture.cpp diff --git a/modules/renderer/private/programs/tinted_texture.hpp b/modules/renderer/legacy/private/programs/tinted_texture.hpp similarity index 100% rename from modules/renderer/private/programs/tinted_texture.hpp rename to modules/renderer/legacy/private/programs/tinted_texture.hpp diff --git a/modules/renderer/private/render_command.cpp b/modules/renderer/legacy/private/render_command.cpp similarity index 100% rename from modules/renderer/private/render_command.cpp rename to modules/renderer/legacy/private/render_command.cpp diff --git a/modules/renderer/private/renderer.cpp b/modules/renderer/legacy/private/renderer.cpp similarity index 100% rename from modules/renderer/private/renderer.cpp rename to modules/renderer/legacy/private/renderer.cpp diff --git a/modules/renderer/private/shader.cpp b/modules/renderer/legacy/private/shader.cpp similarity index 100% rename from modules/renderer/private/shader.cpp rename to modules/renderer/legacy/private/shader.cpp diff --git a/modules/renderer/legacy/private/system.cpp b/modules/renderer/legacy/private/system.cpp new file mode 100644 index 0000000..7f37755 --- /dev/null +++ b/modules/renderer/legacy/private/system.cpp @@ -0,0 +1,17 @@ +#include +#include + +namespace lt::renderer { + +System::System(InitRequirements requirements): m_registry(std::move(requirements.registry)) +{ + ensure(m_registry, "null registry"); +} + +System::~System() = default; + +void System::tick(TickRequirements requirements) +{ +} + +} // namespace lt::renderer diff --git a/modules/renderer/legacy/private/system.test.cpp b/modules/renderer/legacy/private/system.test.cpp new file mode 100644 index 0000000..b2a6075 --- /dev/null +++ b/modules/renderer/legacy/private/system.test.cpp @@ -0,0 +1,44 @@ +#include +#include +#include +#include + +using namespace lt; + +using lt::test::Case; +using lt::test::Suite; + +Suite raii = [] { + using lt::test::expect_true; + using lt::test::expect_throw; + using renderer::System; + + Case { "happy" } = [=] { + std::ignore = System { { + .registry = create_ref(), + } }; + }; + + Case { "unhappy" } = [=] { + expect_throw([=] { + std::ignore = System { { + .registry = {}, + } }; + }); + + expect_throw([=] { + std::ignore = System { { + .registry = create_ref(), + } }; + }); + }; + + Case { "plenty" } = [=] { + for (auto idx : std::views::iota(0, 100'001)) + { + std::ignore = System { { + .registry = create_ref(), + } }; + } + }; +}; diff --git a/modules/renderer/private/texture.cpp b/modules/renderer/legacy/private/texture.cpp similarity index 100% rename from modules/renderer/private/texture.cpp rename to modules/renderer/legacy/private/texture.cpp diff --git a/modules/renderer/private/vertex_layout.cpp b/modules/renderer/legacy/private/vertex_layout.cpp similarity index 100% rename from modules/renderer/private/vertex_layout.cpp rename to modules/renderer/legacy/private/vertex_layout.cpp diff --git a/modules/renderer/private/vk/device.cpp b/modules/renderer/legacy/private/vk/device.cpp similarity index 100% rename from modules/renderer/private/vk/device.cpp rename to modules/renderer/legacy/private/vk/device.cpp diff --git a/modules/renderer/private/vk/device.hpp b/modules/renderer/legacy/private/vk/device.hpp similarity index 100% rename from modules/renderer/private/vk/device.hpp rename to modules/renderer/legacy/private/vk/device.hpp diff --git a/modules/renderer/private/vk/device.test.cpp b/modules/renderer/legacy/private/vk/device.test.cpp similarity index 100% rename from modules/renderer/private/vk/device.test.cpp rename to modules/renderer/legacy/private/vk/device.test.cpp diff --git a/modules/renderer/private/vk/instance.cpp b/modules/renderer/legacy/private/vk/instance.cpp similarity index 100% rename from modules/renderer/private/vk/instance.cpp rename to modules/renderer/legacy/private/vk/instance.cpp diff --git a/modules/renderer/private/vk/instance.hpp b/modules/renderer/legacy/private/vk/instance.hpp similarity index 100% rename from modules/renderer/private/vk/instance.hpp rename to modules/renderer/legacy/private/vk/instance.hpp diff --git a/modules/renderer/private/vk/instance.test.cpp b/modules/renderer/legacy/private/vk/instance.test.cpp similarity index 100% rename from modules/renderer/private/vk/instance.test.cpp rename to modules/renderer/legacy/private/vk/instance.test.cpp diff --git a/modules/renderer/public/backend.hpp b/modules/renderer/legacy/public/backend.hpp similarity index 100% rename from modules/renderer/public/backend.hpp rename to modules/renderer/legacy/public/backend.hpp diff --git a/modules/renderer/public/blender.hpp b/modules/renderer/legacy/public/blender.hpp similarity index 100% rename from modules/renderer/public/blender.hpp rename to modules/renderer/legacy/public/blender.hpp diff --git a/modules/renderer/public/buffers.hpp b/modules/renderer/legacy/public/buffers.hpp similarity index 100% rename from modules/renderer/public/buffers.hpp rename to modules/renderer/legacy/public/buffers.hpp diff --git a/modules/renderer/public/components.hpp b/modules/renderer/legacy/public/components.hpp similarity index 100% rename from modules/renderer/public/components.hpp rename to modules/renderer/legacy/public/components.hpp diff --git a/modules/renderer/public/context.hpp b/modules/renderer/legacy/public/context.hpp similarity index 100% rename from modules/renderer/public/context.hpp rename to modules/renderer/legacy/public/context.hpp diff --git a/modules/renderer/public/framebuffer.hpp b/modules/renderer/legacy/public/framebuffer.hpp similarity index 100% rename from modules/renderer/public/framebuffer.hpp rename to modules/renderer/legacy/public/framebuffer.hpp diff --git a/modules/renderer/public/graphics_context.hpp b/modules/renderer/legacy/public/graphics_context.hpp similarity index 100% rename from modules/renderer/public/graphics_context.hpp rename to modules/renderer/legacy/public/graphics_context.hpp diff --git a/modules/renderer/public/render_command.hpp b/modules/renderer/legacy/public/render_command.hpp similarity index 100% rename from modules/renderer/public/render_command.hpp rename to modules/renderer/legacy/public/render_command.hpp diff --git a/modules/renderer/public/renderer.hpp b/modules/renderer/legacy/public/renderer.hpp similarity index 100% rename from modules/renderer/public/renderer.hpp rename to modules/renderer/legacy/public/renderer.hpp diff --git a/modules/renderer/public/shader.hpp b/modules/renderer/legacy/public/shader.hpp similarity index 100% rename from modules/renderer/public/shader.hpp rename to modules/renderer/legacy/public/shader.hpp diff --git a/modules/renderer/public/shared_context.hpp b/modules/renderer/legacy/public/shared_context.hpp similarity index 100% rename from modules/renderer/public/shared_context.hpp rename to modules/renderer/legacy/public/shared_context.hpp diff --git a/modules/renderer/legacy/public/system.hpp b/modules/renderer/legacy/public/system.hpp new file mode 100644 index 0000000..b1466fb --- /dev/null +++ b/modules/renderer/legacy/public/system.hpp @@ -0,0 +1,56 @@ +#pragma once + +#include +#include + +namespace lt::renderer { + +/** The system for putting gore on your display + * + * Exclusively operates on components: + * - RendererComponent + * - PostEffectsComponent + * - UserInterfaceComponent + * + * Requires read acces on components: + * - TransformComponent + */ +class System +{ +public: + /** The configurations of this system. */ + struct Properties + { + }; + + /** The requirements for this system to initialize. */ + struct InitRequirements + { + Ref registry; + }; + + /** The requirements for this system to tick. */ + struct TickRequirements + { + double delta_time; + }; + + [[nodiscard]] System(InitRequirements requirements); + + System(System &&) = default; + + System(const System &) = delete; + + auto operator=(System &&) -> System & = default; + + auto operator=(const System &) -> System & = delete; + + ~System(); + + void tick(TickRequirements requirements); + +private: + Ref m_registry; +}; + +} // namespace lt::renderer diff --git a/modules/renderer/public/texture.hpp b/modules/renderer/legacy/public/texture.hpp similarity index 100% rename from modules/renderer/public/texture.hpp rename to modules/renderer/legacy/public/texture.hpp diff --git a/modules/renderer/public/vertex_layout.hpp b/modules/renderer/legacy/public/vertex_layout.hpp similarity index 100% rename from modules/renderer/public/vertex_layout.hpp rename to modules/renderer/legacy/public/vertex_layout.hpp diff --git a/modules/renderer/private/system.cpp b/modules/renderer/private/system.cpp index 7f37755..3da8e18 100644 --- a/modules/renderer/private/system.cpp +++ b/modules/renderer/private/system.cpp @@ -1,17 +1,5 @@ -#include #include namespace lt::renderer { -System::System(InitRequirements requirements): m_registry(std::move(requirements.registry)) -{ - ensure(m_registry, "null registry"); } - -System::~System() = default; - -void System::tick(TickRequirements requirements) -{ -} - -} // namespace lt::renderer diff --git a/modules/renderer/private/system.test.cpp b/modules/renderer/private/system.test.cpp index b2a6075..5bf2c6d 100644 --- a/modules/renderer/private/system.test.cpp +++ b/modules/renderer/private/system.test.cpp @@ -1,44 +1,123 @@ #include #include +#include #include -#include using namespace lt; +using std::ignore; +using test::Case; +using test::expect_eq; +using test::expect_ne; +using test::expect_not_nullptr; +using test::expect_throw; +using test::expect_true; +using test::Suite; -using lt::test::Case; -using lt::test::Suite; +using renderer::System; + +constexpr auto resolution = math::uvec2 { 800, 600 }; + +struct SurfaceContext +{ + surface::System system; + ecs::Entity entity; +}; + +struct RendererContext +{ + Ref registry; + System system; +}; + +[[nodiscard]] auto create_surface() -> SurfaceContext +{ + using surface::SurfaceComponent; + + auto surface_registry = create_ref(); + auto surface_entity = surface_registry->create_entity(); + auto surface_system = surface::System(surface_registry); + surface_registry->add( + surface_entity, + SurfaceComponent::CreateInfo { + .title = "", + .resolution = resolution, + } + ); + + return { + .system = std::move(surface_system), + .entity = ecs::Entity { surface_registry, surface_entity }, + }; +} + +[[nodiscard]] auto create_system() -> std::pair +{ + auto surface_context = create_surface(); + auto &[surface_system, surface_entity] = surface_context; + auto registry = create_ref(); + auto stats = create_ref(); + + return { + RendererContext { + .registry = registry, + .system = System( + { + .registry = registry, + .surface_entity = surface_entity, + .system_stats = stats, + } + ), + }, + + std::move(surface_context), + }; +} Suite raii = [] { - using lt::test::expect_true; - using lt::test::expect_throw; - using renderer::System; - - Case { "happy" } = [=] { - std::ignore = System { { - .registry = create_ref(), - } }; + Case { "happy path won't throw" } = [&] { + std::ignore = create_system(); }; - Case { "unhappy" } = [=] { - expect_throw([=] { - std::ignore = System { { - .registry = {}, - } }; - }); - - expect_throw([=] { - std::ignore = System { { - .registry = create_ref(), - } }; - }); + Case { "happy path has no validation errors" } = [&] { + auto [renderer, surface] = create_system(); + expect_true(renderer.system.get_stats().empty_diagnosis()); }; - Case { "plenty" } = [=] { - for (auto idx : std::views::iota(0, 100'001)) - { - std::ignore = System { { - .registry = create_ref(), - } }; - } + Case { "unhappy path throws" } = [] { + auto [surface_system, surface_entity] = create_surface(); + auto empty_registry = create_ref(); + auto empty_entity = ecs::Entity { empty_registry, empty_registry->create_entity() }; + auto registry = create_ref(); + auto stats = create_ref(); + + expect_throw([&] { + std::ignore = System( + { + .registry = {}, + .surface_entity = surface_entity, + .system_stats = stats, + } + ); + }); + + expect_throw([&] { + std::ignore = System( + System::CreateInfo { + .registry = surface_entity.get_registry(), + .surface_entity = empty_entity, + .system_stats = stats, + } + ); + }); + + expect_throw([&] { + std::ignore = System( + System::CreateInfo { + .registry = surface_entity.get_registry(), + .surface_entity = surface_entity, + .system_stats = {}, + } + ); + }); }; }; diff --git a/modules/renderer/private/vk/backend.cpp b/modules/renderer/private/vk/context.cpp similarity index 84% rename from modules/renderer/private/vk/backend.cpp rename to modules/renderer/private/vk/context.cpp index a61f06f..ca69992 100644 --- a/modules/renderer/private/vk/backend.cpp +++ b/modules/renderer/private/vk/context.cpp @@ -1,4 +1,4 @@ -#include +#include #if defined(_WIN32) @@ -83,10 +83,16 @@ PFN_vkCmdBindPipeline vk_cmd_bind_pipeline; PFN_vkCmdDraw vk_cmd_draw; PFN_vkCmdSetViewport vk_cmd_set_viewport; PFN_vkCmdSetScissor vk_cmd_set_scissors; + +PFN_vkCreateXlibSurfaceKHR vk_create_xlib_surface_khr; +PFN_vkDestroySurfaceKHR vk_destroy_surface_khr; // NOLINTEND(cppcoreguidelines-avoid-non-const-global-variables) -Backend::Backend() +Context::Context(const ecs::Entity &surface_entity, Ref system_stats) + : m_stats(std::move(system_stats)) { + ensure(m_stats, "Failed to create Vulkan Context: null stats"); + load_library(); load_global_functions(); @@ -100,16 +106,31 @@ Backend::Backend() load_device_functions(); initialize_queue(); + + const auto &component = surface_entity.get(); + + auto xlib_surface_create_info = VkXlibSurfaceCreateInfoKHR { + .sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR, + .dpy = component.get_native_data().display, + .window = component.get_native_data().window, + }; + + vk_create_xlib_surface_khr(m_instance, &xlib_surface_create_info, nullptr, &m_surface); } -Backend::~Backend() +Context::~Context() { vk_destroy_device(m_device, nullptr); - vk_destroy_debug_messenger(m_instance, m_debug_messenger, nullptr); + + if (m_instance) + { + vk_destroy_surface_khr(m_instance, m_surface, nullptr); + vk_destroy_debug_messenger(m_instance, m_debug_messenger, nullptr); + } + vk_destroy_instance(m_instance, nullptr); } - auto parse_message_type(VkDebugUtilsMessageTypeFlagsEXT message_types) -> const char * { if (message_types == VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT) @@ -132,14 +153,17 @@ auto parse_message_type(VkDebugUtilsMessageTypeFlagsEXT message_types) -> const return "PERFORMANCE"; } -auto parse_message_severity(VkDebugUtilsMessageSeverityFlagBitsEXT message_severity) -> LogLvl +auto parse_message_severity(VkDebugUtilsMessageSeverityFlagBitsEXT message_severity) + -> app::SystemDiagnosis::Severity { + using enum app::SystemDiagnosis::Severity; + switch (message_severity) { - case VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT: return LogLvl::trace; - case VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT: return LogLvl::info; - case VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT: return LogLvl::warn; - case VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT: return LogLvl::error; + case VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT: return verbose; + case VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT: return info; + case VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT: return warning; + case VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT: return error; default: ensure(false, "Invalid message severity: {}", static_cast(message_severity)); } @@ -153,16 +177,34 @@ auto validation_layers_callback( void *const vulkan_user_data ) -> VkBool32 { - std::ignore = vulkan_user_data; + auto stats = *(Ref *)vulkan_user_data; // NOLINT const auto &type = parse_message_type(message_types); - const auto level = parse_message_severity(message_severity); - Logger::log(level, ":: <{}> :: {}", type, callback_data->pMessage); + auto message = std::format( + "Vulkan Validation Message:\ntype: {}\nseverity: {}\nmessage: {}", + type, + std::to_underlying(parse_message_severity(message_severity)), + callback_data->pMessage + ); + + auto severity = parse_message_severity(message_severity); + if (std::to_underlying(severity) < 2) + { + return static_cast(VK_FALSE); + } + + stats->push_diagnosis( + app::SystemDiagnosis { + .message = message, + .code = {}, // TODO(Light): extract vulkan validation-layers code from the message + .severity = severity, + } + ); return static_cast(VK_FALSE); } -void Backend::initialize_instance() +void Context::initialize_instance() { auto app_info = VkApplicationInfo { .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, @@ -198,10 +240,10 @@ void Backend::initialize_instance() auto extensions = std::vector(count); vk_enumerate_instance_extension_properties(nullptr, &count, extensions.data()); - log_inf("Available vulkan instance extensions:"); + // log_inf("Available vulkan instance extensions:"); for (auto &ext : extensions) { - log_inf("\t{} @ {}", ext.extensionName, ext.specVersion); + // log_inf("\t{} @ {}", ext.extensionName, ext.specVersion); } } @@ -210,7 +252,7 @@ void Backend::initialize_instance() ensure(m_instance, "Failed to create vulkan instance"); } -void Backend::initialize_debug_messenger() +void Context::initialize_debug_messenger() { const auto info = VkDebugUtilsMessengerCreateInfoEXT { .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, @@ -226,6 +268,8 @@ void Backend::initialize_debug_messenger() .pfnUserCallback = &validation_layers_callback, + + .pUserData = &m_stats, }; ensure( @@ -234,7 +278,7 @@ void Backend::initialize_debug_messenger() ); } -void Backend::initialize_physical_device() +void Context::initialize_physical_device() { auto count = 0u; vk_enumerate_physical_devices(m_instance, &count, nullptr); @@ -260,7 +304,7 @@ void Backend::initialize_physical_device() ensure(m_physical_device, "Failed to find any suitable Vulkan physical device"); } -void Backend::initialize_logical_device() +void Context::initialize_logical_device() { const float priorities = .0f; @@ -292,12 +336,12 @@ void Backend::initialize_logical_device() ); } -void Backend::initialize_queue() +void Context::initialize_queue() { vk_get_device_queue(m_device, find_suitable_queue_family(), 0, &m_queue); } -void Backend::load_library() +void Context::load_library() { library = dlopen("libvulkan.so", RTLD_NOW | RTLD_LOCAL); ensure(library, "Failed to dlopen libvulkan.so"); @@ -309,13 +353,13 @@ void Backend::load_library() ensure(vk_get_instance_proc_address, "Failed to load vulkan function: vkGetInstanceProcAddr"); } -void Backend::load_global_functions() +void Context::load_global_functions() { constexpr auto load_fn = [](T &pfn, const char *fn_name) { // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) pfn = reinterpret_cast(vk_get_instance_proc_address(nullptr, fn_name)); ensure(pfn, "Failed to load vulkan global function: {}", fn_name); - log_trc("Loaded global function: {}", fn_name); + // log_trc("Loaded global function: {}", fn_name); }; load_fn(vk_create_instance, "vkCreateInstance"); @@ -323,13 +367,13 @@ void Backend::load_global_functions() load_fn(vk_enumerate_instance_layer_properties, "vkEnumerateInstanceLayerProperties"); } -void Backend::load_instance_functions() +void Context::load_instance_functions() { const auto load_fn = [&](T &pfn, const char *fn_name) { // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) pfn = reinterpret_cast(vk_get_instance_proc_address(m_instance, fn_name)); ensure(pfn, "Failed to load vulkan instance function: {}", fn_name); - log_trc("Loaded instance function: {}", fn_name); + // log_trc("Loaded instance function: {}", fn_name); }; load_fn(vk_destroy_instance, "vkDestroyInstance"); @@ -356,15 +400,18 @@ void Backend::load_instance_functions() load_fn(vk_set_debug_object_name, "vkSetDebugUtilsObjectNameEXT"); load_fn(vk_set_debug_object_tag, "vkSetDebugUtilsObjectTagEXT"); load_fn(vk_submit_debug_message, "vkSubmitDebugUtilsMessageEXT"); + + load_fn(vk_create_xlib_surface_khr, "vkCreateXlibSurfaceKHR"); + load_fn(vk_destroy_surface_khr, "vkDestroySurfaceKHR"); } -void Backend::load_device_functions() +void Context::load_device_functions() { const auto load_fn = [&](T &pfn, const char *fn_name) { // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) pfn = reinterpret_cast(vk_get_device_proc_address(m_device, fn_name)); ensure(pfn, "Failed to load vulkan device function: {}", fn_name); - log_trc("Loaded device function: {}", fn_name); + // log_trc("Loaded device function: {}", fn_name); }; load_fn(vk_get_device_queue, "vkGetDeviceQueue"); @@ -409,7 +456,7 @@ void Backend::load_device_functions() load_fn(vk_cmd_set_scissors, "vkCmdSetScissor"); } -[[nodiscard]] auto Backend::find_suitable_queue_family() const -> uint32_t +[[nodiscard]] auto Context::find_suitable_queue_family() const -> uint32_t { auto count = 0u; vk_get_physical_device_queue_family_properties(m_physical_device, &count, nullptr); diff --git a/modules/renderer/private/vk/backend.hpp b/modules/renderer/private/vk/context.hpp similarity index 74% rename from modules/renderer/private/vk/backend.hpp rename to modules/renderer/private/vk/context.hpp index ee4e435..dcad096 100644 --- a/modules/renderer/private/vk/backend.hpp +++ b/modules/renderer/private/vk/context.hpp @@ -1,11 +1,20 @@ #pragma once #define VK_NO_PROTOTYPES -#include +#define VK_USE_PLATFORM_XLIB_KHR #include +#include + +// +#include +#include +#include +#include namespace lt::renderer::vk { +using memory::NullOnMove; + // NOLINTBEGIN(cppcoreguidelines-avoid-non-const-global-variables) // global functions extern PFN_vkGetInstanceProcAddr vk_get_instance_proc_address; @@ -78,26 +87,54 @@ extern PFN_vkCmdBindPipeline vk_cmd_bind_pipeline; extern PFN_vkCmdDraw vk_cmd_draw; extern PFN_vkCmdSetViewport vk_cmd_set_viewport; extern PFN_vkCmdSetScissor vk_cmd_set_scissors; + +extern PFN_vkCreateXlibSurfaceKHR vk_create_xlib_surface_khr; +extern PFN_vkDestroySurfaceKHR vk_destroy_surface_khr; // NOLINTEND(cppcoreguidelines-avoid-non-const-global-variables) -class Backend: public ::lt::renderer::Backend +class Context { public: - Backend(); + Context(const ecs::Entity &surface_entity, Ref system_stats); - Backend(Backend &&) = default; + ~Context(); - auto operator=(Backend &&) -> Backend & = default; + Context(Context &&other) noexcept = default; - Backend(const Backend &) = delete; + auto operator=(Context &&other) noexcept -> Context & = default; - auto operator=(const Backend &) -> Backend & = delete; + Context(const Context &) = delete; - ~Backend() override; + auto operator=(const Context &) -> Context & = delete; - [[nodiscard]] constexpr auto get_api() const -> API override + [[nodiscard]] auto instance() -> VkInstance { - return API::vulkan; + return m_instance; + } + + [[nodiscard]] auto physical_device() -> VkPhysicalDevice + { + return m_physical_device; + } + + [[nodiscard]] auto device() -> VkDevice + { + return m_device; + } + + auto queue() -> VkQueue + { + return m_queue; + }; + + auto debug_messenger() -> VkDebugUtilsMessengerEXT + { + return m_debug_messenger; + }; + + [[nodiscard]] auto get_stats() const -> const app::SystemStats & + { + return *m_stats; } private: @@ -121,15 +158,23 @@ private: [[nodiscard]] auto find_suitable_queue_family() const -> uint32_t; - VkInstance m_instance {}; + Ref m_registry; - VkPhysicalDevice m_physical_device {}; + NullOnMove m_instance = VK_NULL_HANDLE; - VkDevice m_device {}; + NullOnMove m_physical_device = VK_NULL_HANDLE; - VkQueue m_queue {}; + NullOnMove m_device = VK_NULL_HANDLE; - VkDebugUtilsMessengerEXT m_debug_messenger {}; + NullOnMove m_queue = VK_NULL_HANDLE; + + NullOnMove m_swapcha = VK_NULL_HANDLE; + + NullOnMove m_debug_messenger = VK_NULL_HANDLE; + + NullOnMove m_surface = VK_NULL_HANDLE; + + Ref m_stats; }; } // namespace lt::renderer::vk diff --git a/modules/renderer/private/vk/surface.hpp b/modules/renderer/private/vk/surface.hpp new file mode 100644 index 0000000..392f955 --- /dev/null +++ b/modules/renderer/private/vk/surface.hpp @@ -0,0 +1,26 @@ +#pragma once + +#define VK_NO_PROTOTYPES +#define VK_USE_PLATFORM_XLIB_KHR +#include +#include + +// +#include + +namespace lt::renderer::vk { + +class Surface +{ +public: + Surface(ecs::Entity entity) + { + } + + ~Surface(); + +private: + VkSurfaceKHR m_surface = VK_NULL_HANDLE; +}; + +} // namespace lt::renderer::vk diff --git a/modules/renderer/private/vk/swapchain.hpp b/modules/renderer/private/vk/swapchain.hpp new file mode 100644 index 0000000..2bd40a4 --- /dev/null +++ b/modules/renderer/private/vk/swapchain.hpp @@ -0,0 +1,22 @@ +#pragma once + +#define VK_NO_PROTOTYPES +#include + +namespace lt::renderer::vk { + +class Swapchain +{ +public: + Swapchain() + { + } + +private: + VkSwapchainKHR m_swapchain {}; + + std::vector images; + std::vector image_views; +}; + +} // namespace lt::renderer::vk diff --git a/modules/renderer/public/system.hpp b/modules/renderer/public/system.hpp index b1466fb..cdb97a8 100644 --- a/modules/renderer/public/system.hpp +++ b/modules/renderer/public/system.hpp @@ -1,41 +1,30 @@ #pragma once -#include -#include +#include +#include +#include +#include namespace lt::renderer { -/** The system for putting gore on your display - * - * Exclusively operates on components: - * - RendererComponent - * - PostEffectsComponent - * - UserInterfaceComponent - * - * Requires read acces on components: - * - TransformComponent - */ -class System +class System: app::ISystem { public: - /** The configurations of this system. */ - struct Properties - { - }; - - /** The requirements for this system to initialize. */ - struct InitRequirements + struct CreateInfo { Ref registry; + ecs::Entity surface_entity; + Ref system_stats; }; - /** The requirements for this system to tick. */ - struct TickRequirements + [[nodiscard]] System(CreateInfo info) + : m_registry(std::move(info.registry)) + , m_context(info.surface_entity, std::move(info.system_stats)) { - double delta_time; - }; + ensure(m_registry, "Failed to initialize renderer system: null registry"); + } - [[nodiscard]] System(InitRequirements requirements); + ~System() override = default; System(System &&) = default; @@ -45,12 +34,38 @@ public: auto operator=(const System &) -> System & = delete; - ~System(); + void on_register() override + { + } - void tick(TickRequirements requirements); + void on_unregister() override + { + } + + void get_validation_state(); + + void tick(app::TickInfo tick) override + { + } + + [[nodiscard]] auto get_stats() const -> const app::SystemStats & + { + return m_context.get_stats(); + } + + [[nodiscard]] auto get_last_tick_result() const -> const app::TickResult & override + { + return m_last_tick_result; + } private: Ref m_registry; + + renderer::Validation m_validation; + + vk::Context m_context; + + app::TickResult m_last_tick_result {}; }; } // namespace lt::renderer diff --git a/modules/renderer/public/validation.hpp b/modules/renderer/public/validation.hpp new file mode 100644 index 0000000..3d33a76 --- /dev/null +++ b/modules/renderer/public/validation.hpp @@ -0,0 +1,25 @@ +#pragma once + +namespace lt::renderer { + +enum class Severity : uint8_t +{ + off, + + very_verbose, + verbose, + info, + warning, + error, + critical, +}; + +class Validation +{ +public: + void push_diagnosis(); + +private: +}; + +} // namespace lt::renderer