ci(amd64/clang/lsan): fix leak sanitizer errors #57
					 15 changed files with 273 additions and 199 deletions
				
			
		
							
								
								
									
										252
									
								
								.drone.yml
									
										
									
									
									
								
							
							
						
						
									
										252
									
								
								.drone.yml
									
										
									
									
									
								
							| 
						 | 
					@ -1,139 +1,139 @@
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
# kind: pipeline
 | 
					kind: pipeline
 | 
				
			||||||
# type: exec
 | 
					type: exec
 | 
				
			||||||
# name: amd64 — msvc
 | 
					name: amd64 — msvc
 | 
				
			||||||
# trigger:
 | 
					trigger:
 | 
				
			||||||
#   branch:
 | 
					  branch:
 | 
				
			||||||
#   - main
 | 
					  - main
 | 
				
			||||||
# platform:
 | 
					platform:
 | 
				
			||||||
#   os: windows
 | 
					  os: windows
 | 
				
			||||||
#   arch: amd64
 | 
					  arch: amd64
 | 
				
			||||||
#
 | 
					
 | 
				
			||||||
# steps:
 | 
					steps:
 | 
				
			||||||
# - name: unit tests
 | 
					- name: unit tests
 | 
				
			||||||
#   shell: powershell
 | 
					  shell: powershell
 | 
				
			||||||
#   commands: 
 | 
					  commands: 
 | 
				
			||||||
#     - ./tools/ci/amd64/msvc/unit_tests.ps1
 | 
					    - ./tools/ci/amd64/msvc/unit_tests.ps1
 | 
				
			||||||
#
 | 
					
 | 
				
			||||||
# ---
 | 
					---
 | 
				
			||||||
kind: pipeline
 | 
					kind: pipeline
 | 
				
			||||||
type: docker
 | 
					type: docker
 | 
				
			||||||
name: amd64 — gcc
 | 
					name: amd64 — gcc
 | 
				
			||||||
trigger:
 | 
					trigger:
 | 
				
			||||||
  branch:
 | 
					  branch:
 | 
				
			||||||
  - main
 | 
					  - main
 | 
				
			||||||
#
 | 
					
 | 
				
			||||||
steps:
 | 
					steps:
 | 
				
			||||||
# - name: unit tests
 | 
					- name: unit tests
 | 
				
			||||||
#   image: ci:latest
 | 
					  image: ci:latest
 | 
				
			||||||
#   pull: if-not-exists
 | 
					  pull: if-not-exists
 | 
				
			||||||
#   commands:
 | 
					  commands:
 | 
				
			||||||
#     - ./tools/ci/amd64/gcc/unit_tests.sh
 | 
					    - ./tools/ci/amd64/gcc/unit_tests.sh
 | 
				
			||||||
#
 | 
					
 | 
				
			||||||
- name: valgrind
 | 
					- name: valgrind
 | 
				
			||||||
  image: ci:latest 
 | 
					  image: ci:latest 
 | 
				
			||||||
  pull: if-not-exists
 | 
					  pull: if-not-exists
 | 
				
			||||||
  commands:
 | 
					  commands:
 | 
				
			||||||
    - ./tools/ci/amd64/gcc/valgrind.sh
 | 
					    - ./tools/ci/amd64/gcc/valgrind.sh
 | 
				
			||||||
#
 | 
					
 | 
				
			||||||
# ---
 | 
					---
 | 
				
			||||||
# kind: pipeline
 | 
					kind: pipeline
 | 
				
			||||||
# type: docker
 | 
					type: docker
 | 
				
			||||||
# name: amd64 — clang
 | 
					name: amd64 — clang
 | 
				
			||||||
# trigger:
 | 
					trigger:
 | 
				
			||||||
#   branch:
 | 
					  branch:
 | 
				
			||||||
#   - main
 | 
					  - main
 | 
				
			||||||
#
 | 
					
 | 
				
			||||||
# steps:
 | 
					steps:
 | 
				
			||||||
# - name: code coverage
 | 
					- name: code coverage
 | 
				
			||||||
#   image: ci:latest
 | 
					  image: ci:latest
 | 
				
			||||||
#   pull: if-not-exists
 | 
					  pull: if-not-exists
 | 
				
			||||||
#   environment:
 | 
					  environment:
 | 
				
			||||||
#     CODECOV_TOKEN:
 | 
					    CODECOV_TOKEN:
 | 
				
			||||||
#       from_secret: CODECOV_TOKEN 
 | 
					      from_secret: CODECOV_TOKEN 
 | 
				
			||||||
#   commands:
 | 
					  commands:
 | 
				
			||||||
#     - ./tools/ci/amd64/clang/coverage.sh
 | 
					    - ./tools/ci/amd64/clang/coverage.sh
 | 
				
			||||||
#
 | 
					
 | 
				
			||||||
# - name: leak sanitizer
 | 
					- name: leak sanitizer
 | 
				
			||||||
#   image: ci:latest 
 | 
					  image: ci:latest 
 | 
				
			||||||
#   pull: if-not-exists
 | 
					  pull: if-not-exists
 | 
				
			||||||
#   commands:
 | 
					  commands:
 | 
				
			||||||
#     - ./tools/ci/amd64/clang/lsan.sh
 | 
					    - ./tools/ci/amd64/clang/lsan.sh
 | 
				
			||||||
#
 | 
					
 | 
				
			||||||
# - name: memory sanitizer
 | 
					- name: memory sanitizer
 | 
				
			||||||
#   image: ci:latest
 | 
					  image: ci:latest
 | 
				
			||||||
#   pull: if-not-exists
 | 
					  pull: if-not-exists
 | 
				
			||||||
#   commands:
 | 
					  commands:
 | 
				
			||||||
#     - ./tools/ci/amd64/clang/msan.sh
 | 
					    - ./tools/ci/amd64/clang/msan.sh
 | 
				
			||||||
#
 | 
					
 | 
				
			||||||
# ---
 | 
					---
 | 
				
			||||||
# kind: pipeline
 | 
					kind: pipeline
 | 
				
			||||||
# type: docker
 | 
					type: docker
 | 
				
			||||||
# name: static analysis
 | 
					name: static analysis
 | 
				
			||||||
# trigger:
 | 
					trigger:
 | 
				
			||||||
#   branch:
 | 
					  branch:
 | 
				
			||||||
#   - main
 | 
					  - main
 | 
				
			||||||
#
 | 
					
 | 
				
			||||||
# steps:
 | 
					steps:
 | 
				
			||||||
# - name: clang tidy
 | 
					- name: clang tidy
 | 
				
			||||||
#   image: ci:latest 
 | 
					  image: ci:latest 
 | 
				
			||||||
#   pull: if-not-exists
 | 
					  pull: if-not-exists
 | 
				
			||||||
#   privileged: true
 | 
					  privileged: true
 | 
				
			||||||
#   commands:
 | 
					  commands:
 | 
				
			||||||
#     - ./tools/ci/static_analysis/clang_tidy.sh
 | 
					    - ./tools/ci/static_analysis/clang_tidy.sh
 | 
				
			||||||
#
 | 
					
 | 
				
			||||||
# - name: clang format
 | 
					- name: clang format
 | 
				
			||||||
#   image: ci:latest 
 | 
					  image: ci:latest 
 | 
				
			||||||
#   pull: if-not-exists
 | 
					  pull: if-not-exists
 | 
				
			||||||
#   commands:
 | 
					  commands:
 | 
				
			||||||
#     - ./tools/ci/static_analysis/clang_format.sh
 | 
					    - ./tools/ci/static_analysis/clang_format.sh
 | 
				
			||||||
#
 | 
					
 | 
				
			||||||
# ---
 | 
					---
 | 
				
			||||||
# kind: pipeline
 | 
					kind: pipeline
 | 
				
			||||||
# type: docker 
 | 
					type: docker 
 | 
				
			||||||
# name: documentation — development
 | 
					name: documentation — development
 | 
				
			||||||
# node:
 | 
					node:
 | 
				
			||||||
#   environment: ryali
 | 
					  environment: ryali
 | 
				
			||||||
# trigger:
 | 
					trigger:
 | 
				
			||||||
#   branch:
 | 
					  branch:
 | 
				
			||||||
#   - main
 | 
					  - main
 | 
				
			||||||
#
 | 
					
 | 
				
			||||||
# steps:
 | 
					steps:
 | 
				
			||||||
# - name: build and deploy
 | 
					- name: build and deploy
 | 
				
			||||||
#   image: documentation:latest
 | 
					  image: documentation:latest
 | 
				
			||||||
#   pull: if-not-exists
 | 
					  pull: if-not-exists
 | 
				
			||||||
#   commands:
 | 
					  commands:
 | 
				
			||||||
#     - pwd
 | 
					    - pwd
 | 
				
			||||||
#     - cd docs
 | 
					    - cd docs
 | 
				
			||||||
#     - mkdir generated
 | 
					    - mkdir generated
 | 
				
			||||||
#     - touch generated/changelogs.rst
 | 
					    - touch generated/changelogs.rst
 | 
				
			||||||
#     - touch generated/api.rst
 | 
					    - touch generated/api.rst
 | 
				
			||||||
#     - sphinx-build -M html . .
 | 
					    - sphinx-build -M html . .
 | 
				
			||||||
#
 | 
					
 | 
				
			||||||
#     - rm -rf /light_docs_dev/*
 | 
					    - rm -rf /light_docs_dev/*
 | 
				
			||||||
#     - mv ./html/* /light_docs_dev/
 | 
					    - mv ./html/* /light_docs_dev/
 | 
				
			||||||
#
 | 
					
 | 
				
			||||||
# ---
 | 
					---
 | 
				
			||||||
#
 | 
					
 | 
				
			||||||
# kind: pipeline
 | 
					kind: pipeline
 | 
				
			||||||
# type: docker
 | 
					type: docker
 | 
				
			||||||
# name: documentation — production
 | 
					name: documentation — production
 | 
				
			||||||
# node:
 | 
					node:
 | 
				
			||||||
#   environment: ryali
 | 
					  environment: ryali
 | 
				
			||||||
# trigger:
 | 
					trigger:
 | 
				
			||||||
#   event:
 | 
					  event:
 | 
				
			||||||
#   - tag
 | 
					  - tag
 | 
				
			||||||
#
 | 
					
 | 
				
			||||||
# steps:
 | 
					steps:
 | 
				
			||||||
# - name: build and deploy
 | 
					- name: build and deploy
 | 
				
			||||||
#   image: documentation:latest
 | 
					  image: documentation:latest
 | 
				
			||||||
#   pull: if-not-exists
 | 
					  pull: if-not-exists
 | 
				
			||||||
#   commands:
 | 
					  commands:
 | 
				
			||||||
#     - cd docs
 | 
					    - cd docs
 | 
				
			||||||
#     - mkdir generated
 | 
					    - mkdir generated
 | 
				
			||||||
#     - touch generated/changelogs.rst
 | 
					    - touch generated/changelogs.rst
 | 
				
			||||||
#     - touch generated/api.rst
 | 
					    - touch generated/api.rst
 | 
				
			||||||
#     - sphinx-build -M html . .
 | 
					    - sphinx-build -M html . .
 | 
				
			||||||
#
 | 
					
 | 
				
			||||||
#     - rm -rf /light_docs/*
 | 
					    - rm -rf /light_docs/*
 | 
				
			||||||
#     - mv ./html/* /light_docs/
 | 
					    - mv ./html/* /light_docs/
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -40,8 +40,16 @@ Device::~Device()
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	vkc(vk_device_wait_idle(m_device));
 | 
						try
 | 
				
			||||||
	vk_destroy_device(m_device, nullptr);
 | 
						{
 | 
				
			||||||
 | 
							vkc(vk_device_wait_idle(m_device));
 | 
				
			||||||
 | 
							vk_destroy_device(m_device, nullptr);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						catch (const std::exception &exp)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							log_err("Failed to destroy vk device:");
 | 
				
			||||||
 | 
							log_err("\twhat: {}", exp.what());
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Device::initialize_logical_device()
 | 
					void Device::initialize_logical_device()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
#include <app/system.hpp>
 | 
					#include <app/system.hpp>
 | 
				
			||||||
#include <renderer/backend/vk/context/instance.hpp>
 | 
					#include <renderer/backend/vk/context/instance.hpp>
 | 
				
			||||||
#include <renderer/backend/vk/utils.hpp>
 | 
					#include <renderer/backend/vk/utils.hpp>
 | 
				
			||||||
 | 
					#include <vulkan/vulkan_core.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(_WIN32)
 | 
					#if defined(_WIN32)
 | 
				
			||||||
	#error "Unsupported platform (currently)"
 | 
						#error "Unsupported platform (currently)"
 | 
				
			||||||
| 
						 | 
					@ -194,7 +195,7 @@ void Instance::initialize_instance()
 | 
				
			||||||
	const VkLayerSettingsCreateInfoEXT layer_settings_create_info = {
 | 
						const VkLayerSettingsCreateInfoEXT layer_settings_create_info = {
 | 
				
			||||||
		.sType = VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT,
 | 
							.sType = VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT,
 | 
				
			||||||
		.settingCount = settings.size(),
 | 
							.settingCount = settings.size(),
 | 
				
			||||||
		.pSettings = settings.data()
 | 
							.pSettings = settings.data(),
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	auto layers = std::vector<const char *> {
 | 
						auto layers = std::vector<const char *> {
 | 
				
			||||||
| 
						 | 
					@ -231,11 +232,12 @@ void Instance::initialize_instance()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Instance::load_library()
 | 
					void Instance::load_library()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	library = dlopen("libvulkan.so.1", RTLD_NOW | RTLD_LOCAL);
 | 
						constexpr auto runtime_loader_flags = RTLD_NOW | RTLD_DEEPBIND | RTLD_LOCAL | RTLD_NODELETE;
 | 
				
			||||||
    if(!library)
 | 
						library = dlopen("libvulkan.so.1", runtime_loader_flags);
 | 
				
			||||||
    {
 | 
						if (!library)
 | 
				
			||||||
        library = dlopen("libvulkan.so", RTLD_NOW | RTLD_LOCAL | RTLD_NODELETE);
 | 
						{
 | 
				
			||||||
    }
 | 
							library = dlopen("libvulkan.so", runtime_loader_flags);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	ensure(library, "Failed to dlopen vulkan library");
 | 
						ensure(library, "Failed to dlopen vulkan library");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
 | 
						// NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -42,49 +42,50 @@ Suite raii = "raii"_suite = [] {
 | 
				
			||||||
		// expect_not_nullptr(vk_destroy_surface_khr);
 | 
							// expect_not_nullptr(vk_destroy_surface_khr);
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Case { "post load device functions state is correct" } = [] {
 | 
						// TODO(Light): move device function symbols to device.cpp
 | 
				
			||||||
		using namespace renderer::vk;
 | 
						// Case { "post load device functions state is correct" } = [] {
 | 
				
			||||||
		expect_not_nullptr(Instance::get());
 | 
						// 	using namespace renderer::vk;
 | 
				
			||||||
 | 
						// 	expect_not_nullptr(Instance::get());
 | 
				
			||||||
		expect_not_nullptr(vk_get_device_queue);
 | 
						//
 | 
				
			||||||
		expect_not_nullptr(vk_create_command_pool);
 | 
						// 	expect_not_nullptr(vk_get_device_queue);
 | 
				
			||||||
		expect_not_nullptr(vk_destroy_command_pool);
 | 
						// 	expect_not_nullptr(vk_create_command_pool);
 | 
				
			||||||
		expect_not_nullptr(vk_allocate_command_buffers);
 | 
						// 	expect_not_nullptr(vk_destroy_command_pool);
 | 
				
			||||||
		expect_not_nullptr(vk_free_command_buffers);
 | 
						// 	expect_not_nullptr(vk_allocate_command_buffers);
 | 
				
			||||||
		expect_not_nullptr(vk_begin_command_buffer);
 | 
						// 	expect_not_nullptr(vk_free_command_buffers);
 | 
				
			||||||
		expect_not_nullptr(vk_end_command_buffer);
 | 
						// 	expect_not_nullptr(vk_begin_command_buffer);
 | 
				
			||||||
		expect_not_nullptr(vk_cmd_pipeline_barrier);
 | 
						// 	expect_not_nullptr(vk_end_command_buffer);
 | 
				
			||||||
		expect_not_nullptr(vk_queue_submit);
 | 
						// 	expect_not_nullptr(vk_cmd_pipeline_barrier);
 | 
				
			||||||
		expect_not_nullptr(vk_queue_wait_idle);
 | 
						// 	expect_not_nullptr(vk_queue_submit);
 | 
				
			||||||
		expect_not_nullptr(vk_device_wait_idle);
 | 
						// 	expect_not_nullptr(vk_queue_wait_idle);
 | 
				
			||||||
		expect_not_nullptr(vk_create_fence);
 | 
						// 	expect_not_nullptr(vk_device_wait_idle);
 | 
				
			||||||
		expect_not_nullptr(vk_destroy_fence);
 | 
						// 	expect_not_nullptr(vk_create_fence);
 | 
				
			||||||
		expect_not_nullptr(vk_wait_for_fences);
 | 
						// 	expect_not_nullptr(vk_destroy_fence);
 | 
				
			||||||
		expect_not_nullptr(vk_reset_fences);
 | 
						// 	expect_not_nullptr(vk_wait_for_fences);
 | 
				
			||||||
		expect_not_nullptr(vk_create_semaphore);
 | 
						// 	expect_not_nullptr(vk_reset_fences);
 | 
				
			||||||
		expect_not_nullptr(vk_destroy_semaphore);
 | 
						// 	expect_not_nullptr(vk_create_semaphore);
 | 
				
			||||||
		expect_not_nullptr(vk_create_swapchain_khr);
 | 
						// 	expect_not_nullptr(vk_destroy_semaphore);
 | 
				
			||||||
		expect_not_nullptr(vk_destroy_swapchain_khr);
 | 
						// 	expect_not_nullptr(vk_create_swapchain_khr);
 | 
				
			||||||
		expect_not_nullptr(vk_get_swapchain_images_khr);
 | 
						// 	expect_not_nullptr(vk_destroy_swapchain_khr);
 | 
				
			||||||
		expect_not_nullptr(vk_acquire_next_image_khr);
 | 
						// 	expect_not_nullptr(vk_get_swapchain_images_khr);
 | 
				
			||||||
		expect_not_nullptr(vk_queue_present_khr);
 | 
						// 	expect_not_nullptr(vk_acquire_next_image_khr);
 | 
				
			||||||
		expect_not_nullptr(vk_create_image_view);
 | 
						// 	expect_not_nullptr(vk_queue_present_khr);
 | 
				
			||||||
		expect_not_nullptr(vk_destroy_image_view);
 | 
						// 	expect_not_nullptr(vk_create_image_view);
 | 
				
			||||||
		expect_not_nullptr(vk_create_render_pass);
 | 
						// 	expect_not_nullptr(vk_destroy_image_view);
 | 
				
			||||||
		expect_not_nullptr(vk_destroy_render_pass);
 | 
						// 	expect_not_nullptr(vk_create_render_pass);
 | 
				
			||||||
		expect_not_nullptr(vk_create_frame_buffer);
 | 
						// 	expect_not_nullptr(vk_destroy_render_pass);
 | 
				
			||||||
		expect_not_nullptr(vk_destroy_frame_buffer);
 | 
						// 	expect_not_nullptr(vk_create_frame_buffer);
 | 
				
			||||||
		expect_not_nullptr(vk_create_shader_module);
 | 
						// 	expect_not_nullptr(vk_destroy_frame_buffer);
 | 
				
			||||||
		expect_not_nullptr(vk_destroy_shader_module);
 | 
						// 	expect_not_nullptr(vk_create_shader_module);
 | 
				
			||||||
		expect_not_nullptr(vk_create_pipeline_layout);
 | 
						// 	expect_not_nullptr(vk_destroy_shader_module);
 | 
				
			||||||
		expect_not_nullptr(vk_destroy_pipeline_layout);
 | 
						// 	expect_not_nullptr(vk_create_pipeline_layout);
 | 
				
			||||||
		expect_not_nullptr(vk_create_graphics_pipelines);
 | 
						// 	expect_not_nullptr(vk_destroy_pipeline_layout);
 | 
				
			||||||
		expect_not_nullptr(vk_destroy_pipeline);
 | 
						// 	expect_not_nullptr(vk_create_graphics_pipelines);
 | 
				
			||||||
		expect_not_nullptr(vk_cmd_begin_render_pass);
 | 
						// 	expect_not_nullptr(vk_destroy_pipeline);
 | 
				
			||||||
		expect_not_nullptr(vk_cmd_end_render_pass);
 | 
						// 	expect_not_nullptr(vk_cmd_begin_render_pass);
 | 
				
			||||||
		expect_not_nullptr(vk_cmd_bind_pipeline);
 | 
						// 	expect_not_nullptr(vk_cmd_end_render_pass);
 | 
				
			||||||
		expect_not_nullptr(vk_cmd_draw);
 | 
						// 	expect_not_nullptr(vk_cmd_bind_pipeline);
 | 
				
			||||||
		expect_not_nullptr(vk_cmd_set_viewport);
 | 
						// 	expect_not_nullptr(vk_cmd_draw);
 | 
				
			||||||
		expect_not_nullptr(vk_cmd_set_scissors);
 | 
						// 	expect_not_nullptr(vk_cmd_set_viewport);
 | 
				
			||||||
	};
 | 
						// 	expect_not_nullptr(vk_cmd_set_scissors);
 | 
				
			||||||
 | 
						// };
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -76,6 +76,7 @@ Swapchain::Swapchain(ISurface *surface, IGpu *gpu, IDevice *device)
 | 
				
			||||||
		m_device->name(image, "swapchain image {}", idx++);
 | 
							m_device->name(image, "swapchain image {}", idx++);
 | 
				
			||||||
		m_device->name(view, "swapchain image view {}", idx++);
 | 
							m_device->name(view, "swapchain image view {}", idx++);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						m_device->wait_idle();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Swapchain::~Swapchain()
 | 
					Swapchain::~Swapchain()
 | 
				
			||||||
| 
						 | 
					@ -90,6 +91,7 @@ Swapchain::~Swapchain()
 | 
				
			||||||
		m_device->wait_idle();
 | 
							m_device->wait_idle();
 | 
				
			||||||
		m_device->destroy_image_views(m_image_views);
 | 
							m_device->destroy_image_views(m_image_views);
 | 
				
			||||||
		m_device->destroy_swapchain(m_swapchain);
 | 
							m_device->destroy_swapchain(m_swapchain);
 | 
				
			||||||
 | 
							m_device->wait_idle();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	catch (const std::exception &exp)
 | 
						catch (const std::exception &exp)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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 {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,7 +10,15 @@ Pass::Pass(
 | 
				
			||||||
    const lt::assets::ShaderAsset &vertex_shader,
 | 
					    const lt::assets::ShaderAsset &vertex_shader,
 | 
				
			||||||
    const lt::assets::ShaderAsset &fragment_shader
 | 
					    const lt::assets::ShaderAsset &fragment_shader
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
    : m_device(static_cast<Device *>(device))
 | 
					    : m_device(static_cast<Device *>(device)), m_layout(m_device->create_pipeline_layout(
 | 
				
			||||||
 | 
						    VkPipelineLayoutCreateInfo {
 | 
				
			||||||
 | 
						        .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
 | 
				
			||||||
 | 
						        .setLayoutCount = 0u,
 | 
				
			||||||
 | 
						        .pSetLayouts = nullptr,
 | 
				
			||||||
 | 
						        .pushConstantRangeCount = 0u,
 | 
				
			||||||
 | 
						        .pPushConstantRanges = nullptr,
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
						))
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	auto *vertex_module = create_module(
 | 
						auto *vertex_module = create_module(
 | 
				
			||||||
	    vertex_shader.unpack(lt::assets::ShaderAsset::BlobTag::code)
 | 
						    vertex_shader.unpack(lt::assets::ShaderAsset::BlobTag::code)
 | 
				
			||||||
| 
						 | 
					@ -103,15 +111,7 @@ Pass::Pass(
 | 
				
			||||||
		.blendConstants = { 0.0f, 0.0, 0.0, 0.0 },
 | 
							.blendConstants = { 0.0f, 0.0, 0.0, 0.0 },
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	m_layout = m_device->create_pipeline_layout(
 | 
						
 | 
				
			||||||
	    VkPipelineLayoutCreateInfo {
 | 
					 | 
				
			||||||
	        .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
 | 
					 | 
				
			||||||
	        .setLayoutCount = 0u,
 | 
					 | 
				
			||||||
	        .pSetLayouts = nullptr,
 | 
					 | 
				
			||||||
	        .pushConstantRangeCount = 0u,
 | 
					 | 
				
			||||||
	        .pPushConstantRanges = nullptr,
 | 
					 | 
				
			||||||
	    }
 | 
					 | 
				
			||||||
	);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	auto attachment_description = VkAttachmentDescription {
 | 
						auto attachment_description = VkAttachmentDescription {
 | 
				
			||||||
		.format = static_cast<Swapchain *>(swapchain)->get_format(),
 | 
							.format = static_cast<Swapchain *>(swapchain)->get_format(),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,7 +8,6 @@ class IInstance
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
	[[nodiscard]] static auto get(Api target_api) -> IInstance *;
 | 
						[[nodiscard]] static auto get(Api target_api) -> IInstance *;
 | 
				
			||||||
 | 
					 | 
				
			||||||
	IInstance() = default;
 | 
						IInstance() = default;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	virtual ~IInstance() = default;
 | 
						virtual ~IInstance() = default;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,7 +8,6 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using ::lt::ecs::EntityId;
 | 
					using ::lt::ecs::EntityId;
 | 
				
			||||||
using ::lt::ecs::Registry;
 | 
					using ::lt::ecs::Registry;
 | 
				
			||||||
using ::lt::surface::SurfaceComponent;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Suite raii = "surface"_suite = [] {
 | 
					Suite raii = "surface"_suite = [] {
 | 
				
			||||||
	Case { "happy path won't throw" } = [&] {
 | 
						Case { "happy path won't throw" } = [&] {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,10 @@
 | 
				
			||||||
#include <assets/shader.hpp>
 | 
					#include <assets/shader.hpp>
 | 
				
			||||||
 | 
					#include <renderer/frontend/messenger.hpp>
 | 
				
			||||||
#include <renderer/frontend/renderer/pass.hpp>
 | 
					#include <renderer/frontend/renderer/pass.hpp>
 | 
				
			||||||
#include <renderer/test/utils.hpp>
 | 
					#include <renderer/test/utils.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					using ::lt::renderer::IMessenger;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Suite raii = "pass_raii"_suite = [] {
 | 
					Suite raii = "pass_raii"_suite = [] {
 | 
				
			||||||
	Case { "happy path won't throw" } = [] {
 | 
						Case { "happy path won't throw" } = [] {
 | 
				
			||||||
		auto fixture = Fixture_RendererSystem {};
 | 
							auto fixture = Fixture_RendererSystem {};
 | 
				
			||||||
| 
						 | 
					@ -14,6 +17,9 @@ Suite raii = "pass_raii"_suite = [] {
 | 
				
			||||||
		    lt::assets::ShaderAsset { "./data/test_assets/triangle.vert.asset" },
 | 
							    lt::assets::ShaderAsset { "./data/test_assets/triangle.vert.asset" },
 | 
				
			||||||
		    lt::assets::ShaderAsset { "./data/test_assets/triangle.frag.asset" }
 | 
							    lt::assets::ShaderAsset { "./data/test_assets/triangle.frag.asset" }
 | 
				
			||||||
		);
 | 
							);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							expect_false(fixture.has_any_messages_of(IMessenger ::MessageSeverity::error));
 | 
				
			||||||
 | 
							expect_false(fixture.has_any_messages_of(IMessenger ::MessageSeverity::warning));
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Case { "unhappy path throws" } = [] {
 | 
						Case { "unhappy path throws" } = [] {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -47,8 +47,7 @@ System::System(CreateInfo info)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
System::~System()
 | 
					System::~System()
 | 
				
			||||||
{
 | 
					= default;
 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
void System::on_register()
 | 
					void System::on_register()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -148,7 +148,58 @@ 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
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// I know this makes the tests too verbose...
 | 
				
			||||||
 | 
							// but makes it easier to figure out what the problem is when things fail on ci
 | 
				
			||||||
 | 
							log_trc("vulkan: {}", data.message);
 | 
				
			||||||
 | 
							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())
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
| 
						 | 
					@ -188,6 +239,10 @@ private:
 | 
				
			||||||
	    std::any &user_data
 | 
						    std::any &user_data
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
							// I know this makes the tests too verbose...
 | 
				
			||||||
 | 
							// but makes it easier to figure out what the problem is when things fail on ci
 | 
				
			||||||
 | 
							log_trc("vulkan: {}", data.message);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		std::ignore = data;
 | 
							std::ignore = data;
 | 
				
			||||||
		std::ignore = type;
 | 
							std::ignore = type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
	)>;
 | 
						)>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,6 +17,7 @@ cmake . \
 | 
				
			||||||
-DCMAKE_BUILD_TYPE=Debug \
 | 
					-DCMAKE_BUILD_TYPE=Debug \
 | 
				
			||||||
-DCMAKE_CXX_FLAGS=" \
 | 
					-DCMAKE_CXX_FLAGS=" \
 | 
				
			||||||
-fsanitize=leak \
 | 
					-fsanitize=leak \
 | 
				
			||||||
 | 
					-fno-common \
 | 
				
			||||||
-g \
 | 
					-g \
 | 
				
			||||||
-fno-omit-frame-pointer \
 | 
					-fno-omit-frame-pointer \
 | 
				
			||||||
-std=c++23 \
 | 
					-std=c++23 \
 | 
				
			||||||
| 
						 | 
					@ -28,11 +29,11 @@ cmake . \
 | 
				
			||||||
-lc++ \
 | 
					-lc++ \
 | 
				
			||||||
-lc++abi \
 | 
					-lc++abi \
 | 
				
			||||||
-Wl,-rpath,/libcxx_lsan/lib" \
 | 
					-Wl,-rpath,/libcxx_lsan/lib" \
 | 
				
			||||||
&& cmake --build ./build -j`nproc`
 | 
					&& cmake --build ./build --target='renderer_tests' -j`nproc`
 | 
				
			||||||
 | 
					 | 
				
			||||||
export LSAN_OPTIONS="suppressions=$(git rev-parse --show-toplevel)/tools/ci/amd64/clang/lsan.supp"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export LSAN_OPTIONS="suppressions=$(git rev-parse --show-toplevel)/tools/ci/amd64/clang/lsan.supp:fast_unwind_on_malloc=0:verbosity=1:report_objects=1"
 | 
				
			||||||
 | 
					export LSAN_SYMBOLIZER_PATH="$(which llvm-symbolizer)"
 | 
				
			||||||
for test in $(find ./build -type f -name '*_tests' -executable); do
 | 
					for test in $(find ./build -type f -name '*_tests' -executable); do
 | 
				
			||||||
  echo "Running $test"
 | 
					    echo "Running $test"
 | 
				
			||||||
  "$test"
 | 
					    "$test"
 | 
				
			||||||
done
 | 
					done
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,4 @@
 | 
				
			||||||
leak:libX11
 | 
					leak:libX11
 | 
				
			||||||
leak:_dlopen
 | 
					leak:_dlopen
 | 
				
			||||||
leak:_dlclose
 | 
					leak:_dlclose
 | 
				
			||||||
 | 
					leak:lt::renderer::vk::Device::destroy_swapchain
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue