src/opengl/qpixmapdata_x11gl_egl.cpp
changeset 7 f7bc934e204c
parent 0 1918ee327afb
child 30 5dc02b23752f
--- a/src/opengl/qpixmapdata_x11gl_egl.cpp	Tue Feb 02 00:43:10 2010 +0200
+++ b/src/opengl/qpixmapdata_x11gl_egl.cpp	Wed Mar 31 11:06:36 2010 +0300
@@ -1,6 +1,6 @@
 /****************************************************************************
 **
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
 ** All rights reserved.
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
@@ -39,10 +39,19 @@
 **
 ****************************************************************************/
 
+#include <QDebug>
+
 #include <private/qgl_p.h>
 #include <private/qegl_p.h>
 #include <private/qeglproperties_p.h>
+
+#if !defined(QT_OPENGL_ES_1) && !defined(QT_OPENGL_ES_1_CL)
 #include <private/qpaintengineex_opengl2_p.h>
+#endif
+
+#ifndef QT_OPENGL_ES_2
+#include <private/qpaintengine_opengl_p.h>
+#endif
 
 #include "qpixmapdata_x11gl_p.h"
 
@@ -87,14 +96,14 @@
 #endif
             EGL_NONE
         };
-        qPixmapARGBSharedEglContext = eglCreateContext(QEglContext::defaultDisplay(0),
+        qPixmapARGBSharedEglContext = eglCreateContext(QEglContext::display(),
                                                        argbConfig, 0, contextAttribs);
 
         if (argbConfig == rgbConfig) {
             // If the configs are the same, we can re-use the same context.
             qPixmapRGBSharedEglContext = qPixmapARGBSharedEglContext;
         } else {
-            qPixmapRGBSharedEglContext = eglCreateContext(QEglContext::defaultDisplay(0),
+            qPixmapRGBSharedEglContext = eglCreateContext(QEglContext::display(),
                                                            rgbConfig, 0, contextAttribs);
         }
 
@@ -105,7 +114,7 @@
         if (!qt_createEGLSurfaceForPixmap(argbPixmapData, false))
             break;
 
-        haveX11Pixmaps = eglMakeCurrent(QEglContext::defaultDisplay(0),
+        haveX11Pixmaps = eglMakeCurrent(QEglContext::display(),
                                         (EGLSurface)argbPixmapData->gl_surface,
                                         (EGLSurface)argbPixmapData->gl_surface,
                                         qPixmapARGBSharedEglContext);
@@ -125,7 +134,7 @@
             if (!qt_createEGLSurfaceForPixmap(rgbPixmapData, false))
                 break;
 
-            haveX11Pixmaps = eglMakeCurrent(QEglContext::defaultDisplay(0),
+            haveX11Pixmaps = eglMakeCurrent(QEglContext::display(),
                                             (EGLSurface)rgbPixmapData->gl_surface,
                                             (EGLSurface)rgbPixmapData->gl_surface,
                                             qPixmapRGBSharedEglContext);
@@ -138,7 +147,7 @@
     } while (0);
 
     if (qPixmapARGBSharedEglContext || qPixmapRGBSharedEglContext) {
-        eglMakeCurrent(QEglContext::defaultDisplay(0),
+        eglMakeCurrent(QEglContext::display(),
                        EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
     }
 
@@ -158,12 +167,12 @@
     if (!haveX11Pixmaps) {
         // Clean up the context(s) if we can't use X11GL pixmaps
         if (qPixmapARGBSharedEglContext != EGL_NO_CONTEXT)
-            eglDestroyContext(QEglContext::defaultDisplay(0), qPixmapARGBSharedEglContext);
+            eglDestroyContext(QEglContext::display(), qPixmapARGBSharedEglContext);
 
         if (qPixmapRGBSharedEglContext != qPixmapARGBSharedEglContext &&
             qPixmapRGBSharedEglContext != EGL_NO_CONTEXT)
         {
-            eglDestroyContext(QEglContext::defaultDisplay(0), qPixmapRGBSharedEglContext);
+            eglDestroyContext(QEglContext::display(), qPixmapRGBSharedEglContext);
         }
         qPixmapRGBSharedEglContext = EGL_NO_CONTEXT;
         qPixmapARGBSharedEglContext = EGL_NO_CONTEXT;
@@ -187,7 +196,14 @@
 {
 }
 
-static QGL2PaintEngineEx* qt_gl2_engine_for_pixmaps = 0;
+#if !defined(QT_OPENGL_ES_1) && !defined(QT_OPENGL_ES_1_CL)
+Q_GLOBAL_STATIC(QGL2PaintEngineEx, qt_gl_pixmap_2_engine)
+#endif
+
+#ifndef QT_OPENGL_ES_2
+Q_GLOBAL_STATIC(QOpenGLPaintEngine, qt_gl_pixmap_engine)
+#endif
+
 
 QPaintEngine* QX11GLPixmapData::paintEngine() const
 {
@@ -196,24 +212,46 @@
         ctx = new QGLContext(glFormat());
         if (ctx->d_func()->eglContext == 0)
             ctx->d_func()->eglContext = new QEglContext();
-        ctx->d_func()->eglContext->openDisplay(0); // ;-)
         ctx->d_func()->eglContext->setApi(QEgl::OpenGL);
         ctx->d_func()->eglContext->setContext(hasAlphaChannel() ? qPixmapARGBSharedEglContext
                                                                 : qPixmapRGBSharedEglContext);
     }
 
-    if (!qt_gl2_engine_for_pixmaps)
-        qt_gl2_engine_for_pixmaps = new QGL2PaintEngineEx();
+    QPaintEngine* engine;
+
+#if defined(QT_OPENGL_ES_1) || defined(QT_OPENGL_ES_1_CL)
+    engine = qt_gl_pixmap_engine();
+#elif defined(QT_OPENGL_ES_2)
+    engine = qt_gl_pixmap_2_engine();
+#else
+    if (qt_gl_preferGL2Engine())
+        engine = qt_gl_pixmap_2_engine();
+    else
+        engine = qt_gl_pixmap_engine();
+#endif
+
+
 
     // Support multiple painters on multiple pixmaps simultaniously
-    if (qt_gl2_engine_for_pixmaps->isActive()) {
+    if (engine->isActive()) {
         qWarning("Pixmap paint engine already active");
-        QPaintEngine* engine = new QGL2PaintEngineEx();
+
+#if defined(QT_OPENGL_ES_1) || defined(QT_OPENGL_ES_1_CL)
+        engine = new QOpenGLPaintEngine;
+#elif defined(QT_OPENGL_ES_2)
+        engine = new QGL2PaintEngineEx;
+#else
+        if (qt_gl_preferGL2Engine())
+            engine = new QGL2PaintEngineEx;
+        else
+            engine = new QOpenGLPaintEngine;
+#endif
+
         engine->setAutoDestruct(true);
         return engine;
     }
 
-    return qt_gl2_engine_for_pixmaps;
+    return engine;
 }
 
 void QX11GLPixmapData::beginPaint()