summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@qt.io>2022-03-09 15:21:32 +0100
committerLaszlo Agocs <laszlo.agocs@qt.io>2022-03-11 11:14:35 +0100
commit888b75aa12e2cf35ee760bcf5cb1ed60fe0c0770 (patch)
tree7878e4276ac00fc97eda2b82eb4bfa347a9ea40e /src
parentdfe5f991207dcc74868d41feae5bc2bbad277808 (diff)
vulkan: Try loading libvulkan.so.1 first
Change-Id: I876899fbfc126136f2842e9361e21ac10af8f14b Pick-to: 6.3 Fixes: QTBUG-101592 Reviewed-by: Andy Nichols <andy.nichols@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/gui/vulkan/qbasicvulkanplatforminstance.cpp40
-rw-r--r--src/gui/vulkan/qbasicvulkanplatforminstance_p.h4
-rw-r--r--src/plugins/platforms/vkkhrdisplay/qvkkhrdisplayvulkaninstance.cpp2
-rw-r--r--src/plugins/platforms/xcb/qxcbvulkaninstance.cpp2
4 files changed, 37 insertions, 11 deletions
diff --git a/src/gui/vulkan/qbasicvulkanplatforminstance.cpp b/src/gui/vulkan/qbasicvulkanplatforminstance.cpp
index 233f884ce6..dd39f71ba0 100644
--- a/src/gui/vulkan/qbasicvulkanplatforminstance.cpp
+++ b/src/gui/vulkan/qbasicvulkanplatforminstance.cpp
@@ -81,19 +81,45 @@ QBasicPlatformVulkanInstance::~QBasicPlatformVulkanInstance()
m_vkDestroyInstance(m_vkInst, nullptr);
}
-void QBasicPlatformVulkanInstance::loadVulkanLibrary(const QString &defaultLibraryName)
+void QBasicPlatformVulkanInstance::loadVulkanLibrary(const QString &defaultLibraryName, int defaultLibraryVersion)
{
+ QVarLengthArray<std::pair<QString, int>, 3> loadList;
+
+ // First in the list of libraries to try is the manual override, relevant on
+ // embedded systems without a Vulkan loader and possibly with custom vendor
+ // library names.
if (qEnvironmentVariableIsSet("QT_VULKAN_LIB"))
- m_vulkanLib.setFileName(QString::fromUtf8(qgetenv("QT_VULKAN_LIB")));
- else
- m_vulkanLib.setFileName(defaultLibraryName);
+ loadList.append({ QString::fromUtf8(qgetenv("QT_VULKAN_LIB")), -1 });
+
+ // Then what the platform specified. On Linux the version is likely 1, thus
+ // preferring libvulkan.so.1 over libvulkan.so.
+ loadList.append({ defaultLibraryName, defaultLibraryVersion });
+
+ // If there was a version given, we must still try without it if the first
+ // attempt fails, so that libvulkan.so is picked up if the .so.1 is not
+ // present on the system (so loaderless embedded systems still work).
+ if (defaultLibraryVersion >= 0)
+ loadList.append({ defaultLibraryName, -1 });
+
+ bool ok = false;
+ for (const auto &lib : loadList) {
+ m_vulkanLib.reset(new QLibrary);
+ if (lib.second >= 0)
+ m_vulkanLib->setFileNameAndVersion(lib.first, lib.second);
+ else
+ m_vulkanLib->setFileName(lib.first);
+ if (m_vulkanLib->load()) {
+ ok = true;
+ break;
+ }
+ }
- if (!m_vulkanLib.load()) {
- qWarning("Failed to load %s: %s", qPrintable(m_vulkanLib.fileName()), qPrintable(m_vulkanLib.errorString()));
+ if (!ok) {
+ qWarning("Failed to load %s: %s", qPrintable(m_vulkanLib->fileName()), qPrintable(m_vulkanLib->errorString()));
return;
}
- init(&m_vulkanLib);
+ init(m_vulkanLib.get());
}
void QBasicPlatformVulkanInstance::init(QLibrary *lib)
diff --git a/src/gui/vulkan/qbasicvulkanplatforminstance_p.h b/src/gui/vulkan/qbasicvulkanplatforminstance_p.h
index 0fdebd3870..a7c690c525 100644
--- a/src/gui/vulkan/qbasicvulkanplatforminstance_p.h
+++ b/src/gui/vulkan/qbasicvulkanplatforminstance_p.h
@@ -81,7 +81,7 @@ public:
const QList<QVulkanInstance::DebugFilter> *debugFilters() const { return &m_debugFilters; }
protected:
- void loadVulkanLibrary(const QString &defaultLibraryName);
+ void loadVulkanLibrary(const QString &defaultLibraryName, int defaultLibraryVersion = -1);
void init(QLibrary *lib);
void initInstance(QVulkanInstance *instance, const QByteArrayList &extraExts);
@@ -93,7 +93,7 @@ protected:
private:
void setupDebugOutput();
- QLibrary m_vulkanLib;
+ std::unique_ptr<QLibrary> m_vulkanLib;
bool m_ownsVkInst;
VkResult m_errorCode;
diff --git a/src/plugins/platforms/vkkhrdisplay/qvkkhrdisplayvulkaninstance.cpp b/src/plugins/platforms/vkkhrdisplay/qvkkhrdisplayvulkaninstance.cpp
index f6be2f3305..c670638b0d 100644
--- a/src/plugins/platforms/vkkhrdisplay/qvkkhrdisplayvulkaninstance.cpp
+++ b/src/plugins/platforms/vkkhrdisplay/qvkkhrdisplayvulkaninstance.cpp
@@ -44,7 +44,7 @@ QT_BEGIN_NAMESPACE
QVkKhrDisplayVulkanInstance::QVkKhrDisplayVulkanInstance(QVulkanInstance *instance)
: m_instance(instance)
{
- loadVulkanLibrary(QStringLiteral("vulkan"));
+ loadVulkanLibrary(QStringLiteral("vulkan"), 1);
}
void QVkKhrDisplayVulkanInstance::createOrAdoptInstance()
diff --git a/src/plugins/platforms/xcb/qxcbvulkaninstance.cpp b/src/plugins/platforms/xcb/qxcbvulkaninstance.cpp
index bb82bcec39..17d3320928 100644
--- a/src/plugins/platforms/xcb/qxcbvulkaninstance.cpp
+++ b/src/plugins/platforms/xcb/qxcbvulkaninstance.cpp
@@ -48,7 +48,7 @@ QXcbVulkanInstance::QXcbVulkanInstance(QVulkanInstance *instance)
m_getPhysDevPresSupport(nullptr),
m_createSurface(nullptr)
{
- loadVulkanLibrary(QStringLiteral("vulkan"));
+ loadVulkanLibrary(QStringLiteral("vulkan"), 1);
}
QXcbVulkanInstance::~QXcbVulkanInstance()