diff options
author | Tom Cooksey <thomas.cooksey@nokia.com> | 2010-04-23 13:24:19 (GMT) |
---|---|---|
committer | Tom Cooksey <thomas.cooksey@nokia.com> | 2010-04-26 06:26:01 (GMT) |
commit | 372392153a2c1de69d9257753ba84f44cbbd9cf1 (patch) | |
tree | 162f49ffbc677af4fbc56c2ef9c83984ecf15c28 /src/opengl | |
parent | 8669823d5a5c0f26ff3909ad9c83fa99a63a89f3 (diff) | |
download | Qt-372392153a2c1de69d9257753ba84f44cbbd9cf1.zip Qt-372392153a2c1de69d9257753ba84f44cbbd9cf1.tar.gz Qt-372392153a2c1de69d9257753ba84f44cbbd9cf1.tar.bz2 |
Enable QX11GLWindowSurface using "-graphicssystem x11gl" option
When the OpenGL graphics system is in X11GL mode, it will use the
QX11GLWindowSurface for all widgets except QGraphicsViews with the
FullViewportUpdate update mode set, where it will use the regular
QGLWindowSurface, as this is probabbly faster.
QX11GLWindowSurface differs from QGLWindowSurface because it allows
accelerated scrolling and partial updates, while still being using
opengl to do rendering.
Task-number: QT-280
Task-number: QT-2625
Reviewed-By: Trond
Diffstat (limited to 'src/opengl')
-rw-r--r-- | src/opengl/qgraphicssystem_gl.cpp | 22 | ||||
-rw-r--r-- | src/opengl/qgraphicssystem_gl_p.h | 4 | ||||
-rw-r--r-- | src/opengl/qpixmapdata_x11gl_egl.cpp | 16 | ||||
-rw-r--r-- | src/opengl/qwindowsurface_gl.cpp | 4 |
4 files changed, 26 insertions, 20 deletions
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..e0c274a 100644 --- a/src/opengl/qpixmapdata_x11gl_egl.cpp +++ b/src/opengl/qpixmapdata_x11gl_egl.cpp @@ -216,18 +216,16 @@ QX11GLSharedContexts* QX11GLPixmapData::sharedContexts() bool QX11GLPixmapData::hasX11GLPixmaps() { - static bool checkedForX11Pixmaps = false; - static bool haveX11Pixmaps = false; + static bool checkedForX11GLPixmaps = false; + static bool haveX11GLPixmaps = false; - if (checkedForX11Pixmaps) - return haveX11Pixmaps; + if (checkedForX11GLPixmaps) + return haveX11GLPixmaps; - checkedForX11Pixmaps = true; + checkedForX11GLPixmaps = true; + haveX11GLPixmaps = sharedContexts()->isValid(); - if (!qgetenv("QT_USE_X11GL_PIXMAPS").isEmpty() && sharedContexts()->isValid()) - haveX11Pixmaps = true; - - return haveX11Pixmaps; + return haveX11GLPixmaps; } QX11GLPixmapData::QX11GLPixmapData() diff --git a/src/opengl/qwindowsurface_gl.cpp b/src/opengl/qwindowsurface_gl.cpp index bcb96fa..92a347b 100644 --- a/src/opengl/qwindowsurface_gl.cpp +++ b/src/opengl/qwindowsurface_gl.cpp @@ -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) |