Get declarative and wayland EGL backend working for Qt compositor.
authorSamuel Rødal <samuel.rodal@nokia.com>
Thu, 23 Jun 2011 13:37:37 +0000 (15:37 +0200)
committerSamuel Rødal <samuel.rodal@nokia.com>
Thu, 23 Jun 2011 13:40:42 +0000 (15:40 +0200)
src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.cpp
src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglintegration.h
src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglwindow.cpp
src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandeglwindow.h
src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.cpp
src/plugins/platforms/wayland/gl_integration/wayland_egl/qwaylandglcontext.h

index d5c2f62..ab15401 100644 (file)
 #include "gl_integration/qwaylandglintegration.h"
 
 #include "qwaylandeglwindow.h"
+#include "qwaylandglcontext.h"
 
 #include <QtCore/QDebug>
 
 QWaylandEglIntegration::QWaylandEglIntegration(struct wl_display *waylandDisplay)
-    : mWaylandDisplay(waylandDisplay)
+    : m_waylandDisplay(waylandDisplay)
 {
     qDebug() << "Using Wayland-EGL";
 }
@@ -56,17 +57,17 @@ QWaylandEglIntegration::QWaylandEglIntegration(struct wl_display *waylandDisplay
 
 QWaylandEglIntegration::~QWaylandEglIntegration()
 {
-    eglTerminate(mEglDisplay);
+    eglTerminate(m_eglDisplay);
 }
 
 void QWaylandEglIntegration::initialize()
 {
     EGLint major,minor;
-    mEglDisplay = eglGetDisplay(mWaylandDisplay);
-    if (mEglDisplay == NULL) {
+    m_eglDisplay = eglGetDisplay(m_waylandDisplay);
+    if (m_eglDisplay == NULL) {
         qWarning("EGL not available");
     } else {
-        if (!eglInitialize(mEglDisplay, &major, &minor)) {
+        if (!eglInitialize(m_eglDisplay, &major, &minor)) {
             qWarning("failed to initialize EGL display");
             return;
         }
@@ -78,9 +79,14 @@ QWaylandWindow *QWaylandEglIntegration::createEglWindow(QWindow *window)
     return new QWaylandEglWindow(window);
 }
 
+QPlatformGLContext *QWaylandEglIntegration::createPlatformGLContext(const QSurfaceFormat &glFormat, QPlatformGLContext *share) const
+{
+    return new QWaylandGLContext(m_eglDisplay, glFormat, share);
+}
+
 EGLDisplay QWaylandEglIntegration::eglDisplay() const
 {
-    return mEglDisplay;
+    return m_eglDisplay;
 }
 
 QWaylandGLIntegration *QWaylandGLIntegration::createGLIntegration(QWaylandDisplay *waylandDisplay)
index bc20b2c..5e39e39 100644 (file)
@@ -58,13 +58,14 @@ public:
     void initialize();
 
     QWaylandWindow *createEglWindow(QWindow *window);
+    QPlatformGLContext *createPlatformGLContext(const QSurfaceFormat &glFormat, QPlatformGLContext *share) const;
 
     EGLDisplay eglDisplay() const;
-    struct wl_egl_display *nativeDisplay() const;
+
 private:
-    struct wl_display *mWaylandDisplay;
+    struct wl_display *m_waylandDisplay;
 
-    EGLDisplay mEglDisplay;
+    EGLDisplay m_eglDisplay;
 };
 
 #endif // QWAYLANDEGLINTEGRATION_H
index 4a085ae..245097e 100644 (file)
 #include "qwaylandscreen.h"
 #include "qwaylandglcontext.h"
 
+#include <QtPlatformSupport/private/qeglconvenience_p.h>
+
 #include <QtGui/QWindow>
 
 QWaylandEglWindow::QWaylandEglWindow(QWindow *window)
     : QWaylandWindow(window)
-    , mGLContext(0)
-    , mWaylandEglWindow(0)
+    , m_waylandEglWindow(0)
+    , m_eglSurface(0)
+    , m_eglConfig(0)
+    , m_format(window->format())
 {
-    mEglIntegration = static_cast<QWaylandEglIntegration *>(mDisplay->eglIntegration());
+    m_eglIntegration = static_cast<QWaylandEglIntegration *>(mDisplay->eglIntegration());
+
     //super creates a new surface
     newSurfaceCreated();
 }
 
 QWaylandEglWindow::~QWaylandEglWindow()
 {
-    delete mGLContext;
+    if (m_eglSurface) {
+        eglDestroySurface(m_eglIntegration->eglDisplay(), m_eglSurface);
+        m_eglSurface = 0;
+    }
 }
 
 QWaylandWindow::WindowType QWaylandEglWindow::windowType() const
@@ -69,46 +77,46 @@ QWaylandWindow::WindowType QWaylandEglWindow::windowType() const
 void QWaylandEglWindow::setGeometry(const QRect &rect)
 {
     QWaylandWindow::setGeometry(rect);
-    if (mWaylandEglWindow) {
-        wl_egl_window_resize(mWaylandEglWindow,rect.width(),rect.height(),0,0);
-    }
+    if (m_waylandEglWindow)
+        wl_egl_window_resize(m_waylandEglWindow, rect.width(), rect.height(), 0, 0);
 }
 
-void QWaylandEglWindow::setParent(const QPlatformWindow *parent)
+void QWaylandEglWindow::newSurfaceCreated()
 {
-    const QWaylandWindow *wParent = static_cast<const QWaylandWindow *>(parent);
-
-    mParentWindow = wParent;
-}
+    if (m_waylandEglWindow)
+        wl_egl_window_destroy(m_waylandEglWindow);
 
-QPlatformGLContext * QWaylandEglWindow::glContext() const
-{
-    if (!mGLContext) {
-        QWaylandEglWindow *that = const_cast<QWaylandEglWindow *>(this);
-        that->mGLContext = new QWaylandGLContext(mEglIntegration->eglDisplay(),this->window()->requestedWindowFormat());
+    wl_visual *visual = QWaylandScreen::waylandScreenFromWindow(window())->visual();
+    QSize size = geometry().size();
+    if (!size.isValid())
+        size = QSize(0,0);
 
-        EGLNativeWindowType window(reinterpret_cast<EGLNativeWindowType>(mWaylandEglWindow));
-        EGLSurface surface = eglCreateWindowSurface(mEglIntegration->eglDisplay(),mGLContext->eglConfig(),window,NULL);
-        that->mGLContext->setEglSurface(surface);
+    if (m_eglSurface) {
+        eglDestroySurface(m_eglIntegration->eglDisplay(), m_eglSurface);
+        m_eglSurface = 0;
     }
 
-    return mGLContext;
+    m_waylandEglWindow = wl_egl_window_create(mSurface, size.width(), size.height(), visual);
 }
 
-void QWaylandEglWindow::newSurfaceCreated()
+QSurfaceFormat QWaylandEglWindow::format() const
 {
-    if (mWaylandEglWindow) {
-        wl_egl_window_destroy(mWaylandEglWindow);
-    }
-    wl_visual *visual = QWaylandScreen::waylandScreenFromWindow(window())->visual();
-    QSize size = geometry().size();
-    if (!size.isValid())
-        size = QSize(0,0);
+    return m_format;
+}
+
+EGLSurface QWaylandEglWindow::eglSurface() const
+{
+    if (!m_waylandEglWindow)
+        return 0;
 
-    mWaylandEglWindow = wl_egl_window_create(mSurface,size.width(),size.height(),visual);
-    if (mGLContext) {
-        EGLNativeWindowType window(reinterpret_cast<EGLNativeWindowType>(mWaylandEglWindow));
-        EGLSurface surface = eglCreateWindowSurface(mEglIntegration->eglDisplay(),mGLContext->eglConfig(),window,NULL);
-        mGLContext->setEglSurface(surface);
+    if (!m_eglSurface) {
+        if (!m_eglConfig)
+            m_eglConfig = q_configFromGLFormat(m_eglIntegration->eglDisplay(), window()->format(), true);
+
+        EGLNativeWindowType window = m_waylandEglWindow;
+        m_eglSurface = eglCreateWindowSurface(m_eglIntegration->eglDisplay(), m_eglConfig, window, 0);
     }
+
+    return m_eglSurface;
 }
+
index 343c507..d435a51 100644 (file)
@@ -55,16 +55,24 @@ public:
     ~QWaylandEglWindow();
     WindowType windowType() const;
     void setGeometry(const QRect &rect);
-    void setParent(const QPlatformWindow *parent);
-    QPlatformGLContext *glContext() const;
+
+    EGLSurface eglSurface() const;
+
+    QSurfaceFormat format() const;
+
 protected:
     void newSurfaceCreated();
+
 private:
-    QWaylandEglIntegration *mEglIntegration;
-    QWaylandGLContext *mGLContext;
-    struct wl_egl_window *mWaylandEglWindow;
+    QWaylandEglIntegration *m_eglIntegration;
+    struct wl_egl_window *m_waylandEglWindow;
+
+    const QWaylandWindow *m_parentWindow;
+
+    mutable EGLSurface m_eglSurface;
+    mutable EGLConfig m_eglConfig;
 
-    const QWaylandWindow *mParentWindow;
+    QSurfaceFormat m_format;
 };
 
 #endif // QWAYLANDEGLWINDOW_H
index 0cff704..d3ece7c 100644 (file)
 
 #include "qwaylanddisplay.h"
 #include "qwaylandwindow.h"
+#include "qwaylandeglwindow.h"
 
-#include "../../../eglconvenience/qeglconvenience.h"
+#include <QtPlatformSupport/private/qeglconvenience_p.h>
 
 #include <QtGui/QPlatformGLContext>
-#include <QtGui/QWindowFormat>
+#include <QtGui/QSurfaceFormat>
 #include <QtCore/QMutex>
 
-QWaylandGLContext::QWaylandGLContext(EGLDisplay eglDisplay, const QWindowFormat &format)
+QWaylandGLContext::QWaylandGLContext(EGLDisplay eglDisplay, const QSurfaceFormat &format, QPlatformGLContext *share)
     : QPlatformGLContext()
-    , mEglDisplay(eglDisplay)
-    , mSurface(EGL_NO_SURFACE)
-    , mConfig(q_configFromQWindowFormat(mEglDisplay,format,true))
-    , mFormat(q_windowFormatFromConfig(mEglDisplay,mConfig))
+    , m_eglDisplay(eglDisplay)
+    , m_config(q_configFromGLFormat(m_eglDisplay, format, true))
+    , m_format(q_glFormatFromConfig(m_eglDisplay, m_config))
 {
-    EGLContext shareEGLContext = EGL_NO_CONTEXT;
+    EGLContext shareEGLContext = share ? static_cast<QWaylandGLContext *>(share)->eglContext() : EGL_NO_CONTEXT;
 
     eglBindAPI(EGL_OPENGL_ES_API);
 
@@ -66,55 +66,38 @@ QWaylandGLContext::QWaylandGLContext(EGLDisplay eglDisplay, const QWindowFormat
     eglContextAttrs.append(2);
     eglContextAttrs.append(EGL_NONE);
 
-    mContext = eglCreateContext(mEglDisplay, mConfig,
-                                shareEGLContext, eglContextAttrs.constData());
+    m_context = eglCreateContext(m_eglDisplay, m_config, shareEGLContext, eglContextAttrs.constData());
 }
 
-QWaylandGLContext::QWaylandGLContext()
-    : QPlatformGLContext()
-    , mEglDisplay(0)
-    , mContext(EGL_NO_CONTEXT)
-    , mSurface(EGL_NO_SURFACE)
-    , mConfig(0)
-{ }
-
 QWaylandGLContext::~QWaylandGLContext()
 {
-    eglDestroyContext(mEglDisplay,mContext);
+    eglDestroyContext(m_eglDisplay, m_context);
 }
 
-void QWaylandGLContext::makeCurrent()
+bool QWaylandGLContext::makeCurrent(QPlatformSurface *surface)
 {
-    if (mSurface == EGL_NO_SURFACE) {
-        qWarning("makeCurrent with EGL_NO_SURFACE");
-    }
-    eglMakeCurrent(mEglDisplay, mSurface, mSurface, mContext);
+    EGLSurface eglSurface = static_cast<QWaylandEglWindow *>(surface)->eglSurface();
+    return eglMakeCurrent(m_eglDisplay, eglSurface, eglSurface, m_context);
 }
 
 void QWaylandGLContext::doneCurrent()
 {
-    QPlatformGLContext::doneCurrent();
-    eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
-}
-
-void QWaylandGLContext::swapBuffers()
-{
-    eglSwapBuffers(mEglDisplay,mSurface);
+    eglMakeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
 }
 
-void *QWaylandGLContext::getProcAddress(const QString &string)
+void QWaylandGLContext::swapBuffers(QPlatformSurface *surface)
 {
-    return (void *) eglGetProcAddress(string.toLatin1().data());
+    EGLSurface eglSurface = static_cast<QWaylandEglWindow *>(surface)->eglSurface();
+    eglSwapBuffers(m_eglDisplay, eglSurface);
 }
 
-void QWaylandGLContext::setEglSurface(EGLSurface surface)
+void (*QWaylandGLContext::getProcAddress(const QByteArray &procName)) ()
 {
-    doneCurrent();
-    mSurface = surface;
+    return eglGetProcAddress(procName.constData());
 }
 
 EGLConfig QWaylandGLContext::eglConfig() const
 {
-    return mConfig;
+    return m_config;
 }
 
index 47070f5..592f3d1 100644 (file)
@@ -53,27 +53,27 @@ class QWaylandGLWindowSurface;
 
 class QWaylandGLContext : public QPlatformGLContext {
 public:
-    QWaylandGLContext(EGLDisplay eglDisplay, const QWindowFormat &format);
+    QWaylandGLContext(EGLDisplay eglDisplay, const QSurfaceFormat &format, QPlatformGLContext *share);
     ~QWaylandGLContext();
-    void makeCurrent();
+
+    void swapBuffers(QPlatformSurface *surface);
+
+    bool makeCurrent(QPlatformSurface *surface);
     void doneCurrent();
-    void swapBuffers();
-    void* getProcAddress(const QString&);
 
-    QWindowFormat windowFormat() const { return mFormat; }
+    void (*getProcAddress(const QByteArray &procName)) ();
 
-    void setEglSurface(EGLSurface surface);
-    EGLConfig eglConfig() const;
-private:
-    EGLDisplay mEglDisplay;
+    QSurfaceFormat format() const { return m_format; }
 
-    EGLContext mContext;
-    EGLSurface mSurface;
-    EGLConfig mConfig;
-    QWindowFormat mFormat;
+    EGLConfig eglConfig() const;
+    EGLContext eglContext() const { return m_context; }
 
-    QWaylandGLContext();
+private:
+    EGLDisplay m_eglDisplay;
 
+    EGLContext m_context;
+    EGLConfig m_config;
+    QSurfaceFormat m_format;
 };