[4.0] When native image is destroyed, it release of wl buffer and remote surface. 27/156227/1 accepted/tizen/4.0/unified/20171017.212934 submit/tizen_4.0/20171017.144330 submit/tizen_4.0/20171017.145254 tizen_4.0.m2_release
authortaeyoon0.lee <taeyoon0.lee@samsung.com>
Tue, 17 Oct 2017 12:49:37 +0000 (21:49 +0900)
committertaeyoon0.lee <taeyoon0.lee@samsung.com>
Tue, 17 Oct 2017 12:49:37 +0000 (21:49 +0900)
This reverts commit df5776f8297fa252522ecf1a0cdca19a924efbd7.

Conflicts:
widget_viewer_dali/internal/widget_view/widget_view_impl.cpp

Change-Id: I94cbcdd380cab1005c79fd713d7880ff8c97a76b

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

index 674aa48eba0efc2dbd48758f75d71a36467ffbf1..0e37d356e374c7e1864013b516ae667c9056cbe4 100644 (file)
@@ -44,6 +44,7 @@
 #include <unistd.h>
 #include <libintl.h>
 #include <xkbcommon/xkbcommon.h>
+#include <dali/devel-api/images/native-image-interface-extension.h>
 
 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();
index d926d603a7c12e3a6d6750c330a4f02fe1581514..e5fa76c875d2fc32595064471d3c0dd0808ca05d 100644 (file)
@@ -31,6 +31,7 @@
 #include <wayland-extension/tizen-remote-surface-client-protocol.h>
 #include <tbm_surface.h>
 #include <screen_connector_toolkit.h>
+#include <dali/integration-api/adaptors/trigger-event-factory.h>
 
 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();