From 7629130b24c01d406f5dee8e6600538db666cfa8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@nokia.com>
Date: Thu, 24 Feb 2011 17:43:52 +0100
Subject: Lighthouse: Adding EGL support to the xcb plugin

---
 .../eglconvenience/qxlibeglintegration.cpp         | 186 +++++++++++++++++++++
 .../platforms/eglconvenience/qxlibeglintegration.h |  53 ++++++
 src/plugins/platforms/xcb/qxcbconnection.cpp       |   6 +-
 src/plugins/platforms/xcb/qxcbconnection.h         |   4 +-
 src/plugins/platforms/xcb/qxcbintegration.cpp      |  18 +-
 src/plugins/platforms/xcb/qxcbwindow.cpp           |  53 ++++--
 src/plugins/platforms/xcb/qxcbwindow.h             |   6 +-
 src/plugins/platforms/xcb/xcb.pro                  |  27 ++-
 src/plugins/platforms/xlib/qxlibeglintegration.cpp | 186 ---------------------
 src/plugins/platforms/xlib/qxlibeglintegration.h   |  54 ------
 src/plugins/platforms/xlib/qxlibwindow.cpp         |   2 +-
 src/plugins/platforms/xlib/xlib.pro                |   4 +-
 12 files changed, 328 insertions(+), 271 deletions(-)
 create mode 100644 src/plugins/platforms/eglconvenience/qxlibeglintegration.cpp
 create mode 100644 src/plugins/platforms/eglconvenience/qxlibeglintegration.h
 delete mode 100644 src/plugins/platforms/xlib/qxlibeglintegration.cpp
 delete mode 100644 src/plugins/platforms/xlib/qxlibeglintegration.h

diff --git a/src/plugins/platforms/eglconvenience/qxlibeglintegration.cpp b/src/plugins/platforms/eglconvenience/qxlibeglintegration.cpp
new file mode 100644
index 0000000..1135d2f
--- /dev/null
+++ b/src/plugins/platforms/eglconvenience/qxlibeglintegration.cpp
@@ -0,0 +1,186 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtOpenVG module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qxlibeglintegration.h"
+
+static int countBits(unsigned long mask)
+{
+    int count = 0;
+    while (mask != 0) {
+        if (mask & 1)
+            ++count;
+        mask >>= 1;
+    }
+    return count;
+}
+
+VisualID QXlibEglIntegration::getCompatibleVisualId(Display *display, EGLConfig config)
+{
+    VisualID    visualId = 0;
+    EGLint      eglValue = 0;
+
+    EGLDisplay eglDisplay = eglGetDisplay(display);
+
+    EGLint configRedSize = 0;
+    eglGetConfigAttrib(eglDisplay, config, EGL_RED_SIZE, &configRedSize);
+
+    EGLint configGreenSize = 0;
+    eglGetConfigAttrib(eglDisplay, config, EGL_GREEN_SIZE, &configGreenSize);
+
+    EGLint configBlueSize = 0;
+    eglGetConfigAttrib(eglDisplay, config, EGL_BLUE_SIZE, &configBlueSize);
+
+    EGLint configAlphaSize = 0;
+    eglGetConfigAttrib(eglDisplay, config, EGL_ALPHA_SIZE, &configAlphaSize);
+
+    eglGetConfigAttrib(eglDisplay, config, EGL_CONFIG_ID, &eglValue);
+    int configId = eglValue;
+
+    // See if EGL provided a valid VisualID:
+    eglGetConfigAttrib(eglDisplay, config, EGL_NATIVE_VISUAL_ID, &eglValue);
+    visualId = (VisualID)eglValue;
+    if (visualId) {
+        // EGL has suggested a visual id, so get the rest of the visual info for that id:
+        XVisualInfo visualInfoTemplate;
+        memset(&visualInfoTemplate, 0, sizeof(XVisualInfo));
+        visualInfoTemplate.visualid = visualId;
+
+        XVisualInfo *chosenVisualInfo;
+        int matchingCount = 0;
+        chosenVisualInfo = XGetVisualInfo(display, VisualIDMask, &visualInfoTemplate, &matchingCount);
+        if (chosenVisualInfo) {
+            // Skip size checks if implementation supports non-matching visual
+            // and config (http://bugreports.qt.nokia.com/browse/QTBUG-9444).
+            if (q_hasEglExtension(eglDisplay,"EGL_NV_post_convert_rounding")) {
+                XFree(chosenVisualInfo);
+                return visualId;
+            }
+
+            int visualRedSize = countBits(chosenVisualInfo->red_mask);
+            int visualGreenSize = countBits(chosenVisualInfo->green_mask);
+            int visualBlueSize = countBits(chosenVisualInfo->blue_mask);
+            int visualAlphaSize = -1; // Need XRender to tell us the alpha channel size
+
+            bool visualMatchesConfig = false;
+            if ( visualRedSize == configRedSize &&
+                 visualGreenSize == configGreenSize &&
+                 visualBlueSize == configBlueSize )
+            {
+                // We need XRender to check the alpha channel size of the visual. If we don't have
+                // the alpha size, we don't check it against the EGL config's alpha size.
+                if (visualAlphaSize >= 0)
+                    visualMatchesConfig = visualAlphaSize == configAlphaSize;
+                else
+                    visualMatchesConfig = true;
+            }
+
+            if (!visualMatchesConfig) {
+                if (visualAlphaSize >= 0) {
+                    qWarning("Warning: EGL suggested using X Visual ID %d (ARGB%d%d%d%d) for EGL config %d (ARGB%d%d%d%d), but this is incompatable",
+                             (int)visualId, visualAlphaSize, visualRedSize, visualGreenSize, visualBlueSize,
+                             configId, configAlphaSize, configRedSize, configGreenSize, configBlueSize);
+                } else {
+                    qWarning("Warning: EGL suggested using X Visual ID %d (RGB%d%d%d) for EGL config %d (RGB%d%d%d), but this is incompatable",
+                             (int)visualId, visualRedSize, visualGreenSize, visualBlueSize,
+                             configId, configRedSize, configGreenSize, configBlueSize);
+                }
+                visualId = 0;
+            }
+        } else {
+            qWarning("Warning: EGL suggested using X Visual ID %d for EGL config %d, but that isn't a valid ID",
+                     (int)visualId, configId);
+            visualId = 0;
+        }
+        XFree(chosenVisualInfo);
+    }
+#ifdef QT_DEBUG_X11_VISUAL_SELECTION
+    else
+        qDebug("EGL did not suggest a VisualID (EGL_NATIVE_VISUAL_ID was zero) for EGLConfig %d", configId);
+#endif
+
+    if (visualId) {
+#ifdef QT_DEBUG_X11_VISUAL_SELECTION
+        if (configAlphaSize > 0)
+            qDebug("Using ARGB Visual ID %d provided by EGL for config %d", (int)visualId, configId);
+        else
+            qDebug("Using Opaque Visual ID %d provided by EGL for config %d", (int)visualId, configId);
+#endif
+        return visualId;
+    }
+
+    // Finally, try to
+    // use XGetVisualInfo and only use the bit depths to match on:
+    if (!visualId) {
+        XVisualInfo visualInfoTemplate;
+        memset(&visualInfoTemplate, 0, sizeof(XVisualInfo));
+        XVisualInfo *matchingVisuals;
+        int matchingCount = 0;
+
+        visualInfoTemplate.depth = configRedSize + configGreenSize + configBlueSize + configAlphaSize;
+        matchingVisuals = XGetVisualInfo(display,
+                                         VisualDepthMask,
+                                         &visualInfoTemplate,
+                                         &matchingCount);
+        if (!matchingVisuals) {
+            // Try again without taking the alpha channel into account:
+            visualInfoTemplate.depth = configRedSize + configGreenSize + configBlueSize;
+            matchingVisuals = XGetVisualInfo(display,
+                                             VisualDepthMask,
+                                             &visualInfoTemplate,
+                                             &matchingCount);
+        }
+
+        if (matchingVisuals) {
+            visualId = matchingVisuals[0].visualid;
+            XFree(matchingVisuals);
+        }
+    }
+
+    if (visualId) {
+#ifdef QT_DEBUG_X11_VISUAL_SELECTION
+        qDebug("Using Visual ID %d provided by XGetVisualInfo for EGL config %d", (int)visualId, configId);
+#endif
+        return visualId;
+    }
+
+    qWarning("Unable to find an X11 visual which matches EGL config %d", configId);
+    return (VisualID)0;
+}
diff --git a/src/plugins/platforms/eglconvenience/qxlibeglintegration.h b/src/plugins/platforms/eglconvenience/qxlibeglintegration.h
new file mode 100644
index 0000000..f62dce4
--- /dev/null
+++ b/src/plugins/platforms/eglconvenience/qxlibeglintegration.h
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtOpenVG module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTESTLITEEGLINTEGRATION_H
+#define QTESTLITEEGLINTEGRATION_H
+
+#include "qeglconvenience.h"
+
+class QXlibEglIntegration
+{
+public:
+    static VisualID getCompatibleVisualId(Display *display, EGLConfig config);
+};
+
+#endif // QTESTLITEEGLINTEGRATION_H
diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
index 0696ed3..967aa4d 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
@@ -49,7 +49,7 @@
 
 #include <stdio.h>
 
-#ifdef XCB_USE_XLIB_FOR_GLX
+#ifdef XCB_USE_XLIB
 #include <X11/Xlib.h>
 #include <X11/Xlib-xcb.h>
 #endif
@@ -59,7 +59,7 @@ QXcbConnection::QXcbConnection(const char *displayName)
 {
     int primaryScreen = 0;
 
-#ifdef XCB_USE_XLIB_FOR_GLX
+#ifdef XCB_USE_XLIB
     Display *dpy = XOpenDisplay(m_displayName.constData());
     primaryScreen = DefaultScreen(dpy);
     m_connection = XGetXCBConnection(dpy);
@@ -91,7 +91,7 @@ QXcbConnection::~QXcbConnection()
 {
     qDeleteAll(m_screens);
 
-#ifdef XCB_USE_XLIB_FOR_GLX
+#ifdef XCB_USE_XLIB
     XCloseDisplay((Display *)m_xlib_display);
 #else
     xcb_disconnect(xcb_connection());
diff --git a/src/plugins/platforms/xcb/qxcbconnection.h b/src/plugins/platforms/xcb/qxcbconnection.h
index 8a225c2..6a472a7 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.h
+++ b/src/plugins/platforms/xcb/qxcbconnection.h
@@ -232,7 +232,7 @@ public:
 
     QXcbKeyboard *keyboard() const { return m_keyboard; }
 
-#ifdef XCB_USE_XLIB_FOR_GLX
+#ifdef XCB_USE_XLIB
     void *xlib_display() const { return m_xlib_display; }
 #endif
 
@@ -254,7 +254,7 @@ private:
 
     QXcbKeyboard *m_keyboard;
 
-#ifdef XCB_USE_XLIB_FOR_GLX
+#ifdef XCB_USE_XLIB
     void *m_xlib_display;
 #endif
 };
diff --git a/src/plugins/platforms/xcb/qxcbintegration.cpp b/src/plugins/platforms/xcb/qxcbintegration.cpp
index 89a6154..6dc5a5c 100644
--- a/src/plugins/platforms/xcb/qxcbintegration.cpp
+++ b/src/plugins/platforms/xcb/qxcbintegration.cpp
@@ -53,6 +53,10 @@
 
 #include <stdio.h>
 
+#ifdef XCB_USE_EGL
+#include <EGL/egl.h>
+#endif
+
 QXcbIntegration::QXcbIntegration()
     : m_connection(new QXcbConnection)
 {
@@ -118,8 +122,20 @@ QPixmap QXcbIntegration::grabWindow(WId window, int x, int y, int width, int hei
 
 bool QXcbIntegration::hasOpenGL() const
 {
-#ifdef XCB_USE_XLIB_FOR_GLX
+#if defined(XCB_USE_GLX)
     return true;
+#elif defined(XCB_USE_EGL)
+    static bool eglHasbeenInitialized = false;
+    static bool wasEglInitialized = false;
+    if (!eglHasbeenInitialized) {
+        eglHasbeenInitialized = true;
+        const QXcbScreen *screen = static_cast<const QXcbScreen *>(m_screens.at(0));
+        EGLint major, minor;
+        eglBindAPI(EGL_OPENGL_ES_API);
+        EGLDisplay disp = eglGetDisplay((Display*)screen->connection()->xlib_display());
+        wasEglInitialized = eglInitialize(disp,&major,&minor);
+    }
+    return wasEglInitialized;
 #else
     return false;
 #endif
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index 78cba1c..bb856f2 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -53,10 +53,17 @@
 
 #include <stdio.h>
 
-#ifdef XCB_USE_XLIB_FOR_GLX
+#ifdef XCB_USE_XLIB
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
+#endif
+
+#if defined(XCB_USE_GLX)
 #include "qglxintegration.h"
+#elif defined(XCB_USE_EGL)
+#include "../eglconvenience/qeglplatformcontext.h"
+#include "../eglconvenience/qeglconvenience.h"
+#include "../eglconvenience/qxlibeglintegration.h"
 #endif
 
 // Returns true if we should set WM_TRANSIENT_FOR on \a w
@@ -74,9 +81,7 @@ static inline bool isTransient(const QWidget *w)
 
 QXcbWindow::QXcbWindow(QWidget *tlw)
     : QPlatformWindow(tlw)
-#ifdef XCB_USE_XLIB_FOR_GLX
-    , m_glx_context(0)
-#endif
+    , m_context(0)
 {
     m_screen = static_cast<QXcbScreen *>(QPlatformScreen::platformScreenForWidget(tlw));
 
@@ -100,10 +105,24 @@ QXcbWindow::QXcbWindow(QWidget *tlw)
         | XCB_EVENT_MASK_FOCUS_CHANGE
     };
 
-#ifdef XCB_USE_XLIB_FOR_GLX
+#if defined(XCB_USE_GLX) || defined(XCB_USE_EGL)
     if (tlw->platformWindowFormat().windowApi() == QPlatformWindowFormat::OpenGL
        && QApplicationPrivate::platformIntegration()->hasOpenGL() ) {
+#if defined(XCB_USE_GLX)
             XVisualInfo *visualInfo = QGLXContext::findVisualInfo(m_screen, tlw->platformWindowFormat());
+#elif defined(XCB_USE_EGL)
+        EGLDisplay eglDisplay = eglGetDisplay(DISPLAY_FROM_XCB(this));
+        EGLConfig eglConfig = q_configFromQPlatformWindowFormat(eglDisplay,tlw->platformWindowFormat(),true);
+        VisualID id = QXlibEglIntegration::getCompatibleVisualId(DISPLAY_FROM_XCB(this),eglConfig);
+
+        XVisualInfo visualInfoTemplate;
+        memset(&visualInfoTemplate, 0, sizeof(XVisualInfo));
+        visualInfoTemplate.visualid = id;
+
+        XVisualInfo *visualInfo;
+        int matchingCount = 0;
+        visualInfo = XGetVisualInfo(DISPLAY_FROM_XCB(this), VisualIDMask, &visualInfoTemplate, &matchingCount);
+#endif //XCB_USE_GLX
             if (visualInfo) {
                 Colormap cmap = XCreateColormap(DISPLAY_FROM_XCB(this), m_screen->root(), visualInfo->visual, AllocNone);
 
@@ -395,21 +414,31 @@ void QXcbWindow::requestActivateWindow()
 
 QPlatformGLContext *QXcbWindow::glContext() const
 {
-#ifdef XCB_USE_XLIB_FOR_GLX
     if (!QApplicationPrivate::platformIntegration()->hasOpenGL()) {
         printf("no opengl\n");
         return 0;
     }
-
-    if (!m_glx_context) {
+#if defined(XCB_USE_GLX)
+    if (!m_context) {
         QXcbWindow *that = const_cast<QXcbWindow *>(this);
-        that->m_glx_context = new QGLXContext(m_window, m_screen, widget()->platformWindowFormat());
+        that->m_context = new QGLXContext(m_window, m_screen, widget()->platformWindowFormat());
     }
+#elif defined(XCB_USE_EGL)
+    if (!m_context) {
+        EGLDisplay display = eglGetDisplay(DISPLAY_FROM_XCB(this));
 
-    return m_glx_context;
-#else
-    return 0;
+        EGLConfig config = q_configFromQPlatformWindowFormat(display,widget()->platformWindowFormat(),true);
+        QVector<EGLint> eglContextAttrs;
+        eglContextAttrs.append(EGL_CONTEXT_CLIENT_VERSION);
+        eglContextAttrs.append(2);
+        eglContextAttrs.append(EGL_NONE);
+
+        EGLSurface eglSurface = eglCreateWindowSurface(display,config,(EGLNativeWindowType)m_window,0);
+        QXcbWindow *that = const_cast<QXcbWindow *>(this);
+        that->m_context = new QEGLPlatformContext(display, config, eglContextAttrs.data(), eglSurface, EGL_OPENGL_ES_API);
+    }
 #endif
+    return m_context;
 }
 
 void QXcbWindow::handleExposeEvent(const xcb_expose_event_t *event)
diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h
index 8db1a1e..2e8238b 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.h
+++ b/src/plugins/platforms/xcb/qxcbwindow.h
@@ -43,12 +43,12 @@
 #define QXCBWINDOW_H
 
 #include <QtGui/QPlatformWindow>
+#include <QtGui/QPlatformWindowFormat>
 
 #include <xcb/xcb.h>
 
 #include "qxcbobject.h"
 
-class QGLXContext;
 class QXcbScreen;
 
 class QXcbWindow : public QXcbObject, public QPlatformWindow
@@ -92,9 +92,7 @@ private:
     QXcbScreen *m_screen;
 
     xcb_window_t m_window;
-#ifdef XCB_USE_XLIB_FOR_GLX
-    QGLXContext *m_glx_context;
-#endif
+    QPlatformGLContext *m_context;
 };
 
 #endif
diff --git a/src/plugins/platforms/xcb/xcb.pro b/src/plugins/platforms/xcb/xcb.pro
index a6e92ef..b5850e4 100644
--- a/src/plugins/platforms/xcb/xcb.pro
+++ b/src/plugins/platforms/xcb/xcb.pro
@@ -21,14 +21,29 @@ HEADERS = \
         qxcbwindow.h \
         qxcbwindowsurface.h
 
-contains(QT_CONFIG, opengl):DEFINES += XCB_USE_XLIB_FOR_GLX
-
-contains(DEFINES, XCB_USE_XLIB_FOR_GLX) {
+contains(QT_CONFIG, opengl) {
     QT += opengl
-
-    HEADERS += qglxintegration.h
-    SOURCES += qglxintegration.cpp
+    DEFINES += XCB_USE_XLIB
     LIBS += -lX11 -lX11-xcb
+
+    contains(QT_CONFIG, opengles2) {
+        DEFINES += XCB_USE_EGL
+        HEADERS += \
+            ../eglconvenience/qeglplatformcontext.h \
+            ../eglconvenience/qeglconvenience.h \
+            ../eglconvenience/qxlibeglintegration.h
+
+        SOURCES += \
+            ../eglconvenience/qeglplatformcontext.cpp \
+            ../eglconvenience/qeglconvenience.cpp \
+            ../eglconvenience/qxlibeglintegration.cpp
+
+        LIBS += -lEGL
+    } else {
+        DEFINES += XCB_USE_GLX
+        HEADERS += qglxintegration.h
+        SOURCES += qglxintegration.cpp
+    }
 }
 
 LIBS += -lxcb -lxcb-image -lxcb-keysyms -lxcb-icccm
diff --git a/src/plugins/platforms/xlib/qxlibeglintegration.cpp b/src/plugins/platforms/xlib/qxlibeglintegration.cpp
deleted file mode 100644
index 1135d2f..0000000
--- a/src/plugins/platforms/xlib/qxlibeglintegration.cpp
+++ /dev/null
@@ -1,186 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtOpenVG module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qxlibeglintegration.h"
-
-static int countBits(unsigned long mask)
-{
-    int count = 0;
-    while (mask != 0) {
-        if (mask & 1)
-            ++count;
-        mask >>= 1;
-    }
-    return count;
-}
-
-VisualID QXlibEglIntegration::getCompatibleVisualId(Display *display, EGLConfig config)
-{
-    VisualID    visualId = 0;
-    EGLint      eglValue = 0;
-
-    EGLDisplay eglDisplay = eglGetDisplay(display);
-
-    EGLint configRedSize = 0;
-    eglGetConfigAttrib(eglDisplay, config, EGL_RED_SIZE, &configRedSize);
-
-    EGLint configGreenSize = 0;
-    eglGetConfigAttrib(eglDisplay, config, EGL_GREEN_SIZE, &configGreenSize);
-
-    EGLint configBlueSize = 0;
-    eglGetConfigAttrib(eglDisplay, config, EGL_BLUE_SIZE, &configBlueSize);
-
-    EGLint configAlphaSize = 0;
-    eglGetConfigAttrib(eglDisplay, config, EGL_ALPHA_SIZE, &configAlphaSize);
-
-    eglGetConfigAttrib(eglDisplay, config, EGL_CONFIG_ID, &eglValue);
-    int configId = eglValue;
-
-    // See if EGL provided a valid VisualID:
-    eglGetConfigAttrib(eglDisplay, config, EGL_NATIVE_VISUAL_ID, &eglValue);
-    visualId = (VisualID)eglValue;
-    if (visualId) {
-        // EGL has suggested a visual id, so get the rest of the visual info for that id:
-        XVisualInfo visualInfoTemplate;
-        memset(&visualInfoTemplate, 0, sizeof(XVisualInfo));
-        visualInfoTemplate.visualid = visualId;
-
-        XVisualInfo *chosenVisualInfo;
-        int matchingCount = 0;
-        chosenVisualInfo = XGetVisualInfo(display, VisualIDMask, &visualInfoTemplate, &matchingCount);
-        if (chosenVisualInfo) {
-            // Skip size checks if implementation supports non-matching visual
-            // and config (http://bugreports.qt.nokia.com/browse/QTBUG-9444).
-            if (q_hasEglExtension(eglDisplay,"EGL_NV_post_convert_rounding")) {
-                XFree(chosenVisualInfo);
-                return visualId;
-            }
-
-            int visualRedSize = countBits(chosenVisualInfo->red_mask);
-            int visualGreenSize = countBits(chosenVisualInfo->green_mask);
-            int visualBlueSize = countBits(chosenVisualInfo->blue_mask);
-            int visualAlphaSize = -1; // Need XRender to tell us the alpha channel size
-
-            bool visualMatchesConfig = false;
-            if ( visualRedSize == configRedSize &&
-                 visualGreenSize == configGreenSize &&
-                 visualBlueSize == configBlueSize )
-            {
-                // We need XRender to check the alpha channel size of the visual. If we don't have
-                // the alpha size, we don't check it against the EGL config's alpha size.
-                if (visualAlphaSize >= 0)
-                    visualMatchesConfig = visualAlphaSize == configAlphaSize;
-                else
-                    visualMatchesConfig = true;
-            }
-
-            if (!visualMatchesConfig) {
-                if (visualAlphaSize >= 0) {
-                    qWarning("Warning: EGL suggested using X Visual ID %d (ARGB%d%d%d%d) for EGL config %d (ARGB%d%d%d%d), but this is incompatable",
-                             (int)visualId, visualAlphaSize, visualRedSize, visualGreenSize, visualBlueSize,
-                             configId, configAlphaSize, configRedSize, configGreenSize, configBlueSize);
-                } else {
-                    qWarning("Warning: EGL suggested using X Visual ID %d (RGB%d%d%d) for EGL config %d (RGB%d%d%d), but this is incompatable",
-                             (int)visualId, visualRedSize, visualGreenSize, visualBlueSize,
-                             configId, configRedSize, configGreenSize, configBlueSize);
-                }
-                visualId = 0;
-            }
-        } else {
-            qWarning("Warning: EGL suggested using X Visual ID %d for EGL config %d, but that isn't a valid ID",
-                     (int)visualId, configId);
-            visualId = 0;
-        }
-        XFree(chosenVisualInfo);
-    }
-#ifdef QT_DEBUG_X11_VISUAL_SELECTION
-    else
-        qDebug("EGL did not suggest a VisualID (EGL_NATIVE_VISUAL_ID was zero) for EGLConfig %d", configId);
-#endif
-
-    if (visualId) {
-#ifdef QT_DEBUG_X11_VISUAL_SELECTION
-        if (configAlphaSize > 0)
-            qDebug("Using ARGB Visual ID %d provided by EGL for config %d", (int)visualId, configId);
-        else
-            qDebug("Using Opaque Visual ID %d provided by EGL for config %d", (int)visualId, configId);
-#endif
-        return visualId;
-    }
-
-    // Finally, try to
-    // use XGetVisualInfo and only use the bit depths to match on:
-    if (!visualId) {
-        XVisualInfo visualInfoTemplate;
-        memset(&visualInfoTemplate, 0, sizeof(XVisualInfo));
-        XVisualInfo *matchingVisuals;
-        int matchingCount = 0;
-
-        visualInfoTemplate.depth = configRedSize + configGreenSize + configBlueSize + configAlphaSize;
-        matchingVisuals = XGetVisualInfo(display,
-                                         VisualDepthMask,
-                                         &visualInfoTemplate,
-                                         &matchingCount);
-        if (!matchingVisuals) {
-            // Try again without taking the alpha channel into account:
-            visualInfoTemplate.depth = configRedSize + configGreenSize + configBlueSize;
-            matchingVisuals = XGetVisualInfo(display,
-                                             VisualDepthMask,
-                                             &visualInfoTemplate,
-                                             &matchingCount);
-        }
-
-        if (matchingVisuals) {
-            visualId = matchingVisuals[0].visualid;
-            XFree(matchingVisuals);
-        }
-    }
-
-    if (visualId) {
-#ifdef QT_DEBUG_X11_VISUAL_SELECTION
-        qDebug("Using Visual ID %d provided by XGetVisualInfo for EGL config %d", (int)visualId, configId);
-#endif
-        return visualId;
-    }
-
-    qWarning("Unable to find an X11 visual which matches EGL config %d", configId);
-    return (VisualID)0;
-}
diff --git a/src/plugins/platforms/xlib/qxlibeglintegration.h b/src/plugins/platforms/xlib/qxlibeglintegration.h
deleted file mode 100644
index 6a94b8e..0000000
--- a/src/plugins/platforms/xlib/qxlibeglintegration.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtOpenVG module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QTESTLITEEGLINTEGRATION_H
-#define QTESTLITEEGLINTEGRATION_H
-
-#include "qxlibstatic.h"
-#include "../eglconvenience/qeglconvenience.h"
-
-class QXlibEglIntegration
-{
-public:
-    static VisualID getCompatibleVisualId(Display *display, EGLConfig config);
-};
-
-#endif // QTESTLITEEGLINTEGRATION_H
diff --git a/src/plugins/platforms/xlib/qxlibwindow.cpp b/src/plugins/platforms/xlib/qxlibwindow.cpp
index 90b36cf..b0d32d9 100644
--- a/src/plugins/platforms/xlib/qxlibwindow.cpp
+++ b/src/plugins/platforms/xlib/qxlibwindow.cpp
@@ -61,7 +61,7 @@
 #else
 #include "../eglconvenience/qeglconvenience.h"
 #include "../eglconvenience/qeglplatformcontext.h"
-#include "qxlibeglintegration.h"
+#include "../eglconvenience/qxlibeglintegration.h"
 #endif  //QT_OPENGL_ES_2
 #endif //QT_NO_OPENGL
 
diff --git a/src/plugins/platforms/xlib/xlib.pro b/src/plugins/platforms/xlib/xlib.pro
index dc22b80..159fdbe 100644
--- a/src/plugins/platforms/xlib/xlib.pro
+++ b/src/plugins/platforms/xlib/xlib.pro
@@ -45,12 +45,12 @@ contains(QT_CONFIG, opengl) {
         HEADERS += \
             ../eglconvenience/qeglplatformcontext.h \
             ../eglconvenience/qeglconvenience.h \
-            qxlibeglintegration.h
+            ../eglconvenience/qxlibeglintegration.h
 
         SOURCES += \
             ../eglconvenience/qeglplatformcontext.cpp \
             ../eglconvenience/qeglconvenience.cpp \
-            qxlibeglintegration.cpp
+            ../eglconvenience/qxlibeglintegration.cpp
         LIBS += -lEGL
     }
 }
-- 
cgit v0.12