summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/datavisualization/data/labelitem.cpp7
-rw-r--r--src/datavisualization/doc/src/qtdatavisualization.qdoc2
-rw-r--r--src/datavisualization/engine/abstract3drenderer.cpp5
-rw-r--r--src/datavisualization/engine/abstract3drenderer_p.h4
-rw-r--r--src/datavisualization/utils/qutils.h59
-rw-r--r--src/datavisualization/utils/texturehelper.cpp2
-rw-r--r--src/datavisualization/utils/utils.cpp80
-rw-r--r--src/datavisualization/utils/utils_p.h1
-rw-r--r--src/datavisualizationqml2/designer/Scatter3DSpecifics.qml2
-rw-r--r--src/datavisualizationqml2/designer/Surface3DSpecifics.qml2
-rw-r--r--src/datavisualizationqml2/glstatestore.cpp4
-rw-r--r--src/datavisualizationqml2/glstatestore_p.h2
12 files changed, 113 insertions, 57 deletions
diff --git a/src/datavisualization/data/labelitem.cpp b/src/datavisualization/data/labelitem.cpp
index ec8ba3fd..4e0e9b5c 100644
--- a/src/datavisualization/data/labelitem.cpp
+++ b/src/datavisualization/data/labelitem.cpp
@@ -28,7 +28,7 @@ LabelItem::LabelItem()
LabelItem::~LabelItem()
{
- QOpenGLContext::currentContext()->functions()->glDeleteTextures(1, &m_textureId);
+ clear();
}
void LabelItem::setSize(const QSize &size)
@@ -54,10 +54,9 @@ GLuint LabelItem::textureId() const
void LabelItem::clear()
{
- if (m_textureId) {
+ if (m_textureId && QOpenGLContext::currentContext())
QOpenGLContext::currentContext()->functions()->glDeleteTextures(1, &m_textureId);
- m_textureId = 0;
- }
+ m_textureId = 0;
m_size = QSize(0, 0);
}
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/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp
index cfc691af..fc3b4a19 100644
--- a/src/datavisualization/engine/abstract3drenderer.cpp
+++ b/src/datavisualization/engine/abstract3drenderer.cpp
@@ -28,7 +28,7 @@
#include "scatter3drenderer_p.h"
#include <QtCore/qmath.h>
-#include <QtGui/QWindow>
+#include <QtGui/QOffscreenSurface>
#include <QtCore/QThread>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -1789,8 +1789,7 @@ void Abstract3DRenderer::fixContextBeforeDelete()
// Otherwise we expect it to be our shared context, so we can use it for cleanup.
if (!QOpenGLContext::currentContext() && !m_context.isNull()
&& QThread::currentThread() == this->thread()) {
- m_dummySurfaceAtDelete = new QWindow();
- m_dummySurfaceAtDelete->setSurfaceType(QWindow::OpenGLSurface);
+ m_dummySurfaceAtDelete = new QOffscreenSurface();
m_dummySurfaceAtDelete->setFormat(m_context->format());
m_dummySurfaceAtDelete->create();
diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h
index 1e38023d..15793797 100644
--- a/src/datavisualization/engine/abstract3drenderer_p.h
+++ b/src/datavisualization/engine/abstract3drenderer_p.h
@@ -39,7 +39,7 @@
#include "seriesrendercache_p.h"
#include "customrenderitem_p.h"
-class QSurface;
+class QOffscreenSurface;
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -327,7 +327,7 @@ protected:
QOpenGLFunctions_2_1 *m_funcs_2_1; // Not owned
#endif
QPointer<QOpenGLContext> m_context; // Not owned
- QWindow *m_dummySurfaceAtDelete;
+ QOffscreenSurface *m_dummySurfaceAtDelete;
bool m_isOpenGLES;
private:
diff --git a/src/datavisualization/utils/qutils.h b/src/datavisualization/utils/qutils.h
index d4acfc99..93226be9 100644
--- a/src/datavisualization/utils/qutils.h
+++ b/src/datavisualization/utils/qutils.h
@@ -20,29 +20,70 @@
#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 (dummySurface) {
+ ctx->doneCurrent();
+ delete ctx;
+ delete dummySurface;
+ }
+
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 4, 0))
+ // 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;
+ }
#endif
- if (antialias)
- surfaceFormat.setSamples(8);
- else
- surfaceFormat.setSamples(0);
+ 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/texturehelper.cpp b/src/datavisualization/utils/texturehelper.cpp
index 3944fb0c..16396de7 100644
--- a/src/datavisualization/utils/texturehelper.cpp
+++ b/src/datavisualization/utils/texturehelper.cpp
@@ -58,7 +58,7 @@ GLuint TextureHelper::create2DTexture(const QImage &image, bool useTrilinearFilt
QImage texImage = image;
- if (!Utils::isOpenGLES()) {
+ if (Utils::isOpenGLES()) {
GLuint imageWidth = Utils::getNearestPowerOfTwo(image.width());
GLuint imageHeight = Utils::getNearestPowerOfTwo(image.height());
if (smoothScale) {
diff --git a/src/datavisualization/utils/utils.cpp b/src/datavisualization/utils/utils.cpp
index 42a1e532..7f10bac7 100644
--- a/src/datavisualization/utils/utils.cpp
+++ b/src/datavisualization/utils/utils.cpp
@@ -21,14 +21,17 @@
#include <QtGui/QPainter>
#include <QtGui/QOpenGLContext>
-#include <QtGui/QWindow>
+#include <QtGui/QOffscreenSurface>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
#define NUM_IN_POWER(y, x) for (;y<x;y<<=1)
#define MIN_POWER 2
-static GLint maxTextureSize = 0; // Safe, as all instances have the same texture size
+// Some values that only need to be resolved once
+static bool staticsResolved = false;
+static GLint maxTextureSize = 0;
+static bool isES = false;
GLuint Utils::getNearestPowerOfTwo(GLuint value)
{
@@ -58,10 +61,9 @@ QImage Utils::printTextToImage(const QFont &font, const QString &text, const QCo
const QColor &txtColor, bool labelBackground,
bool borders, int maxLabelWidth)
{
- if (maxTextureSize == 0) {
- QOpenGLContext::currentContext()->functions()->glGetIntegerv(
- GL_MAX_TEXTURE_SIZE, &maxTextureSize);
- }
+ if (!staticsResolved)
+ resolveStatics();
+
GLuint paddingWidth = 20;
GLuint paddingHeight = 20;
GLuint prePadding = 20;
@@ -87,7 +89,7 @@ QImage Utils::printTextToImage(const QFont &font, const QString &text, const QCo
// make a label with large empty space
uint testWidth = getNearestPowerOfTwo(valueStrWidth + prePadding) >> 1;
int diffToFit = (valueStrWidth + prePadding) - testWidth;
- int maxSqueeze = int((valueStrWidth + prePadding) * 0.1f);
+ int maxSqueeze = int((valueStrWidth + prePadding) * 0.25f);
if (diffToFit < maxSqueeze && maxTextureSize > GLint(testWidth))
targetWidth = testWidth;
}
@@ -317,39 +319,51 @@ QQuaternion Utils::calculateRotation(const QVector3D &xyzRotations)
bool Utils::isOpenGLES()
{
+ if (!staticsResolved)
+ resolveStatics();
+ return isES;
+}
+
+void Utils::resolveStatics()
+{
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ QOffscreenSurface *dummySurface = 0;
+ if (!ctx) {
+ QSurfaceFormat surfaceFormat;
+ 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)
- return true;
+ isES = true;
#elif (QT_VERSION < QT_VERSION_CHECK(5, 3, 0))
- return false;
+ isES = false;
#else
- static bool resolved = false;
- static bool isES = false;
- if (!resolved) {
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- QWindow *dummySurface = 0;
- if (!ctx) {
- QSurfaceFormat surfaceFormat = qDefaultSurfaceFormat();
- dummySurface = new QWindow();
- dummySurface->setSurfaceType(QWindow::OpenGLSurface);
- dummySurface->setFormat(surfaceFormat);
- dummySurface->create();
- ctx = new QOpenGLContext;
- ctx->setFormat(surfaceFormat);
- ctx->create();
- ctx->makeCurrent(dummySurface);
- }
+ isES = ctx->isOpenGLES();
+#endif
- isES = ctx->isOpenGLES();
- resolved = true;
+ ctx->functions()->glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);
- if (dummySurface) {
- ctx->doneCurrent();
- delete ctx;
- delete dummySurface;
- }
+ if (dummySurface) {
+ ctx->doneCurrent();
+ delete ctx;
+ delete dummySurface;
+ }
+
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 4, 0))
+ // 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;
}
- return isES;
#endif
+
+ staticsResolved = true;
}
QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/utils/utils_p.h b/src/datavisualization/utils/utils_p.h
index 1a46c731..06895bcf 100644
--- a/src/datavisualization/utils/utils_p.h
+++ b/src/datavisualization/utils/utils_p.h
@@ -70,6 +70,7 @@ public:
static float wrapValue(float value, float min, float max);
static QQuaternion calculateRotation(const QVector3D &xyzRotations);
static bool isOpenGLES();
+ static void resolveStatics();
private:
static ParamType mapFormatCharToParamType(char formatSpec);
diff --git a/src/datavisualizationqml2/designer/Scatter3DSpecifics.qml b/src/datavisualizationqml2/designer/Scatter3DSpecifics.qml
index 131f71fd..00dddcc2 100644
--- a/src/datavisualizationqml2/designer/Scatter3DSpecifics.qml
+++ b/src/datavisualizationqml2/designer/Scatter3DSpecifics.qml
@@ -159,7 +159,7 @@ Column {
minimumValue: 0.0
maximumValue: 1.0
stepSize: 0.01
- decimals: 1
+ decimals: 2
Layout.fillWidth: true
}
}
diff --git a/src/datavisualizationqml2/designer/Surface3DSpecifics.qml b/src/datavisualizationqml2/designer/Surface3DSpecifics.qml
index a834f677..9804c32c 100644
--- a/src/datavisualizationqml2/designer/Surface3DSpecifics.qml
+++ b/src/datavisualizationqml2/designer/Surface3DSpecifics.qml
@@ -277,7 +277,7 @@ Column {
minimumValue: 0.0
maximumValue: 1.0
stepSize: 0.01
- decimals: 1
+ decimals: 2
Layout.fillWidth: true
}
}
diff --git a/src/datavisualizationqml2/glstatestore.cpp b/src/datavisualizationqml2/glstatestore.cpp
index 973d5054..5775694d 100644
--- a/src/datavisualizationqml2/glstatestore.cpp
+++ b/src/datavisualizationqml2/glstatestore.cpp
@@ -57,7 +57,7 @@ GLStateStore::GLStateStore(QOpenGLContext *context, QObject *parent) :
m_vertexAttribArrayTypes.reset(new GLint[maxVertexAttribs]);
m_vertexAttribArrayNormalized.reset(new GLint[maxVertexAttribs]);
m_vertexAttribArrayStrides.reset(new GLint[maxVertexAttribs]);
- m_vertexAttribArrayOffsets.reset(new GLint[maxVertexAttribs]);
+ m_vertexAttribArrayOffsets.reset(new void *[maxVertexAttribs]);
initGLDefaultState();
}
@@ -336,7 +336,7 @@ void GLStateStore::restoreGLState()
m_vertexAttribArrayTypes[i],
m_vertexAttribArrayNormalized[i],
m_vertexAttribArrayStrides[i],
- (void *) m_vertexAttribArrayOffsets[i]);
+ m_vertexAttribArrayOffsets[i]);
}
glBindBuffer(GL_ARRAY_BUFFER, m_boundArrayBuffer);
diff --git a/src/datavisualizationqml2/glstatestore_p.h b/src/datavisualizationqml2/glstatestore_p.h
index 4add606b..48b30a15 100644
--- a/src/datavisualizationqml2/glstatestore_p.h
+++ b/src/datavisualizationqml2/glstatestore_p.h
@@ -71,7 +71,7 @@ public:
QScopedArrayPointer<GLint> m_vertexAttribArrayTypes;
QScopedArrayPointer<GLint> m_vertexAttribArrayNormalized;
QScopedArrayPointer<GLint> m_vertexAttribArrayStrides;
- QScopedArrayPointer<GLint> m_vertexAttribArrayOffsets;
+ QScopedArrayPointer<void *> m_vertexAttribArrayOffsets;
GLint m_activeTexture;
GLint m_texBinding2D;