From f2d04d9b8cb323826c5af180dd2c22fe584a5e26 Mon Sep 17 00:00:00 2001 From: Girish Ramakrishnan Date: Wed, 13 Jun 2012 16:38:27 -0700 Subject: eglfs: Make QEglFSWindow respect the window format Prior to this change, eglfs code used to override the window format with it's own format. With this change, eglfs will respect the window format. This is useful when the application requires a surface with alpha (for example, so that the video layer below is visible) QEglFSHooks::surfaceFormatFor() allows the hook author to override the context and window surface format. Change-Id: I97f03a8b0871dfebfca73004fa0188b33d0d0367 Reviewed-by: Johannes Zellner Reviewed-by: Girish Ramakrishnan --- src/plugins/platforms/eglfs/qeglfscontext.cpp | 5 +---- src/plugins/platforms/eglfs/qeglfshooks.h | 2 +- src/plugins/platforms/eglfs/qeglfshooks_stub.cpp | 21 ++------------------- src/plugins/platforms/eglfs/qeglfswindow.cpp | 14 +++++++------- src/plugins/platforms/eglfs/qeglfswindow.h | 1 + 5 files changed, 12 insertions(+), 31 deletions(-) (limited to 'src') diff --git a/src/plugins/platforms/eglfs/qeglfscontext.cpp b/src/plugins/platforms/eglfs/qeglfscontext.cpp index 7e874bee0e..1a16b36696 100644 --- a/src/plugins/platforms/eglfs/qeglfscontext.cpp +++ b/src/plugins/platforms/eglfs/qeglfscontext.cpp @@ -50,15 +50,12 @@ QT_BEGIN_NAMESPACE QEglFSContext::QEglFSContext(const QSurfaceFormat &format, QPlatformOpenGLContext *share, EGLDisplay display, EGLenum eglApi) - : QEGLPlatformContext(format, share, display, eglApi) + : QEGLPlatformContext(hooks->surfaceFormatFor(format), share, display, eglApi) { } bool QEglFSContext::makeCurrent(QPlatformSurface *surface) { - // create the native window surface. this makes sure that - // we create surfaces only for painted widgets (unlike QDesktopWidget) - (static_cast(surface))->create(); return QEGLPlatformContext::makeCurrent(surface); } diff --git a/src/plugins/platforms/eglfs/qeglfshooks.h b/src/plugins/platforms/eglfs/qeglfshooks.h index baaa90aa91..3e40d16f38 100644 --- a/src/plugins/platforms/eglfs/qeglfshooks.h +++ b/src/plugins/platforms/eglfs/qeglfshooks.h @@ -61,7 +61,7 @@ public: virtual QSize screenSize() const; virtual int screenDepth() const; virtual QImage::Format screenFormat() const; - virtual QSurfaceFormat defaultSurfaceFormat() const; + virtual QSurfaceFormat surfaceFormatFor(const QSurfaceFormat &inputFormat) const; virtual EGLNativeWindowType createNativeWindow(const QSize &size); virtual void destroyNativeWindow(EGLNativeWindowType window); virtual bool hasCapability(QPlatformIntegration::Capability cap) const; diff --git a/src/plugins/platforms/eglfs/qeglfshooks_stub.cpp b/src/plugins/platforms/eglfs/qeglfshooks_stub.cpp index fbc02d1a01..fe622e1c1b 100644 --- a/src/plugins/platforms/eglfs/qeglfshooks_stub.cpp +++ b/src/plugins/platforms/eglfs/qeglfshooks_stub.cpp @@ -72,26 +72,9 @@ QImage::Format QEglFSHooks::screenFormat() const return screenDepth() == 16 ? QImage::Format_RGB16 : QImage::Format_RGB32; } -QSurfaceFormat QEglFSHooks::defaultSurfaceFormat() const +QSurfaceFormat QEglFSHooks::surfaceFormatFor(const QSurfaceFormat &inputFormat) const { - QSurfaceFormat format; - if (screenDepth() == 16) { - format.setDepthBufferSize(16); - format.setRedBufferSize(5); - format.setGreenBufferSize(6); - format.setBlueBufferSize(5); - } else { - format.setDepthBufferSize(24); - format.setStencilBufferSize(8); - format.setRedBufferSize(8); - format.setGreenBufferSize(8); - format.setBlueBufferSize(8); - } - - static int samples = qgetenv("QT_QPA_EGLFS_MULTISAMPLE").toInt(); - format.setSamples(samples); - - return format; + return inputFormat; } EGLNativeWindowType QEglFSHooks::createNativeWindow(const QSize &size) diff --git a/src/plugins/platforms/eglfs/qeglfswindow.cpp b/src/plugins/platforms/eglfs/qeglfswindow.cpp index 5e6d09a637..6cb9fc6edf 100644 --- a/src/plugins/platforms/eglfs/qeglfswindow.cpp +++ b/src/plugins/platforms/eglfs/qeglfswindow.cpp @@ -61,6 +61,8 @@ QEglFSWindow::QEglFSWindow(QWindow *w) #endif setWindowState(Qt::WindowFullScreen); + + create(); } QEglFSWindow::~QEglFSWindow() @@ -70,19 +72,17 @@ QEglFSWindow::~QEglFSWindow() void QEglFSWindow::create() { - if (m_window) { - return; - } + Q_ASSERT(!m_window); EGLDisplay display = (static_cast(window()->screen()->handle()))->display(); - QSurfaceFormat platformFormat = hooks->defaultSurfaceFormat(); + QSurfaceFormat platformFormat = hooks->surfaceFormatFor(window()->requestedFormat()); EGLConfig config = q_configFromGLFormat(display, platformFormat); + m_format = q_glFormatFromConfig(display, config); m_window = hooks->createNativeWindow(hooks->screenSize()); m_surface = eglCreateWindowSurface(display, config, m_window, NULL); if (m_surface == EGL_NO_SURFACE) { - qWarning("Could not create the egl surface: error = 0x%x\n", eglGetError()); eglTerminate(display); - qFatal("EGL error"); + qFatal("EGL Error : Could not create the egl surface: error = 0x%x\n", eglGetError()); } } @@ -122,7 +122,7 @@ WId QEglFSWindow::winId() const QSurfaceFormat QEglFSWindow::format() const { - return hooks->defaultSurfaceFormat(); + return m_format; } QT_END_NAMESPACE diff --git a/src/plugins/platforms/eglfs/qeglfswindow.h b/src/plugins/platforms/eglfs/qeglfswindow.h index f8c594b2a6..85866e492c 100644 --- a/src/plugins/platforms/eglfs/qeglfswindow.h +++ b/src/plugins/platforms/eglfs/qeglfswindow.h @@ -69,6 +69,7 @@ private: WId m_winid; EGLSurface m_surface; EGLNativeWindowType m_window; + QSurfaceFormat m_format; }; QT_END_NAMESPACE #endif // QEGLFSWINDOW_H -- cgit v1.2.3