DrmGLESGraphicSystem: Modify for multi screen
authorNobuhiko Tanibata <ntanibata@jp.adit-jv.com>
Fri, 21 Dec 2012 04:51:08 +0000 (13:51 +0900)
committerTimo Lotterbach <timo.lotterbach@bmw-carit.de>
Wed, 9 Jan 2013 13:04:29 +0000 (05:04 -0800)
BaseGraphicSystem
  Add two functions for multi screen which are switchScreen() and updateScreenList()
  switchScreen() is for switching screen devices.
  updateScreenList() is for updating LmScreenList.

DrmGLESGraphicSystem
  Add implementation of switchScreen() and updateScreenList()
  modify controlling multi screen devices

Signed-off-by: Nobuhiko Tanibata <ntanibata@jp.adit-jv.com>
LayerManagerPlugins/Renderers/Graphic/include/GraphicSystems/BaseGraphicSystem.h
LayerManagerPlugins/Renderers/Graphic/include/GraphicSystems/DrmGLESGraphicSystem.h
LayerManagerPlugins/Renderers/Graphic/src/GraphicSystems/DrmGLESGraphicSystem.cpp

index 349b805..37b885b 100644 (file)
@@ -26,6 +26,7 @@
 #include "PlatformSurface.h"
 #include "Surface.h"
 #include "Layer.h"
+#include "LmScreen.h"
 
 template<class DisplayType, class WindowType>
 class BaseGraphicSystem
@@ -76,6 +77,16 @@ public:
     }
     virtual void renderSurface(Surface*)=0;
 
+    virtual void updateScreenList(LmScreenList& screenList)
+    {
+        (void)screenList;
+    }
+
+    virtual void switchScreen(uint screenID)
+    {
+        (void)screenID;
+    }
+
 protected:
     BaseWindowSystem* m_baseWindowSystem;
     ITextureBinder* m_binder;
index 9a44ec7..5a32285 100644 (file)
@@ -59,6 +59,7 @@ struct DrmOutput {
        int             fdDev;
        struct gbm_surface*     surface[2];
        EGLSurface      eglSurface[2];
+       uint32_t        screenID;
 };
 
 class DrmGLESGraphicSystem: public GLESGraphicsystem
@@ -72,6 +73,8 @@ public:
     virtual bool init(EGLNativeDisplayType display, EGLNativeWindowType window);
     virtual void activateGraphicContext();
     virtual void swapBuffers();
+    virtual void updateScreenList(LmScreenList& screenList);
+    virtual void switchScreen(uint screenid);
 
 // proterties
 private:
@@ -85,6 +88,7 @@ private:
        int            m_crtcsNum;
        uint32_t       m_crtcAllocator;
        uint32_t       m_connectorAllocator;
+       DrmOutput*     m_currentOutput;
 
        PFNEGLBINDWAYLANDDISPLAYWL                                              m_pfEglBindWaylandDisplayWL;
        PFNEGLUNBINDWAYLANDDISPLAYWL                                    m_pfEglUnbindWaylandDisplayWL;
index 090965b..fd76bcf 100644 (file)
@@ -55,6 +55,7 @@ DrmGLESGraphicSystem::DrmGLESGraphicSystem(int windowWidth, int windowHeight,
 , m_crtcsNum(0)
 , m_crtcAllocator(0)
 , m_connectorAllocator(0)
+, m_currentOutput(NULL)
 {
     LOG_DEBUG("DrmGLESGraphicSystem", "creating DrmGLESGraphicSystem");
 
@@ -224,11 +225,43 @@ bool DrmGLESGraphicSystem::init(EGLNativeDisplayType display, EGLNativeWindowTyp
 
 void DrmGLESGraphicSystem::activateGraphicContext()
 {
-       struct DrmOutput* output = NULL;
-       wl_list_for_each(output, &m_outputList, link)
-       {
-               drmOutputPrepareRender(output);
-       }
+}
+
+void DrmGLESGraphicSystem::updateScreenList(LmScreenList& screenList)
+{
+    LmScreenListIterator iter = screenList.begin();
+    LmScreenListIterator iterEnd = screenList.end();
+    for (; iter != iterEnd; ++iter)
+    {
+        delete (*iter);
+    }
+    screenList.clear();
+
+    struct DrmOutput* output = NULL;
+    wl_list_for_each(output, &m_outputList, link)
+    {
+        LmScreen* lmScreen = new LmScreen(output->screenID, "");
+        screenList.push_back(lmScreen);
+    }
+}
+
+void DrmGLESGraphicSystem::switchScreen(uint screenID)
+{
+    // Actually, when renderSWLayers is called, rendering target buffer is switched
+    // because of avoiding overhead of switching display.
+    struct DrmOutput* output = NULL;
+    wl_list_for_each(output, &m_outputList, link)
+    {
+        if (output->screenID != screenID)
+        {
+            continue;
+        }
+
+        LOG_DEBUG("DrmGLESGraphicSystem", "switch screen:" << m_currentOutput->screenID);
+        m_currentOutput = output;
+        drmOutputPrepareRender(m_currentOutput);
+        break;
+    }
 }
 
 bool DrmGLESGraphicSystem::initializeSystem()
@@ -292,7 +325,6 @@ bool DrmGLESGraphicSystem::createOutputs()
                }
 
                drmModeFreeConnector(connector);
-               break;
        }
 
        if (wl_list_empty(&m_outputList))
@@ -373,7 +405,7 @@ int DrmGLESGraphicSystem::createOutputForConnector(drmModeRes* resources,
                        goto err_free;
        }
 
-       drmMode = container_of(output->modeList.next, struct DrmMode, link);
+       drmMode = wl_container_of(output->modeList.next, drmMode, link);
        output->currentMode = drmMode;
        drmMode->flags = WL_OUTPUT_MODE_CURRENT | WL_OUTPUT_MODE_PREFERRED;
 
@@ -441,6 +473,10 @@ int DrmGLESGraphicSystem::createOutputForConnector(drmModeRes* resources,
                goto err_egl_surface;
        }
 
+        output->screenID = (uint)wl_list_length(&m_outputList);
+        m_currentOutput = output;
+        drmOutputPrepareRender(m_currentOutput);
+
        wl_list_insert(m_outputList.prev, &output->link);
 
        LOG_DEBUG("DrmGLESGraphicSystem", "createOutputForConnector OUT (NORMAL)");
@@ -504,6 +540,11 @@ void DrmGLESGraphicSystem::swapBuffers()
 
        wl_list_for_each(output, &m_outputList, link)
        {
+               if (output != m_currentOutput)
+               {
+                       continue;
+               }
+
                glFinish();
 
                eglSwapBuffers(m_eglDisplay, output->eglSurface[output->current]);
@@ -525,6 +566,8 @@ void DrmGLESGraphicSystem::swapBuffers()
                {
                        LOG_ERROR("DrmGLESGraphicSystem", "queueing pageflip failed");
                }
+
+               break;
        }
 
     LOG_DEBUG("DrmGLESGraphicSystem", "swapBuffers OUT");