From: Bongjoo Seo Date: Mon, 10 Jun 2013 03:06:51 +0000 (+0900) Subject: Applied context restoring X-Git-Tag: submit/tizen_2.2/20130714.153149~572 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9245910467687da7d4cbf53a68446985ab7dfa0b;p=framework%2Fosp%2Fuifw.git Applied context restoring Change-Id: Iffdc38a849df5dd075e7bee05678f7d43934ae45 Signed-off-by: Bongjoo Seo --- diff --git a/src/graphics/opengl/FGrpEgl.cpp b/src/graphics/opengl/FGrpEgl.cpp index 9925c9b..e57e664 100644 --- a/src/graphics/opengl/FGrpEgl.cpp +++ b/src/graphics/opengl/FGrpEgl.cpp @@ -61,7 +61,7 @@ #include #include #include - +#include #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) diff --git a/src/ui/animations/FUiAnim_Debug.h b/src/ui/animations/FUiAnim_Debug.h index eb02260..4a119b0 100644 --- a/src/ui/animations/FUiAnim_Debug.h +++ b/src/ui/animations/FUiAnim_Debug.h @@ -29,6 +29,7 @@ #include //#define VE_DEBUG // debug config +//#define UI_ANIM_DEBUG #define VE_DEBUG_MODULE extern "C" _OSP_EXPORT_ void DumpAllEvas(void); diff --git a/src/ui/animations/FUiAnim_DisplayManager.cpp b/src/ui/animations/FUiAnim_DisplayManager.cpp index b0fde87..a56bf36 100644 --- a/src/ui/animations/FUiAnim_DisplayManager.cpp +++ b/src/ui/animations/FUiAnim_DisplayManager.cpp @@ -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 diff --git a/src/ui/animations/FUiAnim_EflVisualElementSurfaceImpl.cpp b/src/ui/animations/FUiAnim_EflVisualElementSurfaceImpl.cpp index db61fe9..9d52c1d 100644 --- a/src/ui/animations/FUiAnim_EflVisualElementSurfaceImpl.cpp +++ b/src/ui/animations/FUiAnim_EflVisualElementSurfaceImpl.cpp @@ -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(object)); - if (pLayer->GetEvas() == evas) + Evas* pEvas = evas_object_evas_get(reinterpret_cast(object)); + if (pLayer->GetEvas() == pEvas) { __pEvasImage = reinterpret_cast(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; } diff --git a/src/ui/animations/FUiAnim_VisualElementImpl.cpp b/src/ui/animations/FUiAnim_VisualElementImpl.cpp index a86708e..0ed677e 100644 --- a/src/ui/animations/FUiAnim_VisualElementImpl.cpp +++ b/src/ui/animations/FUiAnim_VisualElementImpl.cpp @@ -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); diff --git a/src/ui/inc/FUiAnim_DisplayManager.h b/src/ui/inc/FUiAnim_DisplayManager.h index aa74c3c..67205a6 100644 --- a/src/ui/inc/FUiAnim_DisplayManager.h +++ b/src/ui/inc/FUiAnim_DisplayManager.h @@ -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