diff options
author | Laszlo Agocs <laszlo.agocs@qt.io> | 2019-11-27 14:10:38 +0100 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2019-11-28 13:44:16 +0100 |
commit | d4cab2523cae58bd864770552da0332afe45585c (patch) | |
tree | 077b78e2061a7598f4bb3cdafd524d1f6d82e9ed /src | |
parent | a6fe62fcb4ee219cdf0ddea7936545785d896015 (diff) |
Make the initialization failure dialog sensible with QRhi
So on Windows one now gets a message box with a reasonable message,
instead of the OpenGL nonsense. Then the application closes when pressing
Abort etc.
On other platforms there is a qFatal, printing the same message.
Involves simplifying the OpenGL version a bit since passing isES type of
flags through multiple layers is not justified here.
Task-number: QTBUG-80365
Change-Id: Ie3ea1e9395a283f7e95eda78c1d3894797ff0acf
Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/quick/items/qquickwindow.cpp | 17 | ||||
-rw-r--r-- | src/quick/items/qquickwindow_p.h | 6 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgrenderloop.cpp | 19 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgrenderloop_p.h | 2 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgrhisupport.cpp | 44 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgrhisupport_p.h | 1 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgthreadedrenderloop.cpp | 3 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgwindowsrenderloop.cpp | 3 | ||||
-rw-r--r-- | src/quickwidgets/qquickwidget.cpp | 7 | ||||
-rw-r--r-- | src/quickwidgets/qquickwidget_p.h | 2 |
10 files changed, 59 insertions, 45 deletions
diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index d927e27af8..4d52373b88 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -1769,7 +1769,7 @@ bool QQuickWindow::event(QEvent *e) if (e->type() == QEvent::Type(QQuickWindowPrivate::FullUpdateRequest)) update(); else if (e->type() == QEvent::Type(QQuickWindowPrivate::TriggerContextCreationFailure)) - d->windowManager->handleContextCreationFailure(this, false); + d->windowManager->handleContextCreationFailure(this); return QWindow::event(e); } @@ -3256,10 +3256,9 @@ bool QQuickWindowPrivate::isRenderable() const void QQuickWindowPrivate::contextCreationFailureMessage(const QSurfaceFormat &format, QString *translatedMessage, - QString *untranslatedMessage, - bool isEs) + QString *untranslatedMessage) { - const QString contextType = QLatin1String(isEs ? "EGL" : "OpenGL"); + const QString contextType = QLatin1String("OpenGL"); QString formatStr; QDebug(&formatStr) << format; #if defined(Q_OS_WIN32) @@ -3284,6 +3283,16 @@ void QQuickWindowPrivate::contextCreationFailureMessage(const QSurfaceFormat &fo #endif // !Q_OS_WIN32 } +void QQuickWindowPrivate::rhiCreationFailureMessage(const QString &backendName, + QString *translatedMessage, + QString *untranslatedMessage) +{ + const char msg[] = QT_TRANSLATE_NOOP("QQuickWindow", + "Failed to initialize graphics backend for %1."); + *translatedMessage = QQuickWindow::tr(msg).arg(backendName); + *untranslatedMessage = QString::fromLatin1(msg).arg(backendName); +} + #if QT_DEPRECATED_SINCE(5, 8) // ### Qt6: remove diff --git a/src/quick/items/qquickwindow_p.h b/src/quick/items/qquickwindow_p.h index ace8d627e1..ef10ba3fe8 100644 --- a/src/quick/items/qquickwindow_p.h +++ b/src/quick/items/qquickwindow_p.h @@ -301,8 +301,10 @@ public: static void contextCreationFailureMessage(const QSurfaceFormat &format, QString *translatedMessage, - QString *untranslatedMessage, - bool isEs); + QString *untranslatedMessage); + static void rhiCreationFailureMessage(const QString &backendName, + QString *translatedMessage, + QString *untranslatedMessage); static void emitBeforeRenderPassRecording(void *ud); static void emitAfterRenderPassRecording(void *ud); diff --git a/src/quick/scenegraph/qsgrenderloop.cpp b/src/quick/scenegraph/qsgrenderloop.cpp index 5be7fbefe3..fb460f28d6 100644 --- a/src/quick/scenegraph/qsgrenderloop.cpp +++ b/src/quick/scenegraph/qsgrenderloop.cpp @@ -324,15 +324,19 @@ void QSGRenderLoop::setInstance(QSGRenderLoop *instance) s_instance = instance; } -void QSGRenderLoop::handleContextCreationFailure(QQuickWindow *window, - bool isEs) +void QSGRenderLoop::handleContextCreationFailure(QQuickWindow *window) { QString translatedMessage; QString untranslatedMessage; - QQuickWindowPrivate::contextCreationFailureMessage(window->requestedFormat(), + if (QSGRhiSupport::instance()->isRhiEnabled()) { + QQuickWindowPrivate::rhiCreationFailureMessage(QSGRhiSupport::instance()->rhiBackendName(), &translatedMessage, - &untranslatedMessage, - isEs); + &untranslatedMessage); + } else { + QQuickWindowPrivate::contextCreationFailureMessage(window->requestedFormat(), + &translatedMessage, + &untranslatedMessage); + } // If there is a slot connected to the error signal, emit it and leave it to // the application to do something with the message. If nothing is connected, // show a message on our own and terminate. @@ -551,7 +555,7 @@ void QSGGuiThreadRenderLoop::renderWindow(QQuickWindow *window) } else { if (!data.rhiDeviceLost) { data.rhiDoomed = true; - handleContextCreationFailure(window, false); + handleContextCreationFailure(window); } // otherwise no error, will retry on a subsequent rendering attempt } @@ -562,10 +566,9 @@ void QSGGuiThreadRenderLoop::renderWindow(QQuickWindow *window) if (qt_gl_global_share_context()) gl->setShareContext(qt_gl_global_share_context()); if (!gl->create()) { - const bool isEs = gl->isOpenGLES(); delete gl; gl = nullptr; - handleContextCreationFailure(window, isEs); + handleContextCreationFailure(window); } else { if (!offscreenSurface) { offscreenSurface = new QOffscreenSurface; diff --git a/src/quick/scenegraph/qsgrenderloop_p.h b/src/quick/scenegraph/qsgrenderloop_p.h index e720a3636b..9fd0ab02f5 100644 --- a/src/quick/scenegraph/qsgrenderloop_p.h +++ b/src/quick/scenegraph/qsgrenderloop_p.h @@ -112,7 +112,7 @@ public: static void cleanup(); - void handleContextCreationFailure(QQuickWindow *window, bool isEs); + void handleContextCreationFailure(QQuickWindow *window); Q_SIGNALS: void timeToIncubate(); diff --git a/src/quick/scenegraph/qsgrhisupport.cpp b/src/quick/scenegraph/qsgrhisupport.cpp index 38c2ef9612..afcfa53e83 100644 --- a/src/quick/scenegraph/qsgrhisupport.cpp +++ b/src/quick/scenegraph/qsgrhisupport.cpp @@ -185,29 +185,10 @@ void QSGRhiSupport::applySettings() if (m_killDeviceFrameCount > 0 && m_rhiBackend == QRhi::D3D11) qDebug("Graphics device will be reset every %d frames", m_killDeviceFrameCount); - const char *backendName = "unknown"; - switch (m_rhiBackend) { - case QRhi::Null: - backendName = "Null"; - break; - case QRhi::Vulkan: - backendName = "Vulkan"; - break; - case QRhi::OpenGLES2: - backendName = "OpenGL"; - break; - case QRhi::D3D11: - backendName = "D3D11"; - break; - case QRhi::Metal: - backendName = "Metal"; - break; - default: - break; - } + const QString backendName = rhiBackendName(); qCDebug(QSG_LOG_INFO, "Using QRhi with backend %s\n graphics API debug/validation layers: %d\n QRhi profiling and debug markers: %d", - backendName, m_debugLayer, m_profile); + qPrintable(backendName), m_debugLayer, m_profile); if (m_preferSoftwareRenderer) qCDebug(QSG_LOG_INFO, "Prioritizing software renderers"); } @@ -247,6 +228,27 @@ QSGRhiSupport *QSGRhiSupport::instance() return inst; } +QString QSGRhiSupport::rhiBackendName() const +{ + if (m_enableRhi) { + switch (m_rhiBackend) { + case QRhi::Null: + return QLatin1String("Null"); + case QRhi::Vulkan: + return QLatin1String("Vulkan"); + case QRhi::OpenGLES2: + return QLatin1String("OpenGL"); + case QRhi::D3D11: + return QLatin1String("D3D11"); + case QRhi::Metal: + return QLatin1String("Metal"); + default: + return QLatin1String("Unknown"); + } + } + return QLatin1String("Unknown (RHI not enabled)"); +} + QSGRendererInterface::GraphicsApi QSGRhiSupport::graphicsApi() const { if (!m_enableRhi) diff --git a/src/quick/scenegraph/qsgrhisupport_p.h b/src/quick/scenegraph/qsgrhisupport_p.h index 11693051d4..0a95a09ad2 100644 --- a/src/quick/scenegraph/qsgrhisupport_p.h +++ b/src/quick/scenegraph/qsgrhisupport_p.h @@ -109,6 +109,7 @@ public: bool isRhiEnabled() const { return m_enableRhi; } QRhi::Implementation rhiBackend() const { return m_rhiBackend; } + QString rhiBackendName() const; QSGRendererInterface::GraphicsApi graphicsApi() const; bool isDebugLayerRequested() const { return m_debugLayer; } diff --git a/src/quick/scenegraph/qsgthreadedrenderloop.cpp b/src/quick/scenegraph/qsgthreadedrenderloop.cpp index 6f842e59c5..36ef0cc218 100644 --- a/src/quick/scenegraph/qsgthreadedrenderloop.cpp +++ b/src/quick/scenegraph/qsgthreadedrenderloop.cpp @@ -1310,10 +1310,9 @@ void QSGThreadedRenderLoop::handleExposure(QQuickWindow *window) w->thread->gl->setFormat(w->window->requestedFormat()); w->thread->gl->setScreen(w->window->screen()); if (!w->thread->gl->create()) { - const bool isEs = w->thread->gl->isOpenGLES(); delete w->thread->gl; w->thread->gl = nullptr; - handleContextCreationFailure(w->window, isEs); + handleContextCreationFailure(w->window); return; } diff --git a/src/quick/scenegraph/qsgwindowsrenderloop.cpp b/src/quick/scenegraph/qsgwindowsrenderloop.cpp index 5b48b86568..b1c9b71c05 100644 --- a/src/quick/scenegraph/qsgwindowsrenderloop.cpp +++ b/src/quick/scenegraph/qsgwindowsrenderloop.cpp @@ -180,10 +180,9 @@ void QSGWindowsRenderLoop::show(QQuickWindow *window) m_gl->setShareContext(qt_gl_global_share_context()); bool created = m_gl->create(); if (!created) { - const bool isEs = m_gl->isOpenGLES(); delete m_gl; m_gl = nullptr; - handleContextCreationFailure(window, isEs); + handleContextCreationFailure(window); return; } diff --git a/src/quickwidgets/qquickwidget.cpp b/src/quickwidgets/qquickwidget.cpp index 253cf5a050..bfcc0b1403 100644 --- a/src/quickwidgets/qquickwidget.cpp +++ b/src/quickwidgets/qquickwidget.cpp @@ -848,13 +848,13 @@ QSize QQuickWidgetPrivate::rootObjectSize() const return rootObjectSize; } -void QQuickWidgetPrivate::handleContextCreationFailure(const QSurfaceFormat &format, bool isEs) +void QQuickWidgetPrivate::handleContextCreationFailure(const QSurfaceFormat &format) { Q_Q(QQuickWidget); QString translatedMessage; QString untranslatedMessage; - QQuickWindowPrivate::contextCreationFailureMessage(format, &translatedMessage, &untranslatedMessage, isEs); + QQuickWindowPrivate::contextCreationFailureMessage(format, &translatedMessage, &untranslatedMessage); static const QMetaMethod errorSignal = QMetaMethod::fromSignal(&QQuickWidget::sceneGraphError); const bool signalConnected = q->isSignalConnected(errorSignal); @@ -896,10 +896,9 @@ void QQuickWidgetPrivate::createContext() context->setScreen(shareContext->screen()); } if (!context->create()) { - const bool isEs = context->isOpenGLES(); delete context; context = nullptr; - handleContextCreationFailure(offscreenWindow->requestedFormat(), isEs); + handleContextCreationFailure(offscreenWindow->requestedFormat()); return; } diff --git a/src/quickwidgets/qquickwidget_p.h b/src/quickwidgets/qquickwidget_p.h index f4f9db7772..881f7f9220 100644 --- a/src/quickwidgets/qquickwidget_p.h +++ b/src/quickwidgets/qquickwidget_p.h @@ -97,7 +97,7 @@ public: void renderSceneGraph(); void createContext(); void destroyContext(); - void handleContextCreationFailure(const QSurfaceFormat &format, bool isEs); + void handleContextCreationFailure(const QSurfaceFormat &format); #if QT_CONFIG(opengl) GLuint textureId() const override; |