From: Eunki Hong Date: Thu, 24 Apr 2025 15:26:02 +0000 (+0900) Subject: Use OffscrenRenderableType Register/Unregister API X-Git-Tag: dali_2.4.17~4^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1b0dea301b51fd97dfecd2e33950143f0421e17c;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git Use OffscrenRenderableType Register/Unregister API 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 --- diff --git a/dali-scene3d/internal/controls/panel/panel-impl.cpp b/dali-scene3d/internal/controls/panel/panel-impl.cpp index bf3acfbcc5..e7ea41fc78 100644 --- a/dali-scene3d/internal/controls/panel/panel-impl.cpp +++ b/dali-scene3d/internal/controls/panel/panel-impl.cpp @@ -403,7 +403,7 @@ void Panel::OnInitialize() scaleConstraint.Apply(); UpdateProperties(); - SetOffScreenRenderableType(OffScreenRenderable::Type::FORWARD); + RegisterOffScreenRenderableType(OffScreenRenderable::Type::FORWARD); } void Panel::OnSceneConnection(int depth) diff --git a/dali-scene3d/internal/controls/scene-view/scene-view-impl.cpp b/dali-scene3d/internal/controls/scene-view/scene-view-impl.cpp index e0a7cf0bd7..4f309e7f43 100644 --- a/dali-scene3d/internal/controls/scene-view/scene-view-impl.cpp +++ b/dali-scene3d/internal/controls/scene-view/scene-view-impl.cpp @@ -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) diff --git a/dali-toolkit/internal/controls/control/control-data-impl.cpp b/dali-toolkit/internal/controls/control/control-data-impl.cpp index 041f2944f3..f8e89e576e 100644 --- a/dali-toolkit/internal/controls/control/control-data-impl.cpp +++ b/dali-toolkit/internal/controls/control/control-data-impl.cpp @@ -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) diff --git a/dali-toolkit/internal/controls/render-effects/mask-effect-impl.cpp b/dali-toolkit/internal/controls/render-effects/mask-effect-impl.cpp index 6ed4621f5f..83231b501d 100644 --- a/dali-toolkit/internal/controls/render-effects/mask-effect-impl.cpp +++ b/dali-toolkit/internal/controls/render-effects/mask-effect-impl.cpp @@ -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(); diff --git a/dali-toolkit/internal/controls/render-effects/offscreen-rendering-impl.cpp b/dali-toolkit/internal/controls/render-effects/offscreen-rendering-impl.cpp index 111a066573..7d73b48d35 100644 --- a/dali-toolkit/internal/controls/render-effects/offscreen-rendering-impl.cpp +++ b/dali-toolkit/internal/controls/render-effects/offscreen-rendering-impl.cpp @@ -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(); } diff --git a/dali-toolkit/internal/controls/render-effects/render-effect-impl.cpp b/dali-toolkit/internal/controls/render-effects/render-effect-impl.cpp index 753d80a6f1..287f279986 100644 --- a/dali-toolkit/internal/controls/render-effects/render-effect-impl.cpp +++ b/dali-toolkit/internal/controls/render-effects/render-effect-impl.cpp @@ -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(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; diff --git a/dali-toolkit/public-api/controls/control-impl.cpp b/dali-toolkit/public-api/controls/control-impl.cpp index e4a8ab85e1..e461b0b910 100644 --- a/dali-toolkit/public-api/controls/control-impl.cpp +++ b/dali-toolkit/public-api/controls/control-impl.cpp @@ -178,7 +178,7 @@ void Control::SetRenderEffect(Toolkit::RenderEffect effect) Internal::RenderEffectImpl* object = dynamic_cast(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()