summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorJørgen Lind <jorgen.lind@nokia.com>2011-02-24 16:43:52 (GMT)
committerJørgen Lind <jorgen.lind@nokia.com>2011-03-01 07:59:40 (GMT)
commit7629130b24c01d406f5dee8e6600538db666cfa8 (patch)
tree48f65f55fae1dc0eb8dc06a333415b0cd04d7a9f /src/plugins
parent463cee77f75d20760f9f74f52e1dfccb44fcb862 (diff)
downloadQt-7629130b24c01d406f5dee8e6600538db666cfa8.zip
Qt-7629130b24c01d406f5dee8e6600538db666cfa8.tar.gz
Qt-7629130b24c01d406f5dee8e6600538db666cfa8.tar.bz2
Lighthouse: Adding EGL support to the xcb plugin
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/platforms/eglconvenience/qxlibeglintegration.cpp (renamed from src/plugins/platforms/xlib/qxlibeglintegration.cpp)0
-rw-r--r--src/plugins/platforms/eglconvenience/qxlibeglintegration.h (renamed from src/plugins/platforms/xlib/qxlibeglintegration.h)3
-rw-r--r--src/plugins/platforms/xcb/qxcbconnection.cpp6
-rw-r--r--src/plugins/platforms/xcb/qxcbconnection.h4
-rw-r--r--src/plugins/platforms/xcb/qxcbintegration.cpp18
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.cpp53
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.h6
-rw-r--r--src/plugins/platforms/xcb/xcb.pro27
-rw-r--r--src/plugins/platforms/xlib/qxlibwindow.cpp2
-rw-r--r--src/plugins/platforms/xlib/xlib.pro4
10 files changed, 90 insertions, 33 deletions
diff --git a/src/plugins/platforms/xlib/qxlibeglintegration.cpp b/src/plugins/platforms/eglconvenience/qxlibeglintegration.cpp
index 1135d2f..1135d2f 100644
--- a/src/plugins/platforms/xlib/qxlibeglintegration.cpp
+++ b/src/plugins/platforms/eglconvenience/qxlibeglintegration.cpp
diff --git a/src/plugins/platforms/xlib/qxlibeglintegration.h b/src/plugins/platforms/eglconvenience/qxlibeglintegration.h
index 6a94b8e..f62dce4 100644
--- a/src/plugins/platforms/xlib/qxlibeglintegration.h
+++ b/src/plugins/platforms/eglconvenience/qxlibeglintegration.h
@@ -42,8 +42,7 @@
#ifndef QTESTLITEEGLINTEGRATION_H
#define QTESTLITEEGLINTEGRATION_H
-#include "qxlibstatic.h"
-#include "../eglconvenience/qeglconvenience.h"
+#include "qeglconvenience.h"
class QXlibEglIntegration
{
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/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
}
}