Redefine RenderEffectImpl::Activate as public 88/313388/8
authorjmm <j0064423.lee@samsung.com>
Tue, 25 Jun 2024 07:28:02 +0000 (16:28 +0900)
committerjmm <j0064423.lee@samsung.com>
Fri, 5 Jul 2024 02:58:46 +0000 (11:58 +0900)
Change-Id: Ifa65d9936b4d885251708ba3adb812349d2a1230

automated-tests/src/dali-toolkit/utc-Dali-RenderEffect.cpp
dali-toolkit/internal/controls/render-effects/blur-effect-impl.cpp
dali-toolkit/internal/controls/render-effects/blur-effect-impl.h
dali-toolkit/internal/controls/render-effects/render-effect-impl.cpp
dali-toolkit/internal/controls/render-effects/render-effect-impl.h
dali-toolkit/public-api/controls/control-impl.cpp

index 0f0f1dbdc710edd47ea8102b1af26bbcb7cbba7b..1c75ae4a992127540113937e25694a043ef48593 100644 (file)
@@ -78,7 +78,6 @@ int UtcDaliRenderEffectActivateP01(void)
   childControl.SetRenderEffect(BackgroundBlurEffect::New());
 
   taskList = scene.GetRenderTaskList();
-  DALI_LOG_ERROR("%d\n", taskList.GetTaskCount());
   DALI_TEST_CHECK(4u == taskList.GetTaskCount());
 
   END_TEST;
@@ -107,7 +106,7 @@ int UtcDaliRenderEffectActivateP02(void)
   control2.SetProperty(Actor::Property::SIZE, Vector2(1.0f, 1.0f));
   scene.Add(control2);
 
-  control2.SetRenderEffect(blurEffect); // Ownership changed.
+  control2.SetRenderEffect(blurEffect);
   taskList = scene.GetRenderTaskList();
   DALI_TEST_CHECK(4u == taskList.GetTaskCount());
 
@@ -153,24 +152,18 @@ int UtcDaliRenderEffectDeactivateN(void)
   control.SetProperty(Actor::Property::SIZE, Vector2(1.0f, 1.0f));
   scene.Add(control);
 
-  try
-  {
-    control.ClearRenderEffect();
-    DALI_TEST_CHECK(false);
-  }
-  catch(Dali::DaliException& e)
-  {
-    DALI_TEST_PRINT_ASSERT(e);
-    DALI_TEST_CHECK(true);
-  }
+  RenderTaskList taskList = scene.GetRenderTaskList();
+  DALI_TEST_CHECK(1u == taskList.GetTaskCount());
+  control.ClearRenderEffect(); // Nothing happens
+  DALI_TEST_CHECK(1u == taskList.GetTaskCount());
 
   END_TEST;
 }
 
-int UtcDaliRenderEffectRepeatActivateDeactivate(void)
+int UtcDaliRenderEffectActivateDeactivateInplace(void)
 {
   ToolkitTestApplication application;
-  tet_infoline("UtcDaliRenderEffectRepeatActivateDeactivate");
+  tet_infoline("UtcDaliRenderEffectActivateDeactivateInplace");
 
   Integration::Scene scene = application.GetScene();
 
@@ -180,13 +173,63 @@ int UtcDaliRenderEffectRepeatActivateDeactivate(void)
   scene.Add(control);
 
   BackgroundBlurEffect blurEffect = BackgroundBlurEffect::New();
-  for(int i = 0; i < 3; i++)
-  {
-    control.SetRenderEffect(blurEffect); // Activate
-    RenderTaskList taskList = scene.GetRenderTaskList();
-    DALI_TEST_CHECK(4u == taskList.GetTaskCount());
-    //control.ClearRenderEffect(); // Deactivate, Done automatically on duplicated jobs.
-  }
+  control.SetRenderEffect(blurEffect);
+
+  RenderTaskList taskList = scene.GetRenderTaskList();
+  DALI_TEST_CHECK(4u == taskList.GetTaskCount());
+
+  control.ClearRenderEffect();
+  control.SetRenderEffect(blurEffect);
+  control.ClearRenderEffect();
+  control.SetRenderEffect(blurEffect);
+  DALI_TEST_CHECK(4u == taskList.GetTaskCount());
+
+  END_TEST;
+}
+
+int UtcDaliRenderEffectReassign(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline("UtcDaliRenderEffectReassign");
+
+  Integration::Scene scene = application.GetScene();
+
+  Control control = Control::New();
+  control.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
+  control.SetProperty(Actor::Property::SIZE, Vector2(1.0f, 1.0f));
+  scene.Add(control);
+
+  BackgroundBlurEffect blurEffect = BackgroundBlurEffect::New();
+  control.SetRenderEffect(blurEffect); // Duplicate actions will be ignored
+  control.SetRenderEffect(blurEffect); // Duplicate actions will be ignored
+  control.SetRenderEffect(blurEffect); // Duplicate actions will be ignored
+  RenderTaskList taskList = scene.GetRenderTaskList();
+  DALI_TEST_CHECK(4u == taskList.GetTaskCount());
+
+  END_TEST;
+}
+
+int UtcDaliRenderEffectResize(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline("UtcDaliRenderEffectResize");
+
+  Integration::Scene scene   = application.GetScene();
+  Control            control = Control::New();
+  control.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
+  scene.Add(control);
+  control.SetRenderEffect(BackgroundBlurEffect::New());
+
+  application.SendNotification();
+  application.Render();
+
+  control.SetProperty(Actor::Property::SIZE, Vector2(30.0f, 30.0f));
+
+  application.SendNotification();
+  application.Render();
+
+  DALI_TEST_EQUALS(control.GetProperty<float>(Actor::Property::SIZE_WIDTH), 30.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(control.GetProperty<float>(Actor::Property::SIZE_HEIGHT), 30.0f, TEST_LOCATION);
 
   END_TEST;
 }
index 243e0c3a03f45b28412f43020cf9f65454b1e899..883b3e759ffdb052b3c4affc0492974b8b05cc0e 100644 (file)
@@ -144,19 +144,29 @@ void BlurEffectImpl::Initialize()
   mInternalRoot.Add(mVerticalBlurActor);
 }
 
-void BlurEffectImpl::Activate()
+void BlurEffectImpl::Activate(Toolkit::Control ownerControl)
 {
-  DALI_ASSERT_ALWAYS(!mIsActivated &&
-                     "This effect is already taken. Call Toolkit::Control::ClearRenderEffect(); to free the effect.");
+  DALI_ASSERT_ALWAYS(ownerControl && "Given empty owner control");
 
-  Toolkit::Control handle = GetOwnerControl();
-  DALI_ASSERT_ALWAYS(handle); // RenderEffect::SetOwnerControl(mOwnerControl); was done.
+  if(mIsActivated)
+  {
+    if(ownerControl == GetOwnerControl())
+    {
+      return;
+    }
+    else
+    {
+      Deactivate();
+    }
+  }
+  SetOwnerControl(ownerControl);
+  mIsActivated = true;
 
   // Get input texture size
   Vector2 size = GetTargetSize();
   if(size == Vector2::ZERO)
   {
-    size = handle.GetNaturalSize();
+    size = ownerControl.GetNaturalSize();
     if(size == Vector2::ZERO)
     {
       return;
@@ -205,11 +215,11 @@ void BlurEffectImpl::Activate()
   if(mIsBackground)
   {
     mSourceRenderTask.SetSourceActor(Stage::GetCurrent().GetRootLayer());
-    mSourceRenderTask.RenderUntil(handle);
+    mSourceRenderTask.RenderUntil(ownerControl);
   }
   else
   {
-    mSourceRenderTask.SetSourceActor(handle);
+    mSourceRenderTask.SetSourceActor(ownerControl);
   }
   mSourceRenderTask.SetOrderIndex(BLUR_EFFECT_ORDER_INDEX);
   mSourceRenderTask.SetCameraActor(mRenderFullSizeCamera);
@@ -246,11 +256,10 @@ void BlurEffectImpl::Activate()
   {
     renderer.SetProperty(Dali::Renderer::Property::DEPTH_INDEX, Dali::Toolkit::DepthIndex::CONTENT);
   }
-  handle.AddRenderer(renderer);
+  ownerControl.AddRenderer(renderer);
   SetRendererTexture(renderer, mSourceFrameBuffer);
 
-  handle.Add(mInternalRoot);
-  mIsActivated = true;
+  ownerControl.Add(mInternalRoot);
 }
 
 void BlurEffectImpl::Deactivate()
@@ -268,12 +277,7 @@ void BlurEffectImpl::Deactivate()
   taskList.RemoveTask(mVerticalBlurTask);
   taskList.RemoveTask(mSourceRenderTask);
 
-  auto ownerControl = GetOwnerControl();
-  if(ownerControl)
-  {
-    Renderer renderer = GetTargetRenderer();
-    ownerControl.RemoveRenderer(renderer);
-  }
+  ClearOwnerControl();
 }
 
 void BlurEffectImpl::SetShaderConstants(float downsampledWidth, float downsampledHeight)
index fe6b177ea75cbbb16640717d17105c7b45e031df..91b9953128af30c8b6d131a0a2afb80c12feca7f 100644 (file)
@@ -64,8 +64,9 @@ public:
 
   /**
    * @brief Activates blur effect
+   * @param[in] ownerControl The control to apply effect
    */
-  void Activate() override;
+  void Activate(Toolkit::Control ownerControl) override;
 
   /**
    * @brief Dectivates blur effect
index b265985c04089dd18316319deda504b5e321a0f3..1f0c8d74437c940833161a8ea5f1843616abbb9a 100644 (file)
@@ -33,20 +33,20 @@ namespace Toolkit
 {
 namespace Internal
 {
-RenderEffectImpl::~RenderEffectImpl() = default;
-
-void RenderEffectImpl::SetOwnerControl(Dali::Toolkit::Control control)
+RenderEffectImpl::~RenderEffectImpl()
 {
   if(mOwnerControl)
   {
-    Deactivate();
-    mOwnerControl.RemovePropertyNotification(mSizeNotification);
+    mOwnerControl.ClearRenderEffect();
   }
+}
 
-  mOwnerControl = control;
-
-  if(mOwnerControl)
+void RenderEffectImpl::SetOwnerControl(Dali::Toolkit::Control control)
+{
+  if(control)
   {
+    mOwnerControl = control;
+
     mTargetSize = mOwnerControl.GetProperty<Vector2>(Actor::Property::SIZE);
     mRenderer   = CreateRenderer(SHADER_RENDER_EFFECT_VERT, SHADER_RENDER_EFFECT_FRAG);
 
@@ -55,6 +55,17 @@ void RenderEffectImpl::SetOwnerControl(Dali::Toolkit::Control control)
   }
 }
 
+void RenderEffectImpl::ClearOwnerControl()
+{
+  if(mOwnerControl)
+  {
+    Renderer renderer = GetTargetRenderer();
+    mOwnerControl.RemoveRenderer(renderer);
+    mOwnerControl.RemovePropertyNotification(mSizeNotification);
+    mOwnerControl.Reset();
+  }
+}
+
 Toolkit::Control RenderEffectImpl::GetOwnerControl() const
 {
   return mOwnerControl;
@@ -64,7 +75,7 @@ void RenderEffectImpl::OnSizeSet(PropertyNotification& source)
 {
   mTargetSize = mOwnerControl.GetProperty<Vector2>(Actor::Property::SIZE);
   Deactivate();
-  Activate();
+  Activate(mOwnerControl);
 }
 
 Renderer RenderEffectImpl::GetTargetRenderer() const
index 8a21c843fe60fd884612f395136b7fdd194ef7ba..1ae7f7a6115c150634741cac5e78f1ca693bc93b 100644 (file)
@@ -38,24 +38,13 @@ class RenderEffectImpl : public BaseObject, public ConnectionTracker
 {
 public:
   /**
-   * @brief Sets owner Control. Applies effect on the owner.
+   * @brief Activates effect on ownerControl
    * @param[in] control The owner control to apply RenderEffect.
    */
-  void SetOwnerControl(Dali::Toolkit::Control control);
-
-  /**
-   * @brief Get Owner control.
-   * @return mOwnerControl
-   */
-  Toolkit::Control GetOwnerControl() const;
+  virtual void Activate(Toolkit::Control ownerControl) = 0;
 
   /**
-   * @brief Activate effect.
-   */
-  virtual void Activate() = 0;
-
-  /**
-   * @brief Deactivate effect.
+   * @brief Deactivates effect
    */
   virtual void Deactivate() = 0;
 
@@ -95,12 +84,29 @@ protected:
    */
   Vector2 GetTargetSize() const;
 
+  /**
+   * @brief Sets owner Control. Applies effect on the owner.
+   * @param[in] control The owner control to apply RenderEffect.
+   */
+  void SetOwnerControl(Toolkit::Control control);
+
+  /**
+   * @brief Clears owner Control.
+   */
+  void ClearOwnerControl();
+
+  /**
+   * @brief Get Owner control.
+   * @return mOwnerControl
+   */
+  Toolkit::Control GetOwnerControl() const;
+
 private:
   Dali::Renderer         mRenderer; // An additional renderer for mOwnerControl
   Dali::Toolkit::Control mOwnerControl;
 
-  Vector2              mTargetSize;       // The final size of mOwnerControl
   PropertyNotification mSizeNotification; // Resize/Relayout signal
+  Vector2              mTargetSize;       // The final size of mOwnerControl
 };
 } // namespace Internal
 
index e4357109e6c6fab6a5750db2a6fc830e5557c866..e9426102ef116a0d69c6b03c33a1b9a44a2b1f0a 100644 (file)
@@ -171,6 +171,7 @@ void Control::SetRenderEffect(Toolkit::RenderEffect effect)
 {
   if(mImpl->mRenderEffect != effect)
   {
+    ClearRenderEffect();
     mImpl->mRenderEffect = effect;
 
     BaseObject&                          handle = effect.GetBaseObject();
@@ -178,8 +179,7 @@ void Control::SetRenderEffect(Toolkit::RenderEffect effect)
     DALI_ASSERT_ALWAYS(object && "Not a valid RenderEffect set.");
 
     Dali::Toolkit::Control ownerControl(GetOwner());
-    object->SetOwnerControl(ownerControl);
-    object->Activate();
+    object->Activate(ownerControl);
   }
 }
 
@@ -187,10 +187,12 @@ void Control::ClearRenderEffect()
 {
   BaseObject&                          handle = mImpl->mRenderEffect.GetBaseObject();
   Toolkit::Internal::RenderEffectImpl* object = dynamic_cast<Toolkit::Internal::RenderEffectImpl*>(&handle);
-  DALI_ASSERT_ALWAYS(object && "Set any render effect before you clear.");
 
-  object->Deactivate();
-  object->SetOwnerControl(Toolkit::Control());
+  if(object)
+  {
+    object->Deactivate();
+  }
+  mImpl->mRenderEffect.Reset();
 }
 
 void Control::SetResourceReady()