From 05a376082307667e87d1f5fc00021ddf9fc4ecdb Mon Sep 17 00:00:00 2001 From: sunghyun kim Date: Thu, 22 May 2025 17:57:12 +0900 Subject: [PATCH] Fix buffer release issue Change-Id: I12d35e7e2bafd137fe4059c62652c6b3d5576cbc --- .../internal/widget_view/widget_view_impl.cpp | 40 +++++++++++++++++-- 1 file changed, 36 insertions(+), 4 deletions(-) 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 e69005c..a09bc2d 100644 --- a/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp +++ b/widget_viewer_dali/internal/widget_view/widget_view_impl.cpp @@ -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)); } 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)); } 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; -- 2.34.1