diff options
Diffstat (limited to 'src/gui/rhi')
-rw-r--r-- | src/gui/rhi/qrhi.cpp | 2 | ||||
-rw-r--r-- | src/gui/rhi/qrhid3d11.cpp | 2 | ||||
-rw-r--r-- | src/gui/rhi/qrhigles2.cpp | 2 | ||||
-rw-r--r-- | src/gui/rhi/qrhivulkan.cpp | 26 | ||||
-rw-r--r-- | src/gui/rhi/qrhivulkan_p_p.h | 5 |
5 files changed, 14 insertions, 23 deletions
diff --git a/src/gui/rhi/qrhi.cpp b/src/gui/rhi/qrhi.cpp index 83c1e8eaa2..868ce62da2 100644 --- a/src/gui/rhi/qrhi.cpp +++ b/src/gui/rhi/qrhi.cpp @@ -1252,7 +1252,7 @@ uint qHash(const QRhiVertexInputLayout &v, uint seed) Q_DECL_NOTHROW } #ifndef QT_NO_DEBUG_STREAM -template<typename T, int N> +template<typename T, qsizetype N> QDebug operator<<(QDebug dbg, const QVarLengthArray<T, N> &vla) { return QtPrivate::printSequentialContainer(dbg, "VLA", vla); diff --git a/src/gui/rhi/qrhid3d11.cpp b/src/gui/rhi/qrhid3d11.cpp index ed202958f3..0665304a19 100644 --- a/src/gui/rhi/qrhid3d11.cpp +++ b/src/gui/rhi/qrhid3d11.cpp @@ -4161,7 +4161,7 @@ bool QD3D11SwapChain::buildOrResize() qWarning("Failed to create D3D11 swapchain: %s", qPrintable(comErrorMessage(hr))); return false; } - rhiD->dxgiFactory->MakeWindowAssociation(hwnd, DXGI_MWA_NO_ALT_ENTER); + rhiD->dxgiFactory->MakeWindowAssociation(hwnd, DXGI_MWA_NO_WINDOW_CHANGES); } else { releaseBuffers(); const UINT count = useFlipDiscard ? BUFFER_COUNT : 1; diff --git a/src/gui/rhi/qrhigles2.cpp b/src/gui/rhi/qrhigles2.cpp index 395ae4b93f..227dace90f 100644 --- a/src/gui/rhi/qrhigles2.cpp +++ b/src/gui/rhi/qrhigles2.cpp @@ -289,8 +289,6 @@ QT_BEGIN_NAMESPACE #define GL_MAP_READ_BIT 0x0001 #endif -Q_DECLARE_LOGGING_CATEGORY(lcOpenGLProgramDiskCache) - /*! Constructs a new QRhiGles2InitParams. diff --git a/src/gui/rhi/qrhivulkan.cpp b/src/gui/rhi/qrhivulkan.cpp index 26c153afff..211ee195e5 100644 --- a/src/gui/rhi/qrhivulkan.cpp +++ b/src/gui/rhi/qrhivulkan.cpp @@ -1296,16 +1296,11 @@ bool QRhiVulkan::recreateSwapChain(QRhiSwapChain *swapChain) VkSurfaceCapabilitiesKHR surfaceCaps; vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physDev, swapChainD->surface, &surfaceCaps); quint32 reqBufferCount; - if (swapChainD->m_flags.testFlag(QRhiSwapChain::MinimalBufferCount)) { + if (swapChainD->m_flags.testFlag(QRhiSwapChain::MinimalBufferCount) || surfaceCaps.maxImageCount == 0) { reqBufferCount = qMax<quint32>(2, surfaceCaps.minImageCount); } else { - const quint32 maxBuffers = QVkSwapChain::MAX_BUFFER_COUNT; - if (surfaceCaps.maxImageCount) - reqBufferCount = qMax(qMin(surfaceCaps.maxImageCount, maxBuffers), surfaceCaps.minImageCount); - else - reqBufferCount = qMax<quint32>(2, surfaceCaps.minImageCount); + reqBufferCount = qMax(qMin<quint32>(surfaceCaps.maxImageCount, 3), surfaceCaps.minImageCount); } - VkSurfaceTransformFlagBitsKHR preTransform = (surfaceCaps.supportedTransforms & VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR) ? VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR @@ -1389,23 +1384,19 @@ bool QRhiVulkan::recreateSwapChain(QRhiSwapChain *swapChain) return false; } - if (actualSwapChainBufferCount > QVkSwapChain::MAX_BUFFER_COUNT) { - qWarning("Too many swapchain buffers (%u)", actualSwapChainBufferCount); - return false; - } if (actualSwapChainBufferCount != reqBufferCount) qCDebug(QRHI_LOG_INFO, "Actual swapchain buffer count is %u", actualSwapChainBufferCount); swapChainD->bufferCount = int(actualSwapChainBufferCount); - VkImage swapChainImages[QVkSwapChain::MAX_BUFFER_COUNT]; - err = vkGetSwapchainImagesKHR(dev, swapChainD->sc, &actualSwapChainBufferCount, swapChainImages); + QVarLengthArray<VkImage, QVkSwapChain::EXPECTED_MAX_BUFFER_COUNT> swapChainImages(actualSwapChainBufferCount); + err = vkGetSwapchainImagesKHR(dev, swapChainD->sc, &actualSwapChainBufferCount, swapChainImages.data()); if (err != VK_SUCCESS) { qWarning("Failed to get swapchain images: %d", err); return false; } - VkImage msaaImages[QVkSwapChain::MAX_BUFFER_COUNT]; - VkImageView msaaViews[QVkSwapChain::MAX_BUFFER_COUNT]; + QVarLengthArray<VkImage, QVkSwapChain::EXPECTED_MAX_BUFFER_COUNT> msaaImages(swapChainD->bufferCount); + QVarLengthArray<VkImageView, QVkSwapChain::EXPECTED_MAX_BUFFER_COUNT> msaaViews(swapChainD->bufferCount); if (swapChainD->samples > VK_SAMPLE_COUNT_1_BIT) { if (!createTransientImage(swapChainD->colorFormat, swapChainD->pixelSize, @@ -1413,8 +1404,8 @@ bool QRhiVulkan::recreateSwapChain(QRhiSwapChain *swapChain) VK_IMAGE_ASPECT_COLOR_BIT, swapChainD->samples, &swapChainD->msaaImageMem, - msaaImages, - msaaViews, + msaaImages.data(), + msaaViews.data(), swapChainD->bufferCount)) { qWarning("Failed to create transient image for MSAA color buffer"); @@ -1427,6 +1418,7 @@ bool QRhiVulkan::recreateSwapChain(QRhiSwapChain *swapChain) fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT; + swapChainD->imageRes.resize(swapChainD->bufferCount); for (int i = 0; i < swapChainD->bufferCount; ++i) { QVkSwapChain::ImageResources &image(swapChainD->imageRes[i]); image.image = swapChainImages[i]; diff --git a/src/gui/rhi/qrhivulkan_p_p.h b/src/gui/rhi/qrhivulkan_p_p.h index 62516e268d..d90b1d1364 100644 --- a/src/gui/rhi/qrhivulkan_p_p.h +++ b/src/gui/rhi/qrhivulkan_p_p.h @@ -587,7 +587,7 @@ struct QVkSwapChain : public QRhiSwapChain bool ensureSurface(); - static const quint32 MAX_BUFFER_COUNT = 3; + static const quint32 EXPECTED_MAX_BUFFER_COUNT = 4; QWindow *window = nullptr; QSize pixelSize; @@ -617,7 +617,8 @@ struct QVkSwapChain : public QRhiSwapChain ScImageUseTransferSource }; LastUse lastUse = ScImageUseNone; - } imageRes[MAX_BUFFER_COUNT]; + }; + QVarLengthArray<ImageResources, EXPECTED_MAX_BUFFER_COUNT> imageRes; struct FrameResources { VkFence imageFence = VK_NULL_HANDLE; |