From ebc626e5112b3493b2eeac8f79ca95b3a94604e0 Mon Sep 17 00:00:00 2001 From: rokuz Date: Wed, 29 Jan 2025 08:13:17 +0000 Subject: [PATCH] Check debug utils availability --- lvk/vulkan/VulkanClasses.cpp | 64 +++++++++++++++++++++++++----------- lvk/vulkan/VulkanUtils.cpp | 2 +- 2 files changed, 46 insertions(+), 20 deletions(-) diff --git a/lvk/vulkan/VulkanClasses.cpp b/lvk/vulkan/VulkanClasses.cpp index d93b98dae3d..0c79c723202 100644 --- a/lvk/vulkan/VulkanClasses.cpp +++ b/lvk/vulkan/VulkanClasses.cpp @@ -971,12 +971,14 @@ void lvk::VulkanImage::generateMipmap(VkCommandBuffer commandBuffer) const { const VkImageAspectFlags imageAspectFlags = getImageAspectFlags(); - const VkDebugUtilsLabelEXT utilsLabel = { - .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT, - .pLabelName = "Generate mipmaps", - .color = {1.0f, 0.75f, 1.0f, 1.0f}, - }; - vkCmdBeginDebugUtilsLabelEXT(commandBuffer, &utilsLabel); + if (vkCmdBeginDebugUtilsLabelEXT) { + const VkDebugUtilsLabelEXT utilsLabel = { + .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT, + .pLabelName = "Generate mipmaps", + .color = {1.0f, 0.75f, 1.0f, 1.0f}, + }; + vkCmdBeginDebugUtilsLabelEXT(commandBuffer, &utilsLabel); + } const VkImageLayout originalImageLayout = vkImageLayout_; @@ -1064,7 +1066,9 @@ void lvk::VulkanImage::generateMipmap(VkCommandBuffer commandBuffer) const { VK_PIPELINE_STAGE_TRANSFER_BIT, // srcStageMask VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, // dstStageMask VkImageSubresourceRange{imageAspectFlags, 0, numLevels_, 0, numLayers_}); - vkCmdEndDebugUtilsLabelEXT(commandBuffer); + if (vkCmdEndDebugUtilsLabelEXT) { + vkCmdEndDebugUtilsLabelEXT(commandBuffer); + } vkImageLayout_ = originalImageLayout; } @@ -1980,7 +1984,7 @@ void lvk::CommandBuffer::cmdDispatchThreadGroups(const Dimensions& threadgroupCo void lvk::CommandBuffer::cmdPushDebugGroupLabel(const char* label, uint32_t colorRGBA) const { LVK_ASSERT(label); - if (!label) { + if (!label || !vkCmdBeginDebugUtilsLabelEXT) { return; } const VkDebugUtilsLabelEXT utilsLabel = { @@ -1998,7 +2002,7 @@ void lvk::CommandBuffer::cmdPushDebugGroupLabel(const char* label, uint32_t colo void lvk::CommandBuffer::cmdInsertDebugEventLabel(const char* label, uint32_t colorRGBA) const { LVK_ASSERT(label); - if (!label) { + if (!label || !vkCmdInsertDebugUtilsLabelEXT) { return; } const VkDebugUtilsLabelEXT utilsLabel = { @@ -2014,6 +2018,9 @@ void lvk::CommandBuffer::cmdInsertDebugEventLabel(const char* label, uint32_t co } void lvk::CommandBuffer::cmdPopDebugGroupLabel() const { + if (!vkCmdEndDebugUtilsLabelEXT) { + return; + } vkCmdEndDebugUtilsLabelEXT(wrapper_->cmdBuf_); } @@ -3549,7 +3556,9 @@ lvk::VulkanContext::~VulkanContext() { // Device has to be destroyed prior to Instance vkDestroyDevice(vkDevice_, nullptr); - vkDestroyDebugUtilsMessengerEXT(vkInstance_, vkDebugUtilsMessenger_, nullptr); + if (vkDebugUtilsMessenger_ != VK_NULL_HANDLE) { + vkDestroyDebugUtilsMessengerEXT(vkInstance_, vkDebugUtilsMessenger_, nullptr); + } vkDestroyInstance(vkInstance_, nullptr); glslang_finalize_process(); @@ -5786,9 +5795,29 @@ void lvk::VulkanContext::createInstance() { }(); } + uint32_t count = 0; + VK_ASSERT(vkEnumerateInstanceExtensionProperties(nullptr, &count, nullptr)); + + std::vector allInstanceExtensions(count); + VK_ASSERT(vkEnumerateInstanceExtensionProperties(nullptr, &count, allInstanceExtensions.data())); + if (config_.enableValidation) { + for (const char *layer: kDefaultValidationLayers) { + uint32_t extCount = 0; + VK_ASSERT(vkEnumerateInstanceExtensionProperties(layer, &extCount, nullptr)); + if (extCount > 0) { + const auto sz = allInstanceExtensions.size(); + allInstanceExtensions.resize(sz + extCount); + VK_ASSERT(vkEnumerateInstanceExtensionProperties(layer, &extCount, + allInstanceExtensions.data() + sz)); + } + } + } + + // check if we have debug utils extension + const bool debugUtilsAvailable = hasExtension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME, allInstanceExtensions); + std::vector instanceExtensionNames = { VK_KHR_SURFACE_EXTENSION_NAME, - VK_EXT_DEBUG_UTILS_EXTENSION_NAME, #if defined(_WIN32) VK_KHR_WIN32_SURFACE_EXTENSION_NAME, #elif defined(VK_USE_PLATFORM_ANDROID_KHR) @@ -5808,6 +5837,10 @@ void lvk::VulkanContext::createInstance() { #endif }; + if (debugUtilsAvailable) { + instanceExtensionNames.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); + } + if (config_.enableValidation) { instanceExtensionNames.push_back(VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME); // enabled only for validation } @@ -5912,7 +5945,7 @@ void lvk::VulkanContext::createInstance() { volkLoadInstance(vkInstance_); // debug messenger - { + if (debugUtilsAvailable) { const VkDebugUtilsMessengerCreateInfoEXT ci = { .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, .messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT | @@ -5925,13 +5958,6 @@ void lvk::VulkanContext::createInstance() { VK_ASSERT(vkCreateDebugUtilsMessengerEXT(vkInstance_, &ci, nullptr, &vkDebugUtilsMessenger_)); } - uint32_t count = 0; - VK_ASSERT(vkEnumerateInstanceExtensionProperties(nullptr, &count, nullptr)); - - std::vector allInstanceExtensions(count); - - VK_ASSERT(vkEnumerateInstanceExtensionProperties(nullptr, &count, allInstanceExtensions.data())); - // log available instance extensions LLOGL("\nVulkan instance extensions:\n"); diff --git a/lvk/vulkan/VulkanUtils.cpp b/lvk/vulkan/VulkanUtils.cpp index be4279360c3..565dbc2db71 100644 --- a/lvk/vulkan/VulkanUtils.cpp +++ b/lvk/vulkan/VulkanUtils.cpp @@ -718,7 +718,7 @@ lvk::Result lvk::compileShader(VkShaderStageFlagBits stage, } VkResult lvk::setDebugObjectName(VkDevice device, VkObjectType type, uint64_t handle, const char* name) { - if (!name || !*name) { + if (!name || !*name || !vkSetDebugUtilsObjectNameEXT) { return VK_SUCCESS; } const VkDebugUtilsObjectNameInfoEXT ni = {