Fix buffer release issue 53/324653/1 accepted/tizen/7.0/unified/20250523.110444
authorsunghyun kim <scholb.kim@samsung.com>
Thu, 22 May 2025 08:57:12 +0000 (17:57 +0900)
committersunghyun kim <scholb.kim@samsung.com>
Thu, 22 May 2025 08:57:12 +0000 (17:57 +0900)
Change-Id: I12d35e7e2bafd137fe4059c62652c6b3d5576cbc

widget_viewer_dali/internal/widget_view/widget_view_impl.cpp

index e69005ca1b74571805917c5a6e2f599abdd28b8c..a09bc2db83f0eb3ed14dfb6ec93a9cec475815b5 100644 (file)
@@ -1266,6 +1266,15 @@ bool WidgetView::IsReadyToRender()
 
 void WidgetView::UpdateImageSource( tbm_surface_h source )
 {
+  Toolkit::Visual::Base widgetVisual = Dali::Toolkit::DevelControl::GetVisual(*this,  Dali::WidgetView::WidgetView::Property::WIDGET_ID);
+  if(widgetVisual && mImageSource)
+  {
+    Any nativeSource(source);
+    mImageSource->SetSource(nativeSource);
+    Dali::Stage::GetCurrent().KeepRendering(0.0f);
+    return;
+  }
+
   mImageSource = Dali::NativeImageSource::New( source );
 
   // Create NativeImageSource using tbm_surface
@@ -1275,6 +1284,10 @@ void WidgetView::UpdateImageSource( tbm_surface_h source )
     Dali::TextureSet textureSet = mRenderer.GetTextures();
     textureSet.SetTexture( 0u, texture );
     mRenderer.SetProperty( Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA, true );
+
+    auto widgetBuffer = new WidgetBuffer(mBuffer,*this,mImageSource);
+    Dali::DevelNativeImageSource::SetResourceDestructionCallback(*mImageSource, new EventThreadCallback(MakeCallback(widgetBuffer, &WidgetBuffer::OnResourceDestruction)));
+    mBufferContainer.push_back(std::unique_ptr<WidgetBuffer>(widgetBuffer));
   }
   else
   {
@@ -1296,10 +1309,6 @@ void WidgetView::UpdateImageSource( tbm_surface_h source )
       Dali::Toolkit::DevelControl::UnregisterVisual(*this, Dali::WidgetView::WidgetView::Property::WIDGET_ID);
     }
   }
-
-  auto widgetBuffer = new WidgetBuffer(mBuffer,*this,mImageSource);
-  Dali::DevelNativeImageSource::SetResourceDestructionCallback(*mImageSource, new EventThreadCallback(MakeCallback(widgetBuffer, &WidgetBuffer::OnResourceDestruction)));
-  mBufferContainer.push_back(std::unique_ptr<WidgetBuffer>(widgetBuffer));
 }
 
 bool WidgetView::OnTouch( Dali::Actor actor, const Dali::TouchEvent& event )
@@ -1477,6 +1486,19 @@ void WidgetView::CloseRemoteSurface()
       mBufferContainer.clear();
       mBuffer = NULL;
     }
+    else
+    {
+      // delete previous buffer. this is widget visual case
+      if(mBuffer)
+      {
+        if( mRemoteSurface != NULL && mBuffer != NULL && tizen_remote_surface_get_version( mRemoteSurface ) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION )
+        {
+          screen_connector_toolkit_dispose_buffer( mWatcherHandle , mBuffer );
+        }
+      }
+    }
+
+    mBuffer = NULL;
 
     screen_connector_toolkit_remove( mWatcherHandle );
     mWatcherHandle = NULL;
@@ -1866,6 +1888,16 @@ void WidgetView::UpdateBuffer( struct tizen_remote_surface *surface, struct wl_b
     return;
   }
 
+  // WidgetVisual can't use buffer container because of flickering issue
+  // To Avoid it, we dispose mBuffer before get a new buffer
+  if( mWatcherHandle != NULL && mBufferContainer.size() == 0)
+  {
+    if( mRemoteSurface != NULL && mBuffer != NULL && tizen_remote_surface_get_version( mRemoteSurface ) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION )
+    {
+      screen_connector_toolkit_dispose_buffer( mWatcherHandle , mBuffer );
+    }
+  }
+
   mBuffer = buffer;
   UpdateImageSource( tbmSurface );
   mRemoteSurface = surface;