From 8be479b9d9e33ff5de9bc5febe9fdca488b3cd50 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Fri, 17 Mar 2023 14:05:34 +0100 Subject: [PATCH] Prevent multiple MessageBoxes on Windows on GL context fail There seems to be a chance of recursion according to real world reports when on Windows we use MessageBox(). Prevent this. Task-number: QTBUG-102846 Change-Id: Id0e7c12279b81ff32582e366ae5952f511ca0f98 Reviewed-by: Andy Nichols (cherry picked from commit 529ebd3fb0430288e5eee6df7ddb86e42ea66b0b) Reviewed-by: Qt Cherry-pick Bot (cherry picked from commit 0b26626159d29430477aa983b360e49399f027d8) --- src/quick/scenegraph/qsgrenderloop.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/quick/scenegraph/qsgrenderloop.cpp b/src/quick/scenegraph/qsgrenderloop.cpp index 8b8191d66b..29df961b06 100644 --- a/src/quick/scenegraph/qsgrenderloop.cpp +++ b/src/quick/scenegraph/qsgrenderloop.cpp @@ -258,6 +258,15 @@ void QSGRenderLoop::setInstance(QSGRenderLoop *instance) void QSGRenderLoop::handleContextCreationFailure(QQuickWindow *window) { + // Must always be called on the gui thread. + + // Guard for recursion; relevant due to the MessageBox() on Windows. + static QSet recurseGuard; + if (recurseGuard.contains(window)) + return; + + recurseGuard.insert(window); + QString translatedMessage; QString untranslatedMessage; QQuickWindowPrivate::rhiCreationFailureMessage(QSGRhiSupport::instance()->rhiBackendName(), @@ -278,6 +287,8 @@ void QSGRenderLoop::handleContextCreationFailure(QQuickWindow *window) #endif // Q_OS_WIN if (!signalEmitted) qFatal("%s", qPrintable(untranslatedMessage)); + + recurseGuard.remove(window); } #ifdef ENABLE_DEFAULT_BACKEND