directfb: Allocate a special surface for OpenGL
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>
Tue, 29 May 2012 17:14:43 +0000 (19:14 +0200)
committerQt by Nokia <qt-info@nokia.com>
Wed, 30 May 2012 17:29:35 +0000 (19:29 +0200)
Allocate an RGB16 surface when we need to use OpenGL, set the
custom DSCAPS_GL for this EGL mode. The broadcom hardware would
allow us to use ABGR but we have some issues with the QSurfaceFormat
to select the right kind of surface.

Change-Id: I0fff7906154f3d7afb35b2b5d2bb91510cf3aa4d
Reviewed-by: Girish Ramakrishnan <girish.1.ramakrishnan@nokia.com>
src/plugins/platforms/directfb/qdirectfb_egl.cpp
src/plugins/platforms/directfb/qdirectfbwindow.h

index 65112a4..f5547d5 100644 (file)
@@ -92,6 +92,8 @@ public:
     QDirectFbWindowEGL(QWindow *tlw, QDirectFbInput *inputhandler);
     ~QDirectFbWindowEGL();
 
+    void createDirectFBWindow();
+
     // EGL. Subclass it instead to have different GL integrations?
     EGLSurface eglSurface();
 
@@ -169,6 +171,37 @@ QDirectFbWindowEGL::~QDirectFbWindowEGL()
     }
 }
 
+void QDirectFbWindowEGL::createDirectFBWindow()
+{
+    // Use the default for the raster surface.
+    if (window()->surfaceType() == QSurface::RasterSurface)
+        return QDirectFbWindow::createDirectFBWindow();
+
+    Q_ASSERT(!m_dfbWindow.data());
+
+    DFBWindowDescription description;
+    memset(&description, 0, sizeof(DFBWindowDescription));
+    description.flags = DFBWindowDescriptionFlags(DWDESC_WIDTH | DWDESC_HEIGHT|
+                                                  DWDESC_POSX | DWDESC_POSY|
+                                                  DWDESC_PIXELFORMAT | DWDESC_SURFACE_CAPS);
+    description.width = qMax(1, window()->width());
+    description.height = qMax(1, window()->height());
+    description.posx = window()->x();
+    description.posy = window()->y();
+
+    description.surface_caps = DSCAPS_GL;
+    description.pixelformat = DSPF_RGB16;
+
+    IDirectFBDisplayLayer *layer;
+    layer = toDfbScreen(window())->dfbLayer();
+    DFBResult result = layer->CreateWindow(layer, &description, m_dfbWindow.outPtr());
+    if (result != DFB_OK)
+        DirectFBError("QDirectFbWindow: failed to create window", result);
+
+    m_dfbWindow->SetOpacity(m_dfbWindow.data(), 0xff);
+    m_inputHandler->addWindow(m_dfbWindow.data(), window());
+}
+
 EGLSurface QDirectFbWindowEGL::eglSurface()
 {
     if (m_eglSurface == EGL_NO_SURFACE) {
index f02f937..0c429c9 100644 (file)
@@ -73,7 +73,7 @@ public:
     // helper to get access to DirectFB types
     IDirectFBSurface *dfbSurface();
 
-private:
+protected:
     QDirectFBPointer<IDirectFBSurface> m_dfbSurface;
     QDirectFBPointer<IDirectFBWindow> m_dfbWindow;
     QDirectFbInput *m_inputHandler;