[4.0] Fixed buffer release issue 09/161609/8 tizen_4.0_tv
authortaeyoon0.lee <taeyoon0.lee@samsung.com>
Fri, 24 Nov 2017 11:53:39 +0000 (20:53 +0900)
committertaeyoon0.lee <taeyoon0.lee@samsung.com>
Thu, 28 Dec 2017 09:46:39 +0000 (18:46 +0900)
 - Destroyed widget image buffer only by native image source destructor.
 - Modified some codes, CloseRemoteSurface(), CreationAborted case, etc.

Change-Id: Ib4565bd70fb95d19f5a818f03e4651d825d0c95d

widget_viewer_dali/internal/widget_view/widget_view_impl.cpp
widget_viewer_dali/internal/widget_view/widget_view_impl.h

index bcf18b004b2b62d4d6ad31d78a4ee90e6a8249f2..d5db237101b1e3de28cc918229594da9f2f57f33 100644 (file)
@@ -109,9 +109,6 @@ DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "activateFaultedWidget",
 
 DALI_TYPE_REGISTRATION_END()
 
-struct wl_buffer* preBuffer;
-struct tizen_remote_surface* remoteSurface;
-
 const char* const STATE_TEXT( "stateText" );
 const char* const FONT_STYLE( "fontStyle" );
 const char* const TEXT_POINT_SIZE( "textPointSize" );
@@ -236,9 +233,6 @@ static void OnBufferUpdated( struct tizen_remote_surface *surface, uint32_t type
     widgetView->UpdateImageSource( tbmSurface, buffer, surface);
   }
 
-  remoteSurface = surface;
-  preBuffer = buffer;
-
   close( img_file_fd );
 }
 
@@ -252,8 +246,8 @@ static void OnSurfaceRemoved( const char *appid, const char *instance_id, const
 
   if( widgetView && !widgetView->IsWidgetFaulted() )
   {
-    widgetView->CloseRemoteSurface();
-    widgetView->RemoveWidgetRenderer();
+    widgetView->RemoveWidget();
+    widgetView->EmitDeletedWidgetSignal();
   }
 }
 
@@ -552,25 +546,12 @@ void WidgetView::CreateWidgetRenderer()
   DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::CreateWidgetRenderer: Widget image is added.\n" );
 }
 
-void WidgetView::RemoveWidgetRenderer()
-{
-  if( mRenderer )
-  {
-    Self().RemoveRenderer( mRenderer );
-
-    ShowRetryState( true );
-
-    Dali::WidgetView::WidgetView handle( GetOwner() );
-    mWidgetDeletedSignal.Emit( handle );
-  }
-
-  DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::RemoveWidgetRenderer: Widget image is removed.\n" );
-}
-
 bool WidgetView::TerminateWidget()
 {
   if( !mWidgetId.empty() && !mInstanceId.empty() )
   {
+    RemoveWidget();
+
     int ret = 0;
     ret = widget_instance_terminate( mInstanceId.c_str() );
 
@@ -586,18 +567,12 @@ bool WidgetView::TerminateWidget()
 
     Dali::WidgetView::WidgetView handle( GetOwner() );
     mWidgetTerminatedSignal.Emit( handle );
-    mWidgetDeletedSignal.Emit( handle );
+
+    EmitDeletedWidgetSignal();
 
     mWidgetId.clear();
     mInstanceId.clear();
 
-    CloseRemoteSurface();
-
-    if( mImageSource )
-    {
-      Any source;
-      mImageSource->SetSource( source );
-    }
     return true;
   }
 
@@ -629,13 +604,14 @@ void WidgetView::SendWidgetEvent( int event )
     case WIDGET_INSTANCE_EVENT_FAULT:
     {
       mWidgetFaultedSignal.Emit( handle );
-      CloseRemoteSurface();
-      RemoveWidgetRenderer();
+      RemoveWidget();
+      ShowRetryState( true );
       break;
     }
     case WIDGET_INSTANCE_EVENT_CREATE_ABORTED:
     {
       mWidgetCreationAbortedSignal.Emit( handle );
+      ShowRetryState( true );
       break;
     }
     default:
@@ -1241,19 +1217,24 @@ float WidgetView::GetWidthForHeight( float height )
   }
 }
 
-void WidgetView::CloseRemoteSurface()
+void WidgetView::RemoveWidget()
 {
-  if( mWatcherHandle != NULL )
+  if( mRemoteSurface != NULL )
   {
-    if( remoteSurface != NULL && preBuffer != NULL && tizen_remote_surface_get_version( remoteSurface ) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION )
-    {
-      tizen_remote_surface_release( remoteSurface, preBuffer );
-      tbm_surface_h preTbmSurface = (tbm_surface_h)wl_buffer_get_user_data( preBuffer );
-      tbm_surface_internal_unref( preTbmSurface );
-      wl_buffer_destroy( preBuffer );
-      preBuffer = NULL;
-    }
+    tizen_remote_surface_transfer_visibility( mRemoteSurface, TIZEN_REMOTE_SURFACE_VISIBILITY_TYPE_INVISIBLE);
+  }
+
+  mImageSource = Dali::NativeImageSource::New( NULL );
+
+  if( mRenderer )
+  {
+    mImageSource = NULL;
+    Self().RemoveRenderer( mRenderer );
+    mRenderer.Reset();
+  }
 
+  if( mWatcherHandle != NULL && mRemoteSurface != NULL )
+  {
     screen_connector_toolkit_remove( mWatcherHandle );
     mWatcherHandle = NULL;
     mRemoteSurface = NULL;
@@ -1669,6 +1650,15 @@ bool WidgetView::GetStringFromProperty( const Dali::Property::Value& value, std:
   return extracted;
 }
 
+void WidgetView::EmitDeletedWidgetSignal()
+{
+  if( !mWidgetId.empty() )
+  {
+    Dali::WidgetView::WidgetView handle( GetOwner() );
+    mWidgetDeletedSignal.Emit( handle );
+  }
+}
+
 } // namespace Internal
 
 } // namespace WidgetView
index e5fa76c875d2fc32595064471d3c0dd0808ca05d..e3302fd4e0a82d28f369e0ab1533279671be7443 100644 (file)
@@ -131,7 +131,7 @@ public: // Internal API
 
   void SetPermanentDelete( bool permanentDelete );
 
-  void RemoveWidgetRenderer();
+  void RemoveWidget();
 
   bool IsPermanentDelete();
 
@@ -147,8 +147,6 @@ public: // Internal API
 
   bool OnWheelEvent( Dali::Actor actor, const Dali::WheelEvent& event );
 
-  void CloseRemoteSurface();
-
   void SetLoadingTextPropertyMap( Dali::Property::Map map );
 
   void SetRetryTextPropertyMap( Dali::Property::Map map );
@@ -169,6 +167,8 @@ public: // Internal API
 
   bool TouchEvent( const Dali::TouchData& event );
 
+  void EmitDeletedWidgetSignal();
+
 public: //Signals
 
   /**