ci(amd64/clang/lsan): fix leak sanitizer errors #57
					 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