diff options
author | Arvid Picciani <aep@exys.org> | 2012-10-10 14:11:30 +0000 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2012-10-13 23:23:33 +0200 |
commit | 0aa28cf67ae6fab9ce4a677b0a5fd697440b8b11 (patch) | |
tree | 55f9b91b8fd750388cd5ee5d4676ee37a81cf745 /mkspecs/unsupported | |
parent | 703fa6c361682cab0d64baabd9256c651da34779 (diff) |
android-eglfs: open the correct fb device for reading attrs
Change-Id: Icedcab50379834fa3456d0e18aaef8a4dd9cf949
Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
Diffstat (limited to 'mkspecs/unsupported')
-rw-r--r-- | mkspecs/unsupported/android-g++/qeglfshooks_surfaceflinger.cpp | 69 |
1 files changed, 68 insertions, 1 deletions
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 <ui/DisplayInfo.h> #include <ui/FramebufferNativeWindow.h> #include <gui/SurfaceComposerClient.h> +#include <fcntl.h> +#include <unistd.h> +#include <linux/fb.h> +#include <sys/ioctl.h> 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<android::SurfaceComposerClient> 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; |