wip
Some checks failed
continuous-integration/drone/pr Build is failing

This commit is contained in:
light7734 2025-10-09 14:19:45 +03:30
parent b3be5e205d
commit 762ea62b2c
Signed by: light7734
GPG key ID: 8C30176798F1A6BA
4 changed files with 126 additions and 76 deletions

View file

@ -5,6 +5,7 @@ namespace lt::renderer::vk {
Messenger::Messenger(IInstance *instance, CreateInfo info) Messenger::Messenger(IInstance *instance, CreateInfo info)
: m_instance(static_cast<Instance *>(instance)) : m_instance(static_cast<Instance *>(instance))
, m_user_data(std::move(info.user_data)) , m_user_data(std::move(info.user_data))
, m_user_callback(std::move(info.callback))
, m_debug_messenger( , m_debug_messenger(
m_instance, m_instance,
VkDebugUtilsMessengerCreateInfoEXT { VkDebugUtilsMessengerCreateInfoEXT {

View file

@ -13,84 +13,84 @@ Suite raii = "renderer_raii"_suite = [] {
); );
}; };
Case { "unhappy path throws" } = [] { // Case { "unhappy path throws" } = [] {
auto fixture = FixtureDeviceSwapchain {}; // auto fixture = FixtureDeviceSwapchain {};
//
expect_throw([&] { // expect_throw([&] {
ignore = lt::renderer::IRenderer::create( // ignore = lt::renderer::IRenderer::create(
constants::api, // constants::api,
nullptr, // nullptr,
fixture.swapchain(), // fixture.swapchain(),
constants::frames_in_flight // constants::frames_in_flight
); // );
}); // });
//
expect_throw([&] { // expect_throw([&] {
ignore = lt::renderer::IRenderer::create( // ignore = lt::renderer::IRenderer::create(
constants::api, // constants::api,
fixture.device(), // fixture.device(),
nullptr, // nullptr,
constants::frames_in_flight // constants::frames_in_flight
); // );
}); // });
//
expect_throw([&] { // expect_throw([&] {
ignore = lt::renderer::IRenderer::create( // ignore = lt::renderer::IRenderer::create(
constants::api, // constants::api,
fixture.device(), // fixture.device(),
nullptr, // nullptr,
lt::renderer::IRenderer::frames_in_flight_upper_limit + 1 // lt::renderer::IRenderer::frames_in_flight_upper_limit + 1
); // );
}); // });
//
expect_throw([&] { // expect_throw([&] {
ignore = lt::renderer::IRenderer::create( // ignore = lt::renderer::IRenderer::create(
constants::api, // constants::api,
fixture.device(), // fixture.device(),
nullptr, // nullptr,
lt::renderer::IRenderer::frames_in_flight_lower_limit - 1 // lt::renderer::IRenderer::frames_in_flight_lower_limit - 1
); // );
}); // });
}; // };
}; };
Suite draw = "renderer_draw"_suite = [] { Suite draw = "renderer_draw"_suite = [] {
using enum lt::renderer::IRenderer::DrawResult; using enum lt::renderer::IRenderer::DrawResult;
Case { "renderer draw" } = [] { // Case { "renderer draw" } = [] {
auto fixture = FixtureDeviceSwapchain {}; // auto fixture = FixtureDeviceSwapchain {};
auto renderer = lt::renderer::IRenderer::create( // auto renderer = lt::renderer::IRenderer::create(
constants::api, // constants::api,
fixture.device(), // fixture.device(),
fixture.swapchain(), // fixture.swapchain(),
constants::frames_in_flight // constants::frames_in_flight
); // );
//
for (auto frame_idx : std::views::iota(0u, 30u)) // for (auto frame_idx : std::views::iota(0u, 30u))
{ // {
expect_eq(renderer->draw(frame_idx % constants::frames_in_flight), success); // expect_eq(renderer->draw(frame_idx % constants::frames_in_flight), success);
} // }
}; // };
//
Case { "post swapchain replacement renderer draw" } = [] { // Case { "post swapchain replacement renderer draw" } = [] {
auto fixture = FixtureDeviceSwapchain {}; // auto fixture = FixtureDeviceSwapchain {};
auto renderer = lt::renderer::IRenderer::create( // auto renderer = lt::renderer::IRenderer::create(
constants::api, // constants::api,
fixture.device(), // fixture.device(),
fixture.swapchain(), // fixture.swapchain(),
constants::frames_in_flight // constants::frames_in_flight
); // );
//
for (auto frame_idx : std::views::iota(0u, 15u)) // for (auto frame_idx : std::views::iota(0u, 15u))
{ // {
expect_eq(renderer->draw(frame_idx % constants::frames_in_flight), success); // expect_eq(renderer->draw(frame_idx % constants::frames_in_flight), success);
} // }
//
fixture.recreate_swapchain(); // fixture.recreate_swapchain();
renderer->replace_swapchain(fixture.swapchain()); // renderer->replace_swapchain(fixture.swapchain());
for (auto frame_idx : std::views::iota(0u, 15u)) // for (auto frame_idx : std::views::iota(0u, 15u))
{ // {
expect_eq(renderer->draw(frame_idx % constants::frames_in_flight), success); // expect_eq(renderer->draw(frame_idx % constants::frames_in_flight), success);
} // }
}; // };
}; };

View file

@ -148,7 +148,56 @@ public:
); );
} }
[[nodiscard]] auto has_any_messages() const -> bool
{
return m_user_data->m_has_any_messages;
}
[[nodiscard]] auto has_any_messages_of(
lt::renderer::IMessenger ::MessageSeverity severity
) const -> uint32_t
{
return m_user_data->m_severity_counter.contains(severity);
}
private: private:
static void messenger_callback(
lt::renderer::IMessenger::MessageSeverity severity,
lt::renderer::IMessenger::MessageType type,
const lt::renderer::IMessenger::MessageData &data,
std::any &user_data
)
{
std::cout << "VULKAN MESSAGE: " << data.message << std::endl; // NOLINT
std::ignore = data;
std::ignore = type;
auto *fixture = std::any_cast<UserData *>(user_data);
fixture->m_has_any_messages = true;
++fixture->m_severity_counter[severity];
}
struct UserData
{
std::unordered_map<lt::renderer::IMessenger::MessageSeverity, uint32_t> m_severity_counter;
bool m_has_any_messages {};
};
lt::memory::Scope<UserData> m_user_data = lt::memory::create_scope<UserData>();
lt::memory::Scope<lt::renderer::IMessenger> m_messenger = lt::renderer::IMessenger::create(
constants::api,
lt::renderer::IInstance::get(constants::api),
lt::renderer::IMessenger ::CreateInfo {
.severities = lt::renderer::IMessenger ::MessageSeverity::all,
.types = lt::renderer::IMessenger ::MessageType::all,
.callback = &messenger_callback,
.user_data = m_user_data.get(),
}
);
lt::memory::Scope<lt::renderer::IDevice> m_device { lt::memory::Scope<lt::renderer::IDevice> m_device {
lt::renderer::IDevice::create(constants::api, gpu(), surface()) lt::renderer::IDevice::create(constants::api, gpu(), surface())
}; };

View file

@ -41,7 +41,7 @@ public:
using Callback_T = std::function<void( using Callback_T = std::function<void(
MessageSeverity message_severity, MessageSeverity message_severity,
MessageType message_type, MessageType message_type,
MessageData data, const MessageData &data,
std::any &user_data std::any &user_data
)>; )>;