Add environment variables for customizing Vulkan

QT_VULKAN_INSTANCE_EXTENSIONS to specify additional
instance extensions.
QT_VULKAN_INSTANCE_LAYERS to specify additional
instance layers.
QT_VULKAN_DEVICE_EXTENSIONS to specify additional
device extensions.

These will apply to all QVulkanWindows and everything
that uses RHI, including Qt Quick with the Vulkan RHI
backend.

Task-number: QTBUG-80499
Change-Id: I912495affa987d62a9823d55d06d6a8209f6adc6
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
This commit is contained in:
Paul Olav Tvete 2019-12-13 14:18:11 +01:00
parent 6d201aa1bd
commit 908df199d0
3 changed files with 36 additions and 0 deletions

View File

@ -501,6 +501,17 @@ bool QRhiVulkan::create(QRhi::Flags flags)
} }
} }
QByteArrayList envExtList;
if (qEnvironmentVariableIsSet("QT_VULKAN_DEVICE_EXTENSIONS")) {
envExtList = qgetenv("QT_VULKAN_DEVICE_EXTENSIONS").split(';');
for (auto ext : requestedDevExts)
envExtList.removeAll(ext);
for (const QByteArray &ext : envExtList) {
if (!ext.isEmpty())
requestedDevExts.append(ext.constData());
}
}
VkDeviceCreateInfo devInfo; VkDeviceCreateInfo devInfo;
memset(&devInfo, 0, sizeof(devInfo)); memset(&devInfo, 0, sizeof(devInfo));
devInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; devInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;

View File

@ -689,6 +689,15 @@ void QVulkanWindowPrivate::init()
QVulkanInfoVector<QVulkanExtension> supportedExtensions = q->supportedDeviceExtensions(); QVulkanInfoVector<QVulkanExtension> supportedExtensions = q->supportedDeviceExtensions();
QByteArrayList reqExts = requestedDevExtensions; QByteArrayList reqExts = requestedDevExtensions;
reqExts.append("VK_KHR_swapchain"); reqExts.append("VK_KHR_swapchain");
QByteArray envExts = qgetenv("QT_VULKAN_DEVICE_EXTENSIONS");
if (!envExts.isEmpty()) {
QByteArrayList envExtList = envExts.split(';');
for (auto ext : reqExts)
envExtList.removeAll(ext);
reqExts.append(envExtList);
}
for (const QByteArray &ext : reqExts) { for (const QByteArray &ext : reqExts) {
if (supportedExtensions.contains(ext)) if (supportedExtensions.contains(ext))
devExts.append(ext.constData()); devExts.append(ext.constData());

View File

@ -214,6 +214,22 @@ void QBasicPlatformVulkanInstance::initInstance(QVulkanInstance *instance, const
for (const QByteArray &ext : extraExts) for (const QByteArray &ext : extraExts)
m_enabledExtensions.append(ext); m_enabledExtensions.append(ext);
QByteArray envExts = qgetenv("QT_VULKAN_INSTANCE_EXTENSIONS");
if (!envExts.isEmpty()) {
QByteArrayList envExtList = envExts.split(';');
for (auto ext : m_enabledExtensions)
envExtList.removeAll(ext);
m_enabledExtensions.append(envExtList);
}
QByteArray envLayers = qgetenv("QT_VULKAN_INSTANCE_LAYERS");
if (!envLayers.isEmpty()) {
QByteArrayList envLayerList = envLayers.split(';');
for (auto ext : m_enabledLayers)
envLayerList.removeAll(ext);
m_enabledLayers.append(envLayerList);
}
// No clever stuff with QSet and friends: the order for layers matters // No clever stuff with QSet and friends: the order for layers matters
// and the user-provided order must be kept. // and the user-provided order must be kept.
for (int i = 0; i < m_enabledLayers.count(); ++i) { for (int i = 0; i < m_enabledLayers.count(); ++i) {