summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQt Continuous Integration System <qt-info@nokia.com>2010-04-26 12:10:05 (GMT)
committerQt Continuous Integration System <qt-info@nokia.com>2010-04-26 12:10:05 (GMT)
commit2648d5a2dc6ad4dee9ac685330b000a34339a758 (patch)
tree3729b143790d2cf36ae0b3cb0e75f598cfd31461
parentc7ca3da5ec1586083dfc4425200508929756ad61 (diff)
parent89aa90f58e7df3c2f6b0f4b3d2bab65dca9cf140 (diff)
downloadQt-2648d5a2dc6ad4dee9ac685330b000a34339a758.zip
Qt-2648d5a2dc6ad4dee9ac685330b000a34339a758.tar.gz
Qt-2648d5a2dc6ad4dee9ac685330b000a34339a758.tar.bz2
Merge branch '4.7' of scm.dev.nokia.troll.no:qt/oslo-staging-2 into 4.7-integration
* '4.7' of scm.dev.nokia.troll.no:qt/oslo-staging-2: Remove stray qDebug Don't leak objects if QX11GLSharedContexts is instanciated twice Enable QX11GLWindowSurface using "-graphicssystem x11gl" option Force full-screen updates for QGLWindowSurface
-rw-r--r--src/opengl/qgl_x11egl.cpp1
-rw-r--r--src/opengl/qgraphicssystem_gl.cpp22
-rw-r--r--src/opengl/qgraphicssystem_gl_p.h4
-rw-r--r--src/opengl/qpixmapdata_x11gl_egl.cpp23
-rw-r--r--src/opengl/qwindowsurface_gl.cpp11
-rw-r--r--src/plugins/graphicssystems/opengl/main.cpp14
6 files changed, 48 insertions, 27 deletions
diff --git a/src/opengl/qgl_x11egl.cpp b/src/opengl/qgl_x11egl.cpp
index c0b1515..9d28de0 100644
--- a/src/opengl/qgl_x11egl.cpp
+++ b/src/opengl/qgl_x11egl.cpp
@@ -351,7 +351,6 @@ void QGLWidgetPrivate::recreateEglSurface()
}
if (glcx->d_func()->eglSurface == EGL_NO_SURFACE) {
- qDebug("Re-creating the surface");
glcx->d_func()->eglSurface = glcx->d_func()->eglContext->createSurface(q);
eglSurfaceWindowId = currentId;
}
diff --git a/src/opengl/qgraphicssystem_gl.cpp b/src/opengl/qgraphicssystem_gl.cpp
index a282e4c..58cc28a 100644
--- a/src/opengl/qgraphicssystem_gl.cpp
+++ b/src/opengl/qgraphicssystem_gl.cpp
@@ -40,6 +40,7 @@
****************************************************************************/
#include "qgraphicssystem_gl_p.h"
+#include <QGraphicsView>
#include "private/qpixmap_raster_p.h"
#include "private/qpixmapdata_gl_p.h"
@@ -47,7 +48,7 @@
#include "private/qgl_p.h"
#include <private/qwindowsurface_raster_p.h>
-#if defined(Q_WS_X11) && defined(QT_OPENGL_ES)
+#if defined(Q_WS_X11) && !defined(QT_NO_EGL)
#include "private/qpixmapdata_x11gl_p.h"
#include "private/qwindowsurface_x11gl_p.h"
#endif
@@ -58,10 +59,6 @@ extern QGLWidget *qt_gl_getShareWidget();
QPixmapData *QGLGraphicsSystem::createPixmapData(QPixmapData::PixelType type) const
{
-#if defined(Q_WS_X11) && defined(QT_OPENGL_ES)
- if (type == QPixmapData::PixmapType && QX11GLPixmapData::hasX11GLPixmaps())
- return new QX11GLPixmapData();
-#endif
return new QGLPixmapData(type);
}
@@ -75,9 +72,18 @@ QWindowSurface *QGLGraphicsSystem::createWindowSurface(QWidget *widget) const
return new QRasterWindowSurface(widget);
#endif
-#if defined(Q_WS_X11) && defined(QT_OPENGL_ES)
- if (QX11GLPixmapData::hasX11GLPixmaps())
- return new QX11GLWindowSurface(widget);
+#if defined(Q_WS_X11) && !defined(QT_NO_EGL)
+ if (m_useX11GL && QX11GLPixmapData::hasX11GLPixmaps()) {
+ // If the widget is a QGraphicsView which will be re-drawing the entire
+ // scene each frame anyway, we should use QGLWindowSurface as this may
+ // provide proper buffer flipping, which should be faster than QX11GL's
+ // blitting approach:
+ QGraphicsView* qgv = qobject_cast<QGraphicsView*>(widget);
+ if (qgv && qgv->viewportUpdateMode() == QGraphicsView::FullViewportUpdate)
+ return new QGLWindowSurface(widget);
+ else
+ return new QX11GLWindowSurface(widget);
+ }
#endif
return new QGLWindowSurface(widget);
diff --git a/src/opengl/qgraphicssystem_gl_p.h b/src/opengl/qgraphicssystem_gl_p.h
index ff47854..9d2d506 100644
--- a/src/opengl/qgraphicssystem_gl_p.h
+++ b/src/opengl/qgraphicssystem_gl_p.h
@@ -62,10 +62,12 @@ QT_BEGIN_NAMESPACE
class Q_OPENGL_EXPORT QGLGraphicsSystem : public QGraphicsSystem
{
public:
- QGLGraphicsSystem();
+ QGLGraphicsSystem(bool useX11GL);
QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
QWindowSurface *createWindowSurface(QWidget *widget) const;
+private:
+ bool m_useX11GL;
};
QT_END_NAMESPACE
diff --git a/src/opengl/qpixmapdata_x11gl_egl.cpp b/src/opengl/qpixmapdata_x11gl_egl.cpp
index 58d34fc..2c11a0b 100644
--- a/src/opengl/qpixmapdata_x11gl_egl.cpp
+++ b/src/opengl/qpixmapdata_x11gl_egl.cpp
@@ -74,7 +74,6 @@ public:
EGLint rgbConfigId;
EGLint argbConfigId;
-
do {
EGLConfig rgbConfig = QEgl::defaultConfig(QInternal::Pixmap, QEgl::OpenGL, QEgl::Renderable);
EGLConfig argbConfig = QEgl::defaultConfig(QInternal::Pixmap, QEgl::OpenGL,
@@ -138,6 +137,7 @@ public:
valid = argbContext->makeCurrent(argbPixmapSurface);
argbContext->doneCurrent();
eglDestroySurface(QEgl::display(), argbPixmapSurface);
+ argbPixmapData->gl_surface = 0;
}
if (!valid) {
@@ -150,7 +150,6 @@ public:
QGLTextureCache::instance();
} while(0);
-
if (!valid)
cleanup();
else
@@ -158,6 +157,10 @@ public:
}
+ ~QX11GLSharedContexts() {
+ cleanup();
+ }
+
void cleanup() {
if (sharedQGLContext) {
delete sharedQGLContext;
@@ -216,18 +219,16 @@ QX11GLSharedContexts* QX11GLPixmapData::sharedContexts()
bool QX11GLPixmapData::hasX11GLPixmaps()
{
- static bool checkedForX11Pixmaps = false;
- static bool haveX11Pixmaps = false;
-
- if (checkedForX11Pixmaps)
- return haveX11Pixmaps;
+ static bool checkedForX11GLPixmaps = false;
+ static bool haveX11GLPixmaps = false;
- checkedForX11Pixmaps = true;
+ if (checkedForX11GLPixmaps)
+ return haveX11GLPixmaps;
- if (!qgetenv("QT_USE_X11GL_PIXMAPS").isEmpty() && sharedContexts()->isValid())
- haveX11Pixmaps = true;
+ haveX11GLPixmaps = qt_x11gl_share_contexts()->isValid();
+ checkedForX11GLPixmaps = true;
- return haveX11Pixmaps;
+ return haveX11GLPixmaps;
}
QX11GLPixmapData::QX11GLPixmapData()
diff --git a/src/opengl/qwindowsurface_gl.cpp b/src/opengl/qwindowsurface_gl.cpp
index b693245..92a347b 100644
--- a/src/opengl/qwindowsurface_gl.cpp
+++ b/src/opengl/qwindowsurface_gl.cpp
@@ -82,7 +82,7 @@
#define GLX_SAMPLES_ARB 100001
#endif
-#ifdef QT_OPENGL_ES
+#ifndef QT_NO_EGL
#include <private/qeglcontext_p.h>
#endif
@@ -94,8 +94,8 @@ QT_BEGIN_NAMESPACE
#ifdef Q_WS_WIN
extern Q_GUI_EXPORT bool qt_win_owndc_required;
#endif
-QGLGraphicsSystem::QGLGraphicsSystem()
- : QGraphicsSystem()
+QGLGraphicsSystem::QGLGraphicsSystem(bool useX11GL)
+ : QGraphicsSystem(), m_useX11GL(useX11GL)
{
QGLWindowSurface::surfaceFormat.setSampleBuffers(true);
#if defined(Q_WS_X11) && !defined(QT_OPENGL_ES)
@@ -354,6 +354,11 @@ void QGLWindowSurface::hijackWindow(QWidget *widget)
QGLContext *ctx = new QGLContext(surfaceFormat, widget);
ctx->create(qt_gl_share_widget()->context());
+#ifndef QT_NO_EGL
+ if (ctx->d_func()->eglContext->configAttrib(EGL_SWAP_BEHAVIOR) != EGL_BUFFER_PRESERVED)
+ setPartialUpdateSupport(false); // Force full-screen updates
+#endif
+
widgetPrivate->extraData()->glContext = ctx;
union { QGLContext **ctxPtr; void **voidPtr; };
diff --git a/src/plugins/graphicssystems/opengl/main.cpp b/src/plugins/graphicssystems/opengl/main.cpp
index abcfb7f..4c740ca 100644
--- a/src/plugins/graphicssystems/opengl/main.cpp
+++ b/src/plugins/graphicssystems/opengl/main.cpp
@@ -59,6 +59,9 @@ QStringList QGLGraphicsSystemPlugin::keys() const
#if !defined(QT_OPENGL_ES_1)
list << QLatin1String("OpenGL2");
#endif
+#if defined(Q_WS_X11) && !defined(QT_NO_EGL)
+ list << QLatin1String("X11GL");
+#endif
return list;
}
@@ -66,18 +69,23 @@ QGraphicsSystem* QGLGraphicsSystemPlugin::create(const QString& system)
{
if (system.toLower() == QLatin1String("opengl1")) {
QGL::setPreferredPaintEngine(QPaintEngine::OpenGL);
- return new QGLGraphicsSystem;
+ return new QGLGraphicsSystem(false);
}
#if !defined(QT_OPENGL_ES_1)
if (system.toLower() == QLatin1String("opengl2")) {
QGL::setPreferredPaintEngine(QPaintEngine::OpenGL2);
- return new QGLGraphicsSystem;
+ return new QGLGraphicsSystem(false);
}
#endif
+#if defined(Q_WS_X11) && !defined(QT_NO_EGL)
+ if (system.toLower() == QLatin1String("x11gl"))
+ return new QGLGraphicsSystem(true);
+#endif
+
if (system.toLower() == QLatin1String("opengl"))
- return new QGLGraphicsSystem;
+ return new QGLGraphicsSystem(false);
return 0;
}