From 879d375b7f69821ff93a168b4133c8ba2137cdc1 Mon Sep 17 00:00:00 2001 From: light7734 Date: Mon, 6 Oct 2025 11:59:28 +0330 Subject: [PATCH] feat(renderer): made messenger component working + bug fixes --- .../private/backend/vk/context/context.hpp | 7 ++- .../private/backend/vk/context/swapchain.cpp | 1 + .../renderer/private/backend/vk/messenger.cpp | 10 +-- .../private/backend/vk/renderer/renderer.cpp | 1 + .../renderer/private/frontend/messenger.cpp | 1 - modules/renderer/private/system.cpp | 21 +++++-- .../renderer/public/components/messenger.hpp | 61 ++++++++++++++++--- .../frontend/messenger.hpp | 0 modules/renderer/public/system.hpp | 5 +- 9 files changed, 87 insertions(+), 20 deletions(-) rename modules/renderer/{private => public}/frontend/messenger.hpp (100%) diff --git a/modules/renderer/private/backend/vk/context/context.hpp b/modules/renderer/private/backend/vk/context/context.hpp index 10144df..4cd4f26 100644 --- a/modules/renderer/private/backend/vk/context/context.hpp +++ b/modules/renderer/private/backend/vk/context/context.hpp @@ -3,6 +3,7 @@ #include #include #include +#include #include namespace lt::renderer::vk { @@ -43,7 +44,11 @@ public: void recreate_swapchain() override { m_swapchain.reset(); - // m_swapchain = memory::create_scope(m_device, m_surface); + m_swapchain = memory::create_scope( + m_surface.get(), + m_gpu.get(), + m_device.get() + ); } private: diff --git a/modules/renderer/private/backend/vk/context/swapchain.cpp b/modules/renderer/private/backend/vk/context/swapchain.cpp index 54830c3..5a40f28 100644 --- a/modules/renderer/private/backend/vk/context/swapchain.cpp +++ b/modules/renderer/private/backend/vk/context/swapchain.cpp @@ -44,6 +44,7 @@ Swapchain::Swapchain(ISurface *surface, IGpu *gpu, IDevice *device) .oldSwapchain = nullptr, } ); + m_resolution = capabilities.currentExtent; m_device->name(m_swapchain, "swapchain {}", idx++); m_device->wait_idle(); diff --git a/modules/renderer/private/backend/vk/messenger.cpp b/modules/renderer/private/backend/vk/messenger.cpp index 055cfba..152ec34 100644 --- a/modules/renderer/private/backend/vk/messenger.cpp +++ b/modules/renderer/private/backend/vk/messenger.cpp @@ -7,13 +7,13 @@ Messenger::Messenger(IInstance *instance, ecs::Entity entity) , m_entity(std::move(entity)) { - const auto &component = entity.get(); + const auto &component = m_entity.get(); m_debug_messenger = m_instance->create_messenger( VkDebugUtilsMessengerCreateInfoEXT { .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, - .messageSeverity = to_native_severity(component.severities), - .messageType = to_native_type(component.types), + .messageSeverity = to_native_severity(component.get_severities()), + .messageType = to_native_type(component.get_types()), .pfnUserCallback = &native_callback, .pUserData = this, } @@ -43,13 +43,13 @@ Messenger::~Messenger() auto *messenger = (Messenger *)vulkan_user_data; // NOLINT auto &component = messenger->m_entity.get(); - component.callback( + component.get_callback()( from_native_severity(severity), from_native_type(type), { .message = callback_data->pMessage, }, - component.user_data + component.get_user_data() ); } catch (const std::exception &exp) diff --git a/modules/renderer/private/backend/vk/renderer/renderer.cpp b/modules/renderer/private/backend/vk/renderer/renderer.cpp index 2a3284e..fba6165 100644 --- a/modules/renderer/private/backend/vk/renderer/renderer.cpp +++ b/modules/renderer/private/backend/vk/renderer/renderer.cpp @@ -136,6 +136,7 @@ void Renderer::replace_swapchain(ISwapchain *swapchain) m_device->wait_idle(); m_swapchain = static_cast(swapchain); m_resolution = m_swapchain->get_resolution(); + m_pass->replace_swapchain(*swapchain); } void Renderer::record_cmd(VkCommandBuffer cmd, uint32_t image_idx) diff --git a/modules/renderer/private/frontend/messenger.cpp b/modules/renderer/private/frontend/messenger.cpp index cc19036..40019bb 100644 --- a/modules/renderer/private/frontend/messenger.cpp +++ b/modules/renderer/private/frontend/messenger.cpp @@ -13,7 +13,6 @@ namespace lt::renderer { switch (target_api) { case API::Vulkan: return memory::create_scope(instance, std::move(entity)); - case API::Metal: case API::DirectX: throw std::runtime_error { "Invalid API" }; } diff --git a/modules/renderer/private/system.cpp b/modules/renderer/private/system.cpp index 788edd6..87d1c4c 100644 --- a/modules/renderer/private/system.cpp +++ b/modules/renderer/private/system.cpp @@ -19,10 +19,6 @@ System::System(CreateInfo info) ensure(m_registry, "Failed to initialize renderer system: null registry"); m_renderer = IRenderer::create(m_api, *m_context, info.config.max_frames_in_flight); - - // WIP(Light): attach debug messenger on messenger component construction - // m_registry->connect_on_construct([](ecs::Registry ®istry, - // ecs::EntityId entity) {}); } System::~System() @@ -62,4 +58,21 @@ void System::tick(app::TickInfo tick) m_frame_idx = (m_frame_idx + 1) % m_max_frames_in_flight; } +void System::create_messenger_component(ecs::EntityId entity, MessengerComponent::CreateInfo info) +try +{ + auto &component = m_registry->add(entity, std::move(info)); + component.m_implementation = IMessenger::create( + m_api, + m_context->instance(), + { m_registry, entity } + ); +} +catch (const std::exception &exp) +{ + log_err("Failed to create renderer::MessengerComponent:"); + log_err("\twhat: {}", exp.what()); +} + + } // namespace lt::renderer diff --git a/modules/renderer/public/components/messenger.hpp b/modules/renderer/public/components/messenger.hpp index 87cd479..46d6c44 100644 --- a/modules/renderer/public/components/messenger.hpp +++ b/modules/renderer/public/components/messenger.hpp @@ -1,7 +1,9 @@ #pragma once -#include #include +#include +#include +#include namespace lt::renderer { @@ -36,18 +38,63 @@ using Callback_T = std::function; -struct MessengerComponent +class MessengerComponent { - MessageSeverity severities; +public: + friend class System; - MessageType types; + struct CreateInfo + { + MessageSeverity severities; - Callback_T callback; + MessageType types; - std::any user_data; + Callback_T callback; + + std::any user_data; + }; + + [[nodiscard]] auto get_severities() const -> MessageSeverity + { + return m_severities; + } + + [[nodiscard]] auto get_types() const -> MessageType + { + return m_types; + } + + [[nodiscard]] auto get_callback() const -> const Callback_T & + { + return m_callback; + } + + [[nodiscard]] auto get_user_data() -> std::any & + { + return m_user_data; + } + +private: + MessengerComponent(CreateInfo info) + : m_severities(info.severities) + , m_types(info.types) + , m_callback(std::move(info.callback)) + , m_user_data(std::move(info.user_data)) + { + } + + MessageSeverity m_severities; + + MessageType m_types; + + Callback_T m_callback; + + std::any m_user_data; + + memory::Scope m_implementation; }; } // namespace lt::renderer diff --git a/modules/renderer/private/frontend/messenger.hpp b/modules/renderer/public/frontend/messenger.hpp similarity index 100% rename from modules/renderer/private/frontend/messenger.hpp rename to modules/renderer/public/frontend/messenger.hpp diff --git a/modules/renderer/public/system.hpp b/modules/renderer/public/system.hpp index 9585161..d7d7400 100644 --- a/modules/renderer/public/system.hpp +++ b/modules/renderer/public/system.hpp @@ -6,6 +6,7 @@ #include #include #include +#include namespace lt::renderer { @@ -46,6 +47,8 @@ public: void tick(app::TickInfo tick) override; + void create_messenger_component(ecs::EntityId entity, MessengerComponent::CreateInfo info); + [[nodiscard]] auto get_last_tick_result() const -> const app::TickResult & override { return m_last_tick_result; @@ -62,8 +65,6 @@ private: memory::Scope m_renderer; - std::vector> m_messengers; - app::TickResult m_last_tick_result {}; uint32_t m_frame_idx {};