aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/scenegraph/qsgrenderloop.cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@digia.com>2014-03-10 10:53:49 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-03-13 13:39:54 +0100
commitb8afc009afcca84a3fd3d5617dfe96c729c531aa (patch)
tree10bdbfb63b3aee36da0344cd8f05184b06b47f37 /src/quick/scenegraph/qsgrenderloop.cpp
parentd6e932b3682c7f8cd610d7554a52c9856d7e67c1 (diff)
Consolidate context creation failure handling in Quick.
Add QQuickWidget::sceneGraphError() equivalent to QQuickWindow::sceneGraphError(), move message formatting code to QQuickWindowPrivate. Change-Id: I18cd4d7e0f6ee1011c29375218dc6a044b0d2cf2 Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
Diffstat (limited to 'src/quick/scenegraph/qsgrenderloop.cpp')
-rw-r--r--src/quick/scenegraph/qsgrenderloop.cpp43
1 files changed, 33 insertions, 10 deletions
diff --git a/src/quick/scenegraph/qsgrenderloop.cpp b/src/quick/scenegraph/qsgrenderloop.cpp
index 644a674749..6647ec83d0 100644
--- a/src/quick/scenegraph/qsgrenderloop.cpp
+++ b/src/quick/scenegraph/qsgrenderloop.cpp
@@ -46,6 +46,7 @@
#include <QtCore/QCoreApplication>
#include <QtCore/QTime>
#include <QtCore/QScopedPointer>
+#include <QtCore/QLibraryInfo>
#include <QtCore/private/qabstractanimation_p.h>
#include <QtGui/QOpenGLContext>
@@ -59,6 +60,10 @@
#include <QtQuick/private/qsgcontext_p.h>
#include <private/qquickprofiler_p.h>
+#ifdef Q_OS_WIN
+# include <QtCore/qt_windows.h>
+#endif
+
QT_BEGIN_NAMESPACE
DEFINE_BOOL_CONFIG_OPTION(qsg_render_timing, QSG_RENDER_TIMING)
@@ -208,6 +213,32 @@ void QSGRenderLoop::setInstance(QSGRenderLoop *instance)
s_renderLoopInstance->reset(instance);
}
+void QSGRenderLoop::handleContextCreationFailure(QQuickWindow *window,
+ bool isEs)
+{
+ QString translatedMessage;
+ QString untranslatedMessage;
+ QQuickWindowPrivate::contextCreationFailureMessage(window->requestedFormat(),
+ &translatedMessage,
+ &untranslatedMessage,
+ isEs);
+ // 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.
+ const bool signalEmitted =
+ QQuickWindowPrivate::get(window)->emitError(QQuickWindow::ContextNotAvailable,
+ translatedMessage);
+#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE) && !defined(Q_OS_WINRT)
+ if (!signalEmitted && !QLibraryInfo::isDebugBuild() && !GetConsoleWindow()) {
+ MessageBox(0, (LPCTSTR) translatedMessage.utf16(),
+ (LPCTSTR)(QCoreApplication::applicationName().utf16()),
+ MB_OK | MB_ICONERROR);
+ }
+#endif // Q_OS_WIN && !Q_OS_WINCE && !Q_OS_WINRT
+ if (!signalEmitted)
+ qFatal("%s", qPrintable(untranslatedMessage));
+}
+
QSGGuiThreadRenderLoop::QSGGuiThreadRenderLoop()
: gl(0)
, eventPending(false)
@@ -283,18 +314,10 @@ void QSGGuiThreadRenderLoop::renderWindow(QQuickWindow *window)
if (QSGContext::sharedOpenGLContext())
gl->setShareContext(QSGContext::sharedOpenGLContext());
if (!gl->create()) {
+ const bool isEs = gl->isES();
delete gl;
gl = 0;
- QString formatStr;
- QDebug(&formatStr) << window->requestedFormat();
- QString contextType = QLatin1String("OpenGL");
- const char *msg = QT_TRANSLATE_NOOP("QSGGuiThreadRenderLoop", "Failed to create %1 context for format %2");
- QString translatedMsg = tr(msg).arg(contextType).arg(formatStr);
- QString nonTranslatedMsg = QString(QLatin1String(msg)).arg(contextType).arg(formatStr);
- bool signalEmitted = QQuickWindowPrivate::get(window)->emitError(QQuickWindow::ContextNotAvailable,
- translatedMsg);
- if (!signalEmitted)
- qFatal("%s", qPrintable(nonTranslatedMsg));
+ handleContextCreationFailure(window, isEs);
} else {
cd->fireOpenGLContextCreated(gl);
current = gl->makeCurrent(window);