summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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
-rw-r--r--tools/qdoc3/test/qt-html-templates.qdocconf2
7 files changed, 49 insertions, 28 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;
}
diff --git a/tools/qdoc3/test/qt-html-templates.qdocconf b/tools/qdoc3/test/qt-html-templates.qdocconf
index 158aef3..8253c45 100644
--- a/tools/qdoc3/test/qt-html-templates.qdocconf
+++ b/tools/qdoc3/test/qt-html-templates.qdocconf
@@ -113,7 +113,7 @@ HTML.footer = " </div>\n" \
" <div class=\"footer\">\n" \
" <p>\n" \
" <acronym title=\"Copyright\">&copy;</acronym> 2008-2010 Nokia Corporation and/or its\n" \
- " subsidiaries. Nokia, Qt and their respective logos are trademarks of Nokia Corporation>\n" \
+ " subsidiaries. Nokia, Qt and their respective logos are trademarks of Nokia Corporation \n" \
" in Finland and/or other countries worldwide.</p>\n" \
" <p>\n" \
" All other trademarks are property of their respective owners. <a title=\"Privacy Policy\"\n" \