From 39d5ffbdc42f6645e13511828ea7a9997497068e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Wed, 5 Nov 2014 08:43:49 +0200 Subject: Force software renderer to using ES2 Task-number: QTRD-3410 Change-Id: I86b240b6548ec4c94f6be0dc352ed112965926f3 Change-Id: I86b240b6548ec4c94f6be0dc352ed112965926f3 Reviewed-by: Miikka Heikkinen --- README | 3 +- .../doc/src/qtdatavisualization.qdoc | 2 + src/datavisualization/utils/qutils.h | 57 ++++++++++++++++++---- src/datavisualization/utils/utils.cpp | 8 ++- 4 files changed, 59 insertions(+), 11 deletions(-) diff --git a/README b/README index 667dcdaa..96099dbe 100644 --- a/README +++ b/README @@ -88,4 +88,5 @@ Known Issues "QT += datavisualization" in the pro file. This is because Qt Data Visualization QML plugin has a dependency to Qt Data Visualization C++ library, which Qt Creator doesn't automatically add to the deployment package. - +- Only OpenGL ES2 emulation is available for software renderer (that is, when using + QCoreApplication::setAttribute(Qt::AA_UseSoftwareOpenGL)) diff --git a/src/datavisualization/doc/src/qtdatavisualization.qdoc b/src/datavisualization/doc/src/qtdatavisualization.qdoc index b07074b1..c243a1cd 100644 --- a/src/datavisualization/doc/src/qtdatavisualization.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization.qdoc @@ -338,6 +338,8 @@ "QT += datavisualization" in the pro file. This is because Qt Data Visualization QML plugin has a dependency to Qt Data Visualization C++ library, which Qt Creator doesn't automatically add to the deployment package. + \li Only OpenGL ES2 emulation is available for software renderer (that is, when using + QCoreApplication::setAttribute(Qt::AA_UseSoftwareOpenGL)) \endlist */ diff --git a/src/datavisualization/utils/qutils.h b/src/datavisualization/utils/qutils.h index d4acfc99..86a0af5e 100644 --- a/src/datavisualization/utils/qutils.h +++ b/src/datavisualization/utils/qutils.h @@ -20,29 +20,68 @@ #define QUTILS_H #include +#include +#include +#include namespace QtDataVisualization { inline static QSurfaceFormat qDefaultSurfaceFormat(bool antialias = true) { + bool isES = false; + QSurfaceFormat surfaceFormat; + // Common attributes surfaceFormat.setDepthBufferSize(24); surfaceFormat.setStencilBufferSize(8); surfaceFormat.setSwapBehavior(QSurfaceFormat::DoubleBuffer); surfaceFormat.setRenderableType(QSurfaceFormat::DefaultRenderableType); + + QOpenGLContext *ctx = QOpenGLContext::currentContext(); + QOffscreenSurface *dummySurface = 0; + if (!ctx) { + dummySurface = new QOffscreenSurface(); + dummySurface->setFormat(surfaceFormat); + dummySurface->create(); + ctx = new QOpenGLContext; + ctx->setFormat(surfaceFormat); + ctx->create(); + ctx->makeCurrent(dummySurface); + } + #if defined(QT_OPENGL_ES_2) - // Antialias not supported for ES - antialias = false; - surfaceFormat.setRedBufferSize(8); - surfaceFormat.setBlueBufferSize(8); - surfaceFormat.setGreenBufferSize(8); + isES = true; +#elif (QT_VERSION < QT_VERSION_CHECK(5, 3, 0)) + isES = false; +#else + isES = ctx->isOpenGLES(); #endif - if (antialias) - surfaceFormat.setSamples(8); - else - surfaceFormat.setSamples(0); + if (dummySurface) { + ctx->doneCurrent(); + delete ctx; + delete dummySurface; + } + + // We support only ES2 emulation with software renderer for now + if (QCoreApplication::testAttribute(Qt::AA_UseSoftwareOpenGL)) { + qWarning("Only OpenGL ES2 emulation is available for software rendering."); + isES = true; + } + + if (isES) { + // For ES2 only attributes + surfaceFormat.setRedBufferSize(8); + surfaceFormat.setBlueBufferSize(8); + surfaceFormat.setGreenBufferSize(8); + } else { + // For OpenGL only attributes + if (antialias) + surfaceFormat.setSamples(8); + else + surfaceFormat.setSamples(0); + } return surfaceFormat; } diff --git a/src/datavisualization/utils/utils.cpp b/src/datavisualization/utils/utils.cpp index 15ef444c..df74cbd3 100644 --- a/src/datavisualization/utils/utils.cpp +++ b/src/datavisualization/utils/utils.cpp @@ -329,7 +329,7 @@ void Utils::resolveStatics() QOpenGLContext *ctx = QOpenGLContext::currentContext(); QOffscreenSurface *dummySurface = 0; if (!ctx) { - QSurfaceFormat surfaceFormat = qDefaultSurfaceFormat(); + QSurfaceFormat surfaceFormat; dummySurface = new QOffscreenSurface(); dummySurface->setFormat(surfaceFormat); dummySurface->create(); @@ -355,6 +355,12 @@ void Utils::resolveStatics() delete dummySurface; } + // We support only ES2 emulation with software renderer for now + if (QCoreApplication::testAttribute(Qt::AA_UseSoftwareOpenGL)) { + qWarning("Only OpenGL ES2 emulation is available for software rendering."); + isES = true; + } + staticsResolved = true; } -- cgit v1.2.3