summaryrefslogtreecommitdiffstats
path: root/src/gui/rhi
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/rhi')
-rw-r--r--src/gui/rhi/qrhi.cpp2
-rw-r--r--src/gui/rhi/qrhid3d11.cpp2
-rw-r--r--src/gui/rhi/qrhigles2.cpp2
-rw-r--r--src/gui/rhi/qrhivulkan.cpp26
-rw-r--r--src/gui/rhi/qrhivulkan_p_p.h5
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;