From 8197da007e88a2dc53898b03163abe11405f3d64 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Tue, 9 Aug 2022 12:19:59 +0200 Subject: rhi: vulkan: Adjust API version based on the physical device Change-Id: I453d0dc12dbe86cf2153888f84b72c748ef47296 Reviewed-by: Qt CI Bot Reviewed-by: Andy Nichols --- src/gui/rhi/qrhivulkan.cpp | 27 +++++++++++++++++++-------- src/gui/rhi/qrhivulkan_p_p.h | 4 +--- 2 files changed, 20 insertions(+), 11 deletions(-) (limited to 'src/gui/rhi') diff --git a/src/gui/rhi/qrhivulkan.cpp b/src/gui/rhi/qrhivulkan.cpp index e803e38056..eddb7f9782 100644 --- a/src/gui/rhi/qrhivulkan.cpp +++ b/src/gui/rhi/qrhivulkan.cpp @@ -388,10 +388,6 @@ bool QRhiVulkan::create(QRhi::Flags flags) f = inst->functions(); - caps.vulkan11OrHigher = inst->apiVersion() >= QVersionNumber(1, 1); - caps.vulkan12OrHigher = inst->apiVersion() >= QVersionNumber(1, 2); - caps.vulkan13OrHigher = inst->apiVersion() >= QVersionNumber(1, 3); - rhiFlags = flags; QList queueFamilyProps; @@ -473,6 +469,21 @@ bool QRhiVulkan::create(QRhi::Flags flags) physDevProperties.deviceType); } + caps.apiVersion = inst->apiVersion(); + + // Check the physical device API version against the instance API version, + // they do not have to match, which means whatever version was set in the + // QVulkanInstance may not be legally used with a given device if the + // physical device has a lower version. + const QVersionNumber physDevApiVersion(VK_VERSION_MAJOR(physDevProperties.apiVersion), + VK_VERSION_MINOR(physDevProperties.apiVersion)); // patch version left out intentionally + if (physDevApiVersion < caps.apiVersion) { + qCDebug(QRHI_LOG_INFO) << "Instance has api version" << caps.apiVersion + << "whereas the chosen physical device has" << physDevApiVersion + << "- restricting to the latter"; + caps.apiVersion = physDevApiVersion; + } + driverInfoStruct.deviceName = QByteArray(physDevProperties.deviceName); driverInfoStruct.deviceId = physDevProperties.deviceID; driverInfoStruct.vendorId = physDevProperties.vendorID; @@ -611,11 +622,11 @@ bool QRhiVulkan::create(QRhi::Flags flags) features13.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES; #endif - if (caps.vulkan12OrHigher) { + if (caps.apiVersion >= QVersionNumber(1, 2)) { physDevFeatures2.pNext = &features11; features11.pNext = &features12; #ifdef VK_VERSION_1_3 - if (caps.vulkan13OrHigher) + if (caps.apiVersion >= QVersionNumber(1, 3)) features12.pNext = &features13; #endif f->vkGetPhysicalDeviceFeatures2(physDev, &physDevFeatures2); @@ -694,7 +705,7 @@ bool QRhiVulkan::create(QRhi::Flags flags) caps.wideLines = physDevFeatures.wideLines; - caps.texture3DSliceAs2D = caps.vulkan11OrHigher; + caps.texture3DSliceAs2D = caps.apiVersion >= QVersionNumber(1, 1); caps.tessellation = physDevFeatures.tessellationShader; caps.geometryShader = physDevFeatures.geometryShader; @@ -7047,7 +7058,7 @@ bool QVkGraphicsPipeline::create() // still have it working with both APIs. This requires Vulkan 1.1 (or // VK_KHR_maintenance2 but don't bother with that). #ifdef VK_VERSION_1_1 - if (rhiD->caps.vulkan11OrHigher) { + if (rhiD->caps.apiVersion >= QVersionNumber(1, 1)) { memset(&originInfo, 0, sizeof(originInfo)); originInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO; originInfo.domainOrigin = VK_TESSELLATION_DOMAIN_ORIGIN_LOWER_LEFT; diff --git a/src/gui/rhi/qrhivulkan_p_p.h b/src/gui/rhi/qrhivulkan_p_p.h index fd981fffa6..5785762859 100644 --- a/src/gui/rhi/qrhivulkan_p_p.h +++ b/src/gui/rhi/qrhivulkan_p_p.h @@ -854,11 +854,9 @@ public: bool vertexAttribDivisor = false; bool texture3DSliceAs2D = false; bool tessellation = false; - bool vulkan11OrHigher = false; bool geometryShader = false; bool nonFillPolygonMode = false; - bool vulkan12OrHigher = false; - bool vulkan13OrHigher = false; + QVersionNumber apiVersion; } caps; VkPipelineCache pipelineCache = VK_NULL_HANDLE; -- cgit v1.2.3