diff options
Diffstat (limited to 'src/datavisualization/utils/qutils.h')
-rw-r--r-- | src/datavisualization/utils/qutils.h | 57 |
1 files changed, 48 insertions, 9 deletions
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 <QtGui/QSurfaceFormat> +#include <QtGui/QOpenGLContext> +#include <QtGui/QOffscreenSurface> +#include <QtCore/QCoreApplication> 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; } |