diff options
author | Miikka Heikkinen <miikka.heikkinen@theqtcompany.com> | 2015-12-29 12:27:48 +0200 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@theqtcompany.com> | 2015-12-30 08:45:14 +0000 |
commit | 64f0d4fb353ae2e447483897839d4df8b5b32f54 (patch) | |
tree | feb89a4253b05c20377b980773edc7619bbae0b9 /src/datavisualization | |
parent | 104c12823b1cbccb2a25593b0af319c0a42abbb5 (diff) |
Add a method for checking if context was successfully created
Now it is possible to check after graph construction if the graph
is actually usable in environments where the OpenGL support might
not be sufficient.
Task-number: QTRD-3748
Change-Id: Ia68b4e51386859f6d0c7b09cb44e50a74730ca55
Reviewed-by: Titta Heikkala <titta.heikkala@theqtcompany.com>
Diffstat (limited to 'src/datavisualization')
-rw-r--r-- | src/datavisualization/engine/q3dbars.cpp | 6 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dscatter.cpp | 6 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dsurface.cpp | 6 | ||||
-rw-r--r-- | src/datavisualization/engine/qabstract3dgraph.cpp | 33 | ||||
-rw-r--r-- | src/datavisualization/engine/qabstract3dgraph.h | 2 | ||||
-rw-r--r-- | src/datavisualization/engine/qabstract3dgraph_p.h | 1 |
6 files changed, 46 insertions, 8 deletions
diff --git a/src/datavisualization/engine/q3dbars.cpp b/src/datavisualization/engine/q3dbars.cpp index 3787b235..a715b4f2 100644 --- a/src/datavisualization/engine/q3dbars.cpp +++ b/src/datavisualization/engine/q3dbars.cpp @@ -92,6 +92,9 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION Q3DBars::Q3DBars(const QSurfaceFormat *format, QWindow *parent) : QAbstract3DGraph(new Q3DBarsPrivate(this), format, parent) { + if (!dptr()->m_initialized) + return; + dptr()->m_shared = new Bars3DController(geometry()); d_ptr->setVisualController(dptr()->m_shared); dptr()->m_shared->initializeOpenGL(); @@ -399,7 +402,8 @@ const Q3DBarsPrivate *Q3DBars::dptrc() const } Q3DBarsPrivate::Q3DBarsPrivate(Q3DBars *q) - : QAbstract3DGraphPrivate(q) + : QAbstract3DGraphPrivate(q), + m_shared(0) { } diff --git a/src/datavisualization/engine/q3dscatter.cpp b/src/datavisualization/engine/q3dscatter.cpp index a4d371d5..c2870db8 100644 --- a/src/datavisualization/engine/q3dscatter.cpp +++ b/src/datavisualization/engine/q3dscatter.cpp @@ -81,6 +81,9 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION Q3DScatter::Q3DScatter(const QSurfaceFormat *format, QWindow *parent) : QAbstract3DGraph(new Q3DScatterPrivate(this), format, parent) { + if (!dptr()->m_initialized) + return; + dptr()->m_shared = new Scatter3DController(geometry()); d_ptr->setVisualController(dptr()->m_shared); dptr()->m_shared->initializeOpenGL(); @@ -251,7 +254,8 @@ QList<QValue3DAxis *> Q3DScatter::axes() const } Q3DScatterPrivate::Q3DScatterPrivate(Q3DScatter *q) - : QAbstract3DGraphPrivate(q) + : QAbstract3DGraphPrivate(q), + m_shared(0) { } diff --git a/src/datavisualization/engine/q3dsurface.cpp b/src/datavisualization/engine/q3dsurface.cpp index 1d6c0a1f..8db2b381 100644 --- a/src/datavisualization/engine/q3dsurface.cpp +++ b/src/datavisualization/engine/q3dsurface.cpp @@ -96,6 +96,9 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION Q3DSurface::Q3DSurface(const QSurfaceFormat *format, QWindow *parent) : QAbstract3DGraph(new Q3DSurfacePrivate(this), format, parent) { + if (!dptr()->m_initialized) + return; + dptr()->m_shared = new Surface3DController(geometry()); d_ptr->setVisualController(dptr()->m_shared); dptr()->m_shared->initializeOpenGL(); @@ -302,7 +305,8 @@ QList<QValue3DAxis *> Q3DSurface::axes() const // Q3DSurfacePrivate Q3DSurfacePrivate::Q3DSurfacePrivate(Q3DSurface *q) - : QAbstract3DGraphPrivate(q) + : QAbstract3DGraphPrivate(q), + m_shared(0) { } diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index 2f3caccd..bc40fbf9 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -189,7 +189,11 @@ QAbstract3DGraph::QAbstract3DGraph(QAbstract3DGraphPrivate *d, const QSurfaceFor d_ptr->m_context->setFormat(requestedFormat()); d_ptr->m_context->create(); - d_ptr->m_context->makeCurrent(this); + bool makeSuccess = d_ptr->m_context->makeCurrent(this); + + // If we fail to get context, just abort + if (!makeSuccess || !QOpenGLContext::currentContext()) + return; initializeOpenGLFunctions(); @@ -208,6 +212,8 @@ QAbstract3DGraph::QAbstract3DGraph(QAbstract3DGraphPrivate *d, const QSurfaceFor qFatal("GLSL version must be 1.20 or higher. Try installing latest display drivers."); } + d_ptr->m_initialized = true; + d_ptr->renderLater(); #if defined(Q_OS_OSX) @@ -872,6 +878,20 @@ qreal QAbstract3DGraph::margin() const } /*! + * \return \c{true} if the OpenGL context of the graph has been successfully initialized. + * Trying to use a graph when the context initialization has failed typically results in a crash. + * A common reason for a context initialization failure is lack of sufficient platform support + * for OpenGL. + */ +bool QAbstract3DGraph::hasContext() const +{ + if (d_ptr->m_initialized) + return true; + else + return false; +} + +/*! * \internal */ bool QAbstract3DGraph::event(QEvent *event) @@ -898,9 +918,11 @@ void QAbstract3DGraph::resizeEvent(QResizeEvent *event) { Q_UNUSED(event); - Q3DScene *scene = d_ptr->m_visualController->scene(); - scene->d_ptr->setWindowSize(QSize(width(), height())); - scene->d_ptr->setViewport(QRect(0, 0, width(), height())); + if (d_ptr->m_visualController) { + Q3DScene *scene = d_ptr->m_visualController->scene(); + scene->d_ptr->setWindowSize(QSize(width(), height())); + scene->d_ptr->setViewport(QRect(0, 0, width(), height())); + } } /*! @@ -968,7 +990,8 @@ QAbstract3DGraphPrivate::QAbstract3DGraphPrivate(QAbstract3DGraph *q) m_updatePending(false), m_visualController(0), m_devicePixelRatio(1.f), - m_offscreenSurface(0) + m_offscreenSurface(0), + m_initialized(false) { } diff --git a/src/datavisualization/engine/qabstract3dgraph.h b/src/datavisualization/engine/qabstract3dgraph.h index 13e2faf0..4a13ca5e 100644 --- a/src/datavisualization/engine/qabstract3dgraph.h +++ b/src/datavisualization/engine/qabstract3dgraph.h @@ -186,6 +186,8 @@ public: void setMargin(qreal margin); qreal margin() const; + bool hasContext() const; + protected: bool event(QEvent *event); void resizeEvent(QResizeEvent *event); diff --git a/src/datavisualization/engine/qabstract3dgraph_p.h b/src/datavisualization/engine/qabstract3dgraph_p.h index 6ff5f418..07c1ade5 100644 --- a/src/datavisualization/engine/qabstract3dgraph_p.h +++ b/src/datavisualization/engine/qabstract3dgraph_p.h @@ -75,6 +75,7 @@ public: Abstract3DController *m_visualController; float m_devicePixelRatio; QOffscreenSurface *m_offscreenSurface; + bool m_initialized; }; QT_END_NAMESPACE_DATAVISUALIZATION |