Applied context restoring
authorBongjoo Seo <bongjoo.seo@samsung.com>
Mon, 10 Jun 2013 03:06:51 +0000 (12:06 +0900)
committerBongjoo Seo <bongjoo.seo@samsung.com>
Mon, 10 Jun 2013 11:14:11 +0000 (20:14 +0900)
Change-Id: Iffdc38a849df5dd075e7bee05678f7d43934ae45
Signed-off-by: Bongjoo Seo <bongjoo.seo@samsung.com>
src/graphics/opengl/FGrpEgl.cpp
src/ui/animations/FUiAnim_Debug.h
src/ui/animations/FUiAnim_DisplayManager.cpp
src/ui/animations/FUiAnim_EflVisualElementSurfaceImpl.cpp
src/ui/animations/FUiAnim_VisualElementImpl.cpp
src/ui/inc/FUiAnim_DisplayManager.h

index 9925c9b..e57e664 100644 (file)
@@ -61,7 +61,7 @@
 #include <FUi_WindowImpl.h>
 #include <FUiAnim_VisualElementSurfaceImpl.h>
 #include <FUiAnim_VisualElementImpl.h>
-
+#include <FUiAnim_DisplayManager.h>
 
 #ifdef __cplusplus
 extern "C"
@@ -123,6 +123,7 @@ class _SglInfo;
 
 #define FGRAPHICS_INTERNAL_USE_RESTORE_CONTEXT
 #if defined(FGRAPHICS_INTERNAL_USE_RESTORE_CONTEXT)
+void _RestoreContext(void);
 void _PostRenderCallback(Ecore_Evas* ee);
 void _SaveCurrentContext(_SglInfo* pSglInfo);
 void _UnregisterRenderCallback(Evas_Object* pObject);
@@ -720,6 +721,8 @@ _GetEvasEngineType(Evas_Object* pObject)
 
                if (engineName.Contains(String("opengl_x11")))
                {
+                       _DisplayManager* pDisplayManger = _DisplayManager::GetInstance();
+                       pDisplayManger->SetRestoreContextCallback(_RestoreContext);
                        return ENGINE_TYPE_OPENGL_X11;
                }
                else
@@ -749,6 +752,8 @@ _GetEvasEngineType(Evas_Object* pObject)
 
                if (engineName.Contains(String("opengl_x11")))
                {
+                       _DisplayManager* pDisplayManger = _DisplayManager::GetInstance();
+                       pDisplayManger->SetRestoreContextCallback(_RestoreContext);
                        return ENGINE_TYPE_OPENGL_X11;
                }
                else if (engineName.Contains(String("software_x11")))
@@ -792,6 +797,44 @@ _EvasObjectImageChange(_SglInfo* pSglInfo)
 
 #if defined(FGRAPHICS_INTERNAL_USE_RESTORE_CONTEXT)
 void
+_RestoreContext(void)
+{
+       if (__pPreviousSglInfo != null)
+       {
+               EGLDisplay display = __pPreviousSglInfo->display;
+               EGLSurface surface = __pPreviousSglInfo->surface;
+               EGLContext context = __pPreviousSglInfo->context;
+
+               if (__isDoublePixmapEnabled)
+               {
+                       _SglInfo* pBackSglInfo = null;
+                       _SglInfo* pFrontSglInfo = null;
+
+                       if (__pPreviousSglInfo->isBackbuffer)
+                       {
+                               pBackSglInfo = __pPreviousSglInfo;
+                               pFrontSglInfo = __pPreviousSglInfo->pSecondSglInfo;
+                       }
+                       else
+                       {
+                               pBackSglInfo = __pPreviousSglInfo->pSecondSglInfo;
+                               pFrontSglInfo = __pPreviousSglInfo;
+                       }
+
+                       surface = pBackSglInfo->surface;
+               }
+
+               EGLBoolean ret = eglMakeCurrent(display, surface, surface, context);
+               SysTryLog(NID_GRP, ret == EGL_TRUE, "fail to restore previous surface and context. %#x %#x %#x %#x egl error:%#x"
+                               , (unsigned int)display
+                               , (unsigned int)surface
+                               , (unsigned int)surface
+                               , (unsigned int)context
+                               , (unsigned int)eglGetError());
+       }
+}
+
+void
 _PostRenderCallback(Ecore_Evas* ee)
 {
        if (__pPreviousSglInfo != null)
index eb02260..4a119b0 100644 (file)
@@ -29,6 +29,7 @@
 #include <Evas.h>
 
 //#define VE_DEBUG // debug config
+//#define UI_ANIM_DEBUG
 #define VE_DEBUG_MODULE
 
 extern "C" _OSP_EXPORT_ void DumpAllEvas(void);
index b0fde87..a56bf36 100644 (file)
@@ -55,6 +55,7 @@ int _DisplayManager::__eventType = 0;
 void* _DisplayManager::__pWakeUpEventHandler = null;
 bool _DisplayManager::__wakeUpEventAdded = false;
 _DisplayManager* _DisplayManager::__pInstance = null;
+_DisplayManager::RestoreContextCallback _DisplayManager::__pRestoreContextCallback = null;
 
 _DisplayManager::_DisplayManager(void)
        : __roots()
@@ -317,8 +318,20 @@ _DisplayManager::Flush(void)
        return E_SUCCESS;
 }
 
+void
+_DisplayManager::SetRestoreContextCallback(RestoreContextCallback pRestoreContextCallback)
+{
+       __pRestoreContextCallback = pRestoreContextCallback;
+}
 
-
+void
+_DisplayManager::RestoreContext(void)
+{
+       if (__pRestoreContextCallback)
+       {
+               (*__pRestoreContextCallback)();
+       }
+}
 
 }}}            // Tizen::Ui::Animations
 
index db61fe9..9d52c1d 100644 (file)
@@ -36,6 +36,7 @@
 #include "FUiAnim_EflNode.h"
 #include "FUiAnim_EflLayer.h"
 #include "FUiAnim_EflVisualElementSurfaceImpl.h"
+#include "FUiAnim_DisplayManager.h"
 
 using namespace std;
 using namespace Tizen::Base;
@@ -97,11 +98,14 @@ _EflVisualElementSurfaceImpl::_EflVisualElementSurfaceImpl(const Handle layer, c
        evas_object_show(__pEvasImage);
        evas_object_move(__pEvasImage, -999999, -999999);
 #endif
+
+       _DisplayManager::RestoreContext();
        return;
 
 CATCH:
        evas_object_del(__pEvasImage);
        __pEvasImage = null;
+       _DisplayManager::RestoreContext();
 }
 
 _EflVisualElementSurfaceImpl::_EflVisualElementSurfaceImpl(const Handle layer, const Handle object, const Dimension& size)
@@ -114,8 +118,8 @@ _EflVisualElementSurfaceImpl::_EflVisualElementSurfaceImpl(const Handle layer, c
        ClearLastResult();
 
        _EflLayer* pLayer = reinterpret_cast<_EflLayer*>(layer);
-       Evas* evas = evas_object_evas_get(reinterpret_cast<Evas_Object*>(object));
-       if (pLayer->GetEvas() == evas)
+       Evas* pEvas = evas_object_evas_get(reinterpret_cast<Evas_Object*>(object));
+       if (pLayer->GetEvas() == pEvas)
        {
                __pEvasImage = reinterpret_cast<Evas_Object*>(object);
        }
@@ -132,6 +136,7 @@ _EflVisualElementSurfaceImpl::_EflVisualElementSurfaceImpl(const Handle layer, c
        evas_object_show(__pEvasImage);
        evas_object_move(__pEvasImage, -999999, -999999);
 #endif
+       _DisplayManager::RestoreContext();
 }
 
 _EflVisualElementSurfaceImpl::~_EflVisualElementSurfaceImpl(void)
@@ -146,6 +151,7 @@ _EflVisualElementSurfaceImpl::~_EflVisualElementSurfaceImpl(void)
                        evas_object_del(__pEvasImage);
                }
                evas_object_smart_member_del(__pEvasImage);
+               _DisplayManager::RestoreContext();
        }
 
        if (__pBuffer != null)
@@ -180,6 +186,7 @@ _EflVisualElementSurfaceImpl::SetImage(const String& fileName)
        }
 
        __pBuffer = null;
+       _DisplayManager::RestoreContext();
 
        return E_SUCCESS;
 }
index a86708e..0ed677e 100644 (file)
@@ -59,6 +59,7 @@
 #include "FUiAnim_MatrixUtil.h"
 #include "FUiAnim_Debug.h"
 #include "FUiAnim_EflNode.h"
+#include "FUiAnim_EflLayer.h"
 #include "FUiAnim_VisualElementSurfaceImpl.h"
 #include "FUiAnim_EflVisualElementSurfaceImpl.h"
 #include "FUiAnim_DisplayManager.h"
@@ -6118,6 +6119,7 @@ _VisualElementImpl::CaptureI(Canvas& outputCanvas, const FloatRectangle& rectDes
                                        __pSharedData->pSurface->GetBufferInfo(info);
                                        
                                        byte* pStart = (byte*)evas_object_image_data_get((Evas_Object*)pSurfImpl->GetNativeHandle(), false);
+                                       _DisplayManager::RestoreContext();
 
                                        if(pStart)
                                        {
@@ -6288,6 +6290,8 @@ _VisualElementImpl::CaptureI(Canvas& outputCanvas, const FloatRectangle& rectDes
                                if(pSurfImpl && pSurfImpl->GetNativeHandle() && pSurfImpl->__isImageObject)
                                {
                                        byte* pStart = (byte*)evas_object_image_data_get((Evas_Object*)pSurfImpl->GetNativeHandle(), false);
+                                       _DisplayManager::RestoreContext();
+
                                        BufferInfo info;
                                        __pSharedData->pSurface->GetBufferInfo(info);
 
index aa74c3c..67205a6 100644 (file)
@@ -49,6 +49,10 @@ public:
        static result ReleaseInstance(void);
        static bool __wakeUpEventAdded;
 
+       // For restoring gl context
+       typedef void (*RestoreContextCallback)(void);
+       static void SetRestoreContextCallback(RestoreContextCallback pRestoreContextCallback);
+       static void RestoreContext(void);
 public:
        _RootVisualElement* CreateRoot(void);
 
@@ -80,6 +84,7 @@ private:
        static int __eventType;
        static void* __pWakeUpEventHandler;
        static _DisplayManager* __pInstance;
+       static RestoreContextCallback __pRestoreContextCallback;
 }; // _DisplayManager
 
 }}} //namespace Tizen { namespace Ui { namespace Animations