Release tizen remote surface when Remove Widget 83/170483/3
authorsunghyun kim <scholb.kim@samsung.com>
Tue, 20 Feb 2018 07:30:07 +0000 (16:30 +0900)
committersunghyun kim <scholb.kim@samsung.com>
Thu, 5 Apr 2018 09:34:23 +0000 (18:34 +0900)
When application call Terminate widget, widget-viewer is crashed.
Because widget-viewer try release widget using invalid surface.
So when application remove widget, widget viewer need to cancled release callback and do release surface before remove widget

Change-Id: I0c28b463b0685d537232c9d7d8e02055c33d7790

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

index d5db237101b1e3de28cc918229594da9f2f57f33..66b66d5dcfec9480fd27a3386feacf6ac0534014 100644 (file)
@@ -286,7 +286,8 @@ WidgetView::WidgetView()
   mRetryState( false ),
   mPermanentDelete( false ),
   mWatcherHandle( NULL ),
-  mRemoteSurface( NULL )
+  mRemoteSurface( NULL ),
+  mWlBuffer( NULL )
 {
 }
 
@@ -308,7 +309,8 @@ WidgetView::WidgetView( const std::string& widgetId, const std::string& contentI
   mRetryState( false ),
   mPermanentDelete( false ),
   mWatcherHandle( NULL ),
-  mRemoteSurface( NULL )
+  mRemoteSurface( NULL ),
+  mWlBuffer( NULL )
 {
 }
 
@@ -1026,11 +1028,12 @@ public:
   {
     struct wl_buffer *buffer = static_cast< struct wl_buffer* >(mWlBuffer);
     struct tizen_remote_surface *surface = static_cast< struct tizen_remote_surface* >(mRemoteSurface);
-    if (tizen_remote_surface_get_version( surface ) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION) {
-        tizen_remote_surface_release( surface, buffer );
-        tbm_surface_h preTbmSurface = (tbm_surface_h)wl_buffer_get_user_data( buffer );
-        tbm_surface_internal_unref( preTbmSurface );
-        wl_buffer_destroy( buffer );
+    if (tizen_remote_surface_get_version( surface ) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION)
+    {
+      tizen_remote_surface_release( surface, buffer );
+      tbm_surface_h preTbmSurface = (tbm_surface_h)wl_buffer_get_user_data( buffer );
+      tbm_surface_internal_unref( preTbmSurface );
+      wl_buffer_destroy( buffer );
     }
   }
 
@@ -1056,6 +1059,7 @@ void WidgetView::UpdateImageSource( tbm_surface_h source , struct wl_buffer *buf
   TriggerEventFactory triggerEventFactory;
   TriggerEventInterface* notification = triggerEventFactory.CreateTriggerEvent( callback,
                                                                                 TriggerEventInterface::DELETE_AFTER_TRIGGER );
+  mWlBuffer = buffer;
 
   mImageSource = Dali::NativeImageSource::New( source );
   Dali::NativeImage image = Dali::NativeImage::New( *mImageSource );
@@ -1063,7 +1067,9 @@ void WidgetView::UpdateImageSource( tbm_surface_h source , struct wl_buffer *buf
   NativeImageInterfacePtr mImageSourcePtr = static_cast< NativeImageInterfacePtr >(mImageSource);
   NativeImageInterface::Extension* extension = mImageSourcePtr->GetExtension();
   if( extension )
-   extension->SetDestructorNotification(notification);
+  {
+    extension->SetDestructorNotification( notification );
+  }
 
   if( mRenderer )
   {
@@ -1224,6 +1230,17 @@ void WidgetView::RemoveWidget()
     tizen_remote_surface_transfer_visibility( mRemoteSurface, TIZEN_REMOTE_SURFACE_VISIBILITY_TYPE_INVISIBLE);
   }
 
+  if(mImageSource)
+  {
+    // Delete trigger
+    NativeImageInterfacePtr mImageSourcePtr = static_cast< NativeImageInterfacePtr >( mImageSource );
+    NativeImageInterface::Extension* extension = mImageSourcePtr->GetExtension();
+    if( extension )
+    {
+      extension->SetDestructorNotification( NULL );
+    }
+  }
+
   mImageSource = Dali::NativeImageSource::New( NULL );
 
   if( mRenderer )
@@ -1235,6 +1252,21 @@ void WidgetView::RemoveWidget()
 
   if( mWatcherHandle != NULL && mRemoteSurface != NULL )
   {
+    // Release tizen remote surface
+    if(mWlBuffer != NULL)
+    {
+      struct wl_buffer *buffer = mWlBuffer;
+      struct tizen_remote_surface *surface = mRemoteSurface;
+      if (tizen_remote_surface_get_version( surface ) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION)
+      {
+        tizen_remote_surface_release( surface, buffer );
+        tbm_surface_h preTbmSurface = (tbm_surface_h)wl_buffer_get_user_data( buffer );
+        tbm_surface_internal_unref( preTbmSurface );
+        wl_buffer_destroy( buffer );
+        mWlBuffer = NULL;
+      }
+    }
+
     screen_connector_toolkit_remove( mWatcherHandle );
     mWatcherHandle = NULL;
     mRemoteSurface = NULL;
index e3302fd4e0a82d28f369e0ab1533279671be7443..7b21b27d4cbf34a0741a3116ac458c7c1f237d6d 100644 (file)
@@ -312,6 +312,7 @@ private:
   bool mPermanentDelete;
   screen_connector_toolkit_h mWatcherHandle;
   tizen_remote_surface* mRemoteSurface;
+  wl_buffer *mWlBuffer;
 
   Dali::Property::Map mEffectPropertyMap;