[3.0] Modified the location of ReleaseSurface in NativeRenderSurface 06/95006/3
authorrubric <sinjae4b.lee@samsung.com>
Mon, 31 Oct 2016 09:23:36 +0000 (18:23 +0900)
committerTaeyoon Lee <taeyoon0.lee@samsung.com>
Wed, 2 Nov 2016 06:17:09 +0000 (23:17 -0700)
[Model] Tizen 3.0
[Problem] Sometimes aquired ConsumeSurface is NULL
[Cause & Measure] surface release timing between render thread and event thread
[Checking Method] Run gallery application which uses EvasPlugin if it works fine
[Developer] SinJae Lee

Change-Id: I89a3b8f1adfb4091078d299ce290c0b484498a4f

adaptors/integration-api/wayland/native-render-surface.h
adaptors/tizen/native-render-surface-tizen.cpp

index 44caaa2..23a3120 100644 (file)
@@ -79,11 +79,6 @@ public: // API
    */
   virtual Any GetSurface();
 
-  /**
-   * @brief Release the surface
-   */
-  virtual void ReleaseSurface();
-
 public: // from Dali::RenderSurface
 
   /**
index 0c94474..ecca85d 100644 (file)
@@ -82,7 +82,6 @@ NativeRenderSurface::~NativeRenderSurface()
   // release the surface if we own one
   if( mImpl->mOwnSurface )
   {
-
     if( mImpl->mConsumeSurface )
     {
       tbm_surface_queue_release( mImpl->mTbmQueue, mImpl->mConsumeSurface );
@@ -191,16 +190,12 @@ void NativeRenderSurface::PostRender( EglInterface& egl, Integration::GlAbstract
     mImpl->mThreadSynchronization->PostRenderStarted();
   }
 
+  if( tbm_surface_queue_can_acquire( mImpl->mTbmQueue, 1 ) )
   {
-    ConditionalWait::ScopedLock lock( mImpl->mTbmSurfaceCondition );
-
-    if( tbm_surface_queue_can_acquire( mImpl->mTbmQueue, 1 ) )
+    if( tbm_surface_queue_acquire( mImpl->mTbmQueue, &mImpl->mConsumeSurface ) != TBM_SURFACE_QUEUE_ERROR_NONE )
     {
-      if( tbm_surface_queue_acquire( mImpl->mTbmQueue, &mImpl->mConsumeSurface ) != TBM_SURFACE_QUEUE_ERROR_NONE )
-      {
-        DALI_LOG_ERROR( "Failed aquire consume tbm_surface\n" );
-        return;
-      }
+      DALI_LOG_ERROR( "Failed to aquire a tbm_surface\n" );
+      return;
     }
   }
 
@@ -214,8 +209,16 @@ void NativeRenderSurface::PostRender( EglInterface& egl, Integration::GlAbstract
 
   if( mImpl->mThreadSynchronization )
   {
+    // wait until the event-thread completed to use the tbm_surface
     mImpl->mThreadSynchronization->PostRenderWaitForCompletion();
   }
+
+  // release the consumed surface after post render was completed
+  if( mImpl->mConsumeSurface )
+  {
+    tbm_surface_queue_release( mImpl->mTbmQueue, mImpl->mConsumeSurface );
+    mImpl->mConsumeSurface = NULL;
+  }
 }
 
 void NativeRenderSurface::StopRender()
@@ -263,16 +266,6 @@ void NativeRenderSurface::CreateNativeRenderable()
   }
 }
 
-void NativeRenderSurface::ReleaseSurface()
-{
-  ConditionalWait::ScopedLock lock( mImpl->mTbmSurfaceCondition );
-  if( mImpl->mConsumeSurface )
-  {
-    tbm_surface_queue_release( mImpl->mTbmQueue, mImpl->mConsumeSurface );
-    mImpl->mConsumeSurface = NULL;
-  }
-}
-
 void NativeRenderSurface::ReleaseLock()
 {
   if( mImpl->mThreadSynchronization )