Get the eglfs plugin compiling.
authorSamuel Rødal <samuel.rodal@nokia.com>
Mon, 25 Jul 2011 12:55:45 +0000 (14:55 +0200)
committerJørgen Lind <jorgen.lind@nokia.com>
Tue, 26 Jul 2011 10:02:32 +0000 (12:02 +0200)
Change-Id: I5addb1a2593a670d559b9fbf9183f52af410895b
Reviewed-on: http://codereview.qt.nokia.com/2176
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Jørgen Lind <jorgen.lind@nokia.com>
15 files changed:
src/gui/kernel/qguiglcontext_qpa.cpp
src/gui/kernel/qplatformglcontext_qpa.cpp
src/gui/kernel/qplatformglcontext_qpa.h
src/gui/kernel/qplatformwindow_qpa.cpp
src/gui/kernel/qplatformwindow_qpa.h
src/platformsupport/eglconvenience/eglconvenience.pri
src/plugins/platforms/eglfs/eglfs.pro
src/plugins/platforms/eglfs/qeglfsbackingstore.cpp [moved from src/plugins/platforms/eglfs/qeglfswindowsurface.cpp with 74% similarity]
src/plugins/platforms/eglfs/qeglfsbackingstore.h [moved from src/plugins/platforms/eglfs/qeglfswindowsurface.h with 86% similarity]
src/plugins/platforms/eglfs/qeglfsintegration.cpp
src/plugins/platforms/eglfs/qeglfsintegration.h
src/plugins/platforms/eglfs/qeglfsscreen.cpp
src/plugins/platforms/eglfs/qeglfsscreen.h
src/plugins/platforms/eglfs/qeglfswindow.cpp
src/plugins/platforms/eglfs/qeglfswindow.h

index 61a0479..a11a1c7 100644 (file)
@@ -180,6 +180,7 @@ bool QGuiGLContext::create()
 
     Q_D(QGuiGLContext);
     d->platformGLContext = QGuiApplicationPrivate::platformIntegration()->createPlatformGLContext(this);
+    d->platformGLContext->setContext(this);
     return d->platformGLContext;
 }
 
index efad9e3..81030b8 100644 (file)
 
     Reimplement this function in a subclass to indicate what format the glContext actually has.
 */
+
+struct QPlatformGLContextPrivate
+{
+    QGuiGLContext *context;
+};
+
+QPlatformGLContext::QPlatformGLContext()
+    : d_ptr(new QPlatformGLContextPrivate)
+{
+    Q_D(QPlatformGLContext);
+    d->context = 0;
+}
+
+QPlatformGLContext::~QPlatformGLContext()
+{
+}
+
+QGuiGLContext *QPlatformGLContext::context() const
+{
+    Q_D(const QPlatformGLContext);
+    return d->context;
+}
+
+void QPlatformGLContext::setContext(QGuiGLContext *context)
+{
+    Q_D(QPlatformGLContext);
+    d->context = context;
+}
index e362e47..30d7186 100644 (file)
@@ -67,10 +67,14 @@ private:
     friend class QPlatformWindow;
 };
 
+class QPlatformGLContextPrivate;
+
 class Q_GUI_EXPORT QPlatformGLContext
 {
+    Q_DECLARE_PRIVATE(QPlatformGLContext)
 public:
-    virtual ~QPlatformGLContext() {}
+    QPlatformGLContext();
+    virtual ~QPlatformGLContext();
 
     virtual QSurfaceFormat format() const = 0;
 
@@ -80,6 +84,17 @@ public:
     virtual void doneCurrent() = 0;
 
     virtual void (*getProcAddress(const QByteArray &procName)) () = 0;
+
+    QGuiGLContext *context() const;
+
+private:
+    friend class QGuiGLContext;
+
+    QScopedPointer<QPlatformGLContextPrivate> d_ptr;
+
+    void setContext(QGuiGLContext *context);
+
+    Q_DISABLE_COPY(QPlatformGLContext)
 };
 
 QT_END_NAMESPACE
index b1fdc97..cd4cc2e 100644 (file)
@@ -43,6 +43,7 @@
 
 #include <QtGui/qwindowsysteminterface_qpa.h>
 #include <QtGui/qwindow.h>
+#include <QtGui/qscreen.h>
 
 class QPlatformWindowPrivate
 {
@@ -89,6 +90,15 @@ QPlatformWindow *QPlatformWindow::parent() const
 }
 
 /*!
+    Returns the platform screen handle corresponding to this platform window.
+*/
+QPlatformScreen *QPlatformWindow::screen() const
+{
+    Q_D(const QPlatformWindow);
+    return d->window->screen()->handle();
+}
+
+/*!
     Returns the actual surface format of the window.
 */
 QSurfaceFormat QPlatformWindow::format() const
index dc988e1..680b24a 100644 (file)
@@ -55,6 +55,7 @@ QT_BEGIN_NAMESPACE
 
 QT_MODULE(Gui)
 
+class QPlatformScreen;
 class QPlatformWindowPrivate;
 class QWindow;
 
@@ -68,6 +69,8 @@ public:
     QWindow *window() const;
     QPlatformWindow *parent() const;
 
+    QPlatformScreen *screen() const;
+
     virtual QSurfaceFormat format() const;
 
     virtual void setGeometry(const QRect &rect);
index f8500e2..868e12c 100644 (file)
@@ -1,4 +1,5 @@
 contains(QT_CONFIG,opengles2) {
+    CONFIG += opengl
     HEADERS += \
         $$PWD/qeglconvenience_p.h \
         $$PWD/qeglplatformcontext_p.h
index bcf5c61..9898d0b 100644 (file)
@@ -2,7 +2,7 @@ TARGET = qeglfs
 TEMPLATE = lib
 CONFIG += plugin
 
-QT += opengl core-private gui-private opengl-private
+QT += opengl core-private gui-private opengl-private platformsupport-private widgets-private
 
 DESTDIR = $$QT.gui.plugins/platforms
 
@@ -12,17 +12,13 @@ DESTDIR = $$QT.gui.plugins/platforms
 
 SOURCES =   main.cpp \
             qeglfsintegration.cpp \
-            ../eglconvenience/qeglconvenience.cpp \
-            ../eglconvenience/qeglplatformcontext.cpp \
             qeglfswindow.cpp \
-            qeglfswindowsurface.cpp \
+            qeglfsbackingstore.cpp \
             qeglfsscreen.cpp
 
 HEADERS =   qeglfsintegration.h \
-            ../eglconvenience/qeglconvenience.h \
-            ../eglconvenience/qeglplatformcontext.h \
             qeglfswindow.h \
-            qeglfswindowsurface.h \
+            qeglfsbackingstore.h \
             qeglfsscreen.h
 
 load(qpa/fontdatabases/genericunix)
 **
 ****************************************************************************/
 
-#include "qeglfswindowsurface.h"
+#include <QtOpenGL/private/qgl_p.h>
+
+#include "qeglfsbackingstore.h"
 
 #include <QtGui/QPlatformGLContext>
+#include <QtGui/QScreen>
 
-#include <QtOpenGL/private/qgl_p.h>
 #include <QtOpenGL/private/qglpaintdevice_p.h>
 
 QT_BEGIN_NAMESPACE
@@ -51,16 +53,16 @@ QT_BEGIN_NAMESPACE
 class QEglFSPaintDevice : public QGLPaintDevice
 {
 public:
-    QEglFSPaintDevice(QEglFSScreen *screen, QWidget *widget)
+    QEglFSPaintDevice(QEglFSScreen *screen)
         :QGLPaintDevice(), m_screen(screen)
     {
     #ifdef QEGL_EXTRA_DEBUG
-        qWarning("QEglPaintDevice %p, %p, %p",this, screen, widget);
+        qWarning("QEglPaintDevice %p, %p",this, screen);
     #endif
     }
 
     QSize size() const { return m_screen->geometry().size(); }
-    QGLContext* context() const { return QGLContext::fromPlatformGLContext(m_screen->platformContext());}
+    QGLContext* context() const { return QGLContext::fromGuiGLContext(m_screen->platformContext()->context()); }
 
     QPaintEngine *paintEngine() const { return qt_qgl_paint_engine(); }
 
@@ -73,29 +75,30 @@ private:
 };
 
 
-QEglFSWindowSurface::QEglFSWindowSurface( QEglFSScreen *screen, QWidget *window )
-    :QWindowSurface(window)
+QEglFSBackingStore::QEglFSBackingStore(QWindow *window)
+    : QPlatformBackingStore(window)
 {
 #ifdef QEGL_EXTRA_DEBUG
-    qWarning("QEglWindowSurface %p, %p", window, screen);
+    qWarning("QEglBackingStore %p, %p", window, screen);
 #endif
-    m_paintDevice = new QEglFSPaintDevice(screen,window);
+    m_paintDevice = new QEglFSPaintDevice(static_cast<QEglFSScreen *>(window->screen()->handle()));
 }
 
-void QEglFSWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
+void QEglFSBackingStore::flush(QWindow *widget, const QRegion &region, const QPoint &offset)
 {
     Q_UNUSED(widget);
     Q_UNUSED(region);
     Q_UNUSED(offset);
 #ifdef QEGL_EXTRA_DEBUG
-    qWarning("QEglWindowSurface::flush %p",widget);
+    qWarning("QEglBackingStore::flush %p",widget);
 #endif
-    widget->platformWindow()->glContext()->swapBuffers();
+    static_cast<QEglFSPaintDevice *>(m_paintDevice)->context()->swapBuffers();
 }
 
-void QEglFSWindowSurface::resize(const QSize &size)
+void QEglFSBackingStore::resize(const QSize &size, const QRegion &staticContents)
 {
     Q_UNUSED(size);
+    Q_UNUSED(staticContents);
 }
 
 QT_END_NAMESPACE
 #include "qeglfsintegration.h"
 #include "qeglfswindow.h"
 
-#include <QtGui/private/qwindowsurface_p.h>
+#include <QtGui/qplatformbackingstore_qpa.h>
 
 QT_BEGIN_NAMESPACE
 
-class QEglFSWindowSurface : public QWindowSurface
+class QEglFSBackingStore : public QPlatformBackingStore
 {
 public:
-    QEglFSWindowSurface(QEglFSScreen *screen, QWidget *window);
-    ~QEglFSWindowSurface() {}
+    QEglFSBackingStore(QWindow *window);
+    ~QEglFSBackingStore() {}
 
     QPaintDevice *paintDevice() { return m_paintDevice; }
-    void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
-    void resize(const QSize &size);
+    void flush(QWindow *window, const QRegion &region, const QPoint &offset);
+    void resize(const QSize &size, const QRegion &staticContents);
+
 private:
     QPaintDevice *m_paintDevice;
 };
index 716ae8a..884c24c 100644 (file)
 #include "qeglfsintegration.h"
 
 #include "qeglfswindow.h"
-#include "qeglfswindowsurface.h"
+#include "qeglfsbackingstore.h"
 
-#include "qgenericunixfontdatabase.h"
+#include <QtPlatformSupport/private/qgenericunixfontdatabase_p.h>
+#include <QtPlatformSupport/private/qgenericunixeventdispatcher_p.h>
 
 #include <QtGui/QPlatformWindow>
-#include <QtGui/QPlatformWindowFormat>
-#include <QtGui/private/qpixmap_raster_p.h>
+#include <QtGui/QSurfaceFormat>
+#include <QtGui/QGuiGLContext>
+#include <QtGui/QScreen>
 
 #include <EGL/egl.h>
 
@@ -57,9 +59,8 @@ QT_BEGIN_NAMESPACE
 QEglFSIntegration::QEglFSIntegration()
     : mFontDb(new QGenericUnixFontDatabase())
 {
-    m_primaryScreen = new QEglFSScreen(EGL_DEFAULT_DISPLAY);
+    screenAdded(new QEglFSScreen(EGL_DEFAULT_DISPLAY));
 
-    mScreens.append(m_primaryScreen);
 #ifdef QEGL_EXTRA_DEBUG
     qWarning("QEglIntegration\n");
 #endif
@@ -73,32 +74,26 @@ bool QEglFSIntegration::hasCapability(QPlatformIntegration::Capability cap) cons
     }
 }
 
-QPlatformPixmap *QEglFSIntegration::createPlatformPixmap(QPlatformPixmap::PixelType type) const
+QPlatformWindow *QEglFSIntegration::createPlatformWindow(QWindow *window) const
 {
 #ifdef QEGL_EXTRA_DEBUG
-    qWarning("QEglIntegration::createPlatformPixmap %d\n", type);
+    qWarning("QEglIntegration::createPlatformWindow %p\n",window);
 #endif
-    return new QRasterPlatformPixmap(type);
+    return new QEglFSWindow(window);
 }
 
-QPlatformWindow *QEglFSIntegration::createPlatformWindow(QWidget *widget, WId winId) const
+
+QPlatformBackingStore *QEglFSIntegration::createPlatformBackingStore(QWindow *window) const
 {
-    Q_UNUSED(winId);
 #ifdef QEGL_EXTRA_DEBUG
-    qWarning("QEglIntegration::createPlatformWindow %p\n",widget);
+    qWarning("QEglIntegration::createWindowSurface %p\n",widget);
 #endif
-    return new QEglFSWindow(widget, m_primaryScreen);
+    return new QEglFSBackingStore(window);
 }
 
-
-QWindowSurface *QEglFSIntegration::createWindowSurface(QWidget *widget, WId winId) const
+QPlatformGLContext *QEglFSIntegration::createPlatformGLContext(QGuiGLContext *context) const
 {
-    Q_UNUSED(winId);
-
-#ifdef QEGL_EXTRA_DEBUG
-    qWarning("QEglIntegration::createWindowSurface %p\n",widget);
-#endif
-    return new QEglFSWindowSurface(m_primaryScreen,widget);
+    return static_cast<QEglFSScreen *>(context->screen()->handle())->platformContext();
 }
 
 QPlatformFontDatabase *QEglFSIntegration::fontDatabase() const
@@ -106,4 +101,9 @@ QPlatformFontDatabase *QEglFSIntegration::fontDatabase() const
     return mFontDb;
 }
 
+QAbstractEventDispatcher *QEglFSIntegration::createEventDispatcher() const
+{
+    return createUnixEventDispatcher();
+}
+
 QT_END_NAMESPACE
index 9b86a04..d8770dd 100644 (file)
@@ -57,18 +57,17 @@ public:
     QEglFSIntegration();
 
     bool hasCapability(QPlatformIntegration::Capability cap) const;
-    QPlatformPixmap *createPlatformPixmap(QPlatformPixmap::PixelType type) const;
-    QPlatformWindow *createPlatformWindow(QWidget *widget, WId winId) const;
-    QWindowSurface *createWindowSurface(QWidget *widget, WId winId) const;
 
-    QList<QPlatformScreen *> screens() const { return mScreens; }
+    QPlatformWindow *createPlatformWindow(QWindow *window) const;
+    QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const;
+    QPlatformGLContext *createPlatformGLContext(QGuiGLContext *context) const;
 
     QPlatformFontDatabase *fontDatabase() const;
 
+    QAbstractEventDispatcher *createEventDispatcher() const;
+
 private:
     QPlatformFontDatabase *mFontDb;
-    QList<QPlatformScreen *> mScreens;
-    QEglFSScreen *m_primaryScreen;
 };
 
 QT_END_NAMESPACE
index 4219536..953ae70 100644 (file)
 ****************************************************************************/
 
 #include "qeglfsscreen.h"
+#include "qeglfswindow.h"
 
-#include "../eglconvenience/qeglconvenience.h"
-#include "../eglconvenience/qeglplatformcontext.h"
+#include <QtPlatformSupport/private/qeglconvenience_p.h>
+#include <QtPlatformSupport/private/qeglplatformcontext_p.h>
 
 #ifdef Q_OPENKODE
 #include <KD/kd.h>
@@ -86,6 +87,23 @@ static struct AttrInfo attrs[] = {
     {-1, 0}};
 #endif //QEGL_EXTRA_DEBUG
 
+class QEglFSContext : public QEGLPlatformContext
+{
+public:
+    QEglFSContext(const QSurfaceFormat &format, QPlatformGLContext *share, EGLDisplay display,
+                  EGLint eglClientVersion = 2, EGLenum eglApi = EGL_OPENGL_ES_API)
+        : QEGLPlatformContext(format, share, display, eglClientVersion, eglApi)
+    {
+    }
+
+    EGLSurface eglSurfaceForPlatformSurface(QPlatformSurface *surface)
+    {
+        QEglFSWindow *window = static_cast<QEglFSWindow *>(surface);
+        QEglFSScreen *screen = static_cast<QEglFSScreen *>(window->screen());
+        return screen->surface();
+    }
+};
+
 QEglFSScreen::QEglFSScreen(EGLNativeDisplayType display)
     : m_depth(32)
     , m_format(QImage::Format_Invalid)
@@ -136,32 +154,29 @@ void QEglFSScreen::createAndSetPlatformContext() const {
 
 void QEglFSScreen::createAndSetPlatformContext()
 {
-    QPlatformWindowFormat platformFormat = QPlatformWindowFormat::defaultFormat();
-
-    platformFormat.setWindowApi(QPlatformWindowFormat::OpenGL);
+    QSurfaceFormat platformFormat;
 
     QByteArray depthString = qgetenv("QT_QPA_EGLFS_DEPTH");
     if (depthString.toInt() == 16) {
-        platformFormat.setDepth(16);
+        platformFormat.setDepthBufferSize(16);
         platformFormat.setRedBufferSize(5);
         platformFormat.setGreenBufferSize(6);
         platformFormat.setBlueBufferSize(5);
         m_depth = 16;
         m_format = QImage::Format_RGB16;
     } else {
-        platformFormat.setDepth(32);
+        platformFormat.setDepthBufferSize(32);
         platformFormat.setRedBufferSize(8);
         platformFormat.setGreenBufferSize(8);
         platformFormat.setBlueBufferSize(8);
         m_depth = 32;
         m_format = QImage::Format_RGB32;
     }
-    if (!qgetenv("QT_QPA_EGLFS_MULTISAMPLE").isEmpty()) {
-        platformFormat.setSampleBuffers(true);
-    }
 
+    if (!qgetenv("QT_QPA_EGLFS_MULTISAMPLE").isEmpty())
+        platformFormat.setSamples(4);
 
-    EGLConfig config = q_configFromQPlatformWindowFormat(m_dpy, platformFormat);
+    EGLConfig config = q_configFromGLFormat(m_dpy, platformFormat);
 
     EGLNativeWindowType eglWindow = 0;
 #ifdef Q_OPENKODE
@@ -193,16 +208,7 @@ void QEglFSScreen::createAndSetPlatformContext()
     qWarning("\n");
 #endif
 
-    EGLint temp;
-    EGLint attribList[32];
-
-    temp = 0;
-
-    attribList[temp++] = EGL_CONTEXT_CLIENT_VERSION;
-    attribList[temp++] = 2; // GLES version 2
-    attribList[temp++] = EGL_NONE;
-
-    QEGLPlatformContext *platformContext = new QEGLPlatformContext(m_dpy,config,attribList,m_surface,EGL_OPENGL_ES_API);
+    QEGLPlatformContext *platformContext = new QEglFSContext(platformFormat, 0, m_dpy);
     m_platformContext = platformContext;
 
     EGLint w,h;                    // screen size detection
index 5cf1dac..230acf3 100644 (file)
@@ -64,6 +64,8 @@ public:
 
     QPlatformGLContext *platformContext() const;
 
+    EGLSurface surface() const { return m_surface; }
+
 private:
     void createAndSetPlatformContext() const;
     void createAndSetPlatformContext();
index 24b17b7..25da588 100644 (file)
@@ -45,8 +45,8 @@
 
 QT_BEGIN_NAMESPACE
 
-QEglFSWindow::QEglFSWindow(QWidget *w, QEglFSScreen *screen)
-    : QPlatformWindow(w), m_screen(screen)
+QEglFSWindow::QEglFSWindow(QWindow *w)
+    : QPlatformWindow(w)
 {
     static int serialNo = 0;
     m_winid  = ++serialNo;
@@ -55,15 +55,11 @@ QEglFSWindow::QEglFSWindow(QWidget *w, QEglFSScreen *screen)
 #endif
 }
 
-
 void QEglFSWindow::setGeometry(const QRect &)
 {
     // We only support full-screen windows
-    QRect rect(m_screen->availableGeometry());
-    QWindowSystemInterface::handleGeometryChange(this->widget(), rect);
-
-    // Since toplevels are fullscreen, propegate the screen size back to the widget
-    widget()->setGeometry(rect);
+    QRect rect(screen()->availableGeometry());
+    QWindowSystemInterface::handleGeometryChange(window(), rect);
 
     QPlatformWindow::setGeometry(rect);
 }
@@ -73,15 +69,4 @@ WId QEglFSWindow::winId() const
     return m_winid;
 }
 
-
-
-QPlatformGLContext *QEglFSWindow::glContext() const
-{
-#ifdef QEGL_EXTRA_DEBUG
-    qWarning("QEglWindow::glContext %p\n", m_screen->platformContext());
-#endif
-    Q_ASSERT(m_screen);
-     return m_screen->platformContext();
-}
-
 QT_END_NAMESPACE
index 4e9a728..09f553d 100644 (file)
@@ -53,15 +53,12 @@ QT_BEGIN_NAMESPACE
 class QEglFSWindow : public QPlatformWindow
 {
 public:
-    QEglFSWindow(QWidget *w, QEglFSScreen *screen);
+    QEglFSWindow(QWindow *w);
 
     void setGeometry(const QRect &);
     WId winId() const;
 
-    QPlatformGLContext *glContext() const;
-
 private:
-    QEglFSScreen *m_screen;
     WId m_winid;
 };
 QT_END_NAMESPACE