From: taeyoon0.lee Date: Tue, 17 Oct 2017 12:49:37 +0000 (+0900) Subject: [4.0] When native image is destroyed, it release of wl buffer and remote surface. X-Git-Tag: submit/tizen_4.0/20171017.144330^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5d8731ee9425443701c38c487d95d25e46ecd3e0;p=platform%2Fcore%2Fuifw%2Fwidget-viewer-dali.git [4.0] When native image is destroyed, it release of wl buffer and remote surface. This reverts commit df5776f8297fa252522ecf1a0cdca19a924efbd7. Conflicts: widget_viewer_dali/internal/widget_view/widget_view_impl.cpp Change-Id: I94cbcdd380cab1005c79fd713d7880ff8c97a76b --- 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 674aa48..0e37d35 100644 --- a/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp +++ b/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp @@ -44,6 +44,7 @@ #include #include #include +#include namespace Dali { @@ -232,15 +233,7 @@ static void OnBufferUpdated( struct tizen_remote_surface *surface, uint32_t type //get tbm surface from buffer tbm_surface_h tbmSurface = static_cast< tbm_surface_h >( wl_buffer_get_user_data( buffer ) ); - widgetView->UpdateImageSource( tbmSurface ); - } - - if( preBuffer != NULL && tizen_remote_surface_get_version( surface ) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION ) - { - tizen_remote_surface_release( surface, preBuffer ); - tbm_surface_h preTbmSurface = (tbm_surface_h)wl_buffer_get_user_data( preBuffer ); - tbm_surface_internal_unref( preTbmSurface ); - wl_buffer_destroy( preBuffer ); + widgetView->UpdateImageSource( tbmSurface, buffer, surface); } remoteSurface = surface; @@ -1034,11 +1027,62 @@ bool WidgetView::IsWidgetRenderer() return ( mRenderer )? true: false; } -void WidgetView::UpdateImageSource( tbm_surface_h source ) + +class DestructorCallback: public CallbackBase { +public: + DestructorCallback(void *buffer ,void *surface) + :CallbackBase( reinterpret_cast< void* >( this ), + NULL, // we get the dispatcher to call function directly + reinterpret_cast< CallbackBase::Dispatcher>( &DestructorCallback::Dispatcher) ), + mWlBuffer( buffer ), + mRemoteSurface( surface ) { + + } + + void RunCallback() + { + 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 ); + } + } + + static void Dispatcher( CallbackBase& base ) + { + DestructorCallback& callback( static_cast< DestructorCallback& >( base) ); + callback.RunCallback(); + } + + ~DestructorCallback() + { + } + +private: + void *mWlBuffer ; + void *mRemoteSurface; +}; + + +void WidgetView::UpdateImageSource( tbm_surface_h source , struct wl_buffer *buffer , struct tizen_remote_surface *surface) +{ + DestructorCallback* callback = new DestructorCallback( buffer, surface ); + TriggerEventFactory triggerEventFactory; + TriggerEventInterface* notification = triggerEventFactory.CreateTriggerEvent( callback, + TriggerEventInterface::DELETE_AFTER_TRIGGER ); + mImageSource = Dali::NativeImageSource::New( source ); Dali::NativeImage image = Dali::NativeImage::New( *mImageSource ); + NativeImageInterfacePtr mImageSourcePtr = static_cast< NativeImageInterfacePtr >(mImageSource); + NativeImageInterface::Extension* extension = mImageSourcePtr->GetExtension(); + if( extension ) + extension->SetDestructorNotification(notification); + if( mRenderer ) { Dali::TextureSet textureSet = mRenderer.GetTextures(); 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 d926d60..e5fa76c 100644 --- a/widget_viewer_dali/internal/widget_view/widget_view_impl.h +++ b/widget_viewer_dali/internal/widget_view/widget_view_impl.h @@ -31,6 +31,7 @@ #include #include #include +#include namespace Dali { @@ -136,7 +137,7 @@ public: // Internal API bool IsWidgetRenderer(); - void UpdateImageSource( tbm_surface_h source ); + void UpdateImageSource( tbm_surface_h source , struct wl_buffer *buffer , struct tizen_remote_surface *surface); void CreateWidgetRenderer();