From: sunghyun kim Date: Tue, 20 Feb 2018 07:30:07 +0000 (+0900) Subject: Release tizen remote surface when Remove Widget X-Git-Tag: submit/tizen_4.0/20181004.072517~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=df7deaeb3caf7e6474d3800654c781613934865b;p=platform%2Fcore%2Fuifw%2Fwidget-viewer-dali.git Release tizen remote surface when Remove Widget 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 --- diff --git a/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp b/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp index d5db237..66b66d5 100644 --- a/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp +++ b/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp @@ -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; diff --git a/widget_viewer_dali/internal/widget_view/widget_view_impl.h b/widget_viewer_dali/internal/widget_view/widget_view_impl.h index e3302fd..7b21b27 100644 --- a/widget_viewer_dali/internal/widget_view/widget_view_impl.h +++ b/widget_viewer_dali/internal/widget_view/widget_view_impl.h @@ -312,6 +312,7 @@ private: bool mPermanentDelete; screen_connector_toolkit_h mWatcherHandle; tizen_remote_surface* mRemoteSurface; + wl_buffer *mWlBuffer; Dali::Property::Map mEffectPropertyMap;