This commit is contained in:
parent
b3be5e205d
commit
762ea62b2c
4 changed files with 126 additions and 76 deletions
|
@ -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 {
|
||||||
|
|
|
@ -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);
|
||||||
}
|
// }
|
||||||
};
|
// };
|
||||||
};
|
};
|
||||||
|
|
|
@ -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())
|
||||||
};
|
};
|
||||||
|
|
|
@ -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
|
||||||
)>;
|
)>;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue