From 5b334729d30d89ad7433f7051d94acb21a1938fb Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Fri, 15 Jul 2022 14:16:23 +0200 Subject: rhi: gl: Avoid magic adjustments to the context/window format ...by removing the entire adjustedFormat() helper. Qt Quick has never used this, which indicates it is not that useful. Same goes for Qt Multimedia or Qt 3D. Ensuring depth and stencil is requested is already solved by using QSurfaceFormat::setDefaultFormat() or by adjusting the formats everywhere as appropriate. The helper function's usages are in the manual tests that use it as a shortcut, and in the GL backend itself. Remove it and leave it up the client to set the depth or stencil buffer size, typically in the global default surface format. (which in fact many of the mentioned manual tests already did, so some of calls to window->setFormat(adjustedFormat()) were completely unnecessary) By not having the built-in magic that tries to always force depth and stencil, we avoid problems that arise then the helper cannot be easily invoked (thinking of widgets and backingstores), and so one ends up with unexpected stencil (or depth) in the context (where the GL backend auto-adjusts), but not in the window (which is not under QRhi's control). It was in practice possible to trigger EGL_BAD_MATCH failures with the new rhi-based widget composition on EGL-based systems. For example, if an application with a QOpenGLWidget did not set both depth and stencil (but only one, or none), it ended up failing due to the context - surface EGLConfig mismatches. On other platforms this matters less due to less strict config/pixelformat management. Pick-to: 6.4 Change-Id: I28ae2de163de63ee91bee3ceae08b58e106e1380 Fixes: QTBUG-104951 Reviewed-by: Andy Nichols --- tests/manual/rhi/hellominimalcrossgfxtriangle/window.cpp | 3 --- tests/manual/rhi/multiwindow/multiwindow.cpp | 12 +++++++----- .../manual/rhi/multiwindow_threaded/multiwindow_threaded.cpp | 4 ++++ tests/manual/rhi/multiwindow_threaded/window.cpp | 5 +---- tests/manual/rhi/shared/examplefw.h | 3 --- 5 files changed, 12 insertions(+), 15 deletions(-) (limited to 'tests/manual') diff --git a/tests/manual/rhi/hellominimalcrossgfxtriangle/window.cpp b/tests/manual/rhi/hellominimalcrossgfxtriangle/window.cpp index 2a3475538d..c75dd73908 100644 --- a/tests/manual/rhi/hellominimalcrossgfxtriangle/window.cpp +++ b/tests/manual/rhi/hellominimalcrossgfxtriangle/window.cpp @@ -11,9 +11,6 @@ Window::Window(QRhi::Implementation graphicsApi) switch (graphicsApi) { case QRhi::OpenGLES2: setSurfaceType(OpenGLSurface); -#if QT_CONFIG(opengl) - setFormat(QRhiGles2InitParams::adjustedFormat()); -#endif break; case QRhi::Vulkan: setSurfaceType(VulkanSurface); diff --git a/tests/manual/rhi/multiwindow/multiwindow.cpp b/tests/manual/rhi/multiwindow/multiwindow.cpp index 0240c21a2f..f25a68c621 100644 --- a/tests/manual/rhi/multiwindow/multiwindow.cpp +++ b/tests/manual/rhi/multiwindow/multiwindow.cpp @@ -268,17 +268,15 @@ Window::Window(const QString &title, const QColor &bgColor, int axis, bool noVSy switch (graphicsApi) { case OpenGL: { -#if QT_CONFIG(opengl) setSurfaceType(OpenGLSurface); - QSurfaceFormat fmt = QRhiGles2InitParams::adjustedFormat(); // default + depth/stencil - fmt.setSwapInterval(noVSync ? 0 : 1); // + swap interval + QSurfaceFormat fmt = QSurfaceFormat::defaultFormat(); + fmt.setSwapInterval(noVSync ? 0 : 1); setFormat(fmt); -#endif } break; case Vulkan: -#if QT_CONFIG(vulkan) setSurfaceType(VulkanSurface); +#if QT_CONFIG(vulkan) setVulkanInstance(r.instance); #endif break; @@ -511,6 +509,10 @@ int main(int argc, char **argv) qDebug("Selected graphics API is %s", qPrintable(graphicsApiName())); qDebug("This is a multi-api example, use command line arguments to override:\n%s", qPrintable(cmdLineParser.helpText())); + QSurfaceFormat fmt; + fmt.setDepthBufferSize(24); + QSurfaceFormat::setDefaultFormat(fmt); + #if QT_CONFIG(vulkan) r.instance = new QVulkanInstance; if (graphicsApi == Vulkan) { diff --git a/tests/manual/rhi/multiwindow_threaded/multiwindow_threaded.cpp b/tests/manual/rhi/multiwindow_threaded/multiwindow_threaded.cpp index 6546d122d2..ef690ca828 100644 --- a/tests/manual/rhi/multiwindow_threaded/multiwindow_threaded.cpp +++ b/tests/manual/rhi/multiwindow_threaded/multiwindow_threaded.cpp @@ -692,6 +692,10 @@ int main(int argc, char **argv) qDebug("Selected graphics API is %s", qPrintable(graphicsApiName())); qDebug("This is a multi-api example, use command line arguments to override:\n%s", qPrintable(cmdLineParser.helpText())); + QSurfaceFormat fmt; + fmt.setDepthBufferSize(24); + QSurfaceFormat::setDefaultFormat(fmt); + #if QT_CONFIG(vulkan) instance = new QVulkanInstance; if (graphicsApi == Vulkan) { diff --git a/tests/manual/rhi/multiwindow_threaded/window.cpp b/tests/manual/rhi/multiwindow_threaded/window.cpp index 9c0d5bfdf9..ea098b7f37 100644 --- a/tests/manual/rhi/multiwindow_threaded/window.cpp +++ b/tests/manual/rhi/multiwindow_threaded/window.cpp @@ -16,14 +16,11 @@ Window::Window(const QString &title, GraphicsApi api) { switch (api) { case OpenGL: -#if QT_CONFIG(opengl) setSurfaceType(OpenGLSurface); - setFormat(QRhiGles2InitParams::adjustedFormat()); -#endif break; case Vulkan: -#if QT_CONFIG(vulkan) setSurfaceType(VulkanSurface); +#if QT_CONFIG(vulkan) setVulkanInstance(instance); #endif break; diff --git a/tests/manual/rhi/shared/examplefw.h b/tests/manual/rhi/shared/examplefw.h index 33a7e4ea48..4f49084537 100644 --- a/tests/manual/rhi/shared/examplefw.h +++ b/tests/manual/rhi/shared/examplefw.h @@ -135,10 +135,7 @@ Window::Window() // Tell the platform plugin what we want. switch (graphicsApi) { case OpenGL: -#if QT_CONFIG(opengl) setSurfaceType(OpenGLSurface); - setFormat(QRhiGles2InitParams::adjustedFormat()); -#endif break; case Vulkan: setSurfaceType(VulkanSurface); -- cgit v1.2.3