From 3b3e34a835d6a9a3ad6f827da9636f9842c46390 Mon Sep 17 00:00:00 2001 From: sharkautarch <128002472+sharkautarch@users.noreply.github.com> Date: Mon, 15 Jan 2024 11:33:18 -0500 Subject: [PATCH 01/14] support VK_EXT_debug_utils --- src/main.cpp | 7 +++- src/rendervulkan.cpp | 81 +++++++++++++++++++++++++++++++++++++++++--- src/rendervulkan.hpp | 27 +++++++++++++++ 3 files changed, 110 insertions(+), 5 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 220ee15836..c24dd8c7ab 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -62,6 +62,7 @@ const struct option *gamescope_options = (struct option[]){ { "rt", no_argument, nullptr, 0 }, { "prefer-vk-device", required_argument, 0 }, { "expose-wayland", no_argument, 0 }, + { "vulkan-debug-extension", no_argument, 0}, { "headless", no_argument, 0 }, @@ -227,7 +228,8 @@ const char usage[] = " --disable-xres disable XRes for PID lookup\n" " --hdr-debug-force-support forces support for HDR, etc even if the display doesn't support it. HDR clients will be outputted as SDR still in that case.\n" " --hdr-debug-force-output forces support and output to HDR10 PQ even if the output does not support it (will look very wrong if it doesn't)\n" - " --hdr-debug-heatmap displays a heatmap-style debug view of HDR luminence across the scene in nits." + " --hdr-debug-heatmap displays a heatmap-style debug view of HDR luminence across the scene in nits.\n" + " --vulkan-debug-extension loads vulkan debug extension(s). Supplies object names to validation layer messages." "\n" "Reshade shader options:\n" " --reshade-effect sets the name of a reshade shader to use in either /usr/share/gamescope/reshade/Shaders or ~/.local/share/gamescope/reshade/Shaders\n" @@ -542,6 +544,7 @@ static bool CheckWaylandPresentationTime() int g_nPreferredOutputWidth = 0; int g_nPreferredOutputHeight = 0; bool g_bExposeWayland = false; +bool g_vulkanDebugEXT = false; int main(int argc, char **argv) { @@ -605,6 +608,8 @@ int main(int argc, char **argv) g_bDebugLayers = true; } else if (strcmp(opt_name, "disable-color-management") == 0) { g_bForceDisableColorMgmt = true; + } else if (strcmp(opt_name, "vulkan-debug-extension") == 0) { + g_vulkanDebugEXT = true; } else if (strcmp(opt_name, "xwayland-count") == 0) { g_nXWaylandCount = atoi( optarg ); } else if (strcmp(opt_name, "composite-debug") == 0) { diff --git a/src/rendervulkan.cpp b/src/rendervulkan.cpp index f31d8a931d..2f853b27e6 100644 --- a/src/rendervulkan.cpp +++ b/src/rendervulkan.cpp @@ -95,7 +95,7 @@ VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr( const char* pName); } - +bool vulkanDebugExtSupported=false; VulkanOutput_t g_output; uint32_t g_uCompositeDebug = 0u; @@ -609,6 +609,15 @@ bool CVulkanDevice::createDevice() #define VK_FUNC(x) vk.x = (PFN_vk##x) vk.GetDeviceProcAddr(device(), "vk"#x); VULKAN_DEVICE_FUNCTIONS #undef VK_FUNC + + + if (vulkanDebugExtSupported) + { + #define VK_FUNC(x) vk.x = (PFN_vk##x) vk.GetDeviceProcAddr(device(), "vk"#x); + VULKAN_DEVICE_FUNCTIONS_DEBUGGING + #undef VK_FUNC + } + vk.GetDeviceQueue(device(), m_queueFamily, 0, &m_queue); if ( m_queueFamily == m_generalQueueFamily ) @@ -619,6 +628,8 @@ bool CVulkanDevice::createDevice() return true; } +VkDebugUtilsMessengerEXT debug_utils_messenger{VK_NULL_HANDLE}; + static VkSamplerYcbcrModelConversion colorspaceToYCBCRModel( EStreamColorspace colorspace ) { switch (colorspace) @@ -3255,11 +3266,37 @@ static bool init_nis_data() return true; } +static VKAPI_ATTR VkBool32 VKAPI_CALL debug_utils_messenger_callback +(VkDebugUtilsMessageSeverityFlagBitsEXT message_severity + , VkDebugUtilsMessageTypeFlagsEXT message_type + , const VkDebugUtilsMessengerCallbackDataEXT *callback_data + , void *user_data) { + std::string s; + for (uint32_t i = 0; i < callback_data->objectCount; i++) { + const char * objname = callback_data->pObjects[i].pObjectName; + if (objname == nullptr) + s.append("NULL"); + else + s.append(callback_data->pObjects[i].pObjectName); + s.append("\n"); + } + if (message_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) + { + vk_log.infof("%i - %s: %s\nobject name(s): %s", callback_data->messageIdNumber, callback_data->pMessageIdName, callback_data->pMessage, s.c_str()); + } + else if (message_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) + { + vk_log.errorf("%i - %s: %s\nobject name(s): %s", callback_data->messageIdNumber, callback_data->pMessageIdName, callback_data->pMessage, s.c_str()); + } + return VK_FALSE; +} + VkInstance vulkan_create_instance( void ) { VkResult result = VK_ERROR_INITIALIZATION_FAILED; std::vector< const char * > sdlExtensions; + unsigned int extCount = 0; if ( BIsVRSession() ) { #if HAVE_OPENVR @@ -3274,12 +3311,30 @@ VkInstance vulkan_create_instance( void ) return nullptr; } - unsigned int extCount = 0; SDL_Vulkan_GetInstanceExtensions( nullptr, &extCount, nullptr ); sdlExtensions.resize( extCount ); SDL_Vulkan_GetInstanceExtensions( nullptr, &extCount, sdlExtensions.data() ); } + + uint32_t instance_extension_count; + vkEnumerateInstanceExtensionProperties(nullptr, &instance_extension_count, nullptr); + + std::vector available_instance_extensions(instance_extension_count); + + vkEnumerateInstanceExtensionProperties(nullptr, &instance_extension_count, available_instance_extensions.data()); + + for (auto &available_extension : available_instance_extensions) { + if (g_vulkanDebugEXT == true + && strcmp(available_extension.extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME) == 0) { + vulkanDebugExtSupported = true; + sdlExtensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); + } + } + if (g_vulkanDebugEXT == true && vulkanDebugExtSupported == false) + { + vk_log.errorf("VK_EXT_DEBUG_UTILS_EXTENSION_NAME is not supported, continuing without vulkan debug extension(s)"); + } const VkApplicationInfo appInfo = { .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, .pApplicationName = "gamescope", @@ -3289,7 +3344,7 @@ VkInstance vulkan_create_instance( void ) .apiVersion = VK_API_VERSION_1_3, }; - const VkInstanceCreateInfo createInfo = { + VkInstanceCreateInfo createInfo = { .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, .pApplicationInfo = &appInfo, .enabledExtensionCount = (uint32_t)sdlExtensions.size(), @@ -3297,7 +3352,25 @@ VkInstance vulkan_create_instance( void ) }; VkInstance instance = nullptr; - result = vkCreateInstance(&createInfo, 0, &instance); + if ( g_vulkanDebugEXT && vulkanDebugExtSupported) + { + VkDebugUtilsMessengerCreateInfoEXT debug_utils_create_info = {VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT}; + + debug_utils_create_info.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT; + debug_utils_create_info.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT; + debug_utils_create_info.pfnUserCallback = debug_utils_messenger_callback; + createInfo.pNext = &debug_utils_create_info; + + result = vkCreateInstance(&createInfo, 0, &instance); + + auto func = (PFN_vkCreateDebugUtilsMessengerEXT) vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT"); + result = func(instance, &debug_utils_create_info, nullptr, &debug_utils_messenger); + } + else + { + result = vkCreateInstance(&createInfo, 0, &instance); + } + if ( result != VK_SUCCESS ) { vk_errorf( result, "vkCreateInstance failed" ); diff --git a/src/rendervulkan.hpp b/src/rendervulkan.hpp index e102952087..9777e30113 100644 --- a/src/rendervulkan.hpp +++ b/src/rendervulkan.hpp @@ -16,6 +16,8 @@ #include "shaders/descriptor_set_constants.h" +extern bool g_vulkanDebugEXT; + class CVulkanCmdBuffer; // 1: Fade Plane (Fade outs between switching focus) @@ -628,6 +630,9 @@ static inline uint32_t div_roundup(uint32_t x, uint32_t y) VK_FUNC(GetPhysicalDeviceSurfacePresentModesKHR) \ VK_FUNC(GetPhysicalDeviceSurfaceSupportKHR) +#define VULKAN_DEVICE_FUNCTIONS_DEBUGGING \ + VK_FUNC(SetDebugUtilsObjectNameEXT) + #define VULKAN_DEVICE_FUNCTIONS \ VK_FUNC(AcquireNextImageKHR) \ VK_FUNC(AllocateCommandBuffers) \ @@ -762,10 +767,32 @@ class CVulkanDevice { VULKAN_INSTANCE_FUNCTIONS VULKAN_DEVICE_FUNCTIONS + VULKAN_DEVICE_FUNCTIONS_DEBUGGING } vk; #undef VK_FUNC void resetCmdBuffers(uint64_t sequence); + + std::optional _SetName(const bool cond=false, uint64_t objectHandle = NULL, const char * name = nullptr, VkObjectType objectType = VK_OBJECT_TYPE_UNKNOWN, const void * pNext = nullptr) + { + if (cond) + { + VkDebugUtilsObjectNameInfoEXT pNameInfo = { + .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT, + .pNext = pNext, + .objectType = objectType, + .objectHandle = objectHandle, + .pObjectName = name + }; + return vk.SetDebugUtilsObjectNameEXT(device(), &pNameInfo); + } + } + + #define SetName(...) g_device._SetName(g_vulkanDebugEXT == true && vulkanDebugExtSupported == true, __VA_ARGS__) + + #define smark(name) #name + #define lineit(line) line + #define MARK(name, ...) SetName(name, smark(name lineit((line __LINE__))), __VA_ARGS__) protected: friend class CVulkanCmdBuffer; From 9502603a73da2dbfc225b3062b96435915667327 Mon Sep 17 00:00:00 2001 From: sharkautarch <128002472+sharkautarch@users.noreply.github.com> Date: Mon, 15 Jan 2024 18:05:53 -0500 Subject: [PATCH 02/14] (somewhat) correctly make use of vk.SetDebugUtilsObjectNameEXT() --- src/rendervulkan.cpp | 67 ++++++++++++++++++++++++++++++++++++++------ src/rendervulkan.hpp | 62 +++++++++++++++++++++++++++++----------- 2 files changed, 103 insertions(+), 26 deletions(-) diff --git a/src/rendervulkan.cpp b/src/rendervulkan.cpp index bfbe6d877e..1a2123a8c8 100644 --- a/src/rendervulkan.cpp +++ b/src/rendervulkan.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #if defined(__linux__) #include @@ -47,6 +48,10 @@ #include "reshade_effect_manager.hpp" +static CVulkanDevice g_device; + +CVulkanDevice * m_device = nullptr; + extern bool g_bWasPartialComposite; static constexpr mat3x4 g_rgb2yuv_srgb_to_bt601_limited = {{ @@ -139,6 +144,35 @@ Target *pNextFind(const Base *base, VkStructureType sType) return nullptr; } +inline std::optional SetName_impl(const bool cond, void * ptr, uint64_t objectHandle, const char * name, VkObjectType objectType, const void * pNext) noexcept +{ + if (cond) { + if (m_device != nullptr) { + return m_device->_SetName(objectHandle, name, objectType, pNext); + } else { + return g_device._SetName(objectHandle, name, objectType, pNext); + } + } + + return {}; +} + +inline std::optional CVulkanDevice::SetName_impl(const bool cond, void * ptr, uint64_t objectHandle, const char * name, VkObjectType objectType, const void * pNext) noexcept +{ + if (cond && (objectType != VK_OBJECT_TYPE_UNKNOWN || ptr != nullptr)) + { + auto search = typeLookupTable.find(ptr); + if ( ptr != nullptr && search != typeLookupTable.end()) + objectType = search->second; + else if (objectType == VK_OBJECT_TYPE_UNKNOWN) { + vk_log.errorf( "couldn't find objectType for obj: %s", name); + } + _SetName(objectHandle, name, objectType, pNext); + } + return {}; +} + + #define VK_STRUCTURE_TYPE_WSI_IMAGE_CREATE_INFO_MESA (VkStructureType)1000001002 #define VK_STRUCTURE_TYPE_WSI_MEMORY_ALLOCATE_INFO_MESA (VkStructureType)1000001003 @@ -697,7 +731,7 @@ bool CVulkanDevice::createLayouts() }; vk.CreateSamplerYcbcrConversion( device(), &ycbcrSamplerConversionCreateInfo, nullptr, &m_ycbcrConversion ); - + MARK(m_ycbcrConversion) VkSamplerYcbcrConversionInfo ycbcrSamplerConversionInfo = { .sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO, .conversion = m_ycbcrConversion, @@ -715,7 +749,7 @@ bool CVulkanDevice::createLayouts() }; vk.CreateSampler( device(), &ycbcrSamplerInfo, nullptr, &m_ycbcrSampler ); - + MARK(m_ycbcrSampler) // Create an array of our ycbcrSampler to fill up std::array ycbcrSamplers; for (auto& sampler : ycbcrSamplers) @@ -775,6 +809,7 @@ bool CVulkanDevice::createLayouts() }; VkResult res = vk.CreateDescriptorSetLayout(device(), &descriptorSetLayoutCreateInfo, 0, &m_descriptorSetLayout); + MARK(m_descriptorSetLayout) if ( res != VK_SUCCESS ) { vk_errorf( res, "vkCreateDescriptorSetLayout failed" ); @@ -788,6 +823,7 @@ bool CVulkanDevice::createLayouts() }; res = vk.CreatePipelineLayout(device(), &pipelineLayoutCreateInfo, nullptr, &m_pipelineLayout); + MARK(m_pipelineLayout) if ( res != VK_SUCCESS ) { vk_errorf( res, "vkCreatePipelineLayout failed" ); @@ -931,6 +967,7 @@ bool CVulkanDevice::createScratchResources() }; res = vk.CreateBuffer( device(), &bufferCreateInfo, nullptr, &m_uploadBuffer ); + MARK(m_uploadBuffer) if ( res != VK_SUCCESS ) { vk_errorf( res, "vkCreateBuffer failed" ); @@ -975,6 +1012,7 @@ bool CVulkanDevice::createScratchResources() }; res = vk.CreateSemaphore( device(), &semCreateInfo, NULL, &m_scratchTimelineSemaphore ); + MARK(m_scratchTimelineSemaphore) if ( res != VK_SUCCESS ) { vk_errorf( res, "vkCreateSemaphore failed" ); @@ -1003,7 +1041,7 @@ VkSampler CVulkanDevice::sampler( SamplerState key ) }; vk.CreateSampler( device(), &samplerCreateInfo, nullptr, &ret ); - + MARK_TYPED(ret, VK_OBJECT_TYPE_SAMPLER) m_samplerCache[key] = ret; return ret; @@ -1091,6 +1129,7 @@ VkPipeline CVulkanDevice::compilePipeline(uint32_t layerCount, uint32_t ycbcrMas VkPipeline result; VkResult res = vk.CreateComputePipelines(device(), VK_NULL_HANDLE, 1, &computePipelineCreateInfo, nullptr, &result); + MARK_TYPED(result, VK_OBJECT_TYPE_PIPELINE) if (res != VK_SUCCESS) { vk_errorf( res, "vkCreateComputePipelines failed" ); return VK_NULL_HANDLE; @@ -1192,6 +1231,7 @@ std::unique_ptr CVulkanDevice::commandBuffer() }; VkResult res = vk.AllocateCommandBuffers( device(), &commandBufferAllocateInfo, &rawCmdBuffer ); + MARK(rawCmdBuffer) if ( res != VK_SUCCESS ) { vk_errorf( res, "vkAllocateCommandBuffers failed" ); @@ -1581,9 +1621,12 @@ void CVulkanCmdBuffer::copyImage(std::shared_ptr src, std::share .depth = 1 }, }; - + m_device->vk.CmdCopyImage(m_cmdBuffer, src->vkImage(), VK_IMAGE_LAYOUT_GENERAL, dst->vkImage(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion); + MARK(src->vkImage()) + MARK(dst->vkImage()) + markDirty(dst.get()); } @@ -1605,9 +1648,11 @@ void CVulkanCmdBuffer::copyBufferToImage(VkBuffer buffer, VkDeviceSize offset, u .depth = dst->depth(), }, }; - + m_device->vk.CmdCopyBufferToImage(m_cmdBuffer, buffer, dst->vkImage(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion); + MARK(dst->vkImage()) + markDirty(dst.get()); } @@ -1673,7 +1718,7 @@ void CVulkanCmdBuffer::insertBarrier(bool flush) bool isPresent = flush && state.needsPresentLayout; VkImageLayout presentLayout = BIsVRSession() ? VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL : VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; - + if (!state.discarded && !state.dirty && !state.needsImport && !isExport && !isPresent) continue; @@ -1695,7 +1740,9 @@ void CVulkanCmdBuffer::insertBarrier(bool flush) .image = image->vkImage(), .subresourceRange = subResRange }; - + + MARK_TYPED(memoryBarrier.image, VK_OBJECT_TYPE_IMAGE) + barriers.push_back(memoryBarrier); state.discarded = false; @@ -1705,10 +1752,10 @@ void CVulkanCmdBuffer::insertBarrier(bool flush) // TODO replace VK_PIPELINE_STAGE_ALL_COMMANDS_BIT m_device->vk.CmdPipelineBarrier(m_cmdBuffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, - 0, 0, nullptr, 0, nullptr, barriers.size(), barriers.data()); + 0, 0, nullptr, 0, nullptr, barriers.size(), barriers.data()); + MARK(m_cmdBuffer); } -static CVulkanDevice g_device; static bool allDMABUFsEqual( wlr_dmabuf_attributes *pDMA ) { @@ -2016,6 +2063,7 @@ bool CVulkanTexture::BInit( uint32_t width, uint32_t height, uint32_t depth, uin m_format = imageInfo.format; res = g_device.vk.CreateImage(g_device.device(), &imageInfo, nullptr, &m_vkImage); + MARK(m_vkImage) if (res != VK_SUCCESS) { vk_errorf( res, "vkCreateImage failed" ); return false; @@ -4115,6 +4163,7 @@ std::shared_ptr vulkan_create_texture_from_wlr_buffer( struct wl }; VkBuffer buffer; result = g_device.vk.CreateBuffer( g_device.device(), &bufferCreateInfo, nullptr, &buffer ); + MARK(buffer) if ( result != VK_SUCCESS ) { wlr_buffer_end_data_ptr_access( buf ); diff --git a/src/rendervulkan.hpp b/src/rendervulkan.hpp index 9777e30113..896784e5a0 100644 --- a/src/rendervulkan.hpp +++ b/src/rendervulkan.hpp @@ -11,7 +11,7 @@ #include #include #include - +#include #include "main.hpp" #include "shaders/descriptor_set_constants.h" @@ -773,26 +773,32 @@ class CVulkanDevice void resetCmdBuffers(uint64_t sequence); - std::optional _SetName(const bool cond=false, uint64_t objectHandle = NULL, const char * name = nullptr, VkObjectType objectType = VK_OBJECT_TYPE_UNKNOWN, const void * pNext = nullptr) + std::optional __attribute__((nothrow, no_stack_protector, visibility("protected"))) _SetName(uint64_t objectHandle = NULL, const char * name = nullptr, VkObjectType objectType = VK_OBJECT_TYPE_UNKNOWN, const void * pNext = nullptr) noexcept { - if (cond) - { - VkDebugUtilsObjectNameInfoEXT pNameInfo = { - .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT, - .pNext = pNext, - .objectType = objectType, - .objectHandle = objectHandle, - .pObjectName = name - }; - return vk.SetDebugUtilsObjectNameEXT(device(), &pNameInfo); - } + VkDebugUtilsObjectNameInfoEXT pNameInfo = { + .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT, + .pNext = pNext, + .objectType = objectType, + .objectHandle = objectHandle, + .pObjectName = name + }; + return vk.SetDebugUtilsObjectNameEXT(device(), &pNameInfo); } + + inline std::optional SetName_impl(const bool cond=false, void * ptr = nullptr, uint64_t objectHandle = NULL, const char * name = nullptr, VkObjectType objectType = VK_OBJECT_TYPE_UNKNOWN, const void * pNext = nullptr) noexcept; + - #define SetName(...) g_device._SetName(g_vulkanDebugEXT == true && vulkanDebugExtSupported == true, __VA_ARGS__) + #define CONCAT_IMPL( x, y ) x##y + #define MACRO_CONCAT( x, y ) CONCAT_IMPL( x, y ) - #define smark(name) #name - #define lineit(line) line - #define MARK(name, ...) SetName(name, smark(name lineit((line __LINE__))), __VA_ARGS__) + #define SetName(...) SetName_impl(g_vulkanDebugEXT == true && vulkanDebugExtSupported == true, ## __VA_ARGS__); + + #define _smark(name) #name + #define smark(name) _smark(name) + #define lineit_impl(line) line + #define lineit(line) lineit_impl(line) + #define MARK(name, ...) SetName( reinterpret_cast(name), reinterpret_cast(name), smark(name lineit((line __LINE__))), ## __VA_ARGS__) + #define MARK_TYPED(name, ...) SetName( reinterpret_cast(name), reinterpret_cast(name), smark(name lineit((line __LINE__))), ## __VA_ARGS__) protected: friend class CVulkanCmdBuffer; @@ -818,6 +824,7 @@ class CVulkanDevice VkDescriptorPool m_descriptorPool = VK_NULL_HANDLE; VkCommandPool m_commandPool = VK_NULL_HANDLE; VkCommandPool m_generalCommandPool = VK_NULL_HANDLE; + uint32_t m_queueFamily = -1; uint32_t m_generalQueueFamily = -1; @@ -853,8 +860,29 @@ class CVulkanDevice std::atomic m_submissionSeqNo = { 0 }; std::vector> m_unusedCmdBufs; std::map> m_pendingCmdBufs; + + const std::unordered_map typeLookupTable = + { + { (reinterpret_cast(m_device)), VK_OBJECT_TYPE_DEVICE}, + { (reinterpret_cast(m_physDev)), VK_OBJECT_TYPE_PHYSICAL_DEVICE}, + { (reinterpret_cast(m_instance)), VK_OBJECT_TYPE_INSTANCE}, + { (reinterpret_cast(m_queue)), VK_OBJECT_TYPE_QUEUE}, + { (reinterpret_cast(m_generalQueue)), VK_OBJECT_TYPE_QUEUE}, + { (reinterpret_cast(m_ycbcrConversion)), VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION}, + { (reinterpret_cast(m_ycbcrSampler)), VK_OBJECT_TYPE_SAMPLER}, + { (reinterpret_cast(m_descriptorSetLayout)), VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT}, + { (reinterpret_cast(m_pipelineLayout)), VK_OBJECT_TYPE_PIPELINE_LAYOUT}, + { (reinterpret_cast(m_descriptorPool)), VK_OBJECT_TYPE_DESCRIPTOR_POOL}, + { (reinterpret_cast(m_commandPool)), VK_OBJECT_TYPE_COMMAND_POOL}, + { (reinterpret_cast(m_generalCommandPool)), VK_OBJECT_TYPE_COMMAND_POOL}, + { (reinterpret_cast(m_uploadBuffer)), VK_OBJECT_TYPE_BUFFER}, + { (reinterpret_cast(m_uploadBufferMemory)), VK_OBJECT_TYPE_DEVICE_MEMORY}, + { (reinterpret_cast(m_scratchTimelineSemaphore)), VK_OBJECT_TYPE_SEMAPHORE} + }; }; +inline std::optional SetName_impl(const bool cond=false, void * ptr = nullptr, uint64_t objectHandle = NULL, const char * name = nullptr, VkObjectType objectType = VK_OBJECT_TYPE_UNKNOWN, const void * pNext = nullptr) noexcept; + struct TextureState { bool discarded : 1; From b3d66f8d3fc1ab38ae377426faca290104d1ba54 Mon Sep 17 00:00:00 2001 From: sharkautarch <128002472+sharkautarch@users.noreply.github.com> Date: Mon, 15 Jan 2024 18:09:57 -0500 Subject: [PATCH 03/14] slight adjust --- src/rendervulkan.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/rendervulkan.cpp b/src/rendervulkan.cpp index 1a2123a8c8..fec2fa2782 100644 --- a/src/rendervulkan.cpp +++ b/src/rendervulkan.cpp @@ -1624,8 +1624,8 @@ void CVulkanCmdBuffer::copyImage(std::shared_ptr src, std::share m_device->vk.CmdCopyImage(m_cmdBuffer, src->vkImage(), VK_IMAGE_LAYOUT_GENERAL, dst->vkImage(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion); - MARK(src->vkImage()) - MARK(dst->vkImage()) + MARK_TYPED(src->vkImage(), VK_OBJECT_TYPE_IMAGE) + MARK_TYPED(dst->vkImage(), VK_OBJECT_TYPE_IMAGE) markDirty(dst.get()); } @@ -1651,7 +1651,7 @@ void CVulkanCmdBuffer::copyBufferToImage(VkBuffer buffer, VkDeviceSize offset, u m_device->vk.CmdCopyBufferToImage(m_cmdBuffer, buffer, dst->vkImage(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion); - MARK(dst->vkImage()) + MARK_TYPED(dst->vkImage(), VK_OBJECT_TYPE_IMAGE) markDirty(dst.get()); } From 451677f3b3207c0b2584dab3f84403dc31fec5fe Mon Sep 17 00:00:00 2001 From: sharkautarch <128002472+sharkautarch@users.noreply.github.com> Date: Mon, 15 Jan 2024 18:21:07 -0500 Subject: [PATCH 04/14] fix warning --- src/rendervulkan.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/rendervulkan.hpp b/src/rendervulkan.hpp index 896784e5a0..15e2867be5 100644 --- a/src/rendervulkan.hpp +++ b/src/rendervulkan.hpp @@ -773,7 +773,7 @@ class CVulkanDevice void resetCmdBuffers(uint64_t sequence); - std::optional __attribute__((nothrow, no_stack_protector, visibility("protected"))) _SetName(uint64_t objectHandle = NULL, const char * name = nullptr, VkObjectType objectType = VK_OBJECT_TYPE_UNKNOWN, const void * pNext = nullptr) noexcept + std::optional __attribute__((nothrow, no_stack_protector, visibility("protected"))) _SetName(uint64_t objectHandle = 0, const char * name = nullptr, VkObjectType objectType = VK_OBJECT_TYPE_UNKNOWN, const void * pNext = nullptr) noexcept { VkDebugUtilsObjectNameInfoEXT pNameInfo = { .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT, @@ -785,7 +785,7 @@ class CVulkanDevice return vk.SetDebugUtilsObjectNameEXT(device(), &pNameInfo); } - inline std::optional SetName_impl(const bool cond=false, void * ptr = nullptr, uint64_t objectHandle = NULL, const char * name = nullptr, VkObjectType objectType = VK_OBJECT_TYPE_UNKNOWN, const void * pNext = nullptr) noexcept; + inline std::optional SetName_impl(const bool cond=false, void * ptr = nullptr, uint64_t objectHandle = 0, const char * name = nullptr, VkObjectType objectType = VK_OBJECT_TYPE_UNKNOWN, const void * pNext = nullptr) noexcept; #define CONCAT_IMPL( x, y ) x##y @@ -881,7 +881,7 @@ class CVulkanDevice }; }; -inline std::optional SetName_impl(const bool cond=false, void * ptr = nullptr, uint64_t objectHandle = NULL, const char * name = nullptr, VkObjectType objectType = VK_OBJECT_TYPE_UNKNOWN, const void * pNext = nullptr) noexcept; +inline std::optional SetName_impl(const bool cond=false, void * ptr = nullptr, uint64_t objectHandle = 0, const char * name = nullptr, VkObjectType objectType = VK_OBJECT_TYPE_UNKNOWN, const void * pNext = nullptr) noexcept; struct TextureState { From 364d7febcba46cde1cc05691516d4512cdc9e67d Mon Sep 17 00:00:00 2001 From: sharkautarch <128002472+sharkautarch@users.noreply.github.com> Date: Mon, 15 Jan 2024 18:26:20 -0500 Subject: [PATCH 05/14] make CI happier --- src/rendervulkan.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/rendervulkan.cpp b/src/rendervulkan.cpp index fec2fa2782..20f9dcf071 100644 --- a/src/rendervulkan.cpp +++ b/src/rendervulkan.cpp @@ -11,7 +11,6 @@ #include #include #include -#include #if defined(__linux__) #include @@ -4163,7 +4162,7 @@ std::shared_ptr vulkan_create_texture_from_wlr_buffer( struct wl }; VkBuffer buffer; result = g_device.vk.CreateBuffer( g_device.device(), &bufferCreateInfo, nullptr, &buffer ); - MARK(buffer) + MARK_TYPED(buffer, VK_OBJECT_TYPE_BUFFER) if ( result != VK_SUCCESS ) { wlr_buffer_end_data_ptr_access( buf ); From 8102d15100369e79603648616f5ed91e4dc6edad Mon Sep 17 00:00:00 2001 From: sharkautarch <128002472+sharkautarch@users.noreply.github.com> Date: Mon, 15 Jan 2024 18:31:27 -0500 Subject: [PATCH 06/14] make CI happier 2 --- src/rendervulkan.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/rendervulkan.hpp b/src/rendervulkan.hpp index 15e2867be5..2852333029 100644 --- a/src/rendervulkan.hpp +++ b/src/rendervulkan.hpp @@ -874,10 +874,10 @@ class CVulkanDevice { (reinterpret_cast(m_pipelineLayout)), VK_OBJECT_TYPE_PIPELINE_LAYOUT}, { (reinterpret_cast(m_descriptorPool)), VK_OBJECT_TYPE_DESCRIPTOR_POOL}, { (reinterpret_cast(m_commandPool)), VK_OBJECT_TYPE_COMMAND_POOL}, - { (reinterpret_cast(m_generalCommandPool)), VK_OBJECT_TYPE_COMMAND_POOL}, - { (reinterpret_cast(m_uploadBuffer)), VK_OBJECT_TYPE_BUFFER}, - { (reinterpret_cast(m_uploadBufferMemory)), VK_OBJECT_TYPE_DEVICE_MEMORY}, - { (reinterpret_cast(m_scratchTimelineSemaphore)), VK_OBJECT_TYPE_SEMAPHORE} + { (reinterpret_cast(m_generalCommandPool)), VK_OBJECT_TYPE_COMMAND_POOL} + //{ (reinterpret_cast(m_uploadBuffer)), VK_OBJECT_TYPE_BUFFER}, + //{ (reinterpret_cast(m_uploadBufferMemory)), VK_OBJECT_TYPE_DEVICE_MEMORY}, + //{ (reinterpret_cast(m_scratchTimelineSemaphore)), VK_OBJECT_TYPE_SEMAPHORE} }; }; From e1bf2046609509dfe204a744a8d693b619733e99 Mon Sep 17 00:00:00 2001 From: sharkautarch <128002472+sharkautarch@users.noreply.github.com> Date: Mon, 15 Jan 2024 23:02:27 -0500 Subject: [PATCH 07/14] slight simplification --- src/rendervulkan.cpp | 26 +++++++++++++------------- src/rendervulkan.hpp | 9 ++------- 2 files changed, 15 insertions(+), 20 deletions(-) diff --git a/src/rendervulkan.cpp b/src/rendervulkan.cpp index 20f9dcf071..931e0f27cf 100644 --- a/src/rendervulkan.cpp +++ b/src/rendervulkan.cpp @@ -1040,7 +1040,7 @@ VkSampler CVulkanDevice::sampler( SamplerState key ) }; vk.CreateSampler( device(), &samplerCreateInfo, nullptr, &ret ); - MARK_TYPED(ret, VK_OBJECT_TYPE_SAMPLER) + MARK(ret, VK_OBJECT_TYPE_SAMPLER) m_samplerCache[key] = ret; return ret; @@ -1128,7 +1128,7 @@ VkPipeline CVulkanDevice::compilePipeline(uint32_t layerCount, uint32_t ycbcrMas VkPipeline result; VkResult res = vk.CreateComputePipelines(device(), VK_NULL_HANDLE, 1, &computePipelineCreateInfo, nullptr, &result); - MARK_TYPED(result, VK_OBJECT_TYPE_PIPELINE) + MARK(result, VK_OBJECT_TYPE_PIPELINE) if (res != VK_SUCCESS) { vk_errorf( res, "vkCreateComputePipelines failed" ); return VK_NULL_HANDLE; @@ -1620,11 +1620,11 @@ void CVulkanCmdBuffer::copyImage(std::shared_ptr src, std::share .depth = 1 }, }; - + m_device->vk.CmdCopyImage(m_cmdBuffer, src->vkImage(), VK_IMAGE_LAYOUT_GENERAL, dst->vkImage(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion); - MARK_TYPED(src->vkImage(), VK_OBJECT_TYPE_IMAGE) - MARK_TYPED(dst->vkImage(), VK_OBJECT_TYPE_IMAGE) + MARK(src->vkImage(), VK_OBJECT_TYPE_IMAGE) + MARK(dst->vkImage(), VK_OBJECT_TYPE_IMAGE) markDirty(dst.get()); } @@ -1647,10 +1647,10 @@ void CVulkanCmdBuffer::copyBufferToImage(VkBuffer buffer, VkDeviceSize offset, u .depth = dst->depth(), }, }; - + m_device->vk.CmdCopyBufferToImage(m_cmdBuffer, buffer, dst->vkImage(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion); - MARK_TYPED(dst->vkImage(), VK_OBJECT_TYPE_IMAGE) + MARK(dst->vkImage(), VK_OBJECT_TYPE_IMAGE) markDirty(dst.get()); } @@ -1717,7 +1717,7 @@ void CVulkanCmdBuffer::insertBarrier(bool flush) bool isPresent = flush && state.needsPresentLayout; VkImageLayout presentLayout = BIsVRSession() ? VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL : VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; - + if (!state.discarded && !state.dirty && !state.needsImport && !isExport && !isPresent) continue; @@ -1740,7 +1740,7 @@ void CVulkanCmdBuffer::insertBarrier(bool flush) .subresourceRange = subResRange }; - MARK_TYPED(memoryBarrier.image, VK_OBJECT_TYPE_IMAGE) + MARK(memoryBarrier.image, VK_OBJECT_TYPE_IMAGE) barriers.push_back(memoryBarrier); @@ -1751,8 +1751,8 @@ void CVulkanCmdBuffer::insertBarrier(bool flush) // TODO replace VK_PIPELINE_STAGE_ALL_COMMANDS_BIT m_device->vk.CmdPipelineBarrier(m_cmdBuffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, - 0, 0, nullptr, 0, nullptr, barriers.size(), barriers.data()); - MARK(m_cmdBuffer); + 0, 0, nullptr, 0, nullptr, barriers.size(), barriers.data()); + MARK(m_cmdBuffer, VK_OBJECT_TYPE_COMMAND_BUFFER); } @@ -2062,7 +2062,7 @@ bool CVulkanTexture::BInit( uint32_t width, uint32_t height, uint32_t depth, uin m_format = imageInfo.format; res = g_device.vk.CreateImage(g_device.device(), &imageInfo, nullptr, &m_vkImage); - MARK(m_vkImage) + MARK(m_vkImage, VK_OBJECT_TYPE_IMAGE) if (res != VK_SUCCESS) { vk_errorf( res, "vkCreateImage failed" ); return false; @@ -4162,7 +4162,7 @@ std::shared_ptr vulkan_create_texture_from_wlr_buffer( struct wl }; VkBuffer buffer; result = g_device.vk.CreateBuffer( g_device.device(), &bufferCreateInfo, nullptr, &buffer ); - MARK_TYPED(buffer, VK_OBJECT_TYPE_BUFFER) + MARK(buffer, VK_OBJECT_TYPE_BUFFER) if ( result != VK_SUCCESS ) { wlr_buffer_end_data_ptr_access( buf ); diff --git a/src/rendervulkan.hpp b/src/rendervulkan.hpp index 2852333029..d8bdd9a621 100644 --- a/src/rendervulkan.hpp +++ b/src/rendervulkan.hpp @@ -11,7 +11,7 @@ #include #include #include -#include + #include "main.hpp" #include "shaders/descriptor_set_constants.h" @@ -773,7 +773,7 @@ class CVulkanDevice void resetCmdBuffers(uint64_t sequence); - std::optional __attribute__((nothrow, no_stack_protector, visibility("protected"))) _SetName(uint64_t objectHandle = 0, const char * name = nullptr, VkObjectType objectType = VK_OBJECT_TYPE_UNKNOWN, const void * pNext = nullptr) noexcept + std::optional __attribute__((nothrow, visibility("protected"))) _SetName(uint64_t objectHandle = 0, const char * name = nullptr, VkObjectType objectType = VK_OBJECT_TYPE_UNKNOWN, const void * pNext = nullptr) noexcept { VkDebugUtilsObjectNameInfoEXT pNameInfo = { .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT, @@ -788,9 +788,6 @@ class CVulkanDevice inline std::optional SetName_impl(const bool cond=false, void * ptr = nullptr, uint64_t objectHandle = 0, const char * name = nullptr, VkObjectType objectType = VK_OBJECT_TYPE_UNKNOWN, const void * pNext = nullptr) noexcept; - #define CONCAT_IMPL( x, y ) x##y - #define MACRO_CONCAT( x, y ) CONCAT_IMPL( x, y ) - #define SetName(...) SetName_impl(g_vulkanDebugEXT == true && vulkanDebugExtSupported == true, ## __VA_ARGS__); #define _smark(name) #name @@ -798,7 +795,6 @@ class CVulkanDevice #define lineit_impl(line) line #define lineit(line) lineit_impl(line) #define MARK(name, ...) SetName( reinterpret_cast(name), reinterpret_cast(name), smark(name lineit((line __LINE__))), ## __VA_ARGS__) - #define MARK_TYPED(name, ...) SetName( reinterpret_cast(name), reinterpret_cast(name), smark(name lineit((line __LINE__))), ## __VA_ARGS__) protected: friend class CVulkanCmdBuffer; @@ -824,7 +820,6 @@ class CVulkanDevice VkDescriptorPool m_descriptorPool = VK_NULL_HANDLE; VkCommandPool m_commandPool = VK_NULL_HANDLE; VkCommandPool m_generalCommandPool = VK_NULL_HANDLE; - uint32_t m_queueFamily = -1; uint32_t m_generalQueueFamily = -1; From 0f59bfe5e6a8832926da0bd5d173d1c06ac4b6a9 Mon Sep 17 00:00:00 2001 From: sharkautarch <128002472+sharkautarch@users.noreply.github.com> Date: Tue, 16 Jan 2024 16:45:37 -0500 Subject: [PATCH 08/14] fixup typeLookupTable. MARK(...) -> seperate debug macros -> MARK_TYPED(...), MARK(...) --- src/rendervulkan.cpp | 28 ++++++++++++++-------------- src/rendervulkan.hpp | 44 ++++++++++++++++++++++++-------------------- 2 files changed, 38 insertions(+), 34 deletions(-) diff --git a/src/rendervulkan.cpp b/src/rendervulkan.cpp index 931e0f27cf..f6f338d851 100644 --- a/src/rendervulkan.cpp +++ b/src/rendervulkan.cpp @@ -143,7 +143,7 @@ Target *pNextFind(const Base *base, VkStructureType sType) return nullptr; } -inline std::optional SetName_impl(const bool cond, void * ptr, uint64_t objectHandle, const char * name, VkObjectType objectType, const void * pNext) noexcept +inline std::optional SetName_impl(const bool cond, void ** ptr, uint64_t objectHandle, const char * name, VkObjectType objectType, const void * pNext) noexcept { if (cond) { if (m_device != nullptr) { @@ -156,7 +156,7 @@ inline std::optional SetName_impl(const bool cond, void * ptr, uint64_ return {}; } -inline std::optional CVulkanDevice::SetName_impl(const bool cond, void * ptr, uint64_t objectHandle, const char * name, VkObjectType objectType, const void * pNext) noexcept +inline std::optional CVulkanDevice::SetName_impl(const bool cond, void ** ptr, uint64_t objectHandle, const char * name, VkObjectType objectType, const void * pNext) noexcept { if (cond && (objectType != VK_OBJECT_TYPE_UNKNOWN || ptr != nullptr)) { @@ -1040,7 +1040,7 @@ VkSampler CVulkanDevice::sampler( SamplerState key ) }; vk.CreateSampler( device(), &samplerCreateInfo, nullptr, &ret ); - MARK(ret, VK_OBJECT_TYPE_SAMPLER) + MARK_TYPED(ret, VK_OBJECT_TYPE_SAMPLER) m_samplerCache[key] = ret; return ret; @@ -1128,7 +1128,7 @@ VkPipeline CVulkanDevice::compilePipeline(uint32_t layerCount, uint32_t ycbcrMas VkPipeline result; VkResult res = vk.CreateComputePipelines(device(), VK_NULL_HANDLE, 1, &computePipelineCreateInfo, nullptr, &result); - MARK(result, VK_OBJECT_TYPE_PIPELINE) + MARK_TYPED(result, VK_OBJECT_TYPE_PIPELINE) if (res != VK_SUCCESS) { vk_errorf( res, "vkCreateComputePipelines failed" ); return VK_NULL_HANDLE; @@ -1230,7 +1230,7 @@ std::unique_ptr CVulkanDevice::commandBuffer() }; VkResult res = vk.AllocateCommandBuffers( device(), &commandBufferAllocateInfo, &rawCmdBuffer ); - MARK(rawCmdBuffer) + MARK_TYPED(rawCmdBuffer, VK_OBJECT_TYPE_BUFFER) if ( res != VK_SUCCESS ) { vk_errorf( res, "vkAllocateCommandBuffers failed" ); @@ -1623,8 +1623,8 @@ void CVulkanCmdBuffer::copyImage(std::shared_ptr src, std::share m_device->vk.CmdCopyImage(m_cmdBuffer, src->vkImage(), VK_IMAGE_LAYOUT_GENERAL, dst->vkImage(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion); - MARK(src->vkImage(), VK_OBJECT_TYPE_IMAGE) - MARK(dst->vkImage(), VK_OBJECT_TYPE_IMAGE) + MARK_TYPED(src->vkImage(), VK_OBJECT_TYPE_IMAGE) + MARK_TYPED(dst->vkImage(), VK_OBJECT_TYPE_IMAGE) markDirty(dst.get()); } @@ -1650,7 +1650,7 @@ void CVulkanCmdBuffer::copyBufferToImage(VkBuffer buffer, VkDeviceSize offset, u m_device->vk.CmdCopyBufferToImage(m_cmdBuffer, buffer, dst->vkImage(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion); - MARK(dst->vkImage(), VK_OBJECT_TYPE_IMAGE) + MARK_TYPED(dst->vkImage(), VK_OBJECT_TYPE_IMAGE) markDirty(dst.get()); } @@ -1740,7 +1740,7 @@ void CVulkanCmdBuffer::insertBarrier(bool flush) .subresourceRange = subResRange }; - MARK(memoryBarrier.image, VK_OBJECT_TYPE_IMAGE) + MARK_TYPED(memoryBarrier.image, VK_OBJECT_TYPE_IMAGE) barriers.push_back(memoryBarrier); @@ -1752,7 +1752,7 @@ void CVulkanCmdBuffer::insertBarrier(bool flush) // TODO replace VK_PIPELINE_STAGE_ALL_COMMANDS_BIT m_device->vk.CmdPipelineBarrier(m_cmdBuffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, barriers.size(), barriers.data()); - MARK(m_cmdBuffer, VK_OBJECT_TYPE_COMMAND_BUFFER); + MARK_TYPED(m_cmdBuffer, VK_OBJECT_TYPE_COMMAND_BUFFER); } @@ -2062,7 +2062,7 @@ bool CVulkanTexture::BInit( uint32_t width, uint32_t height, uint32_t depth, uin m_format = imageInfo.format; res = g_device.vk.CreateImage(g_device.device(), &imageInfo, nullptr, &m_vkImage); - MARK(m_vkImage, VK_OBJECT_TYPE_IMAGE) + MARK_TYPED(m_vkImage, VK_OBJECT_TYPE_IMAGE) if (res != VK_SUCCESS) { vk_errorf( res, "vkCreateImage failed" ); return false; @@ -3404,8 +3404,8 @@ VkInstance vulkan_create_instance( void ) { VkDebugUtilsMessengerCreateInfoEXT debug_utils_create_info = {VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT}; - debug_utils_create_info.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT; - debug_utils_create_info.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT; + debug_utils_create_info.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT; + debug_utils_create_info.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT; debug_utils_create_info.pfnUserCallback = debug_utils_messenger_callback; createInfo.pNext = &debug_utils_create_info; @@ -4162,7 +4162,7 @@ std::shared_ptr vulkan_create_texture_from_wlr_buffer( struct wl }; VkBuffer buffer; result = g_device.vk.CreateBuffer( g_device.device(), &bufferCreateInfo, nullptr, &buffer ); - MARK(buffer, VK_OBJECT_TYPE_BUFFER) + MARK_TYPED(buffer, VK_OBJECT_TYPE_BUFFER) if ( result != VK_SUCCESS ) { wlr_buffer_end_data_ptr_access( buf ); diff --git a/src/rendervulkan.hpp b/src/rendervulkan.hpp index d8bdd9a621..509a504962 100644 --- a/src/rendervulkan.hpp +++ b/src/rendervulkan.hpp @@ -785,7 +785,7 @@ class CVulkanDevice return vk.SetDebugUtilsObjectNameEXT(device(), &pNameInfo); } - inline std::optional SetName_impl(const bool cond=false, void * ptr = nullptr, uint64_t objectHandle = 0, const char * name = nullptr, VkObjectType objectType = VK_OBJECT_TYPE_UNKNOWN, const void * pNext = nullptr) noexcept; + inline std::optional SetName_impl(const bool cond=false, void ** ptr = nullptr, uint64_t objectHandle = 0, const char * name = nullptr, VkObjectType objectType = VK_OBJECT_TYPE_UNKNOWN, const void * pNext = nullptr) noexcept; #define SetName(...) SetName_impl(g_vulkanDebugEXT == true && vulkanDebugExtSupported == true, ## __VA_ARGS__); @@ -794,8 +794,12 @@ class CVulkanDevice #define smark(name) _smark(name) #define lineit_impl(line) line #define lineit(line) lineit_impl(line) - #define MARK(name, ...) SetName( reinterpret_cast(name), reinterpret_cast(name), smark(name lineit((line __LINE__))), ## __VA_ARGS__) - + #define _MARK_w_addr(name, ...) SetName( reinterpret_cast((&(name))), reinterpret_cast(name), smark(name lineit((line __LINE__))), ## __VA_ARGS__) + #define _MARK(name, ...) SetName( nullptr, reinterpret_cast(name), smark(name lineit((line __LINE__))), ## __VA_ARGS__) + + #define MARK(name, ...) _MARK_w_addr(name, ## __VA_ARGS__) + #define MARK_TYPED(name, typeinfo, ...) _MARK(name, typeinfo, ## __VA_ARGS__) + protected: friend class CVulkanCmdBuffer; @@ -856,27 +860,27 @@ class CVulkanDevice std::vector> m_unusedCmdBufs; std::map> m_pendingCmdBufs; - const std::unordered_map typeLookupTable = + const std::unordered_map typeLookupTable = { - { (reinterpret_cast(m_device)), VK_OBJECT_TYPE_DEVICE}, - { (reinterpret_cast(m_physDev)), VK_OBJECT_TYPE_PHYSICAL_DEVICE}, - { (reinterpret_cast(m_instance)), VK_OBJECT_TYPE_INSTANCE}, - { (reinterpret_cast(m_queue)), VK_OBJECT_TYPE_QUEUE}, - { (reinterpret_cast(m_generalQueue)), VK_OBJECT_TYPE_QUEUE}, - { (reinterpret_cast(m_ycbcrConversion)), VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION}, - { (reinterpret_cast(m_ycbcrSampler)), VK_OBJECT_TYPE_SAMPLER}, - { (reinterpret_cast(m_descriptorSetLayout)), VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT}, - { (reinterpret_cast(m_pipelineLayout)), VK_OBJECT_TYPE_PIPELINE_LAYOUT}, - { (reinterpret_cast(m_descriptorPool)), VK_OBJECT_TYPE_DESCRIPTOR_POOL}, - { (reinterpret_cast(m_commandPool)), VK_OBJECT_TYPE_COMMAND_POOL}, - { (reinterpret_cast(m_generalCommandPool)), VK_OBJECT_TYPE_COMMAND_POOL} - //{ (reinterpret_cast(m_uploadBuffer)), VK_OBJECT_TYPE_BUFFER}, - //{ (reinterpret_cast(m_uploadBufferMemory)), VK_OBJECT_TYPE_DEVICE_MEMORY}, - //{ (reinterpret_cast(m_scratchTimelineSemaphore)), VK_OBJECT_TYPE_SEMAPHORE} + { (reinterpret_cast(&m_device)), VK_OBJECT_TYPE_DEVICE}, + { (reinterpret_cast(&m_physDev)), VK_OBJECT_TYPE_PHYSICAL_DEVICE}, + { (reinterpret_cast(&m_instance)), VK_OBJECT_TYPE_INSTANCE}, + { (reinterpret_cast(&m_queue)), VK_OBJECT_TYPE_QUEUE}, + { (reinterpret_cast(&m_generalQueue)), VK_OBJECT_TYPE_QUEUE}, + { (reinterpret_cast(&m_ycbcrConversion)), VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION}, + { (reinterpret_cast(&m_ycbcrSampler)), VK_OBJECT_TYPE_SAMPLER}, + { (reinterpret_cast(&m_descriptorSetLayout)), VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT}, + { (reinterpret_cast(&m_pipelineLayout)), VK_OBJECT_TYPE_PIPELINE_LAYOUT}, + { (reinterpret_cast(&m_descriptorPool)), VK_OBJECT_TYPE_DESCRIPTOR_POOL}, + { (reinterpret_cast(&m_commandPool)), VK_OBJECT_TYPE_COMMAND_POOL}, + { (reinterpret_cast(&m_generalCommandPool)), VK_OBJECT_TYPE_COMMAND_POOL}, + { (reinterpret_cast(&m_uploadBuffer)), VK_OBJECT_TYPE_BUFFER}, + { (reinterpret_cast(&m_uploadBufferMemory)), VK_OBJECT_TYPE_DEVICE_MEMORY}, + { (reinterpret_cast(&m_scratchTimelineSemaphore)), VK_OBJECT_TYPE_SEMAPHORE} }; }; -inline std::optional SetName_impl(const bool cond=false, void * ptr = nullptr, uint64_t objectHandle = 0, const char * name = nullptr, VkObjectType objectType = VK_OBJECT_TYPE_UNKNOWN, const void * pNext = nullptr) noexcept; +inline std::optional SetName_impl(const bool cond=false, void ** ptr = nullptr, uint64_t objectHandle = 0, const char * name = nullptr, VkObjectType objectType = VK_OBJECT_TYPE_UNKNOWN, const void * pNext = nullptr) noexcept; struct TextureState { From a80ab9ec099daa9beeabcc98072ad61a1dea0c22 Mon Sep 17 00:00:00 2001 From: sharkautarch <128002472+sharkautarch@users.noreply.github.com> Date: Tue, 16 Jan 2024 19:05:01 -0500 Subject: [PATCH 09/14] de-globalize g_vulkanDebugEXT -> vulkanDebugEXT --- src/main.cpp | 7 +++---- src/rendervulkan.cpp | 10 ++++++---- src/rendervulkan.hpp | 7 ++----- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index c24dd8c7ab..a89c8571d1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -544,7 +544,6 @@ static bool CheckWaylandPresentationTime() int g_nPreferredOutputWidth = 0; int g_nPreferredOutputHeight = 0; bool g_bExposeWayland = false; -bool g_vulkanDebugEXT = false; int main(int argc, char **argv) { @@ -553,7 +552,7 @@ int main(int argc, char **argv) static std::string optstring = build_optstring(gamescope_options); gamescope_optstring = optstring.c_str(); - + bool vulkanDebugEXT = false; int o; int opt_index = -1; while ((o = getopt_long(argc, argv, gamescope_optstring, gamescope_options, &opt_index)) != -1) @@ -609,7 +608,7 @@ int main(int argc, char **argv) } else if (strcmp(opt_name, "disable-color-management") == 0) { g_bForceDisableColorMgmt = true; } else if (strcmp(opt_name, "vulkan-debug-extension") == 0) { - g_vulkanDebugEXT = true; + vulkanDebugEXT = true; } else if (strcmp(opt_name, "xwayland-count") == 0) { g_nXWaylandCount = atoi( optarg ); } else if (strcmp(opt_name, "composite-debug") == 0) { @@ -763,7 +762,7 @@ int main(int argc, char **argv) } } - VkInstance instance = vulkan_create_instance(); + VkInstance instance = vulkan_create_instance(vulkanDebugEXT); VkSurfaceKHR surface = VK_NULL_HANDLE; if ( !BIsNested() ) diff --git a/src/rendervulkan.cpp b/src/rendervulkan.cpp index f6f338d851..2ac71478ab 100644 --- a/src/rendervulkan.cpp +++ b/src/rendervulkan.cpp @@ -100,6 +100,7 @@ VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr( } bool vulkanDebugExtSupported=false; +static bool vulkanDebugEXT; VulkanOutput_t g_output; uint32_t g_uCompositeDebug = 0u; @@ -3339,8 +3340,9 @@ static VKAPI_ATTR VkBool32 VKAPI_CALL debug_utils_messenger_callback return VK_FALSE; } -VkInstance vulkan_create_instance( void ) +VkInstance vulkan_create_instance(const bool bShouldDebug ) { + vulkanDebugEXT=bShouldDebug; VkResult result = VK_ERROR_INITIALIZATION_FAILED; std::vector< const char * > sdlExtensions; @@ -3372,14 +3374,14 @@ VkInstance vulkan_create_instance( void ) vkEnumerateInstanceExtensionProperties(nullptr, &instance_extension_count, available_instance_extensions.data()); for (auto &available_extension : available_instance_extensions) { - if (g_vulkanDebugEXT == true + if (vulkanDebugEXT == true && strcmp(available_extension.extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME) == 0) { vulkanDebugExtSupported = true; sdlExtensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); } } - if (g_vulkanDebugEXT == true && vulkanDebugExtSupported == false) + if (vulkanDebugEXT == true && vulkanDebugExtSupported == false) { vk_log.errorf("VK_EXT_DEBUG_UTILS_EXTENSION_NAME is not supported, continuing without vulkan debug extension(s)"); } @@ -3400,7 +3402,7 @@ VkInstance vulkan_create_instance( void ) }; VkInstance instance = nullptr; - if ( g_vulkanDebugEXT && vulkanDebugExtSupported) + if ( vulkanDebugEXT && vulkanDebugExtSupported) { VkDebugUtilsMessengerCreateInfoEXT debug_utils_create_info = {VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT}; diff --git a/src/rendervulkan.hpp b/src/rendervulkan.hpp index 509a504962..525ef747d1 100644 --- a/src/rendervulkan.hpp +++ b/src/rendervulkan.hpp @@ -16,8 +16,6 @@ #include "shaders/descriptor_set_constants.h" -extern bool g_vulkanDebugEXT; - class CVulkanCmdBuffer; // 1: Fade Plane (Fade outs between switching focus) @@ -367,7 +365,7 @@ namespace CompositeDebugFlag static constexpr uint32_t Tonemap_Reinhard = 1u << 7; }; -VkInstance vulkan_create_instance(void); +VkInstance vulkan_create_instance(bool bShouldDebug); bool vulkan_init(VkInstance instance, VkSurfaceKHR surface); bool vulkan_init_formats(void); bool vulkan_make_output(VkSurfaceKHR surface); @@ -788,7 +786,7 @@ class CVulkanDevice inline std::optional SetName_impl(const bool cond=false, void ** ptr = nullptr, uint64_t objectHandle = 0, const char * name = nullptr, VkObjectType objectType = VK_OBJECT_TYPE_UNKNOWN, const void * pNext = nullptr) noexcept; - #define SetName(...) SetName_impl(g_vulkanDebugEXT == true && vulkanDebugExtSupported == true, ## __VA_ARGS__); + #define SetName(...) SetName_impl(vulkanDebugEXT == true && vulkanDebugExtSupported == true, ## __VA_ARGS__); #define _smark(name) #name #define smark(name) _smark(name) @@ -859,7 +857,6 @@ class CVulkanDevice std::atomic m_submissionSeqNo = { 0 }; std::vector> m_unusedCmdBufs; std::map> m_pendingCmdBufs; - const std::unordered_map typeLookupTable = { { (reinterpret_cast(&m_device)), VK_OBJECT_TYPE_DEVICE}, From bbb5d48f6eb966c91c9e70a042cf8fd742e23327 Mon Sep 17 00:00:00 2001 From: sharkautarch <128002472+sharkautarch@users.noreply.github.com> Date: Tue, 16 Jan 2024 19:34:38 -0500 Subject: [PATCH 10/14] disable the bits of the vulkan debug extension stuff that could impact runtime performance when compiling w/ -Db_ndebug=true --- src/main.cpp | 7 +++++++ src/rendervulkan.hpp | 7 ++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index a89c8571d1..f62e82512f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -608,7 +608,14 @@ int main(int argc, char **argv) } else if (strcmp(opt_name, "disable-color-management") == 0) { g_bForceDisableColorMgmt = true; } else if (strcmp(opt_name, "vulkan-debug-extension") == 0) { + #ifndef NDEBUG vulkanDebugEXT = true; + #else + fprintf(stderr, "gamescope is not compiled with --vulkan-debug-extension supported\n" + "to enable it, recompile gamescope after reconfiguring it with:\n" + "meson --reconfigure build -Db_ndebug=false\n"); + exit(1); + #endif } else if (strcmp(opt_name, "xwayland-count") == 0) { g_nXWaylandCount = atoi( optarg ); } else if (strcmp(opt_name, "composite-debug") == 0) { diff --git a/src/rendervulkan.hpp b/src/rendervulkan.hpp index 525ef747d1..737e85b9c9 100644 --- a/src/rendervulkan.hpp +++ b/src/rendervulkan.hpp @@ -786,7 +786,7 @@ class CVulkanDevice inline std::optional SetName_impl(const bool cond=false, void ** ptr = nullptr, uint64_t objectHandle = 0, const char * name = nullptr, VkObjectType objectType = VK_OBJECT_TYPE_UNKNOWN, const void * pNext = nullptr) noexcept; - #define SetName(...) SetName_impl(vulkanDebugEXT == true && vulkanDebugExtSupported == true, ## __VA_ARGS__); + #define SetName(...)if (__builtin_expect(vulkanDebugEXT, 0)) {} else SetName_impl(vulkanDebugEXT == true && vulkanDebugExtSupported == true, ## __VA_ARGS__); #define _smark(name) #name #define smark(name) _smark(name) @@ -795,8 +795,13 @@ class CVulkanDevice #define _MARK_w_addr(name, ...) SetName( reinterpret_cast((&(name))), reinterpret_cast(name), smark(name lineit((line __LINE__))), ## __VA_ARGS__) #define _MARK(name, ...) SetName( nullptr, reinterpret_cast(name), smark(name lineit((line __LINE__))), ## __VA_ARGS__) +#ifndef NDEBUG #define MARK(name, ...) _MARK_w_addr(name, ## __VA_ARGS__) #define MARK_TYPED(name, typeinfo, ...) _MARK(name, typeinfo, ## __VA_ARGS__) +#else + #define MARK(...) + #define MARK_TYPED(...) +#endif protected: friend class CVulkanCmdBuffer; From b7a35ee2c7891259d778fbf8e7404ecbac4feb67 Mon Sep 17 00:00:00 2001 From: sharkautarch <128002472+sharkautarch@users.noreply.github.com> Date: Tue, 16 Jan 2024 23:10:34 -0500 Subject: [PATCH 11/14] move a variable back to where it was before --- src/rendervulkan.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rendervulkan.cpp b/src/rendervulkan.cpp index 2ac71478ab..af4f3d73e5 100644 --- a/src/rendervulkan.cpp +++ b/src/rendervulkan.cpp @@ -3346,7 +3346,6 @@ VkInstance vulkan_create_instance(const bool bShouldDebug ) VkResult result = VK_ERROR_INITIALIZATION_FAILED; std::vector< const char * > sdlExtensions; - unsigned int extCount = 0; if ( BIsVRSession() ) { #if HAVE_OPENVR @@ -3360,7 +3359,8 @@ VkInstance vulkan_create_instance(const bool bShouldDebug ) fprintf(stderr, "SDL_Vulkan_LoadLibrary failed: %s\n", SDL_GetError()); return nullptr; } - + + unsigned int extCount = 0; SDL_Vulkan_GetInstanceExtensions( nullptr, &extCount, nullptr ); sdlExtensions.resize( extCount ); SDL_Vulkan_GetInstanceExtensions( nullptr, &extCount, sdlExtensions.data() ); From eeb812e0b6f4c701e8c51235727ab80a1793b74a Mon Sep 17 00:00:00 2001 From: sharkautarch <128002472+sharkautarch@users.noreply.github.com> Date: Tue, 16 Jan 2024 23:12:08 -0500 Subject: [PATCH 12/14] move a variable back to where it was before --- src/rendervulkan.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rendervulkan.cpp b/src/rendervulkan.cpp index af4f3d73e5..6f34970052 100644 --- a/src/rendervulkan.cpp +++ b/src/rendervulkan.cpp @@ -3359,7 +3359,7 @@ VkInstance vulkan_create_instance(const bool bShouldDebug ) fprintf(stderr, "SDL_Vulkan_LoadLibrary failed: %s\n", SDL_GetError()); return nullptr; } - + unsigned int extCount = 0; SDL_Vulkan_GetInstanceExtensions( nullptr, &extCount, nullptr ); sdlExtensions.resize( extCount ); From 5f52be45de42a7ea6328313861a1981ee339af86 Mon Sep 17 00:00:00 2001 From: sharkautarch <128002472+sharkautarch@users.noreply.github.com> Date: Wed, 17 Jan 2024 13:44:21 -0500 Subject: [PATCH 13/14] fix a mistake I made that prevented names from being provided + destroy the debug_utils_messenger thingy on program close (in a thread-safe way) --- src/main.cpp | 4 ++++ src/rendervulkan.cpp | 28 +++++++++++++++++++++++++--- src/rendervulkan.hpp | 15 +++++++++++++-- src/steamcompmgr.cpp | 5 ++++- 4 files changed, 46 insertions(+), 6 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index f62e82512f..800c37d6a0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -434,6 +434,10 @@ static void handle_signal( int sig ) } fprintf( stderr, "gamescope: Received %s signal, attempting shutdown!\n", strsignal(sig) ); + + if (vulkan_run_at_exit != nullptr) + (*vulkan_run_at_exit)(); + g_bRun = false; break; case SIGUSR1: diff --git a/src/rendervulkan.cpp b/src/rendervulkan.cpp index 6f34970052..faa089be3f 100644 --- a/src/rendervulkan.cpp +++ b/src/rendervulkan.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #if defined(__linux__) #include @@ -674,8 +675,6 @@ bool CVulkanDevice::createDevice() return true; } -VkDebugUtilsMessengerEXT debug_utils_messenger{VK_NULL_HANDLE}; - static VkSamplerYcbcrModelConversion colorspaceToYCBCRModel( EStreamColorspace colorspace ) { switch (colorspace) @@ -3315,11 +3314,16 @@ static bool init_nis_data() return true; } -static VKAPI_ATTR VkBool32 VKAPI_CALL debug_utils_messenger_callback +VKAPI_ATTR VkBool32 VKAPI_CALL debug_utils_messenger_callback (VkDebugUtilsMessageSeverityFlagBitsEXT message_severity , VkDebugUtilsMessageTypeFlagsEXT message_type , const VkDebugUtilsMessengerCallbackDataEXT *callback_data , void *user_data) { + if ( g_device.bWantToClearDebug.load(std::memory_order_relaxed) || g_device.debugEXT_clearFlag.test_and_set(std::memory_order_acquire)) { + g_device.debugEXT_clearFlag.notify_all(); + return VK_FALSE; + } + std::string s; for (uint32_t i = 0; i < callback_data->objectCount; i++) { const char * objname = callback_data->pObjects[i].pObjectName; @@ -3337,9 +3341,24 @@ static VKAPI_ATTR VkBool32 VKAPI_CALL debug_utils_messenger_callback { vk_log.errorf("%i - %s: %s\nobject name(s): %s", callback_data->messageIdNumber, callback_data->pMessageIdName, callback_data->pMessage, s.c_str()); } + + g_device.debugEXT_clearFlag.clear(); + g_device.debugEXT_clearFlag.notify_all(); return VK_FALSE; } +VkDebugUtilsMessengerEXT debug_utils_messenger{VK_NULL_HANDLE}; +void (*vulkan_run_at_exit)(void) = nullptr; + +void vulkan_clear_debugEXT() +{ + g_device.bWantToClearDebug.store(true, std::memory_order_relaxed); + if (g_device.debugEXT_clearFlag.test_and_set(std::memory_order_acquire)) + g_device.debugEXT_clearFlag.wait(true); + auto func = (PFN_vkDestroyDebugUtilsMessengerEXT) vkGetInstanceProcAddr(g_device.m_instance, "vkDestroyDebugUtilsMessengerEXT"); + func(g_device.m_instance, debug_utils_messenger, nullptr); +} + VkInstance vulkan_create_instance(const bool bShouldDebug ) { vulkanDebugEXT=bShouldDebug; @@ -3415,6 +3434,9 @@ VkInstance vulkan_create_instance(const bool bShouldDebug ) auto func = (PFN_vkCreateDebugUtilsMessengerEXT) vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT"); result = func(instance, &debug_utils_create_info, nullptr, &debug_utils_messenger); + if (result == VK_SUCCESS) + vulkan_run_at_exit = vulkan_clear_debugEXT; + } else { diff --git a/src/rendervulkan.hpp b/src/rendervulkan.hpp index 737e85b9c9..32d734ee61 100644 --- a/src/rendervulkan.hpp +++ b/src/rendervulkan.hpp @@ -704,6 +704,8 @@ constexpr T align(T what, U to) { return (what + to - 1) & ~(to - 1); } +extern void (*vulkan_run_at_exit)(void); + class CVulkanDevice { public: @@ -771,6 +773,8 @@ class CVulkanDevice void resetCmdBuffers(uint64_t sequence); + std::atomic bWantToClearDebug = false; + std::optional __attribute__((nothrow, visibility("protected"))) _SetName(uint64_t objectHandle = 0, const char * name = nullptr, VkObjectType objectType = VK_OBJECT_TYPE_UNKNOWN, const void * pNext = nullptr) noexcept { VkDebugUtilsObjectNameInfoEXT pNameInfo = { @@ -786,7 +790,7 @@ class CVulkanDevice inline std::optional SetName_impl(const bool cond=false, void ** ptr = nullptr, uint64_t objectHandle = 0, const char * name = nullptr, VkObjectType objectType = VK_OBJECT_TYPE_UNKNOWN, const void * pNext = nullptr) noexcept; - #define SetName(...)if (__builtin_expect(vulkanDebugEXT, 0)) {} else SetName_impl(vulkanDebugEXT == true && vulkanDebugExtSupported == true, ## __VA_ARGS__); + #define SetName(...) SetName_impl(vulkanDebugEXT == true && vulkanDebugExtSupported == true, ## __VA_ARGS__); #define _smark(name) #name #define smark(name) _smark(name) @@ -805,7 +809,12 @@ class CVulkanDevice protected: friend class CVulkanCmdBuffer; - + friend void vulkan_clear_debugEXT(); + friend VKAPI_ATTR VkBool32 VKAPI_CALL debug_utils_messenger_callback +(VkDebugUtilsMessageSeverityFlagBitsEXT message_severity + , VkDebugUtilsMessageTypeFlagsEXT message_type + , const VkDebugUtilsMessengerCallbackDataEXT *callback_data + , void *user_data); bool selectPhysDev(VkSurfaceKHR surface); bool createDevice(); bool createLayouts(); @@ -838,6 +847,8 @@ class CVulkanDevice bool m_bHasDrmPrimaryDevId = false; bool m_bSupportsModifiers = false; bool m_bInitialized = false; + + std::atomic_flag debugEXT_clearFlag = ATOMIC_FLAG_INIT; VkPhysicalDeviceMemoryProperties m_memoryProperties; diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp index 7c8d2eeafe..92914fcd77 100644 --- a/src/steamcompmgr.cpp +++ b/src/steamcompmgr.cpp @@ -6368,6 +6368,9 @@ error(Display *dpy, XErrorEvent *ev) [[noreturn]] static void steamcompmgr_exit(void) { + if ( vulkan_run_at_exit != nullptr ) + (*vulkan_run_at_exit)(); + g_ImageWaiter.Shutdown(); // Clean up any commits. @@ -6388,7 +6391,7 @@ steamcompmgr_exit(void) statsThreadRun = false; statsThreadSem.signal(); } - + sdlwindow_shutdown(); wlserver_lock(); From ff1c5ed00e58d15b92ef82bdb596b11e1f374582 Mon Sep 17 00:00:00 2001 From: sharkautarch <128002472+sharkautarch@users.noreply.github.com> Date: Mon, 22 Jan 2024 09:45:36 -0500 Subject: [PATCH 14/14] fix merge w/ master --- src/main.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 19b451f5bf..589e116d9e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -115,7 +115,7 @@ const struct option *gamescope_options = (struct option[]){ { "synchronous-x11", no_argument, nullptr, 0 }, { "debug-hud", no_argument, nullptr, 'v' }, { "debug-events", no_argument, nullptr, 0 }, - { "vulkan-debug-extension", no_argument, 0}, + { "vulkan-debug-extension", no_argument, 0}, { "steam", no_argument, nullptr, 'e' }, { "force-composition", no_argument, nullptr, 'c' }, { "composite-debug", no_argument, nullptr, 0 }, @@ -328,7 +328,7 @@ bool BIsSDLSession( void ) } -static bool initOutput(int preferredWidth, int preferredHeight, int preferredRefresh); +static bool initOutput(int preferredWidth, int preferredHeight, int preferredRefresh, bool vulkanDebugEXT = false); static void steamCompMgrThreadRun(int argc, char **argv); static std::string build_optstring(const struct option *options) @@ -780,8 +780,6 @@ int main(int argc, char **argv) } } - VkInstance instance = vulkan_create_instance(vulkanDebugEXT); - VkSurfaceKHR surface = VK_NULL_HANDLE; if ( !BIsNested() ) { g_bForceRelativeMouse = false; @@ -798,7 +796,7 @@ int main(int argc, char **argv) } #endif - if ( !initOutput( g_nPreferredOutputWidth, g_nPreferredOutputHeight, g_nNestedRefresh ) ) + if ( !initOutput( g_nPreferredOutputWidth, g_nPreferredOutputHeight, g_nNestedRefresh, vulkanDebugEXT ) ) { fprintf( stderr, "Failed to initialize output\n" ); return 1; @@ -922,9 +920,9 @@ static void steamCompMgrThreadRun(int argc, char **argv) pthread_kill( g_mainThread, SIGINT ); } -static bool initOutput( int preferredWidth, int preferredHeight, int preferredRefresh ) +static bool initOutput( int preferredWidth, int preferredHeight, int preferredRefresh, bool vulkanDebugEXT ) { - VkInstance instance = vulkan_create_instance(); + VkInstance instance = vulkan_create_instance(vulkanDebugEXT); if ( BIsNested() ) {