From 89f6997e805e4bc94bea4aff592b5ae93aea8e85 Mon Sep 17 00:00:00 2001 From: Hannu Lyytinen Date: Wed, 11 Apr 2012 09:41:21 +0300 Subject: [PATCH] Add support for QPlatformNativeInterface. Initial bits to enable figuring out the EGL display and context. Change-Id: I4b578e356dceb40b4456f0590d32c8df1f51fa53 Reviewed-by: Andy Nichols --- src/plugins/platforms/kms/kms.pro | 6 +- src/plugins/platforms/kms/qkmsintegration.cpp | 9 +- src/plugins/platforms/kms/qkmsintegration.h | 4 + .../platforms/kms/qkmsnativeinterface.cpp | 105 ++++++++++++++++++ .../platforms/kms/qkmsnativeinterface.h | 67 +++++++++++ 5 files changed, 188 insertions(+), 3 deletions(-) create mode 100644 src/plugins/platforms/kms/qkmsnativeinterface.cpp create mode 100644 src/plugins/platforms/kms/qkmsnativeinterface.h diff --git a/src/plugins/platforms/kms/kms.pro b/src/plugins/platforms/kms/kms.pro index 5b91326a39..93d972abe8 100644 --- a/src/plugins/platforms/kms/kms.pro +++ b/src/plugins/platforms/kms/kms.pro @@ -18,7 +18,8 @@ SOURCES = main.cpp \ qkmscursor.cpp \ qkmsdevice.cpp \ qkmsbuffermanager.cpp \ - qkmsbackingstore.cpp + qkmsbackingstore.cpp \ + qkmsnativeinterface.cpp HEADERS = qkmsintegration.h \ qkmsscreen.h \ qkmscontext.h \ @@ -26,7 +27,8 @@ HEADERS = qkmsintegration.h \ qkmscursor.h \ qkmsdevice.h \ qkmsbuffermanager.h \ - qkmsbackingstore.h + qkmsbackingstore.h \ + qkmsnativeinterface.h target.path += $$[QT_INSTALL_PLUGINS]/platforms INSTALLS += target diff --git a/src/plugins/platforms/kms/qkmsintegration.cpp b/src/plugins/platforms/kms/qkmsintegration.cpp index c495ca26f9..74346e8097 100644 --- a/src/plugins/platforms/kms/qkmsintegration.cpp +++ b/src/plugins/platforms/kms/qkmsintegration.cpp @@ -45,6 +45,7 @@ #include "qkmswindow.h" #include "qkmsbackingstore.h" #include "qkmscontext.h" +#include "qkmsnativeinterface.h" #include #include @@ -58,7 +59,8 @@ QT_BEGIN_NAMESPACE QKmsIntegration::QKmsIntegration() : QPlatformIntegration(), m_fontDatabase(new QGenericUnixFontDatabase()), - m_eventDispatcher(createUnixEventDispatcher()) + m_eventDispatcher(createUnixEventDispatcher()), + m_nativeInterface(new QKmsNativeInterface) { QGuiApplicationPrivate::instance()->setEventDispatcher(m_eventDispatcher); setenv("EGL_PLATFORM", "drm",1); @@ -129,4 +131,9 @@ QAbstractEventDispatcher *QKmsIntegration::guiThreadEventDispatcher() const return m_eventDispatcher; } +QPlatformNativeInterface *QKmsIntegration::nativeInterface() const +{ + return m_nativeInterface; +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/kms/qkmsintegration.h b/src/plugins/platforms/kms/qkmsintegration.h index 5724471295..96d030f849 100644 --- a/src/plugins/platforms/kms/qkmsintegration.h +++ b/src/plugins/platforms/kms/qkmsintegration.h @@ -43,6 +43,7 @@ #define QPLATFORMINTEGRATION_KMS_H #include +#include QT_BEGIN_NAMESPACE @@ -66,6 +67,8 @@ public: void addScreen(QKmsScreen *screen); + QPlatformNativeInterface *nativeInterface() const; + private: QStringList findDrmDevices(); @@ -73,6 +76,7 @@ private: QList m_devices; QPlatformFontDatabase *m_fontDatabase; QAbstractEventDispatcher *m_eventDispatcher; + QPlatformNativeInterface *m_nativeInterface; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/kms/qkmsnativeinterface.cpp b/src/plugins/platforms/kms/qkmsnativeinterface.cpp new file mode 100644 index 0000000000..8e026b2503 --- /dev/null +++ b/src/plugins/platforms/kms/qkmsnativeinterface.cpp @@ -0,0 +1,105 @@ +/**************************************************************************** +** +** 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 +#include "qkmsnativeinterface.h" +#include "qkmsdevice.h" + +#include "qscreen.h" + +class QKmsResourceMap : public QMap +{ +public: + QKmsResourceMap() + :QMap() + { + insert("egldisplay", QKmsNativeInterface::EglDisplay); + insert("eglcontext", QKmsNativeInterface::EglContext); + } +}; + +Q_GLOBAL_STATIC(QKmsResourceMap, qKmsResourceMap) + +void *QKmsNativeInterface::nativeResourceForWindow(const QByteArray &resourceString, QWindow *window) +{ + QByteArray lowerCaseResource = resourceString.toLower(); + ResourceType resource = qKmsResourceMap()->value(lowerCaseResource); + void *result = 0; + switch (resource) { + case EglDisplay: + result = eglDisplayForWindow(window); + break; + case EglContext: + result = eglContextForWindow(window); + break; + default: + result = 0; + } + return result; +} + +void *QKmsNativeInterface::eglDisplayForWindow(QWindow *window) +{ + QKmsScreen *screen = qPlatformScreenForWindow(window); + if (!screen) + return 0; + QKmsDevice *device = screen->device(); + if (!device) + return 0; + return device->eglDisplay(); +} + +void *QKmsNativeInterface::eglContextForWindow(QWindow *window) +{ + QKmsScreen *screen = qPlatformScreenForWindow(window); + if (!screen) + return 0; + QKmsDevice *device = screen->device(); + if (!device) + return 0; + return device->eglContext(); +} + +QKmsScreen *QKmsNativeInterface::qPlatformScreenForWindow(QWindow *window) +{ + QScreen *screen = window ? window->screen() : QGuiApplication::primaryScreen(); + return static_cast(screen->handle()); +} diff --git a/src/plugins/platforms/kms/qkmsnativeinterface.h b/src/plugins/platforms/kms/qkmsnativeinterface.h new file mode 100644 index 0000000000..77a9573250 --- /dev/null +++ b/src/plugins/platforms/kms/qkmsnativeinterface.h @@ -0,0 +1,67 @@ +/**************************************************************************** +** +** 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 QKMSNATIVEINTERFACE_H +#define QKMSNATIVEINTERFACE_H + +#include "qkmsscreen.h" + +#include + +class QKmsNativeInterface : public QPlatformNativeInterface +{ +public: + enum ResourceType { + EglDisplay, + EglContext + }; + + void *nativeResourceForWindow(const QByteArray &resourceString, QWindow *window); + + void *eglDisplayForWindow(QWindow *window); + void *eglContextForWindow(QWindow *window); + +private: + static QKmsScreen *qPlatformScreenForWindow(QWindow *window); +}; + + +#endif // QKMSNATIVEINTERFACE_H