Use OffscrenRenderableType Register/Unregister API 51/323251/3
authorEunki Hong <eunkiki.hong@samsung.com>
Thu, 24 Apr 2025 15:26:02 +0000 (00:26 +0900)
committerEunki Hong <eunkiki.hong@samsung.com>
Tue, 29 Apr 2025 06:00:08 +0000 (06:00 +0000)
Since single control could have multiple effects,
we should consider the count of offscreen renerable type registered.

Change-Id: I8d065643b4be4f357390112f9f8dac56e551c6a6
Signed-off-by: Eunki Hong <eunkiki.hong@samsung.com>
dali-scene3d/internal/controls/panel/panel-impl.cpp
dali-scene3d/internal/controls/scene-view/scene-view-impl.cpp
dali-toolkit/internal/controls/control/control-data-impl.cpp
dali-toolkit/internal/controls/render-effects/mask-effect-impl.cpp
dali-toolkit/internal/controls/render-effects/offscreen-rendering-impl.cpp
dali-toolkit/internal/controls/render-effects/render-effect-impl.cpp
dali-toolkit/public-api/controls/control-impl.cpp

index bf3acfbcc599bbf500c90ed916afc88451884f0f..e7ea41fc785a6f26d2fa95ebd6951bd3f4696723 100644 (file)
@@ -403,7 +403,7 @@ void Panel::OnInitialize()
   scaleConstraint.Apply();
 
   UpdateProperties();
-  SetOffScreenRenderableType(OffScreenRenderable::Type::FORWARD);
+  RegisterOffScreenRenderableType(OffScreenRenderable::Type::FORWARD);
 }
 
 void Panel::OnSceneConnection(int depth)
index e0a7cf0bd790f38a6f19b2070bd98e32e59f6752..4f309e7f434da1bfdd8cf67287f575b56846f63e 100644 (file)
@@ -798,8 +798,9 @@ void SceneView::UseFramebuffer(bool useFramebuffer)
 {
   if(mUseFrameBuffer != useFramebuffer)
   {
+    UnregisterOffScreenRenderableType((mUseFrameBuffer) ? OffScreenRenderable::Type::FORWARD : OffScreenRenderable::Type::NONE);
     mUseFrameBuffer = useFramebuffer;
-    SetOffScreenRenderableType((mUseFrameBuffer) ? OffScreenRenderable::Type::FORWARD : OffScreenRenderable::Type::NONE);
+    RegisterOffScreenRenderableType((mUseFrameBuffer) ? OffScreenRenderable::Type::FORWARD : OffScreenRenderable::Type::NONE);
     UpdateRenderTask();
     RequestRenderTaskReorder();
   }
@@ -1326,10 +1327,7 @@ void SceneView::OnInitialize()
   AddCamera(mDefaultCamera);
   UpdateCamera(mDefaultCamera);
 
-  if(mUseFrameBuffer)
-  {
-    SetOffScreenRenderableType(OffScreenRenderable::Type::FORWARD);
-  }
+  RegisterOffScreenRenderableType((mUseFrameBuffer) ? OffScreenRenderable::Type::FORWARD : OffScreenRenderable::Type::NONE);
 }
 
 void SceneView::OnChildAdd(Actor& child)
index 041f2944f324785e0170a106a46cdc03101a6935..f8e89e576e9025118df006690e2fe624a83adf56 100644 (file)
@@ -1940,8 +1940,8 @@ void Control::Impl::SetOffScreenRendering(int32_t offScreenRenderingType)
   {
     if(mOffScreenRenderingImpl)
     {
-      mOffScreenRenderingImpl->ClearOwnerControl();
-      mOffScreenRenderingImpl.reset();
+      auto tempOffscreenRenderingImpl = std::move(mOffScreenRenderingImpl);
+      tempOffscreenRenderingImpl->ClearOwnerControl();
     }
   }
   else if(mOffScreenRenderingType == DevelControl::OffScreenRenderingType::NONE)
index 6ed4621f5f2065aafdc9b40a237c4dbb47b8f355..83231b501dba5900a6dd8eb1526016b162144df3 100644 (file)
@@ -142,7 +142,7 @@ void MaskEffectImpl::OnActivate()
   ownerControl.Add(mCamera);
   Renderer maskRenderer = GetTargetRenderer();
   ownerControl.GetImplementation().SetCacheRenderer(maskRenderer);
-  ownerControl.GetImplementation().SetOffScreenRenderableType(OffScreenRenderable::Type::FORWARD);
+  ownerControl.GetImplementation().RegisterOffScreenRenderableType(OffScreenRenderable::Type::FORWARD);
 
   Vector2 size = GetTargetSize();
   mCamera.SetPerspectiveProjection(size);
@@ -166,6 +166,13 @@ void MaskEffectImpl::OnActivate()
 
 void MaskEffectImpl::OnDeactivate()
 {
+  Toolkit::Control control = GetOwnerControl();
+  if(DALI_LIKELY(control))
+  {
+    control.GetImplementation().RemoveCacheRenderer();
+    control.GetImplementation().UnregisterOffScreenRenderableType(OffScreenRenderable::Type::FORWARD);
+  }
+
   mCamera.Unparent();
   mMaskTargetFrameBuffer.Reset();
   mMaskSourceFrameBuffer.Reset();
index 111a0665730dcfe6ea88e9d2d9f4981d7fac3c91..7d73b48d356efe730ab60c85cb4f55bd85946402 100644 (file)
@@ -94,7 +94,7 @@ void OffScreenRenderingImpl::OnActivate()
 
   Toolkit::Control control = GetOwnerControl();
   control.GetImplementation().SetCacheRenderer(renderer);
-  control.GetImplementation().SetOffScreenRenderableType(OffScreenRenderable::Type::FORWARD);
+  control.GetImplementation().RegisterOffScreenRenderableType(OffScreenRenderable::Type::FORWARD);
   mRenderTask.SetScreenToFrameBufferMappingActor(control);
 }
 
@@ -104,7 +104,7 @@ void OffScreenRenderingImpl::OnDeactivate()
   if(DALI_LIKELY(control))
   {
     control.GetImplementation().RemoveCacheRenderer();
-    control.GetImplementation().SetOffScreenRenderableType(OffScreenRenderable::Type::NONE);
+    control.GetImplementation().UnregisterOffScreenRenderableType(OffScreenRenderable::Type::FORWARD);
 
     mCamera.Unparent();
   }
index 753d80a6f1aa5cc12eff9f88f7d32617cf8148ff..287f2799860b9d276edab6ced0afb8ab904d4527 100644 (file)
@@ -162,8 +162,6 @@ void RenderEffectImpl::Activate()
 {
   if(!IsActivated() && IsActivateValid())
   {
-    mIsActivated = true;
-
     Dali::Toolkit::Control ownerControl = mOwnerControl.GetHandle();
     DALI_LOG_INFO(gRenderEffectLogFilter, Debug::General, "[RenderEffect:%p] Activated! [ID:%d]\n", this, ownerControl ? ownerControl.GetProperty<int>(Actor::Property::ID) : -1);
 
@@ -174,6 +172,8 @@ void RenderEffectImpl::Activate()
       DALI_LOG_ERROR("RenderEffect Could not be activated due to ownerControl's SceneHolder is not exist\n");
       return;
     }
+    mIsActivated = true;
+
     mPlacementSceneHolder = sceneHolder;
 
     // Activate logic for subclass.
@@ -198,7 +198,7 @@ void RenderEffectImpl::Activate()
 
 void RenderEffectImpl::Deactivate()
 {
-  if(IsActivated() || !IsActivateValid())
+  if(IsActivated())
   {
     mIsActivated = false;
 
index e4a8ab85e1b4318afcdf2ee7310695ac3986e823..e461b0b91012415109f88466d3380b92d1e879a7 100644 (file)
@@ -178,7 +178,7 @@ void Control::SetRenderEffect(Toolkit::RenderEffect effect)
     Internal::RenderEffectImpl* object = dynamic_cast<Internal::RenderEffectImpl*>(effect.GetObjectPtr());
     DALI_ASSERT_ALWAYS(object && "Given render effect is not valid.");
 
-    SetOffScreenRenderableType(object->GetOffScreenRenderableType());
+    RegisterOffScreenRenderableType(object->GetOffScreenRenderableType());
 
     Dali::Toolkit::Control ownerControl(GetOwner());
     object->SetOwnerControl(ownerControl);
@@ -200,10 +200,14 @@ void Control::ClearRenderEffect()
 {
   if(mImpl->mRenderEffect)
   {
-    mImpl->mRenderEffect.Get()->ClearOwnerControl();
+    RenderEffectImplPtr effectImpl = std::move(mImpl->mRenderEffect);
+
+    // Reset handle first to avoid circular reference
     mImpl->mRenderEffect.Reset();
+
+    UnregisterOffScreenRenderableType(effectImpl->GetOffScreenRenderableType());
+    effectImpl->ClearOwnerControl();
   }
-  SetOffScreenRenderableType(OffScreenRenderable::NONE);
 }
 
 void Control::SetResourceReady()