device: Introduce hooks for the directfb plugin and use them
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>
Fri, 16 Mar 2012 21:50:30 +0000 (22:50 +0100)
committerQt by Nokia <qt-info@nokia.com>
Fri, 13 Apr 2012 06:33:37 +0000 (08:33 +0200)
The EGL integration is vendor specific, add platform hooks to the
DirectFB plugin and implement them for the Broadcom 97425. The hook
interface is internal and there are no ABI/API gurantees.

Change-Id: I33359830c51f16895e771837fccb71e03c81cf18
Reviewed-by: Girish Ramakrishnan <girish.1.ramakrishnan@nokia.com>
mkspecs/devices/linux-mipsel-broadcom-97425-g++/qdirectfbeglhooks_bcm97425.cpp [new file with mode: 0644]
mkspecs/devices/linux-mipsel-broadcom-97425-g++/qmake.conf
src/plugins/platforms/directfb/directfb.pro
src/plugins/platforms/directfb/qdirectfb_egl.cpp
src/plugins/platforms/directfb/qdirectfb_egl.h
src/plugins/platforms/directfb/qdirectfbeglhooks.h [new file with mode: 0644]
src/plugins/platforms/directfb/qdirectfbeglhooks_stub.cpp [new file with mode: 0644]

diff --git a/mkspecs/devices/linux-mipsel-broadcom-97425-g++/qdirectfbeglhooks_bcm97425.cpp b/mkspecs/devices/linux-mipsel-broadcom-97425-g++/qdirectfbeglhooks_bcm97425.cpp
new file mode 100644 (file)
index 0000000..16aee0c
--- /dev/null
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the qmake spec 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 "qdirectfbeglhooks.h"
+#include "qdirectfbconvenience.h"
+
+#include "default_directfb.h"
+
+// Exported to the directfb plugin
+QDirectFBEGLHooks platform_hook;
+static void *dbpl_handle;
+
+void QDirectFBEGLHooks::platformInit()
+{
+    DBPL_RegisterDirectFBDisplayPlatform(&dbpl_handle, QDirectFbConvenience::dfbInterface());
+}
+
+void QDirectFBEGLHooks::platformDestroy()
+{
+    DBPL_UnregisterDirectFBDisplayPlatform(&dbpl_handle);
+    dbpl_handle = 0;
+}
+
+bool QDirectFBEGLHooks::hasCapability(QPlatformIntegration::Capability cap) const
+{
+    switch (cap) {
+    case QPlatformIntegration::ThreadedOpenGL:
+        return true;
+    default:
+        return false;
+    }
+}
+
index 866fad6..ced323f 100644 (file)
@@ -62,4 +62,8 @@ DIRECTFB_LIBS           = -L$${BRCM_APPLIBS_PATH}/opensource/directfb/bin/Direct
 
 QMAKE_LFLAGS            += -Wl,-rpath-link,$$QMAKE_LIBDIR_OPENGL_ES2  -Wl,-rpath-link,$${BRCM_APPLIBS_PATH}/opensource/zlib/zlib-1.2.3
 
+# DirectFB platform hooks for this hardware
+QT_CONFIG += directfb_egl
+DIRECTFB_PLATFORM_HOOKS_SOURCES = $$PWD/qdirectfbeglhooks_bcm97425.cpp
+
 load(qt_config)
index ae47ec3..2251b8f 100644 (file)
@@ -30,15 +30,24 @@ HEADERS = qdirectfbintegration.h \
     qdirectfbinput.h \
     qdirectfbcursor.h \
     qdirectfbwindow.h \
-    qdirectfbscreen.h
+    qdirectfbscreen.h \
+    qdirectfbeglhooks.h
 
 # ### port the GL context
-directfbegl: {
+directfb_egl {
     HEADERS += qdirectfb_egl.h
     SOURCES += qdirectfb_egl.cpp
     DEFINES += DIRECTFB_GL_EGL
 }
 
+!isEmpty(DIRECTFB_PLATFORM_HOOKS_SOURCES) {
+    HEADERS += $$DIRECTFB_PLATFORM_HOOKS_HEADERS
+    SOURCES += $$DIRECTFB_PLATFORM_HOOKS_SOURCES
+    DEFINES += DIRECTFB_PLATFORM_HOOKS
+} else {
+    SOURCES += qdirectfbeglhooks_stub.cpp
+}
+
 
 CONFIG += qpa/genericunixfontdatabase
 target.path += $$[QT_INSTALL_PLUGINS]/platforms
index ee0cbba..ac9142c 100644 (file)
@@ -42,6 +42,7 @@
 #include "qdirectfb_egl.h"
 #include "qdirectfbwindow.h"
 #include "qdirectfbscreen.h"
+#include "qdirectfbeglhooks.h"
 
 #include <QtGui/QOpenGLContext>
 #include <QtGui/QPlatformOpenGLContext>
 
 QT_BEGIN_NAMESPACE
 
+#ifdef DIRECTFB_PLATFORM_HOOKS
+extern QDirectFBEGLHooks platform_hook;
+static QDirectFBEGLHooks *hooks = &platform_hook;
+#else
+static QDirectFBEGLHooks *hooks = 0;
+#endif
+
 /**
  * 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
@@ -137,12 +145,14 @@ void QDirectFbScreenEGL::initializeEGL()
 
 void QDirectFbScreenEGL::platformInit()
 {
-    // Place vendor init code here.
+    if (hooks)
+        hooks->platformInit();
 }
 
 void QDirectFbScreenEGL::platformDestroy()
 {
-    // Place vendor finalize code here.
+    if (hooks)
+        hooks->platformDestroy();
 }
 
 QDirectFbWindowEGL::QDirectFbWindowEGL(QWindow *tlw, QDirectFbInput *input)
@@ -209,4 +219,12 @@ void QDirectFbIntegrationEGL::initializeScreen()
     screenAdded(m_primaryScreen.data());
 }
 
+bool QDirectFbIntegrationEGL::hasCapability(QPlatformIntegration::Capability cap) const
+{
+    // We assume that devices will have more and not less capabilities
+    if (hooks && hooks->hasCapability(cap))
+        return true;
+    return QDirectFbIntegration::hasCapability(cap);
+}
+
 QT_END_NAMESPACE
index 88f7e60..7781b17 100644 (file)
@@ -53,6 +53,8 @@ public:
     QPlatformWindow *createPlatformWindow(QWindow *window) const;
     QPlatformOpenGLContext *createPlatformOpenGLContext(QOpenGLContext *context) const;
 
+    bool hasCapability(QPlatformIntegration::Capability cap) const;
+
 protected:
     void initializeScreen();
 };
diff --git a/src/plugins/platforms/directfb/qdirectfbeglhooks.h b/src/plugins/platforms/directfb/qdirectfbeglhooks.h
new file mode 100644 (file)
index 0000000..d0711b6
--- /dev/null
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** 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 QDIRECTFBEGL_HOOKS_H
+#define QDIRECTFBEGL_HOOKS_H
+
+#include "qplatformintegration_qpa.h"
+
+QT_BEGIN_NAMESPACE
+
+struct QDirectFBEGLHooks {
+    void platformInit();
+    void platformDestroy();
+    bool hasCapability(QPlatformIntegration::Capability) const;
+};
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/src/plugins/platforms/directfb/qdirectfbeglhooks_stub.cpp b/src/plugins/platforms/directfb/qdirectfbeglhooks_stub.cpp
new file mode 100644 (file)
index 0000000..753a9d4
--- /dev/null
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** 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 "qdirectfbeglhooks.h"
+
+/**
+ * This file is compiled in case there is no platform specific hook. On an
+ * optimizing compiler these functions should never be called.
+ */
+
+void QDirectFBEGLHooks::platformInit()
+{
+}
+
+void QDirectFBEGLHooks::platformDestroy()
+{
+}
+
+bool QDirectFBEGLHooks::hasCapability(QPlatformIntegration::Capability) const
+{
+    return false;
+}
+