feat(renderer): made messenger component working + bug fixes

This commit is contained in:
light7734 2025-10-06 11:59:28 +03:30
parent 8defb9a3ec
commit 879d375b7f
Signed by: light7734
GPG key ID: 8C30176798F1A6BA
9 changed files with 87 additions and 20 deletions

View file

@ -3,6 +3,7 @@
#include <ecs/entity.hpp>
#include <memory/pointer_types/null_on_move.hpp>
#include <memory/scope.hpp>
#include <renderer/backend/vk/context/swapchain.hpp>
#include <renderer/frontend/context/context.hpp>
namespace lt::renderer::vk {
@ -43,7 +44,11 @@ public:
void recreate_swapchain() override
{
m_swapchain.reset();
// m_swapchain = memory::create_scope<vk::Swapchain>(m_device, m_surface);
m_swapchain = memory::create_scope<vk::Swapchain>(
m_surface.get(),
m_gpu.get(),
m_device.get()
);
}
private:

View file

@ -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();

View file

@ -7,13 +7,13 @@ Messenger::Messenger(IInstance *instance, ecs::Entity entity)
, m_entity(std::move(entity))
{
const auto &component = entity.get<MessengerComponent>();
const auto &component = m_entity.get<MessengerComponent>();
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<MessengerComponent>();
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)

View file

@ -136,6 +136,7 @@ void Renderer::replace_swapchain(ISwapchain *swapchain)
m_device->wait_idle();
m_swapchain = static_cast<Swapchain *>(swapchain);
m_resolution = m_swapchain->get_resolution();
m_pass->replace_swapchain(*swapchain);
}
void Renderer::record_cmd(VkCommandBuffer cmd, uint32_t image_idx)

View file

@ -13,7 +13,6 @@ namespace lt::renderer {
switch (target_api)
{
case API::Vulkan: return memory::create_scope<vk::Messenger>(instance, std::move(entity));
case API::Metal:
case API::DirectX: throw std::runtime_error { "Invalid API" };
}

View file

@ -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<renderer::MessengerComponent>([](ecs::Registry &registry,
// 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<MessengerComponent>(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

View file

@ -1,7 +1,9 @@
#pragma once
#include <bitwise/operations.hpp>
#include <any>
#include <bitwise/operations.hpp>
#include <memory/scope.hpp>
#include <renderer/frontend/messenger.hpp>
namespace lt::renderer {
@ -36,18 +38,63 @@ using Callback_T = std::function<void(
MessageSeverity message_severity,
MessageType message_type,
MessengerCallbackData data,
std::any user_data
std::any &user_data
)>;
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<IMessenger> m_implementation;
};
} // namespace lt::renderer

View file

@ -6,6 +6,7 @@
#include <memory/reference.hpp>
#include <memory/scope.hpp>
#include <renderer/api.hpp>
#include <renderer/components/messenger.hpp>
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<class IRenderer> m_renderer;
std::vector<memory::Scope<class IMessenger>> m_messengers;
app::TickResult m_last_tick_result {};
uint32_t m_frame_idx {};