From 6038d503c237e1b4e240e4310245c3855b0f6537 Mon Sep 17 00:00:00 2001 From: Themaister Date: Wed, 31 Aug 2022 19:02:53 +0200 Subject: [PATCH 1/5] Move over to VK_EXT_debug_utils. Debug marker is deprecated years ago. --- gfx/common/vulkan_common.c | 70 +++++++------------ gfx/common/vulkan_common.h | 2 +- .../include/vulkan/vulkan_symbol_wrapper.h | 23 ++---- .../vulkan/vulkan_symbol_wrapper.c | 12 ++-- 4 files changed, 38 insertions(+), 69 deletions(-) diff --git a/gfx/common/vulkan_common.c b/gfx/common/vulkan_common.c index 7eaa03f91e..3687cb8e18 100644 --- a/gfx/common/vulkan_common.c +++ b/gfx/common/vulkan_common.c @@ -80,43 +80,19 @@ static bool trigger_spurious_error(void) #ifdef VULKAN_DEBUG static VKAPI_ATTR VkBool32 VKAPI_CALL vulkan_debug_cb( - VkDebugReportFlagsEXT flags, - VkDebugReportObjectTypeEXT objectType, - uint64_t object, - size_t location, - int32_t messageCode, - const char *pLayerPrefix, - const char *pMessage, + VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, + VkDebugUtilsMessageTypeFlagsEXT messageType, + const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData, void *pUserData) { - (void)objectType; - (void)object; - (void)location; - (void)messageCode; + const char *name; (void)pUserData; - if (flags & VK_DEBUG_REPORT_ERROR_BIT_EXT) + if (messageSeverity == VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT && + messageType == VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT) { - RARCH_ERR("[Vulkan]: Error: %s: %s\n", - pLayerPrefix, pMessage); + RARCH_ERR("[Vulkan]: Validation Error: %s\n", pCallbackData->pMessage); } -#if 0 - else if (flags & VK_DEBUG_REPORT_WARNING_BIT_EXT) - { - RARCH_WARN("[Vulkan]: Warning: %s: %s\n", - pLayerPrefix, pMessage); - } - else if (flags & VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT) - { - RARCH_LOG("[Vulkan]: Performance warning: %s: %s\n", - pLayerPrefix, pMessage); - } - else - { - RARCH_LOG("[Vulkan]: Information: %s: %s\n", - pLayerPrefix, pMessage); - } -#endif return VK_FALSE; } @@ -1787,7 +1763,7 @@ bool vulkan_context_init(gfx_ctx_vulkan_data_t *vk, (struct retro_hw_render_context_negotiation_interface_vulkan*)video_driver_get_context_negotiation_interface(); #ifdef VULKAN_DEBUG static const char *instance_layers[] = { "VK_LAYER_KHRONOS_validation" }; - instance_extensions[ext_count++] = "VK_EXT_debug_report"; + instance_extensions[ext_count++] = "VK_EXT_debug_utils"; #endif if (iface && iface->interface_type != RETRO_HW_RENDER_CONTEXT_NEGOTIATION_INTERFACE_VULKAN) @@ -1923,24 +1899,29 @@ bool vulkan_context_init(gfx_ctx_vulkan_data_t *vk, #ifdef VULKAN_DEBUG VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_EXTENSION_SYMBOL(vk->context.instance, - vkCreateDebugReportCallbackEXT); + vkCreateDebugUtilsMessengerEXT); VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_EXTENSION_SYMBOL(vk->context.instance, - vkDebugReportMessageEXT); + vkDestroyDebugUtilsMessengerEXT); VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_EXTENSION_SYMBOL(vk->context.instance, - vkDestroyDebugReportCallbackEXT); + vkSetDebugUtilsObjectNameEXT); { - VkDebugReportCallbackCreateInfoEXT info = - { VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT }; - info.flags = - VK_DEBUG_REPORT_ERROR_BIT_EXT | - VK_DEBUG_REPORT_WARNING_BIT_EXT | - VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT; - info.pfnCallback = vulkan_debug_cb; + VkDebugUtilsMessengerCreateInfoEXT info = + { VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT }; + 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; + info.messageType = + VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | + VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT; + info.pfnUserCallback = vulkan_debug_cb; if (vk->context.instance) - vkCreateDebugReportCallbackEXT(vk->context.instance, &info, NULL, + { + vkCreateDebugUtilsMessengerEXT(vk->context.instance, &info, NULL, &vk->context.debug_callback); + } } RARCH_LOG("[Vulkan]: Enabling Vulkan debug layers.\n"); #endif @@ -1957,6 +1938,7 @@ bool vulkan_context_init(gfx_ctx_vulkan_data_t *vk, if (res != VK_SUCCESS) { RARCH_ERR("Failed to create Vulkan instance (%d).\n", res); + RARCH_ERR("If VULKAN_DEBUG=1 is enabled, make sure Vulkan validation layers are installed.\n"); return false; } @@ -2521,7 +2503,7 @@ void vulkan_context_destroy(gfx_ctx_vulkan_data_t *vk, #ifdef VULKAN_DEBUG if (vk->context.debug_callback) - vkDestroyDebugReportCallbackEXT(vk->context.instance, vk->context.debug_callback, NULL); + vkDestroyDebugUtilsMessengerEXT(vk->context.instance, vk->context.debug_callback, NULL); #endif if (video_driver_is_video_cache_context()) diff --git a/gfx/common/vulkan_common.h b/gfx/common/vulkan_common.h index 13d812ef28..ca4034d07f 100644 --- a/gfx/common/vulkan_common.h +++ b/gfx/common/vulkan_common.h @@ -140,7 +140,7 @@ typedef struct vulkan_context VkSemaphore swapchain_wait_semaphores[VULKAN_MAX_SWAPCHAIN_IMAGES]; #ifdef VULKAN_DEBUG - VkDebugReportCallbackEXT debug_callback; + VkDebugUtilsMessengerEXT debug_callback; #endif uint32_t graphics_queue_index; uint32_t num_swapchain_images; diff --git a/libretro-common/include/vulkan/vulkan_symbol_wrapper.h b/libretro-common/include/vulkan/vulkan_symbol_wrapper.h index 4b1ded0d4e..c3cc93d41e 100644 --- a/libretro-common/include/vulkan/vulkan_symbol_wrapper.h +++ b/libretro-common/include/vulkan/vulkan_symbol_wrapper.h @@ -317,22 +317,13 @@ extern PFN_vkCreateDisplayPlaneSurfaceKHR vulkan_symbol_wrapper_vkCreateDisplayP #define vkCreateDisplayPlaneSurfaceKHR vulkan_symbol_wrapper_vkCreateDisplayPlaneSurfaceKHR extern PFN_vkCreateSharedSwapchainsKHR vulkan_symbol_wrapper_vkCreateSharedSwapchainsKHR; #define vkCreateSharedSwapchainsKHR vulkan_symbol_wrapper_vkCreateSharedSwapchainsKHR -extern PFN_vkCreateDebugReportCallbackEXT vulkan_symbol_wrapper_vkCreateDebugReportCallbackEXT; -#define vkCreateDebugReportCallbackEXT vulkan_symbol_wrapper_vkCreateDebugReportCallbackEXT -extern PFN_vkDestroyDebugReportCallbackEXT vulkan_symbol_wrapper_vkDestroyDebugReportCallbackEXT; -#define vkDestroyDebugReportCallbackEXT vulkan_symbol_wrapper_vkDestroyDebugReportCallbackEXT -extern PFN_vkDebugReportMessageEXT vulkan_symbol_wrapper_vkDebugReportMessageEXT; -#define vkDebugReportMessageEXT vulkan_symbol_wrapper_vkDebugReportMessageEXT -extern PFN_vkDebugMarkerSetObjectTagEXT vulkan_symbol_wrapper_vkDebugMarkerSetObjectTagEXT; -#define vkDebugMarkerSetObjectTagEXT vulkan_symbol_wrapper_vkDebugMarkerSetObjectTagEXT -extern PFN_vkDebugMarkerSetObjectNameEXT vulkan_symbol_wrapper_vkDebugMarkerSetObjectNameEXT; -#define vkDebugMarkerSetObjectNameEXT vulkan_symbol_wrapper_vkDebugMarkerSetObjectNameEXT -extern PFN_vkCmdDebugMarkerBeginEXT vulkan_symbol_wrapper_vkCmdDebugMarkerBeginEXT; -#define vkCmdDebugMarkerBeginEXT vulkan_symbol_wrapper_vkCmdDebugMarkerBeginEXT -extern PFN_vkCmdDebugMarkerEndEXT vulkan_symbol_wrapper_vkCmdDebugMarkerEndEXT; -#define vkCmdDebugMarkerEndEXT vulkan_symbol_wrapper_vkCmdDebugMarkerEndEXT -extern PFN_vkCmdDebugMarkerInsertEXT vulkan_symbol_wrapper_vkCmdDebugMarkerInsertEXT; -#define vkCmdDebugMarkerInsertEXT vulkan_symbol_wrapper_vkCmdDebugMarkerInsertEXT + +extern PFN_vkCreateDebugUtilsMessengerEXT vulkan_symbol_wrapper_vkCreateDebugUtilsMessengerEXT; +#define vkCreateDebugUtilsMessengerEXT vulkan_symbol_wrapper_vkCreateDebugUtilsMessengerEXT +extern PFN_vkDestroyDebugUtilsMessengerEXT vulkan_symbol_wrapper_vkDestroyDebugUtilsMessengerEXT; +#define vkDestroyDebugUtilsMessengerEXT vulkan_symbol_wrapper_vkDestroyDebugUtilsMessengerEXT +extern PFN_vkSetDebugUtilsObjectNameEXT vulkan_symbol_wrapper_vkSetDebugUtilsObjectNameEXT; +#define vkSetDebugUtilsObjectNameEXT vulkan_symbol_wrapper_vkSetDebugUtilsObjectNameEXT void vulkan_symbol_wrapper_init(PFN_vkGetInstanceProcAddr get_instance_proc_addr); PFN_vkGetInstanceProcAddr vulkan_symbol_wrapper_instance_proc_addr(void); diff --git a/libretro-common/vulkan/vulkan_symbol_wrapper.c b/libretro-common/vulkan/vulkan_symbol_wrapper.c index 7fe13ea8b9..4cb4347075 100644 --- a/libretro-common/vulkan/vulkan_symbol_wrapper.c +++ b/libretro-common/vulkan/vulkan_symbol_wrapper.c @@ -156,14 +156,10 @@ PFN_vkCreateDisplayModeKHR vulkan_symbol_wrapper_vkCreateDisplayModeKHR; PFN_vkGetDisplayPlaneCapabilitiesKHR vulkan_symbol_wrapper_vkGetDisplayPlaneCapabilitiesKHR; PFN_vkCreateDisplayPlaneSurfaceKHR vulkan_symbol_wrapper_vkCreateDisplayPlaneSurfaceKHR; PFN_vkCreateSharedSwapchainsKHR vulkan_symbol_wrapper_vkCreateSharedSwapchainsKHR; -PFN_vkCreateDebugReportCallbackEXT vulkan_symbol_wrapper_vkCreateDebugReportCallbackEXT; -PFN_vkDestroyDebugReportCallbackEXT vulkan_symbol_wrapper_vkDestroyDebugReportCallbackEXT; -PFN_vkDebugReportMessageEXT vulkan_symbol_wrapper_vkDebugReportMessageEXT; -PFN_vkDebugMarkerSetObjectTagEXT vulkan_symbol_wrapper_vkDebugMarkerSetObjectTagEXT; -PFN_vkDebugMarkerSetObjectNameEXT vulkan_symbol_wrapper_vkDebugMarkerSetObjectNameEXT; -PFN_vkCmdDebugMarkerBeginEXT vulkan_symbol_wrapper_vkCmdDebugMarkerBeginEXT; -PFN_vkCmdDebugMarkerEndEXT vulkan_symbol_wrapper_vkCmdDebugMarkerEndEXT; -PFN_vkCmdDebugMarkerInsertEXT vulkan_symbol_wrapper_vkCmdDebugMarkerInsertEXT; + +PFN_vkCreateDebugUtilsMessengerEXT vulkan_symbol_wrapper_vkCreateDebugUtilsMessengerEXT; +PFN_vkDestroyDebugUtilsMessengerEXT vulkan_symbol_wrapper_vkDestroyDebugUtilsMessengerEXT; +PFN_vkSetDebugUtilsObjectNameEXT vulkan_symbol_wrapper_vkSetDebugUtilsObjectNameEXT; static PFN_vkGetInstanceProcAddr GetInstanceProcAddr; void vulkan_symbol_wrapper_init(PFN_vkGetInstanceProcAddr get_instance_proc_addr) From d9088dd2a9d9ee6b96376ed575b0de7bb7ddf610 Mon Sep 17 00:00:00 2001 From: Themaister Date: Wed, 31 Aug 2022 19:45:33 +0200 Subject: [PATCH 2/5] Add helpers to mark object names automatically. Can be trivially extended as required. --- gfx/common/vulkan_common.c | 34 ++++++++++++++++++++++++++++++++++ gfx/common/vulkan_common.h | 4 ++++ 2 files changed, 38 insertions(+) diff --git a/gfx/common/vulkan_common.c b/gfx/common/vulkan_common.c index 3687cb8e18..a9a43ccdef 100644 --- a/gfx/common/vulkan_common.c +++ b/gfx/common/vulkan_common.c @@ -358,6 +358,40 @@ static unsigned vulkan_num_miplevels(unsigned width, unsigned height) return levels; } +static void vulkan_debug_mark_object(VkDevice device, + VkObjectType object_type, uint64_t object_handle, const char *name, unsigned count) +{ + if (vkSetDebugUtilsObjectNameEXT) + { + char merged_name[1024]; + snprintf(merged_name, sizeof(merged_name), "%s (%u)", name, count); + + VkDebugUtilsObjectNameInfoEXT info = { VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT }; + info.objectType = object_type; + info.objectHandle = object_handle; + info.pObjectName = merged_name; + vkSetDebugUtilsObjectNameEXT(device, &info); + } +} + +void vulkan_debug_mark_buffer(VkDevice device, VkBuffer buffer) +{ + static unsigned object_count; + vulkan_debug_mark_object(device, VK_OBJECT_TYPE_BUFFER, (uint64_t)buffer, "marked buffer", ++object_count); +} + +void vulkan_debug_mark_image(VkDevice device, VkImage image) +{ + static unsigned object_count; + vulkan_debug_mark_object(device, VK_OBJECT_TYPE_IMAGE, (uint64_t)image, "marked image", ++object_count); +} + +void vulkan_debug_mark_memory(VkDevice device, VkDeviceMemory memory) +{ + static unsigned object_count; + vulkan_debug_mark_object(device, VK_OBJECT_TYPE_DEVICE_MEMORY, (uint64_t)memory, "marked memory", ++object_count); +} + struct vk_texture vulkan_create_texture(vk_t *vk, struct vk_texture *old, unsigned width, unsigned height, diff --git a/gfx/common/vulkan_common.h b/gfx/common/vulkan_common.h index ca4034d07f..d85263eff4 100644 --- a/gfx/common/vulkan_common.h +++ b/gfx/common/vulkan_common.h @@ -783,6 +783,10 @@ void vulkan_set_uniform_buffer( VkDeviceSize offset, VkDeviceSize range); +void vulkan_debug_mark_buffer(VkDevice device, VkBuffer buffer); +void vulkan_debug_mark_image(VkDevice device, VkImage image); +void vulkan_debug_mark_memory(VkDevice device, VkDeviceMemory memory); + RETRO_END_DECLS #endif From d6413f2a437a24b0b9f6d9a614b732fe52cb96cd Mon Sep 17 00:00:00 2001 From: Themaister Date: Wed, 31 Aug 2022 19:21:56 +0200 Subject: [PATCH 3/5] Automatically mark buffer/images/memory with names. --- gfx/common/vulkan_common.c | 12 +++++++++--- gfx/drivers/vulkan.c | 2 ++ gfx/drivers_shader/shader_vulkan.cpp | 5 +++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/gfx/common/vulkan_common.c b/gfx/common/vulkan_common.c index a9a43ccdef..67e989320e 100644 --- a/gfx/common/vulkan_common.c +++ b/gfx/common/vulkan_common.c @@ -377,19 +377,19 @@ static void vulkan_debug_mark_object(VkDevice device, void vulkan_debug_mark_buffer(VkDevice device, VkBuffer buffer) { static unsigned object_count; - vulkan_debug_mark_object(device, VK_OBJECT_TYPE_BUFFER, (uint64_t)buffer, "marked buffer", ++object_count); + vulkan_debug_mark_object(device, VK_OBJECT_TYPE_BUFFER, (uint64_t)buffer, "RetroArch buffer", ++object_count); } void vulkan_debug_mark_image(VkDevice device, VkImage image) { static unsigned object_count; - vulkan_debug_mark_object(device, VK_OBJECT_TYPE_IMAGE, (uint64_t)image, "marked image", ++object_count); + vulkan_debug_mark_object(device, VK_OBJECT_TYPE_IMAGE, (uint64_t)image, "RetroArch image", ++object_count); } void vulkan_debug_mark_memory(VkDevice device, VkDeviceMemory memory) { static unsigned object_count; - vulkan_debug_mark_object(device, VK_OBJECT_TYPE_DEVICE_MEMORY, (uint64_t)memory, "marked memory", ++object_count); + vulkan_debug_mark_object(device, VK_OBJECT_TYPE_DEVICE_MEMORY, (uint64_t)memory, "RetroArch memory", ++object_count); } struct vk_texture vulkan_create_texture(vk_t *vk, @@ -493,6 +493,7 @@ struct vk_texture vulkan_create_texture(vk_t *vk, if (type != VULKAN_TEXTURE_STAGING && type != VULKAN_TEXTURE_READBACK) { vkCreateImage(device, &info, NULL, &tex.image); + vulkan_debug_mark_image(device, tex.image); #if 0 vulkan_track_alloc(tex.image); #endif @@ -503,6 +504,7 @@ struct vk_texture vulkan_create_texture(vk_t *vk, /* Linear staging textures are not guaranteed to be supported, * use buffers instead. */ vkCreateBuffer(device, &buffer_info, NULL, &tex.buffer); + vulkan_debug_mark_buffer(device, tex.buffer); vkGetBufferMemoryRequirements(device, tex.buffer, &mem_reqs); } alloc.allocationSize = mem_reqs.size; @@ -548,6 +550,7 @@ struct vk_texture vulkan_create_texture(vk_t *vk, buffer_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; vkCreateBuffer(device, &buffer_info, NULL, &tex.buffer); + vulkan_debug_mark_buffer(device, tex.buffer); vkGetBufferMemoryRequirements(device, tex.buffer, &mem_reqs); alloc.allocationSize = mem_reqs.size; @@ -596,6 +599,7 @@ struct vk_texture vulkan_create_texture(vk_t *vk, else { vkAllocateMemory(device, &alloc, NULL, &tex.memory); + vulkan_debug_mark_memory(device, tex.memory); tex.memory_size = alloc.allocationSize; tex.memory_type = alloc.memoryTypeIndex; } @@ -1173,6 +1177,7 @@ struct vk_buffer vulkan_create_buffer( info.queueFamilyIndexCount = 0; info.pQueueFamilyIndices = NULL; vkCreateBuffer(context->device, &info, NULL, &buffer.buffer); + vulkan_debug_mark_buffer(context->device, buffer.buffer); vkGetBufferMemoryRequirements(context->device, buffer.buffer, &mem_reqs); @@ -1185,6 +1190,7 @@ struct vk_buffer vulkan_create_buffer( VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); vkAllocateMemory(context->device, &alloc, NULL, &buffer.memory); + vulkan_debug_mark_memory(context->device, buffer.memory); vkBindBufferMemory(context->device, buffer.buffer, buffer.memory, 0); buffer.size = size; diff --git a/gfx/drivers/vulkan.c b/gfx/drivers/vulkan.c index 08a4f387db..98c57f6b92 100644 --- a/gfx/drivers/vulkan.c +++ b/gfx/drivers/vulkan.c @@ -2816,6 +2816,7 @@ static bool vulkan_frame(void *data, const void *frame, image_info.initialLayout = VK_IMAGE_LAYOUT_GENERAL; /* VK_IMAGE_LAYOUT_UNDEFINED; */ vkCreateImage(vk->context->device, &image_info, NULL, &vk->main_buffer.image); + vulkan_debug_mark_image(vk->context->device, vk->main_buffer.image); vkGetImageMemoryRequirements(vk->context->device, vk->main_buffer.image, &mem_reqs); alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; alloc.pNext = NULL; @@ -2826,6 +2827,7 @@ static bool vulkan_frame(void *data, const void *frame, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); vkAllocateMemory(vk->context->device, &alloc, NULL, &vk->main_buffer.memory); + vulkan_debug_mark_memory(vk->context->device, vk->main_buffer.memory); vkBindImageMemory(vk->context->device, vk->main_buffer.image, vk->main_buffer.memory, 0); diff --git a/gfx/drivers_shader/shader_vulkan.cpp b/gfx/drivers_shader/shader_vulkan.cpp index 409a42f4f9..726030ebc2 100644 --- a/gfx/drivers_shader/shader_vulkan.cpp +++ b/gfx/drivers_shader/shader_vulkan.cpp @@ -845,6 +845,7 @@ static std::unique_ptr vulkan_filter_chain_load_lut( image_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; vkCreateImage(info->device, &image_info, nullptr, &tex); + vulkan_debug_mark_image(info->device, tex); vkGetImageMemoryRequirements(info->device, tex, &mem_reqs); alloc.allocationSize = mem_reqs.size; @@ -856,6 +857,7 @@ static std::unique_ptr vulkan_filter_chain_load_lut( if (vkAllocateMemory(info->device, &alloc, nullptr, &memory) != VK_SUCCESS) goto error; + vulkan_debug_mark_memory(info->device, memory); vkBindImageMemory(info->device, tex, memory, 0); view_info.image = tex; @@ -1703,6 +1705,7 @@ Buffer::Buffer(VkDevice device, | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); vkAllocateMemory(device, &alloc, NULL, &memory); + vulkan_debug_mark_memory(device, memory); vkBindBufferMemory(device, buffer, memory, 0); } @@ -2706,6 +2709,7 @@ void Framebuffer::init(DeferredDisposer *disposer) levels = info.mipLevels; vkCreateImage(device, &info, nullptr, &image); + vulkan_debug_mark_image(device, image); vkGetImageMemoryRequirements(device, image, &mem_reqs); @@ -2731,6 +2735,7 @@ void Framebuffer::init(DeferredDisposer *disposer) memory.size = mem_reqs.size; vkAllocateMemory(device, &alloc, nullptr, &memory.memory); + vulkan_debug_mark_memory(device, memory.memory); } vkBindImageMemory(device, image, memory.memory, 0); From f9eda02a74e2065536499d4954d10742f4ac8943 Mon Sep 17 00:00:00 2001 From: Themaister Date: Wed, 31 Aug 2022 19:35:48 +0200 Subject: [PATCH 4/5] Fix leak of HDR UBO buffer. --- gfx/drivers/vulkan.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gfx/drivers/vulkan.c b/gfx/drivers/vulkan.c index 98c57f6b92..be1ae68ee7 100644 --- a/gfx/drivers/vulkan.c +++ b/gfx/drivers/vulkan.c @@ -1159,7 +1159,8 @@ static void vulkan_free(void *data) vulkan_filter_chain_free((vulkan_filter_chain_t*)vk->filter_chain); #ifdef VULKAN_HDR_SWAPCHAIN - video_driver_unset_hdr_support(); + vulkan_destroy_buffer(vk->context->device, &vk->hdr.ubo); + video_driver_unset_hdr_support(); #endif /* VULKAN_HDR_SWAPCHAIN */ if (vk->ctx_driver && vk->ctx_driver->destroy) From f508a6a87fb360964b4ab2b3bf5c02209d722b68 Mon Sep 17 00:00:00 2001 From: Themaister Date: Wed, 31 Aug 2022 19:57:54 +0200 Subject: [PATCH 5/5] Fix some potential validation errors in HDR code. --- gfx/drivers/vulkan.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gfx/drivers/vulkan.c b/gfx/drivers/vulkan.c index be1ae68ee7..ed5869860c 100644 --- a/gfx/drivers/vulkan.c +++ b/gfx/drivers/vulkan.c @@ -2461,8 +2461,8 @@ static bool vulkan_frame(void *data, const void *frame, VULKAN_IMAGE_LAYOUT_TRANSITION(vk->cmd, vk->main_buffer.image, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, - VK_ACCESS_COLOR_ATTACHMENT_READ_BIT, VK_ACCESS_SHADER_READ_BIT, - VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, + VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT, + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); /* Begin render pass and set up viewport */ @@ -2495,7 +2495,7 @@ static bool vulkan_frame(void *data, const void *frame, image_info.sampler = vk->samplers.nearest; image_info.imageView = vk->main_buffer.view; - image_info.imageLayout = VK_IMAGE_LAYOUT_GENERAL; + image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; write.pNext = NULL; @@ -2814,7 +2814,7 @@ static bool vulkan_frame(void *data, const void *frame, image_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; image_info.queueFamilyIndexCount= 0; image_info.pQueueFamilyIndices = NULL; - image_info.initialLayout = VK_IMAGE_LAYOUT_GENERAL; /* VK_IMAGE_LAYOUT_UNDEFINED; */ + image_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; vkCreateImage(vk->context->device, &image_info, NULL, &vk->main_buffer.image); vulkan_debug_mark_image(vk->context->device, vk->main_buffer.image);