From 4f1c64af05f09e3bd9cafe063721faa99a2b45d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C5=82a=C5=BCej=20Szczygie=C5=82?= Date: Sat, 21 Oct 2023 00:30:44 +0200 Subject: [PATCH] Vulkan: Load libvulkan.so.1 if Qt can't find libvulkan.so Closes #663 --- src/qmplay2/vulkan/VulkanInstance.cpp | 36 +++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/src/qmplay2/vulkan/VulkanInstance.cpp b/src/qmplay2/vulkan/VulkanInstance.cpp index 443dbedc2..9d33ef802 100644 --- a/src/qmplay2/vulkan/VulkanInstance.cpp +++ b/src/qmplay2/vulkan/VulkanInstance.cpp @@ -31,6 +31,10 @@ #include #include +#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) +# include +#endif + #if defined(Q_OS_WIN) # include #elif defined(Q_OS_LINUX) @@ -266,8 +270,36 @@ void Instance::init() VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME, }); - if (!m_qVulkanInstance->create()) - throw vk::InitializationFailedError("Can't create Vulkan instance"); +#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) + const bool maybeSetEnvVar = (QVersionNumber::fromString(qVersion()) < QVersionNumber(6, 3, 0) || QGuiApplication::platformName().contains("wayland")) && !qEnvironmentVariableIsSet("QT_VULKAN_LIB"); + + QtMessageHandler oldMsgHandler = nullptr; + if (maybeSetEnvVar) + oldMsgHandler = qInstallMessageHandler(nullptr); +#endif + + bool ok = m_qVulkanInstance->create(); + +#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) + if (maybeSetEnvVar && oldMsgHandler) + qInstallMessageHandler(oldMsgHandler); +#endif + + if (!ok) + { +#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) + if (maybeSetEnvVar) + { + qputenv("QT_VULKAN_LIB", "libvulkan.so.1"); + qDebug() << "Set QT_VULKAN_LIB to \"libvulkan.so.1\""; + ok = m_qVulkanInstance->create(); + } + if (!ok) +#endif + { + throw vk::InitializationFailedError("Can't create Vulkan instance"); + } + } #ifdef QT_DEBUG if (!m_qVulkanInstance->layers().contains("VK_LAYER_KHRONOS_validation"))