From 0aa28cf67ae6fab9ce4a677b0a5fd697440b8b11 Mon Sep 17 00:00:00 2001 From: Arvid Picciani Date: Wed, 10 Oct 2012 14:11:30 +0000 Subject: android-eglfs: open the correct fb device for reading attrs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Icedcab50379834fa3456d0e18aaef8a4dd9cf949 Reviewed-by: Samuel Rødal --- .../android-g++/qeglfshooks_surfaceflinger.cpp | 69 +++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/mkspecs/unsupported/android-g++/qeglfshooks_surfaceflinger.cpp b/mkspecs/unsupported/android-g++/qeglfshooks_surfaceflinger.cpp index bb751eb98d..cef1d1ccbe 100644 --- a/mkspecs/unsupported/android-g++/qeglfshooks_surfaceflinger.cpp +++ b/mkspecs/unsupported/android-g++/qeglfshooks_surfaceflinger.cpp @@ -44,6 +44,10 @@ #include #include #include +#include +#include +#include +#include using namespace android; @@ -53,6 +57,8 @@ class QEglFSPandaHooks : public QEglFSHooks { public: virtual EGLNativeWindowType createNativeWindow(const QSize &size, const QSurfaceFormat &format); + virtual QSize screenSize() const; + virtual int screenDepth() const; private: // androidy things sp mSession; @@ -72,13 +78,74 @@ EGLNativeWindowType QEglFSPandaHooks::createNativeWindow(const QSize &size, cons 0, dinfo.w, dinfo.h, PIXEL_FORMAT_RGB_888); SurfaceComposerClient::openGlobalTransaction(); mControl->setLayer(0x40000000); - mControl->setAlpha(0.4); +// mControl->setAlpha(1); SurfaceComposerClient::closeGlobalTransaction(); mAndroidSurface = mControl->getSurface(); EGLNativeWindowType eglWindow = mAndroidSurface.get(); return eglWindow; } +QSize QEglFSPandaHooks::screenSize() const +{ + static QSize size; + + if (size.isEmpty()) { + int width = qgetenv("QT_QPA_EGLFS_WIDTH").toInt(); + int height = qgetenv("QT_QPA_EGLFS_HEIGHT").toInt(); + + if (width && height) { + // no need to read fb0 + size.setWidth(width); + size.setHeight(height); + return size; + } + + struct fb_var_screeninfo vinfo; + int fd = open("/dev/graphics/fb0", O_RDONLY); + + if (fd != -1) { + if (ioctl(fd, FBIOGET_VSCREENINFO, &vinfo) == -1) + qWarning("Could not query variable screen info."); + else + size = QSize(vinfo.xres, vinfo.yres); + + close(fd); + } else { + qWarning("Failed to open /dev/graphics/fb0 to detect screen resolution."); + } + + // override fb0 from environment var setting + if (width) + size.setWidth(width); + if (height) + size.setHeight(height); + } + + return size; +} + +int QEglFSPandaHooks::screenDepth() const +{ + static int depth = qgetenv("QT_QPA_EGLFS_DEPTH").toInt(); + + if (depth == 0) { + struct fb_var_screeninfo vinfo; + int fd = open("/dev/graphics/fb0", O_RDONLY); + + if (fd != -1) { + if (ioctl(fd, FBIOGET_VSCREENINFO, &vinfo) == -1) + qWarning("Could not query variable screen info."); + else + depth = vinfo.bits_per_pixel; + + close(fd); + } else { + qWarning("Failed to open /dev/graphics/fb0 to detect screen depth."); + } + } + + return depth == 0 ? 32 : depth; +} static QEglFSPandaHooks eglFSPandaHooks; QEglFSHooks *platformHooks = &eglFSPandaHooks; -- cgit v1.2.3