summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/plugins/platforms/directfb/directfb.pro6
-rw-r--r--src/plugins/platforms/directfb/main.cpp23
-rw-r--r--src/plugins/platforms/directfb/qdirectfb_egl.cpp197
-rw-r--r--src/plugins/platforms/directfb/qdirectfb_egl.h63
-rw-r--r--src/plugins/platforms/directfb/qdirectfbintegration.cpp16
-rw-r--r--src/plugins/platforms/directfb/qdirectfbintegration.h9
-rw-r--r--src/plugins/platforms/directfb/qdirectfbwindow.cpp13
-rw-r--r--src/plugins/platforms/directfb/qdirectfbwindow.h4
8 files changed, 327 insertions, 4 deletions
diff --git a/src/plugins/platforms/directfb/directfb.pro b/src/plugins/platforms/directfb/directfb.pro
index 1fe8d0d353..0585777889 100644
--- a/src/plugins/platforms/directfb/directfb.pro
+++ b/src/plugins/platforms/directfb/directfb.pro
@@ -33,6 +33,12 @@ HEADERS = qdirectfbintegration.h \
qdirectfbscreen.h
# ### port the GL context
+directfbegl: {
+ HEADERS += qdirectfb_egl.h
+ SOURCES += qdirectfb_egl.cpp
+ DEFINES += DIRECTFB_GL_EGL
+}
+
CONFIG += qpa/genericunixfontdatabase
target.path += $$[QT_INSTALL_PLUGINS]/platforms
diff --git a/src/plugins/platforms/directfb/main.cpp b/src/plugins/platforms/directfb/main.cpp
index 312fc411ac..1a254e4fe7 100644
--- a/src/plugins/platforms/directfb/main.cpp
+++ b/src/plugins/platforms/directfb/main.cpp
@@ -41,9 +41,20 @@
#include <QtGui/QPlatformIntegrationPlugin>
#include "qdirectfbintegration.h"
+#include "qdirectfb_egl.h"
QT_BEGIN_NAMESPACE
+#ifdef DIRECTFB_GL_EGL
+#define QT_EGL_BACKEND_STRING(list) list << "directfbegl";
+#define QT_EGL_BACKEND_CREATE(list, out) \
+ if (list.toLower() == "directfbegl") \
+ out = new QDirectFbIntegrationEGL;
+#else
+#define QT_EGL_BACKEND_STRING(list)
+#define QT_EGL_BACKEND_CREATE(system, out)
+#endif
+
class QDirectFbIntegrationPlugin : public QPlatformIntegrationPlugin
{
public:
@@ -55,16 +66,24 @@ QStringList QDirectFbIntegrationPlugin::keys() const
{
QStringList list;
list << "directfb";
+ QT_EGL_BACKEND_STRING(list);
return list;
}
QPlatformIntegration * QDirectFbIntegrationPlugin::create(const QString& system, const QStringList& paramList)
{
Q_UNUSED(paramList);
+ QDirectFbIntegration *integration = 0;
+
if (system.toLower() == "directfb")
- return new QDirectFbIntegration;
+ integration = new QDirectFbIntegration;
+ QT_EGL_BACKEND_CREATE(system, integration)
+
+ if (!integration)
+ return 0;
- return 0;
+ integration->initialize();
+ return integration;
}
Q_EXPORT_PLUGIN2(directfb, QDirectFbIntegrationPlugin)
diff --git a/src/plugins/platforms/directfb/qdirectfb_egl.cpp b/src/plugins/platforms/directfb/qdirectfb_egl.cpp
new file mode 100644
index 0000000000..399e90a9fb
--- /dev/null
+++ b/src/plugins/platforms/directfb/qdirectfb_egl.cpp
@@ -0,0 +1,197 @@
+/****************************************************************************
+**
+** 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 plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdirectfb_egl.h"
+#include "qdirectfbwindow.h"
+#include "qdirectfbscreen.h"
+
+#include <QtGui/QOpenGLContext>
+#include <QtGui/QPlatformOpenGLContext>
+#include <QtGui/QScreen>
+
+#include <QtPlatformSupport/private/qeglplatformcontext_p.h>
+
+#include <EGL/egl.h>
+
+QT_BEGIN_NAMESPACE
+
+/**
+ * This provides OpenGL ES 2.0 integration with DirectFB. It assumes that
+ * one can adapt a DirectFBSurface as a EGLSurface. It might need some vendor
+ * init code in the QDirectFbScreenEGL class to initialize EGL and one might
+ * need to provide a custom QDirectFbWindowEGL::format() to return the
+ * QSurfaceFormat used by the device.
+ */
+
+class QDirectFbScreenEGL : public QDirectFbScreen {
+public:
+ QDirectFbScreenEGL(int display);
+ ~QDirectFbScreenEGL();
+
+ // EGL helper
+ EGLDisplay eglDisplay();
+
+private:
+ void initializeEGL();
+ void platformInit();
+ void platformDestroy();
+
+private:
+ EGLDisplay m_eglDisplay;
+};
+
+class QDirectFbWindowEGL : public QDirectFbWindow {
+public:
+ QDirectFbWindowEGL(QWindow *tlw, QDirectFbInput *inputhandler);
+ ~QDirectFbWindowEGL();
+
+ // EGL. Subclass it instead to have different GL integrations?
+ EGLSurface eglSurface();
+
+ QSurfaceFormat format() const;
+
+private:
+ EGLSurface m_eglSurface;
+};
+
+class QDirectFbEGLContext : public QEGLPlatformContext {
+public:
+ QDirectFbEGLContext(QDirectFbScreenEGL *screen, QOpenGLContext *context);
+
+protected:
+ EGLSurface eglSurfaceForPlatformSurface(QPlatformSurface *surface);
+
+private:
+ QDirectFbScreen *m_screen;
+};
+
+QDirectFbScreenEGL::QDirectFbScreenEGL(int display)
+ : QDirectFbScreen(display)
+ , m_eglDisplay(EGL_NO_DISPLAY)
+{}
+
+QDirectFbScreenEGL::~QDirectFbScreenEGL()
+{
+ platformDestroy();
+}
+
+EGLDisplay QDirectFbScreenEGL::eglDisplay()
+{
+ if (m_eglDisplay == EGL_NO_DISPLAY)
+ initializeEGL();
+ return m_eglDisplay;
+}
+
+void QDirectFbScreenEGL::initializeEGL()
+{
+ m_eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+ if (m_eglDisplay == EGL_NO_DISPLAY)
+ return;
+
+ platformInit();
+
+ EGLint major, minor;
+ eglBindAPI(EGL_OPENGL_ES_API);
+ eglInitialize(m_eglDisplay, &major, &minor);
+ return;
+}
+
+void QDirectFbScreenEGL::platformInit()
+{
+ // Place vendor init code here.
+}
+
+void QDirectFbScreenEGL::platformDestroy()
+{
+ // Place vendor finalize code here.
+}
+
+QDirectFbWindowEGL::QDirectFbWindowEGL(QWindow *tlw, QDirectFbInput *input)
+ : QDirectFbWindow(tlw, input)
+ , m_eglSurface(EGL_NO_SURFACE)
+{}
+
+QDirectFbWindowEGL::~QDirectFbWindowEGL()
+{
+ if (m_eglSurface != EGL_NO_SURFACE) {
+ QDirectFbScreenEGL *dfbScreen;
+ dfbScreen = static_cast<QDirectFbScreenEGL*>(screen());
+ eglDestroySurface(dfbScreen->eglDisplay(), m_eglSurface);
+ }
+}
+
+QSurfaceFormat QDirectFbWindowEGL::format() const
+{
+ return window()->requestedFormat();
+}
+
+
+QDirectFbEGLContext::QDirectFbEGLContext(QDirectFbScreenEGL *screen, QOpenGLContext *context)
+ : QEGLPlatformContext(context->format(), context->shareHandle(),
+ screen->eglDisplay(), EGL_OPENGL_ES_API)
+ , m_screen(screen)
+{}
+
+EGLSurface QDirectFbEGLContext::eglSurfaceForPlatformSurface(QPlatformSurface *surface)
+{
+ QDirectFbWindowEGL *window = static_cast<QDirectFbWindowEGL*>(surface);
+ return window->eglSurface();
+}
+
+QPlatformWindow *QDirectFbIntegrationEGL::createPlatformWindow(QWindow *window) const
+{
+ return new QDirectFbWindowEGL(window, m_input.data());
+}
+
+QPlatformOpenGLContext *QDirectFbIntegrationEGL::createPlatformOpenGLContext(QOpenGLContext *context) const
+{
+ QDirectFbScreenEGL *screen;
+ screen = static_cast<QDirectFbScreenEGL*>(context->screen()->handle());
+ return new QDirectFbEGLContext(screen, context);
+}
+
+void QDirectFbIntegrationEGL::initializeScreen()
+{
+ m_primaryScreen.reset(new QDirectFbScreenEGL(0));
+ screenAdded(m_primaryScreen.data());
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/directfb/qdirectfb_egl.h b/src/plugins/platforms/directfb/qdirectfb_egl.h
new file mode 100644
index 0000000000..9e53939232
--- /dev/null
+++ b/src/plugins/platforms/directfb/qdirectfb_egl.h
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** 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 plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDIRECTFB_EGL_H
+#define QDIRECTFB_EGL_H
+
+#include "qdirectfbintegration.h"
+
+#ifdef DIRECTFB_GL_EGL
+
+QT_BEGIN_NAMESPACE
+
+class QDirectFbIntegrationEGL : public QDirectFbIntegration {
+public:
+ QPlatformWindow *createPlatformWindow(QWindow *window) const;
+ QPlatformOpenGLContext *createPlatformOpenGLContext(QOpenGLContext *context) const;
+
+protected:
+ void initializeScreen();
+};
+
+QT_END_NAMESPACE
+
+#endif
+#endif
diff --git a/src/plugins/platforms/directfb/qdirectfbintegration.cpp b/src/plugins/platforms/directfb/qdirectfbintegration.cpp
index 73ea490110..b40e64e25a 100644
--- a/src/plugins/platforms/directfb/qdirectfbintegration.cpp
+++ b/src/plugins/platforms/directfb/qdirectfbintegration.cpp
@@ -64,7 +64,17 @@ QDirectFbIntegration::QDirectFbIntegration()
, m_eventDispatcher(createUnixEventDispatcher())
{
QGuiApplicationPrivate::instance()->setEventDispatcher(m_eventDispatcher);
+}
+void QDirectFbIntegration::initialize()
+{
+ initializeDirectFB();
+ initializeScreen();
+ initializeInput();
+}
+
+void QDirectFbIntegration::initializeDirectFB()
+{
const QStringList args = QCoreApplication::arguments();
int argc = args.size();
char **argv = new char*[argc];
@@ -84,10 +94,16 @@ QDirectFbIntegration::QDirectFbIntegration()
// This must happen after DirectFBInit.
m_dfb.reset(QDirectFbConvenience::dfbInterface());
+}
+void QDirectFbIntegration::initializeScreen()
+{
m_primaryScreen.reset(new QDirectFbScreen(0));
screenAdded(m_primaryScreen.data());
+}
+void QDirectFbIntegration::initializeInput()
+{
m_input.reset(new QDirectFbInput(m_dfb.data(), m_primaryScreen->dfbLayer()));
m_input->start();
}
diff --git a/src/plugins/platforms/directfb/qdirectfbintegration.h b/src/plugins/platforms/directfb/qdirectfbintegration.h
index 4e8a867f0b..42a085261d 100644
--- a/src/plugins/platforms/directfb/qdirectfbintegration.h
+++ b/src/plugins/platforms/directfb/qdirectfbintegration.h
@@ -60,6 +60,8 @@ public:
QDirectFbIntegration();
~QDirectFbIntegration();
+ void initialize();
+
QPlatformPixmap *createPlatformPixmap(QPlatformPixmap::PixelType type) const;
QPlatformWindow *createPlatformWindow(QWindow *window) const;
QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const;
@@ -67,7 +69,12 @@ public:
QPlatformFontDatabase *fontDatabase() const;
-private:
+protected:
+ virtual void initializeDirectFB();
+ virtual void initializeScreen();
+ virtual void initializeInput();
+
+protected:
QDirectFBPointer<IDirectFB> m_dfb;
QScopedPointer<QDirectFbScreen> m_primaryScreen;
QScopedPointer<QDirectFbInput> m_input;
diff --git a/src/plugins/platforms/directfb/qdirectfbwindow.cpp b/src/plugins/platforms/directfb/qdirectfbwindow.cpp
index 55fce90252..4648ed42f0 100644
--- a/src/plugins/platforms/directfb/qdirectfbwindow.cpp
+++ b/src/plugins/platforms/directfb/qdirectfbwindow.cpp
@@ -202,4 +202,15 @@ IDirectFBWindow *QDirectFbWindow::dfbWindow() const
return m_dfbWindow.data();
}
-QT_END_NAMESPACE
+IDirectFBSurface *QDirectFbWindow::dfbSurface()
+{
+ if (!m_dfbSurface) {
+ DFBResult res = m_dfbWindow->GetSurface(m_dfbWindow.data(), m_dfbSurface.outPtr());
+ if (res != DFB_OK)
+ DirectFBError(QDFB_PRETTY, res);
+ }
+
+ return m_dfbSurface.data();
+}
+
+QT_END_NAMESPACE \ No newline at end of file
diff --git a/src/plugins/platforms/directfb/qdirectfbwindow.h b/src/plugins/platforms/directfb/qdirectfbwindow.h
index 93fd940a23..35b44ca8df 100644
--- a/src/plugins/platforms/directfb/qdirectfbwindow.h
+++ b/src/plugins/platforms/directfb/qdirectfbwindow.h
@@ -69,7 +69,11 @@ public:
IDirectFBWindow *dfbWindow() const;
+ // helper to get access to DirectFB types
+ IDirectFBSurface *dfbSurface();
+
private:
+ QDirectFBPointer<IDirectFBSurface> m_dfbSurface;
QDirectFBPointer<IDirectFBWindow> m_dfbWindow;
QDirectFbInput *m_inputHandler;
};