EGLFS: Enablers for Android plugin

These are some changes that are needed to make the Android
plugin as a subclass of the EGLFS plugin.

Change-Id: I7c77931f311d8a07f9292715d2abc256c5d552d8
Reviewed-by: Gunnar Sletta <gunnar.sletta@digia.com>
This commit is contained in:
Eskil Abrahamsen Blomfeldt 2013-02-27 17:08:03 +01:00 committed by The Qt Project
parent f4d7b4d10f
commit dedec0b305
7 changed files with 78 additions and 51 deletions

View File

@ -0,0 +1,44 @@
QT += core-private gui-private platformsupport-private
#DEFINES += QEGL_EXTRA_DEBUG
#Avoid X11 header collision
DEFINES += MESA_EGL_NO_X11_HEADERS
#To test the hooks on x11 (xlib), comment the above define too
#EGLFS_PLATFORM_HOOKS_SOURCES += qeglfshooks_x11.cpp
#LIBS += -lX11
SOURCES += $$PWD/qeglfsintegration.cpp \
$$PWD/qeglfswindow.cpp \
$$PWD/qeglfsbackingstore.cpp \
$$PWD/qeglfsscreen.cpp \
$$PWD/qeglfshooks_stub.cpp \
$$PWD/qeglfscursor.cpp \
$$PWD/qeglfscontext.cpp
HEADERS += $$PWD/qeglfsintegration.h \
$$PWD/qeglfswindow.h \
$$PWD/qeglfsbackingstore.h \
$$PWD/qeglfsscreen.h \
$$PWD/qeglfscursor.h \
$$PWD/qeglfshooks.h \
$$PWD/qeglfscontext.h
QMAKE_LFLAGS += $$QMAKE_LFLAGS_NOUNDEF
INCLUDEPATH += $$PWD
!isEmpty(EGLFS_PLATFORM_HOOKS_SOURCES) {
HEADERS += $$EGLFS_PLATFORM_HOOKS_HEADERS
SOURCES += $$EGLFS_PLATFORM_HOOKS_SOURCES
LIBS += $$EGLFS_PLATFORM_HOOKS_LIBS
DEFINES += EGLFS_PLATFORM_HOOKS
}
CONFIG += egl qpa/genericunixfontdatabase
RESOURCES += $$PWD/cursor.qrc
OTHER_FILES += \
$$PWD/eglfs.json

View File

@ -4,48 +4,6 @@ PLUGIN_TYPE = platforms
PLUGIN_CLASS_NAME = QEglFSIntegrationPlugin
load(qt_plugin)
QT += core-private gui-private platformsupport-private
SOURCES += $$PWD/main.cpp
#DEFINES += QEGL_EXTRA_DEBUG
#Avoid X11 header collision
DEFINES += MESA_EGL_NO_X11_HEADERS
#To test the hooks on x11 (xlib), comment the above define too
#EGLFS_PLATFORM_HOOKS_SOURCES += qeglfshooks_x11.cpp
#LIBS += -lX11
SOURCES = main.cpp \
qeglfsintegration.cpp \
qeglfswindow.cpp \
qeglfsbackingstore.cpp \
qeglfsscreen.cpp \
qeglfshooks_stub.cpp \
qeglfscursor.cpp \
qeglfscontext.cpp
HEADERS = qeglfsintegration.h \
qeglfswindow.h \
qeglfsbackingstore.h \
qeglfsscreen.h \
qeglfscursor.h \
qeglfshooks.h \
qeglfscontext.h
QMAKE_LFLAGS += $$QMAKE_LFLAGS_NOUNDEF
INCLUDEPATH += $$PWD
!isEmpty(EGLFS_PLATFORM_HOOKS_SOURCES) {
HEADERS += $$EGLFS_PLATFORM_HOOKS_HEADERS
SOURCES += $$EGLFS_PLATFORM_HOOKS_SOURCES
LIBS += $$EGLFS_PLATFORM_HOOKS_LIBS
DEFINES += EGLFS_PLATFORM_HOOKS
}
CONFIG += egl qpa/genericunixfontdatabase
RESOURCES += cursor.qrc
OTHER_FILES += \
eglfs.json
include(eglfs.pri)

View File

@ -53,7 +53,7 @@ QT_BEGIN_NAMESPACE
QEglFSContext::QEglFSContext(const QSurfaceFormat &format, QPlatformOpenGLContext *share,
EGLDisplay display, EGLenum eglApi)
: QEGLPlatformContext(format, share, display, QEglFSIntegration::chooseConfig(display, format), eglApi)
: QEGLPlatformContext(QEglFSHooks::hooks()->surfaceFormatFor(format), share, display, QEglFSIntegration::chooseConfig(display, QEglFSHooks::hooks()->surfaceFormatFor(format)), eglApi)
{
}

View File

@ -246,12 +246,14 @@ QEglFSCursor *QEglFSHooks::createCursor(QEglFSScreen *screen) const
void QEglFSHooks::waitForVSync() const
{
#if defined(FBIO_WAITFORVSYNC)
static const bool forceSync = qgetenv("QT_QPA_EGLFS_FORCEVSYNC").toInt();
if (forceSync && framebuffer != -1) {
int arg = 0;
if (ioctl(framebuffer, FBIO_WAITFORVSYNC, &arg) == -1)
qWarning("Could not wait for vsync.");
}
#endif
}
#ifndef EGLFS_PLATFORM_HOOKS

View File

@ -74,8 +74,11 @@ public:
void *nativeResourceForIntegration(const QByteArray &resource);
void *nativeResourceForContext(const QByteArray &resource, QOpenGLContext *context);
QPlatformScreen *screen() const { return mScreen; }
static EGLConfig chooseConfig(EGLDisplay display, const QSurfaceFormat &format);
EGLDisplay display() const { return mDisplay; }
private:
EGLDisplay mDisplay;
QAbstractEventDispatcher *mEventDispatcher;

View File

@ -84,11 +84,28 @@ void QEglFSWindow::create()
EGLDisplay display = (static_cast<QEglFSScreen *>(window()->screen()->handle()))->display();
QSurfaceFormat platformFormat = QEglFSHooks::hooks()->surfaceFormatFor(window()->requestedFormat());
EGLConfig config = QEglFSIntegration::chooseConfig(display, platformFormat);
m_config = QEglFSIntegration::chooseConfig(display, platformFormat);
m_format = q_glFormatFromConfig(display, m_config);
resetSurface();
}
void QEglFSWindow::invalidateSurface()
{
// Native surface has been deleted behind our backs
m_window = 0;
if (m_surface != 0) {
EGLDisplay display = (static_cast<QEglFSScreen *>(window()->screen()->handle()))->display();
eglDestroySurface(display, m_surface);
m_surface = 0;
}
}
void QEglFSWindow::resetSurface()
{
EGLDisplay display = static_cast<QEglFSScreen *>(screen())->display();
m_format = q_glFormatFromConfig(display, config);
m_window = QEglFSHooks::hooks()->createNativeWindow(QEglFSHooks::hooks()->screenSize(), m_format);
m_surface = eglCreateWindowSurface(display, config, m_window, NULL);
m_surface = eglCreateWindowSurface(display, m_config, m_window, NULL);
if (m_surface == EGL_NO_SURFACE) {
EGLint error = eglGetError();
eglTerminate(display);
@ -99,7 +116,7 @@ void QEglFSWindow::create()
void QEglFSWindow::destroy()
{
if (m_surface) {
EGLDisplay display = (static_cast<QEglFSScreen *>(window()->screen()->handle()))->display();
EGLDisplay display = static_cast<QEglFSScreen *>(screen())->display();
eglDestroySurface(display, m_surface);
m_surface = 0;
}
@ -114,9 +131,8 @@ void QEglFSWindow::setGeometry(const QRect &)
{
// We only support full-screen windows
QRect rect(screen()->availableGeometry());
QWindowSystemInterface::handleGeometryChange(window(), rect);
QPlatformWindow::setGeometry(rect);
QWindowSystemInterface::handleGeometryChange(window(), rect);
}
void QEglFSWindow::setWindowState(Qt::WindowState)

View File

@ -65,10 +65,14 @@ public:
void create();
void destroy();
virtual void invalidateSurface();
virtual void resetSurface();
private:
WId m_winid;
EGLSurface m_surface;
EGLNativeWindowType m_window;
EGLConfig m_config;
QSurfaceFormat m_format;
};
QT_END_NAMESPACE