diff options
Diffstat (limited to 'src/gui/vulkan/qvulkanwindow.cpp')
-rw-r--r-- | src/gui/vulkan/qvulkanwindow.cpp | 37 |
1 files changed, 33 insertions, 4 deletions
diff --git a/src/gui/vulkan/qvulkanwindow.cpp b/src/gui/vulkan/qvulkanwindow.cpp index cb89b0b1e6..e2baf298b9 100644 --- a/src/gui/vulkan/qvulkanwindow.cpp +++ b/src/gui/vulkan/qvulkanwindow.cpp @@ -195,6 +195,23 @@ Q_LOGGING_CATEGORY(lcGuiVk, "qt.vulkan") \note QVulkanWindow does not expose device layers since this functionality has been deprecated since version 1.0.13 of the Vulkan API. + \section1 Layers, device features, and extensions + + To enable instance layers, call QVulkanInstance::setLayers() before creating + the QVulkanInstance. To query what instance layer are available, call + QVulkanInstance::supportedLayers(). + + To enable device extensions, call setDeviceExtensions() early on when setting + up the QVulkanWindow. To query what device extensions are available, call + supportedDeviceExtensions(). + + Specifying an unsupported layer or extension is handled gracefully: this will + not fail instance or device creation, but the layer or extension request is + rather ignored. + + When it comes to device features, QVulkanWindow enables all Vulkan 1.0 + features that are reported as supported from vkGetPhysicalDeviceFeatures(). + \sa QVulkanInstance, QWindow */ @@ -712,6 +729,14 @@ void QVulkanWindowPrivate::init() devInfo.enabledExtensionCount = devExts.count(); devInfo.ppEnabledExtensionNames = devExts.constData(); + // Enable all supported 1.0 core features, except ones that likely + // involve a performance penalty. + VkPhysicalDeviceFeatures features; + memset(&features, 0, sizeof(features)); + f->vkGetPhysicalDeviceFeatures(physDev, &features); + features.robustBufferAccess = VK_FALSE; + devInfo.pEnabledFeatures = &features; + // Device layers are not supported by QVulkanWindow since that's an already deprecated // API. However, have a workaround for systems with older API and layers (f.ex. L4T // 24.2 for the Jetson TX1 provides API 1.0.13 and crashes when the validation layer @@ -1043,9 +1068,11 @@ void QVulkanWindowPrivate::recreateSwapChain() VkPhysicalDevice physDev = physDevs.at(physDevIndex); VkSurfaceCapabilitiesKHR surfaceCaps; vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physDev, surface, &surfaceCaps); - uint32_t reqBufferCount = swapChainBufferCount; - if (surfaceCaps.maxImageCount) - reqBufferCount = qBound(surfaceCaps.minImageCount, reqBufferCount, surfaceCaps.maxImageCount); + uint32_t reqBufferCount; + if (surfaceCaps.maxImageCount == 0) + reqBufferCount = qMax<uint32_t>(2, surfaceCaps.minImageCount); + else + reqBufferCount = qMax(qMin<uint32_t>(surfaceCaps.maxImageCount, 3), surfaceCaps.minImageCount); VkExtent2D bufferSize = surfaceCaps.currentExtent; if (bufferSize.width == uint32_t(-1)) { @@ -2018,7 +2045,7 @@ void QVulkanWindowPrivate::endFrame() // order to circumvent driver frame callbacks inst->presentAboutToBeQueued(q); - err = vkQueuePresentKHR(gfxQueue, &presInfo); + err = vkQueuePresentKHR(presQueue, &presInfo); if (err != VK_SUCCESS) { if (err == VK_ERROR_OUT_OF_DATE_KHR) { recreateSwapChain(); @@ -2727,3 +2754,5 @@ QMatrix4x4 QVulkanWindow::clipCorrectionMatrix() } QT_END_NAMESPACE + +#include "moc_qvulkanwindow.cpp" |