diff options
Diffstat (limited to 'src/plugins/platforms/eglfs/qeglfsintegration.cpp')
-rw-r--r-- | src/plugins/platforms/eglfs/qeglfsintegration.cpp | 216 |
1 files changed, 22 insertions, 194 deletions
diff --git a/src/plugins/platforms/eglfs/qeglfsintegration.cpp b/src/plugins/platforms/eglfs/qeglfsintegration.cpp index d6832493f1..2941806f17 100644 --- a/src/plugins/platforms/eglfs/qeglfsintegration.cpp +++ b/src/plugins/platforms/eglfs/qeglfsintegration.cpp @@ -42,25 +42,15 @@ #include "qeglfsintegration.h" #include "qeglfswindow.h" -#include "qeglfsbackingstore.h" -#include "qeglfscompositor.h" #include "qeglfshooks.h" +#include "qeglfscontext.h" #include <QtGui/private/qguiapplication_p.h> -#include <QtPlatformSupport/private/qgenericunixfontdatabase_p.h> -#include <QtPlatformSupport/private/qgenericunixeventdispatcher_p.h> -#include <QtPlatformSupport/private/qgenericunixservices_p.h> #include <QtPlatformSupport/private/qeglconvenience_p.h> #include <QtPlatformSupport/private/qeglplatformcontext_p.h> #include <QtPlatformSupport/private/qeglpbuffer_p.h> -#if !defined(QT_NO_EVDEV) && (!defined(Q_OS_ANDROID) || defined(Q_OS_ANDROID_NO_SDK)) -#include <QtPlatformSupport/private/qevdevmousemanager_p.h> -#include <QtPlatformSupport/private/qevdevkeyboardmanager_p.h> -#include <QtPlatformSupport/private/qevdevtouch_p.h> -#endif - #include <qpa/qplatformwindow.h> #include <QtGui/QSurfaceFormat> #include <QtGui/QOpenGLContext> @@ -68,10 +58,6 @@ #include <QtGui/QOffscreenSurface> #include <qpa/qplatformcursor.h> -#include <qpa/qplatforminputcontextfactory_p.h> - -#include "qeglfscontext.h" - #include <EGL/egl.h> static void initResources() @@ -82,10 +68,6 @@ static void initResources() QT_BEGIN_NAMESPACE QEglFSIntegration::QEglFSIntegration() - : mFontDb(new QGenericUnixFontDatabase) - , mServices(new QGenericUnixServices) - , mScreen(0) - , mInputContext(0) { mDisableInputHandlers = qgetenv("QT_QPA_EGLFS_DISABLE_INPUT").toInt(); @@ -94,9 +76,6 @@ QEglFSIntegration::QEglFSIntegration() QEglFSIntegration::~QEglFSIntegration() { - QEglFSCompositor::destroy(); - delete mScreen; - eglTerminate(mDisplay); QEglFSHooks::hooks()->platformDestroy(); } @@ -106,85 +85,46 @@ bool QEglFSIntegration::hasCapability(QPlatformIntegration::Capability cap) cons if (QEglFSHooks::hooks() && QEglFSHooks::hooks()->hasCapability(cap)) return true; - switch (cap) { - case ThreadedPixmaps: return true; - case OpenGL: return true; - case ThreadedOpenGL: return true; - case WindowManagement: return false; - default: return QPlatformIntegration::hasCapability(cap); - } + return QEGLPlatformIntegration::hasCapability(cap); } -QPlatformWindow *QEglFSIntegration::createPlatformWindow(QWindow *window) const +void QEglFSIntegration::initialize() { - QWindowSystemInterface::flushWindowSystemEvents(); - QEglFSWindow *w = new QEglFSWindow(window); - w->create(); - if (window->type() != Qt::ToolTip) - w->requestActivateWindow(); - return w; -} + QEglFSHooks::hooks()->platformInit(); -QPlatformBackingStore *QEglFSIntegration::createPlatformBackingStore(QWindow *window) const -{ - return new QEglFSBackingStore(window); -} + QEGLPlatformIntegration::initialize(); -QPlatformOpenGLContext *QEglFSIntegration::createPlatformOpenGLContext(QOpenGLContext *context) const -{ - return new QEglFSContext(QEglFSHooks::hooks()->surfaceFormatFor(context->format()), context->shareHandle(), mDisplay); + if (!mDisableInputHandlers) + createInputHandlers(); } -QPlatformOffscreenSurface *QEglFSIntegration::createPlatformOffscreenSurface(QOffscreenSurface *surface) const +EGLNativeDisplayType QEglFSIntegration::nativeDisplay() const { - QEglFSScreen *screen = static_cast<QEglFSScreen *>(surface->screen()->handle()); - return new QEGLPbuffer(screen->display(), QEglFSHooks::hooks()->surfaceFormatFor(surface->requestedFormat()), surface); + return QEglFSHooks::hooks()->platformDisplay(); } -QPlatformFontDatabase *QEglFSIntegration::fontDatabase() const +QEGLPlatformScreen *QEglFSIntegration::createScreen() const { - return mFontDb.data(); + return new QEglFSScreen(display()); } -QAbstractEventDispatcher *QEglFSIntegration::createEventDispatcher() const +QEGLPlatformWindow *QEglFSIntegration::createWindow(QWindow *window) const { - return createUnixEventDispatcher(); + return new QEglFSWindow(window); } -void QEglFSIntegration::initialize() +QEGLPlatformContext *QEglFSIntegration::createContext(const QSurfaceFormat &format, + QPlatformOpenGLContext *shareContext, + EGLDisplay display) const { - QEglFSHooks::hooks()->platformInit(); - - EGLint major, minor; - - if (!eglBindAPI(EGL_OPENGL_ES_API)) { - qWarning("Could not bind GL_ES API\n"); - qFatal("EGL error"); - } - - mDisplay = eglGetDisplay(QEglFSHooks::hooks() ? QEglFSHooks::hooks()->platformDisplay() : EGL_DEFAULT_DISPLAY); - if (mDisplay == EGL_NO_DISPLAY) { - qWarning("Could not open egl display\n"); - qFatal("EGL error"); - } - - if (!eglInitialize(mDisplay, &major, &minor)) { - qWarning("Could not initialize egl display\n"); - qFatal("EGL error"); - } - - mScreen = createScreen(); - screenAdded(mScreen); - - mInputContext = QPlatformInputContextFactory::create(); - - if (!mDisableInputHandlers) - createInputHandlers(); + return new QEglFSContext(QEglFSHooks::hooks()->surfaceFormatFor(format), shareContext, display); } -QEglFSScreen *QEglFSIntegration::createScreen() const +QPlatformOffscreenSurface *QEglFSIntegration::createOffscreenSurface(EGLDisplay display, + const QSurfaceFormat &format, + QOffscreenSurface *surface) const { - return new QEglFSScreen(mDisplay); + return new QEGLPbuffer(display, QEglFSHooks::hooks()->surfaceFormatFor(format), surface); } QVariant QEglFSIntegration::styleHint(QPlatformIntegration::StyleHint hint) const @@ -192,115 +132,12 @@ QVariant QEglFSIntegration::styleHint(QPlatformIntegration::StyleHint hint) cons switch (hint) { case QPlatformIntegration::ShowIsFullScreen: - return mScreen->rootWindow() == 0; + return screen()->compositingWindow() == 0; default: return QPlatformIntegration::styleHint(hint); } } -QPlatformServices *QEglFSIntegration::services() const -{ - return mServices.data(); -} - -QPlatformNativeInterface *QEglFSIntegration::nativeInterface() const -{ - return const_cast<QEglFSIntegration *>(this); -} - -enum ResourceType { - EglDisplay, - EglWindow, - EglContext -}; - -static int resourceType(const QByteArray &key) -{ - static const QByteArray names[] = { // match ResourceType - QByteArrayLiteral("egldisplay"), - QByteArrayLiteral("eglwindow"), - QByteArrayLiteral("eglcontext") - }; - const QByteArray *end = names + sizeof(names) / sizeof(names[0]); - const QByteArray *result = std::find(names, end, key); - if (result == end) - result = std::find(names, end, key.toLower()); - return int(result - names); -} - -void *QEglFSIntegration::nativeResourceForIntegration(const QByteArray &resource) -{ - void *result = 0; - - switch (resourceType(resource)) { - case EglDisplay: - result = mScreen->display(); - break; - default: - break; - } - - return result; -} - -void *QEglFSIntegration::nativeResourceForWindow(const QByteArray &resource, QWindow *window) -{ - void *result = 0; - - switch (resourceType(resource)) { - case EglDisplay: - if (window && window->handle()) - result = static_cast<QEglFSScreen *>(window->handle()->screen())->display(); - else - result = mScreen->display(); - break; - case EglWindow: - if (window && window->handle()) - result = reinterpret_cast<void*>(static_cast<QEglFSWindow *>(window->handle())->eglWindow()); - break; - default: - break; - } - - return result; -} - -void *QEglFSIntegration::nativeResourceForContext(const QByteArray &resource, QOpenGLContext *context) -{ - void *result = 0; - - switch (resourceType(resource)) { - case EglContext: - if (context->handle()) - result = static_cast<QEGLPlatformContext *>(context->handle())->eglContext(); - break; - default: - break; - } - - return result; -} - -static void *eglContextForContext(QOpenGLContext *context) -{ - Q_ASSERT(context); - - QEGLPlatformContext *handle = static_cast<QEGLPlatformContext *>(context->handle()); - if (!handle) - return 0; - - return handle->eglContext(); -} - -QPlatformNativeInterface::NativeResourceForContextFunction QEglFSIntegration::nativeResourceFunctionForContext(const QByteArray &resource) -{ - QByteArray lowerCaseResource = resource.toLower(); - if (lowerCaseResource == "get_egl_context") - return NativeResourceForContextFunction(eglContextForContext); - - return 0; -} - EGLConfig QEglFSIntegration::chooseConfig(EGLDisplay display, const QSurfaceFormat &format) { class Chooser : public QEglConfigChooser { @@ -326,13 +163,4 @@ EGLConfig QEglFSIntegration::chooseConfig(EGLDisplay display, const QSurfaceForm return chooser.chooseConfig(); } -void QEglFSIntegration::createInputHandlers() -{ -#if !defined(QT_NO_EVDEV) && (!defined(Q_OS_ANDROID) || defined(Q_OS_ANDROID_NO_SDK)) - new QEvdevKeyboardManager(QLatin1String("EvdevKeyboard"), QString() /* spec */, this); - new QEvdevMouseManager(QLatin1String("EvdevMouse"), QString() /* spec */, this); - new QEvdevTouchScreenHandlerThread(QString() /* spec */, this); -#endif -} - QT_END_NAMESPACE |