From d86f61cd82cd015bdb29ff9e176b0c2008343ba1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Sun, 20 Mar 2022 14:54:38 +0100 Subject: [PATCH] VulkanRenderer: Fix VK_EXT_debug_utils with MoltenVK --- .../Nazara/VulkanRenderer/Wrapper/Device.hpp | 3 +-- .../Nazara/VulkanRenderer/Wrapper/Device.inl | 23 +++++++++++-------- .../Wrapper/DeviceFunctions.hpp | 21 ++++++++++------- .../VulkanRenderer/Wrapper/Instance.hpp | 3 +-- .../VulkanRenderer/Wrapper/Instance.inl | 18 +++++++-------- src/Nazara/VulkanRenderer/Wrapper/Device.cpp | 7 +++--- 6 files changed, 42 insertions(+), 33 deletions(-) diff --git a/include/Nazara/VulkanRenderer/Wrapper/Device.hpp b/include/Nazara/VulkanRenderer/Wrapper/Device.hpp index a3de3e56b..4a1704c2e 100644 --- a/include/Nazara/VulkanRenderer/Wrapper/Device.hpp +++ b/include/Nazara/VulkanRenderer/Wrapper/Device.hpp @@ -58,6 +58,7 @@ namespace Nz inline VmaAllocator GetMemoryAllocator() const; inline VkPhysicalDevice GetPhysicalDevice() const; inline const Vk::PhysicalDevice& GetPhysicalDeviceInfo() const; + inline PFN_vkVoidFunction GetProcAddr(const char* name, bool allowInstanceFallback); QueueHandle GetQueue(UInt32 queueFamilyIndex, UInt32 queueIndex); inline bool IsExtensionLoaded(const std::string& extensionName); @@ -98,8 +99,6 @@ namespace Nz void ResetPointers(); void WaitAndDestroyDevice(); - inline PFN_vkVoidFunction GetProcAddr(const char* name); - struct InternalData; static constexpr std::size_t QueueCount = static_cast(QueueType::Max) + 1; diff --git a/include/Nazara/VulkanRenderer/Wrapper/Device.inl b/include/Nazara/VulkanRenderer/Wrapper/Device.inl index 61c9e861a..6b91c65c9 100644 --- a/include/Nazara/VulkanRenderer/Wrapper/Device.inl +++ b/include/Nazara/VulkanRenderer/Wrapper/Device.inl @@ -57,6 +57,20 @@ namespace Nz::Vk return *m_physicalDevice; } + inline PFN_vkVoidFunction Device::GetProcAddr(const char* name, bool allowInstanceFallback) + { + PFN_vkVoidFunction func = m_instance.GetDeviceProcAddr(m_device, name); + if (!func) + { + if (allowInstanceFallback) + return m_instance.GetProcAddr(name); + + NazaraError("Failed to get " + std::string(name) + " address"); + } + + return func; + } + inline bool Device::IsExtensionLoaded(const std::string& extensionName) { return m_loadedExtensions.count(extensionName) > 0; @@ -83,15 +97,6 @@ namespace Nz::Vk { return m_device; } - - inline PFN_vkVoidFunction Device::GetProcAddr(const char* name) - { - PFN_vkVoidFunction func = m_instance.GetDeviceProcAddr(m_device, name); - if (!func) - NazaraError("Failed to get " + std::string(name) + " address"); - - return func; - } } #include diff --git a/include/Nazara/VulkanRenderer/Wrapper/DeviceFunctions.hpp b/include/Nazara/VulkanRenderer/Wrapper/DeviceFunctions.hpp index ff0e4d64e..9afe0148a 100644 --- a/include/Nazara/VulkanRenderer/Wrapper/DeviceFunctions.hpp +++ b/include/Nazara/VulkanRenderer/Wrapper/DeviceFunctions.hpp @@ -16,6 +16,10 @@ #define NAZARA_VULKANRENDERER_DEVICE_EXT_END() #endif +#ifndef NAZARA_VULKANRENDERER_DEVICE_OR_INSTANCE_FUNCTION +#define NAZARA_VULKANRENDERER_DEVICE_OR_INSTANCE_FUNCTION(func) NAZARA_VULKANRENDERER_DEVICE_FUNCTION(func) +#endif + #ifndef NAZARA_VULKANRENDERER_INSTANCE_EXT_BEGIN #define NAZARA_VULKANRENDERER_INSTANCE_EXT_BEGIN(ext) #endif @@ -168,19 +172,20 @@ NAZARA_VULKANRENDERER_DEVICE_EXT_BEGIN(VK_KHR_swapchain) NAZARA_VULKANRENDERER_DEVICE_EXT_END() NAZARA_VULKANRENDERER_INSTANCE_EXT_BEGIN(VK_EXT_debug_utils) - NAZARA_VULKANRENDERER_DEVICE_FUNCTION(vkCmdBeginDebugUtilsLabelEXT) - NAZARA_VULKANRENDERER_DEVICE_FUNCTION(vkCmdEndDebugUtilsLabelEXT) - NAZARA_VULKANRENDERER_DEVICE_FUNCTION(vkCmdInsertDebugUtilsLabelEXT) - NAZARA_VULKANRENDERER_DEVICE_FUNCTION(vkQueueBeginDebugUtilsLabelEXT) - NAZARA_VULKANRENDERER_DEVICE_FUNCTION(vkQueueEndDebugUtilsLabelEXT) - NAZARA_VULKANRENDERER_DEVICE_FUNCTION(vkQueueInsertDebugUtilsLabelEXT) - NAZARA_VULKANRENDERER_DEVICE_FUNCTION(vkSetDebugUtilsObjectNameEXT) - NAZARA_VULKANRENDERER_DEVICE_FUNCTION(vkSetDebugUtilsObjectTagEXT) + NAZARA_VULKANRENDERER_DEVICE_OR_INSTANCE_FUNCTION(vkCmdBeginDebugUtilsLabelEXT) + NAZARA_VULKANRENDERER_DEVICE_OR_INSTANCE_FUNCTION(vkCmdEndDebugUtilsLabelEXT) + NAZARA_VULKANRENDERER_DEVICE_OR_INSTANCE_FUNCTION(vkCmdInsertDebugUtilsLabelEXT) + NAZARA_VULKANRENDERER_DEVICE_OR_INSTANCE_FUNCTION(vkQueueBeginDebugUtilsLabelEXT) + NAZARA_VULKANRENDERER_DEVICE_OR_INSTANCE_FUNCTION(vkQueueEndDebugUtilsLabelEXT) + NAZARA_VULKANRENDERER_DEVICE_OR_INSTANCE_FUNCTION(vkQueueInsertDebugUtilsLabelEXT) + NAZARA_VULKANRENDERER_DEVICE_OR_INSTANCE_FUNCTION(vkSetDebugUtilsObjectNameEXT) + NAZARA_VULKANRENDERER_DEVICE_OR_INSTANCE_FUNCTION(vkSetDebugUtilsObjectTagEXT) NAZARA_VULKANRENDERER_INSTANCE_EXT_END() #undef NAZARA_VULKANRENDERER_DEVICE_CORE_EXT_FUNCTION #undef NAZARA_VULKANRENDERER_DEVICE_EXT_BEGIN #undef NAZARA_VULKANRENDERER_DEVICE_EXT_END #undef NAZARA_VULKANRENDERER_DEVICE_FUNCTION +#undef NAZARA_VULKANRENDERER_DEVICE_OR_INSTANCE_FUNCTION #undef NAZARA_VULKANRENDERER_INSTANCE_EXT_BEGIN #undef NAZARA_VULKANRENDERER_INSTANCE_EXT_END diff --git a/include/Nazara/VulkanRenderer/Wrapper/Instance.hpp b/include/Nazara/VulkanRenderer/Wrapper/Instance.hpp index 09b643efb..b63252bcd 100644 --- a/include/Nazara/VulkanRenderer/Wrapper/Instance.hpp +++ b/include/Nazara/VulkanRenderer/Wrapper/Instance.hpp @@ -73,6 +73,7 @@ namespace Nz inline VkPhysicalDeviceMemoryProperties GetPhysicalDeviceMemoryProperties(VkPhysicalDevice device) const; inline VkPhysicalDeviceProperties GetPhysicalDeviceProperties(VkPhysicalDevice device) const; bool GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice device, std::vector* queueFamilyProperties) const; + inline PFN_vkVoidFunction GetProcAddr(const char* name) const; void InstallDebugMessageCallback(); @@ -95,8 +96,6 @@ namespace Nz void DestroyInstance(); void ResetPointers(); - inline PFN_vkVoidFunction GetProcAddr(const char* name) const; - struct InternalData; std::unique_ptr m_internalData; diff --git a/include/Nazara/VulkanRenderer/Wrapper/Instance.inl b/include/Nazara/VulkanRenderer/Wrapper/Instance.inl index 30d26b58e..14f37e8fc 100644 --- a/include/Nazara/VulkanRenderer/Wrapper/Instance.inl +++ b/include/Nazara/VulkanRenderer/Wrapper/Instance.inl @@ -68,6 +68,15 @@ namespace Nz return m_lastErrorCode; } + inline PFN_vkVoidFunction Instance::GetProcAddr(const char* name) const + { + PFN_vkVoidFunction func = Loader::GetInstanceProcAddr(m_instance, name); + if (!func) + NazaraError("Failed to get " + std::string(name) + " address"); + + return func; + } + inline bool Instance::IsExtensionLoaded(const std::string& extensionName) const { return m_loadedExtensions.count(extensionName) > 0; @@ -131,15 +140,6 @@ namespace Nz return properties; } - - inline PFN_vkVoidFunction Instance::GetProcAddr(const char* name) const - { - PFN_vkVoidFunction func = Loader::GetInstanceProcAddr(m_instance, name); - if (!func) - NazaraError("Failed to get " + std::string(name) + " address"); - - return func; - } } } diff --git a/src/Nazara/VulkanRenderer/Wrapper/Device.cpp b/src/Nazara/VulkanRenderer/Wrapper/Device.cpp index 8cfd90fb1..93e0f4c71 100644 --- a/src/Nazara/VulkanRenderer/Wrapper/Device.cpp +++ b/src/Nazara/VulkanRenderer/Wrapper/Device.cpp @@ -88,16 +88,17 @@ namespace Nz #define NAZARA_VULKANRENDERER_DEVICE_EXT_BEGIN(ext) if (IsExtensionLoaded(#ext)) { #define NAZARA_VULKANRENDERER_DEVICE_EXT_END() } -#define NAZARA_VULKANRENDERER_DEVICE_FUNCTION(func) func = reinterpret_cast(GetProcAddr(#func)); +#define NAZARA_VULKANRENDERER_DEVICE_FUNCTION(func) func = reinterpret_cast(GetProcAddr(#func, false)); +#define NAZARA_VULKANRENDERER_DEVICE_OR_INSTANCE_FUNCTION(func) func = reinterpret_cast(GetProcAddr(#func, true)); #define NAZARA_VULKANRENDERER_INSTANCE_EXT_BEGIN(ext) if (m_instance.IsExtensionLoaded(#ext)) { #define NAZARA_VULKANRENDERER_INSTANCE_EXT_END() } #define NAZARA_VULKANRENDERER_DEVICE_CORE_EXT_FUNCTION(func, coreVersion, suffix, extName) \ if (deviceVersion >= coreVersion) \ - func = reinterpret_cast(GetProcAddr(#func)); \ + func = reinterpret_cast(GetProcAddr(#func, false)); \ else if (IsExtensionLoaded("VK_" #suffix "_" #extName)) \ - func = reinterpret_cast(GetProcAddr(#func #suffix)); + func = reinterpret_cast(GetProcAddr(#func #suffix, false)); #include }