Don't use mEventThreadService without checkout thread 67/319967/5
authorEunki Hong <eunkiki.hong@samsung.com>
Tue, 5 Nov 2024 16:08:05 +0000 (01:08 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Thu, 7 Nov 2024 11:52:28 +0000 (20:52 +0900)
Since member value of EventThreadService can call API at worker thread.
It might make some resource leak.

For example, we can call animation.Clear() at worker thread.
If then, only event thread side informations removed, and nothing changed
for update thread.

To avoid this kind of issue
- Let we define interface class s.t. Get EventThreadService and assert if we access here at workerthread.
- Change every local value usage to using this API.

During test, let we just assert it always.
After several weeks later, it would be change as debug.

Change-Id: I956445c67c40956af2e4219417f6638072ae29e4
Signed-off-by: Eunki Hong <eunkiki.hong@samsung.com>
27 files changed:
automated-tests/src/dali/utc-Dali-Animation.cpp
dali/internal/event/actors/actor-renderer-container.cpp
dali/internal/event/actors/actor-renderer-container.h
dali/internal/event/animation/animation-impl.cpp
dali/internal/event/animation/animation-impl.h
dali/internal/event/animation/animator-connector-base.h
dali/internal/event/animation/constraint-base.cpp
dali/internal/event/animation/constraint-base.h
dali/internal/event/common/event-thread-services-holder.h [new file with mode: 0644]
dali/internal/event/common/object-impl.cpp
dali/internal/event/common/object-impl.h
dali/internal/event/events/ray-test.cpp
dali/internal/event/events/ray-test.h
dali/internal/event/render-tasks/render-task-list-impl.cpp
dali/internal/event/render-tasks/render-task-list-impl.h
dali/internal/event/rendering/frame-buffer-impl.cpp
dali/internal/event/rendering/frame-buffer-impl.h
dali/internal/event/rendering/geometry-impl.cpp
dali/internal/event/rendering/geometry-impl.h
dali/internal/event/rendering/sampler-impl.cpp
dali/internal/event/rendering/sampler-impl.h
dali/internal/event/rendering/texture-impl.cpp
dali/internal/event/rendering/texture-impl.h
dali/internal/event/rendering/texture-set-impl.cpp
dali/internal/event/rendering/texture-set-impl.h
dali/internal/event/rendering/vertex-buffer-impl.cpp
dali/internal/event/rendering/vertex-buffer-impl.h

index cfbac54e9b549312f2260d006e07d10af6eb996c..9cbf7860b1efea84e4058be4551b7f10db414fca 100644 (file)
@@ -17179,3 +17179,56 @@ int UtcDaliAnimationDestructWorkerThreadN(void)
 
   END_TEST;
 }
+
+int UtcDaliAnimationPlayWorkerThreadN(void)
+{
+  TestApplication application;
+  tet_infoline("UtcDaliAnimationPlayWorkerThreadN Test");
+
+  try
+  {
+    class TestThread : public Thread
+    {
+    public:
+      virtual void Run()
+      {
+        tet_printf("Run TestThread\n");
+        for(auto& functor : {&Animation::Play, &Animation::Pause, &Animation::Stop, &Animation::Clear})
+        {
+          try
+          {
+            // API call at worker thread.
+            (mAnimation.*functor)();
+          }
+          catch(Dali::DaliException& e)
+          {
+            DALI_TEST_PRINT_ASSERT(e);
+            DALI_TEST_ASSERT(e, "Core is not running! Might call this API from worker thread.", TEST_LOCATION);
+          }
+        }
+      }
+
+      Dali::Animation mAnimation;
+    };
+    TestThread thread;
+
+    Dali::Animation animation = Dali::Animation::New(0);
+    Dali::Actor     actor     = Actor::New();
+    application.GetScene().Add(actor);
+    animation.AnimateTo(Property(actor, Actor::Property::POSITION), Vector3(100.0f, 10.0f, 1.0f), AlphaFunction::LINEAR);
+    thread.mAnimation = std::move(animation);
+    animation.Reset();
+
+    thread.Start();
+
+    thread.Join();
+  }
+  catch(...)
+  {
+  }
+
+  // Always success
+  DALI_TEST_CHECK(true);
+
+  END_TEST;
+}
index 46612260efd5a887ba1fc50207341bd1f56344e2..cc2742359338bc45e3fd6fe0ad1d2bc8d119d676 100644 (file)
@@ -20,7 +20,7 @@
 namespace Dali::Internal
 {
 RendererContainer::RendererContainer(EventThreadServices& eventThreadServices)
-: mEventThreadServices(eventThreadServices)
+: EventThreadServicesHolder(eventThreadServices)
 {
 }
 
@@ -44,7 +44,7 @@ uint32_t RendererContainer::Add(const SceneGraph::Node& node, Renderer& renderer
   }
   RendererPtr rendererPtr = RendererPtr(&renderer);
   mRenderers.push_back(rendererPtr);
-  AttachRendererMessage(mEventThreadServices.GetUpdateManager(), node, renderer.GetRendererSceneObject());
+  AttachRendererMessage(GetEventThreadServices().GetUpdateManager(), node, renderer.GetRendererSceneObject());
   return index;
 }
 
@@ -56,7 +56,7 @@ void RendererContainer::Remove(const SceneGraph::Node& node, Renderer& renderer)
     if((*iter).Get() == &renderer)
     {
       mRenderers.erase(iter);
-      DetachRendererMessage(mEventThreadServices, node, renderer.GetRendererSceneObject());
+      DetachRendererMessage(GetEventThreadServices(), node, renderer.GetRendererSceneObject());
       break;
     }
   }
@@ -67,7 +67,7 @@ void RendererContainer::Remove(const SceneGraph::Node& node, uint32_t index)
   if(index < mRenderers.size())
   {
     RendererPtr renderer = mRenderers[index];
-    DetachRendererMessage(mEventThreadServices, node, renderer->GetRendererSceneObject());
+    DetachRendererMessage(GetEventThreadServices(), node, renderer->GetRendererSceneObject());
     mRenderers.erase(mRenderers.begin() + index);
   }
 }
@@ -76,7 +76,7 @@ void RendererContainer::RemoveAll(const SceneGraph::Node& node)
 {
   for(auto&& renderer : mRenderers)
   {
-    DetachRendererMessage(mEventThreadServices, node, renderer->GetRendererSceneObject());
+    DetachRendererMessage(GetEventThreadServices(), node, renderer->GetRendererSceneObject());
   }
   mRenderers.clear();
 }
index 3594a973fc184b58c58e49bbef579d50acb13f1c..1e61c39f6ed4b0884a0c6727ff7c9c2759bf6104 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_ACTORS_ACTOR_RENDERER_CONTAINER_H
 
 /*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
  */
 
 #include <dali/devel-api/rendering/renderer-devel.h>
+#include <dali/internal/event/common/event-thread-services-holder.h>
 #include <dali/internal/event/common/event-thread-services.h>
 #include <dali/public-api/common/vector-wrapper.h>
 
@@ -35,7 +36,7 @@ class Node;
  * Class to contain an actor's renderers.
  * Enables actor to set the blending for all renderers at once.
  */
-class RendererContainer
+class RendererContainer : public EventThreadServicesHolder
 {
 public:
   /**
@@ -101,8 +102,7 @@ public:
   void SetBlending(DevelBlendEquation::Type blendEquation);
 
 private:
-  EventThreadServices&     mEventThreadServices; ///< The event thread services (for sending messages)
-  std::vector<RendererPtr> mRenderers;           ///< The contained renderers
+  std::vector<RendererPtr> mRenderers; ///< The contained renderers
 };
 
 } // namespace Dali::Internal
index 831a61d945b5467a52ddb3f5bacb4e96b7c29af8..4e9dc88bd19d888b508aed1afb3e7dff93d0fbef 100644 (file)
@@ -241,7 +241,7 @@ AnimationPtr Animation::New(float durationSeconds)
 }
 
 Animation::Animation(EventThreadServices& eventThreadServices, AnimationPlaylist& playlist, float durationSeconds, EndAction endAction, EndAction disconnectAction, AlphaFunction defaultAlpha)
-: mEventThreadServices(eventThreadServices),
+: EventThreadServicesHolder(eventThreadServices),
   mPlaylist(playlist),
   mDefaultAlpha(defaultAlpha),
   mDurationSeconds(durationSeconds),
@@ -290,7 +290,7 @@ void Animation::CreateSceneObject()
   mAnimationId = mAnimation->GetNotifyId();
 
   OwnerPointer<SceneGraph::Animation> transferOwnership(const_cast<SceneGraph::Animation*>(mAnimation));
-  AddAnimationMessage(mEventThreadServices.GetUpdateManager(), transferOwnership);
+  AddAnimationMessage(GetEventThreadServices().GetUpdateManager(), transferOwnership);
 
   // Setup mapping infomations between scenegraph animation
   mPlaylist.MapNotifier(mAnimation, *this);
@@ -304,7 +304,7 @@ void Animation::DestroySceneObject()
     mPlaylist.UnmapNotifier(mAnimation);
 
     // Remove animation using a message to the update manager
-    RemoveAnimationMessage(mEventThreadServices.GetUpdateManager(), *mAnimation);
+    RemoveAnimationMessage(GetEventThreadServices().GetUpdateManager(), *mAnimation);
     mAnimation = nullptr;
 
     // Reset id
@@ -323,7 +323,7 @@ void Animation::SetDuration(float seconds)
   mDurationSeconds = seconds;
 
   // mAnimation is being used in a separate thread; queue a message to set the value
-  SetDurationMessage(mEventThreadServices, *mAnimation, seconds);
+  SetDurationMessage(GetEventThreadServices(), *mAnimation, seconds);
 }
 
 void Animation::SetProgressNotification(float progress)
@@ -354,7 +354,7 @@ void Animation::SetLoopCount(int32_t count)
   mLoopCount = count;
 
   // mAnimation is being used in a separate thread; queue a message to set the value
-  SetLoopingMessage(mEventThreadServices, *mAnimation, mLoopCount);
+  SetLoopingMessage(GetEventThreadServices(), *mAnimation, mLoopCount);
 }
 
 int32_t Animation::GetLoopCount()
@@ -384,7 +384,7 @@ void Animation::SetEndAction(EndAction action)
   mEndAction = action;
 
   // mAnimation is being used in a separate thread; queue a message to set the value
-  SetEndActionMessage(mEventThreadServices, *mAnimation, action);
+  SetEndActionMessage(GetEventThreadServices(), *mAnimation, action);
 }
 
 Dali::Animation::EndAction Animation::GetEndAction() const
@@ -399,7 +399,7 @@ void Animation::SetDisconnectAction(EndAction action)
   mDisconnectAction = action;
 
   // mAnimation is being used in a separate thread; queue a message to set the value
-  SetDisconnectActionMessage(mEventThreadServices, *mAnimation, action);
+  SetDisconnectActionMessage(GetEventThreadServices(), *mAnimation, action);
 }
 
 Dali::Animation::EndAction Animation::GetDisconnectAction() const
@@ -420,7 +420,7 @@ void Animation::Play()
   SendFinalProgressNotificationMessage();
 
   // mAnimation is being used in a separate thread; queue a Play message
-  PlayAnimationMessage(mEventThreadServices, *mAnimation);
+  PlayAnimationMessage(GetEventThreadServices(), *mAnimation);
 }
 
 void Animation::PlayFrom(float progress)
@@ -437,7 +437,7 @@ void Animation::PlayFrom(float progress)
     SendFinalProgressNotificationMessage();
 
     // mAnimation is being used in a separate thread; queue a Play message
-    PlayAnimationFromMessage(mEventThreadServices, *mAnimation, progress);
+    PlayAnimationFromMessage(GetEventThreadServices(), *mAnimation, progress);
   }
 }
 
@@ -458,7 +458,7 @@ void Animation::PlayAfter(float delaySeconds)
   SendFinalProgressNotificationMessage();
 
   // mAnimation is being used in a separate thread; queue a message to set the value
-  PlayAfterMessage(mEventThreadServices, *mAnimation, delaySeconds);
+  PlayAfterMessage(GetEventThreadServices(), *mAnimation, delaySeconds);
 }
 
 void Animation::Pause()
@@ -466,7 +466,7 @@ void Animation::Pause()
   if(InternalStateConverter(mState, Dali::Animation::PAUSED))
   {
     // mAnimation is being used in a separate thread; queue a Pause message
-    PauseAnimationMessage(mEventThreadServices, *mAnimation);
+    PauseAnimationMessage(GetEventThreadServices(), *mAnimation);
 
     // Notify the objects with the _paused_, i.e. current values
     NotifyObjects(Notify::FORCE_CURRENT_VALUE);
@@ -506,7 +506,7 @@ void Animation::Stop()
   if(InternalStateConverter(mState, Dali::Animation::STOPPED))
   {
     // mAnimation is being used in a separate thread; queue a Stop message
-    StopAnimationMessage(mEventThreadServices.GetUpdateManager(), *mAnimation);
+    StopAnimationMessage(GetEventThreadServices().GetUpdateManager(), *mAnimation);
 
     // Only notify the objects with the _stopped_, i.e. current values if the end action is set to BAKE
     if(mEndAction == EndAction::BAKE)
@@ -540,7 +540,7 @@ void Animation::Clear()
   mConnectorTargetValuesSortRequired = false;
 
   // mAnimation is being used in a separate thread; queue a Clear message
-  ClearAnimationMessage(mEventThreadServices.GetUpdateManager(), *mAnimation);
+  ClearAnimationMessage(GetEventThreadServices().GetUpdateManager(), *mAnimation);
 
   // Reset the notification count and relative values, since the new scene-object has never been played
   mNotificationCount = 0;
@@ -1144,7 +1144,7 @@ void Animation::SetCurrentProgress(float progress)
   if(mAnimation && progress >= mPlayRange.x && progress <= mPlayRange.y)
   {
     // mAnimation is being used in a separate thread; queue a message to set the current progress
-    SetCurrentProgressMessage(mEventThreadServices, *mAnimation, progress);
+    SetCurrentProgressMessage(GetEventThreadServices(), *mAnimation, progress);
   }
 }
 
@@ -1174,7 +1174,7 @@ void Animation::SetSpeedFactor(float factor)
   if(mAnimation)
   {
     mSpeedFactor = factor;
-    SetSpeedFactorMessage(mEventThreadServices, *mAnimation, factor);
+    SetSpeedFactorMessage(GetEventThreadServices(), *mAnimation, factor);
   }
 }
 
@@ -1199,7 +1199,7 @@ void Animation::SetPlayRange(const Vector2& range)
     mPlayRange = orderedRange;
 
     // mAnimation is being used in a separate thread; queue a message to set play range
-    SetPlayRangeMessage(mEventThreadServices, *mAnimation, orderedRange);
+    SetPlayRangeMessage(GetEventThreadServices(), *mAnimation, orderedRange);
   }
 }
 
@@ -1213,7 +1213,7 @@ void Animation::SetBlendPoint(float blendPoint)
   if(blendPoint >= 0.0f && blendPoint <= 1.0f)
   {
     mBlendPoint = blendPoint;
-    SetBlendPointMessage(mEventThreadServices, *mAnimation, mBlendPoint);
+    SetBlendPointMessage(GetEventThreadServices(), *mAnimation, mBlendPoint);
   }
   else
   {
@@ -1231,7 +1231,7 @@ void Animation::SetLoopingMode(Dali::Animation::LoopingMode loopingMode)
   mAutoReverseEnabled = (loopingMode == Dali::Animation::LoopingMode::AUTO_REVERSE);
 
   // mAnimation is being used in a separate thread; queue a message to set play range
-  SetLoopingModeMessage(mEventThreadServices, *mAnimation, mAutoReverseEnabled);
+  SetLoopingModeMessage(GetEventThreadServices(), *mAnimation, mAutoReverseEnabled);
 }
 
 Dali::Animation::LoopingMode Animation::GetLoopingMode() const
@@ -1290,7 +1290,7 @@ void Animation::SendFinalProgressNotificationMessage()
   if(mProgressReachedMarker > 0.0f)
   {
     float progressMarkerSeconds = mDurationSeconds * mProgressReachedMarker;
-    SetProgressNotificationMessage(mEventThreadServices, *mAnimation, progressMarkerSeconds);
+    SetProgressNotificationMessage(GetEventThreadServices(), *mAnimation, progressMarkerSeconds);
   }
 }
 
index 08271b2a8b5bd9d316794549f36771d0ef47d436..fca6ccdda2bd728ca5d648a6cb5da91e1e8443ea 100644 (file)
@@ -21,6 +21,7 @@
 // INTERNAL INCLUDES
 #include <dali/devel-api/animation/animation-devel.h>
 #include <dali/devel-api/common/owner-container.h>
+#include <dali/internal/event/common/event-thread-services-holder.h>
 #include <dali/internal/event/common/event-thread-services.h>
 #include <dali/public-api/animation/animation.h>
 #include <dali/public-api/animation/key-frames.h>
@@ -56,7 +57,7 @@ using AnimationConstIter = AnimationContainer::const_iterator;
  * The UpdateManager owns the Animation object, but the lifetime of the animation is
  * indirectly controlled by the Animation.
  */
-class Animation : public BaseObject
+class Animation : public BaseObject, public EventThreadServicesHolder
 {
 public:
   enum Type : uint8_t
@@ -438,9 +439,9 @@ public: // For connecting animators to animations
    * Retrieve the event thread services object
    * @return The interface for sending messages to the scene graph
    */
-  EventThreadServices& GetEventThreadServices()
+  EventThreadServices& GetAnimationEventThreadServices()
   {
-    return mEventThreadServices;
+    return GetEventThreadServices();
   }
 
 protected:
@@ -570,8 +571,7 @@ private:
 
   const SceneGraph::Animation* mAnimation{nullptr};
 
-  EventThreadServices& mEventThreadServices;
-  AnimationPlaylist&   mPlaylist;
+  AnimationPlaylist& mPlaylist;
 
   Dali::Animation::AnimationSignalType mFinishedSignal{};
   Dali::Animation::AnimationSignalType mProgressReachedSignal{};
index 64ef09011ec56373f0b8f1270d23436d5565823f..5d4990b34bc65e6b0a7dbf88df56864378a23d6b 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_ANIMATOR_CONNECTOR_BASE_H
 
 /*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -104,13 +104,13 @@ public:
     // Add the new SceneGraph::Animator to its correspondent SceneGraph::Animation via message
     const SceneGraph::Animation* animation = mParent->GetSceneObject();
     DALI_ASSERT_DEBUG(nullptr != animation);
-    AddAnimatorMessage(mParent->GetEventThreadServices(), *animation, *mAnimator);
+    AddAnimatorMessage(mParent->GetAnimationEventThreadServices(), *animation, *mAnimator);
 
     // Add the new SceneGraph::PropertyResetter to the update manager via message
     if(resetterRequired)
     {
       OwnerPointer<SceneGraph::PropertyResetterBase> resetter = SceneGraph::AnimatorResetter::New(propertyOwner, *baseProperty, *mAnimator);
-      AddResetterMessage(mParent->GetEventThreadServices().GetUpdateManager(), resetter);
+      AddResetterMessage(mParent->GetAnimationEventThreadServices().GetUpdateManager(), resetter);
     }
   }
 
index d27a5efb9ae117582148fb85d8278c9592f55705..8d1730afeb49adb302e95cc4008c05b5ce072c77 100644 (file)
@@ -53,7 +53,7 @@ inline void AddUnique(SceneGraph::PropertyOwnerContainer& propertyOwners, SceneG
 } // unnamed namespace
 
 ConstraintBase::ConstraintBase(Object& object, Property::Index targetPropertyIndex, SourceContainer& sources)
-: mEventThreadServices(EventThreadServices::Get()),
+: EventThreadServicesHolder(EventThreadServices::Get()),
   mTargetObject(&object),
   mSceneGraphConstraint(nullptr),
   mSources(sources),
index e286e43d32714a10ba25706a5d9b961279633340..4df740c7ed3026abff405f7e4463bf7b5343fe1d 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_ACTIVE_CONSTRAINT_BASE_H
 
 /*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,6 +21,7 @@
 // INTERNAL INCLUDES
 #include <dali/internal/common/owner-pointer.h>
 #include <dali/internal/event/animation/constraint-source-impl.h>
+#include <dali/internal/event/common/event-thread-services-holder.h>
 #include <dali/internal/update/animation/scene-graph-constraint-base.h>
 #include <dali/public-api/animation/constraint.h>
 #include <dali/public-api/common/dali-common.h>
@@ -46,7 +47,7 @@ class AnimatableProperty;
 /**
  * An abstract base class for active constraints.
  */
-class ConstraintBase : public BaseObject, public Object::Observer
+class ConstraintBase : public BaseObject, public Object::Observer, public EventThreadServicesHolder
 {
 public:
   using RemoveAction = Dali::Constraint::RemoveAction;
@@ -189,34 +190,7 @@ protected:
    */
   PropertyInputImpl* AddInputProperty(Source& source, SceneGraph::PropertyOwnerContainer& propertyOwners, int32_t& componentIndex);
 
-  /**
-   * Get the event thread services object - used for sending messages to the scene graph
-   * Assert if called from the wrong thread.
-   * This is intentionally inline for performance reasons.
-   *
-   * @return The event thread services object
-   */
-  inline EventThreadServices& GetEventThreadServices()
-  {
-    DALI_ASSERT_DEBUG(EventThreadServices::IsCoreRunning());
-    return mEventThreadServices;
-  }
-
-  /**
-   * Get the event thread services object - used for sending messages to the scene graph
-   * Assert if called from the wrong thread
-   * This is intentionally inline for performance reasons.
-   *
-   * @return The event thread services object
-   */
-  inline const EventThreadServices& GetEventThreadServices() const
-  {
-    DALI_ASSERT_DEBUG(EventThreadServices::IsCoreRunning());
-    return mEventThreadServices;
-  }
-
 protected:
-  EventThreadServices&              mEventThreadServices;
   Object*                           mTargetObject; ///< The object owns the constraint.
   const SceneGraph::ConstraintBase* mSceneGraphConstraint;
   SourceContainer                   mSources;
diff --git a/dali/internal/event/common/event-thread-services-holder.h b/dali/internal/event/common/event-thread-services-holder.h
new file mode 100644 (file)
index 0000000..0b195bc
--- /dev/null
@@ -0,0 +1,73 @@
+#ifndef DALI_INTERNAL_EVENT_THREAD_SERVICES_HOLDER_H
+#define DALI_INTERNAL_EVENT_THREAD_SERVICES_HOLDER_H
+
+/*
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// INTERNAL INCLUDES
+#include <dali/internal/event/common/event-thread-services.h>
+#include <dali/public-api/common/dali-common.h>
+
+#ifndef DALI_ASSERT_EVENT_THREAD_SERVICES
+#define DALI_ASSERT_EVENT_THREAD_SERVICES(x) DALI_ASSERT_DEBUG(x)
+#endif
+
+namespace Dali::Internal
+{
+class EventThreadServicesHolder
+{
+protected:
+  EventThreadServicesHolder(EventThreadServices& eventThreadServices)
+  : mEventThreadServices(eventThreadServices)
+  {
+  }
+
+  virtual ~EventThreadServicesHolder() = default;
+
+protected:
+  /**
+   * Get the event thread services object - used for sending messages to the scene graph
+   * Assert if called from the wrong thread.
+   * This is intentionally inline for performance reasons.
+   *
+   * @return The event thread services object
+   */
+  inline EventThreadServices& GetEventThreadServices()
+  {
+    DALI_ASSERT_EVENT_THREAD_SERVICES(EventThreadServices::IsCoreRunning() && "Core is not running! Might call this API from worker thread.");
+    return mEventThreadServices;
+  }
+
+  /**
+   * Get the event thread services object - used for sending messages to the scene graph
+   * Assert if called from the wrong thread
+   * This is intentionally inline for performance reasons.
+   *
+   * @return The event thread services object
+   */
+  inline const EventThreadServices& GetEventThreadServices() const
+  {
+    DALI_ASSERT_EVENT_THREAD_SERVICES(EventThreadServices::IsCoreRunning() && "Core is not running! Might call this API from worker thread.");
+    return mEventThreadServices;
+  }
+
+private:
+  EventThreadServices& mEventThreadServices;
+};
+
+} // namespace Dali::Internal
+
+#endif // DALI_INTERNAL_EVENT_THREAD_SERVICES_HOLDER_H
index 65f9563ef22322241fe2ab1f056c93adb68deb09..cef02dfed796dce3c3772a8230f57962aa07e8c2 100644 (file)
@@ -1007,7 +1007,7 @@ Handle::PropertySetSignalType& Object::PropertySetSignal()
 }
 
 Object::Object(const SceneGraph::PropertyOwner* sceneObject)
-: mEventThreadServices(EventThreadServices::Get()),
+: EventThreadServicesHolder(EventThreadServices::Get()),
   mUpdateObject(sceneObject),
   mTypeInfo(nullptr),
   mConstraints(nullptr),
index 40dd0a1ae28c235bd67bb7112d2db710b6345000..30703b92772b994a2d1c4bb9b55b7636e8ed75d1 100644 (file)
@@ -27,6 +27,7 @@
 #include <dali/integration-api/ordered-set.h>
 #include <dali/internal/common/const-string.h>
 #include <dali/internal/event/animation/animation-impl.h>
+#include <dali/internal/event/common/event-thread-services-holder.h>
 #include <dali/internal/event/common/event-thread-services.h>
 #include <dali/internal/event/common/property-input-impl.h>
 #include <dali/internal/event/common/property-metadata.h>
@@ -107,7 +108,7 @@ public:
  *   a) Create their own scene-graph object and pass it to Object constructor.
  *   b) pass nullptr to Object constructor, in this case Object will create default scene object for property handling
  */
-class Object : public Dali::BaseObject
+class Object : public Dali::BaseObject, public EventThreadServicesHolder
 {
 public:
   using Capability = Dali::Handle::Capability;
@@ -568,36 +569,6 @@ private:
    */
   virtual void SetSceneGraphProperty(Property::Index index, const PropertyMetadata& entry, const Property::Value& value);
 
-protected:
-  /**
-   * Get the event thread services object - used for sending messages to the scene graph
-   * Assert if called from the wrong thread.
-   * This is intentionally inline for performance reasons.
-   *
-   * @return The event thread services object
-   */
-  inline EventThreadServices& GetEventThreadServices()
-  {
-    DALI_ASSERT_ALWAYS(EventThreadServices::IsCoreRunning());
-    return mEventThreadServices;
-  }
-
-  /**
-   * Get the event thread services object - used for sending messages to the scene graph
-   * Assert if called from the wrong thread
-   * This is intentionally inline for performance reasons.
-   *
-   * @return The event thread services object
-   */
-  inline const EventThreadServices& GetEventThreadServices() const
-  {
-    DALI_ASSERT_ALWAYS(EventThreadServices::IsCoreRunning());
-    return mEventThreadServices;
-  }
-
-private:
-  EventThreadServices& mEventThreadServices;
-
 protected:
   // mutable because it's lazy initialised and GetSceneObject has to be const so it can be called from const methods
   // const to prevent accidentally calling setters directly from event thread
index c2e3e29e60ec4902d5b698d32cc4b6113a6d28d9..a78cc614534d903b0d9e6ab581d0a56a99c49704 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -55,7 +55,6 @@ namespace Dali
 namespace Internal
 {
 RayTest::RayTest()
-: mEventThreadServices(EventThreadServices::Get())
 {
 }
 
index eb37162108fe3aca8c5322103d1c9d3ee4a87ec4..911ba159511d2320f2952da982f69983a8126c52 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_RAY_TEST_H
 
 /*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -71,9 +71,6 @@ public:
    * @note The actor coordinates are relative to the top-left (0.0, 0.0, 0.5)
    */
   bool ActorTest(const Internal::Actor& actor, const Vector4& rayOrigin, const Vector4& rayDir, Vector2& hitPointLocal, float& distance) const;
-
-private:
-  const EventThreadServices& mEventThreadServices;
 };
 
 } // namespace Internal
index 09db52ebb59a2db0c51838de535885bb6907e293..71030eca2cec344898ff402d2bc3e12b06d698c2 100644 (file)
@@ -42,7 +42,6 @@ namespace Dali
 {
 namespace Internal
 {
-
 typedef std::vector<Actor*>                             OffScreenRenderableContainer;
 typedef std::pair<Actor*, OffScreenRenderableContainer> ForwardOffScreenRenderableSubTree;
 typedef std::vector<ForwardOffScreenRenderableSubTree>  OffScreenRenderableData;
@@ -188,13 +187,13 @@ void RenderTaskList::SortTasks()
   {
     sortedTasks->push_back(task->GetRenderTaskSceneObject());
   }
-  SortTasksMessage(mEventThreadServices, *mSceneObject, sortedTasks);
+  SortTasksMessage(GetEventThreadServices(), *mSceneObject, sortedTasks);
   mIsRequestedToSortTask = false;
 }
 
 bool IsWithinSourceActors(const Actor& sourceActor, Actor& actor)
 {
-  bool isInside = false;
+  bool   isInside     = false;
   Actor* currentActor = &actor;
   while(currentActor)
   {
@@ -218,7 +217,6 @@ void FindOffScreenRenderableWithinSubTree(Actor& rootActor, Actor& actor, uint32
 {
   if(&actor != renderableData[subTreeIndex].first)
   {
-
     // New BACKWARD OffScreen Renderable
     if(actor.GetOffScreenRenderableType() & OffScreenRenderable::Type::BACKWARD)
     {
@@ -359,7 +357,7 @@ void RenderTaskList::ReorderTasks(Dali::Internal::LayerList& layerList)
 }
 
 RenderTaskList::RenderTaskList()
-: mEventThreadServices(EventThreadServices::Get()),
+: EventThreadServicesHolder(EventThreadServices::Get()),
   mDefaults(*Stage::GetCurrent()),
   mSceneObject(nullptr)
 {
@@ -375,7 +373,7 @@ RenderTaskList::~RenderTaskList()
   if(DALI_LIKELY(EventThreadServices::IsCoreRunning() && mSceneObject))
   {
     // Remove the render task list using a message to the update manager
-    RemoveRenderTaskListMessage(mEventThreadServices.GetUpdateManager(), *mSceneObject);
+    RemoveRenderTaskListMessage(GetEventThreadServices().GetUpdateManager(), *mSceneObject);
   }
 }
 
@@ -385,7 +383,7 @@ void RenderTaskList::Initialize()
   mSceneObject = SceneGraph::RenderTaskList::New();
 
   OwnerPointer<SceneGraph::RenderTaskList> transferOwnership(const_cast<SceneGraph::RenderTaskList*>(mSceneObject));
-  AddRenderTaskListMessage(mEventThreadServices.GetUpdateManager(), transferOwnership);
+  AddRenderTaskListMessage(GetEventThreadServices().GetUpdateManager(), transferOwnership);
 
   // set the callback to call us back when tasks are completed
   mSceneObject->SetCompleteNotificationInterface(this);
index af02533816b248870e511362f52336665c921e29..80ff62284953d4118b2ffd0afe92b1edd2a1bed8 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_RENDER_TASK_LIST_H
 
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,6 +25,7 @@
 
 #include <dali/internal/event/actors/layer-list.h>
 #include <dali/internal/event/common/complete-notification-interface.h>
+#include <dali/internal/event/common/event-thread-services-holder.h>
 #include <dali/internal/event/common/scene-graph-notifier-interface-mapper.h>
 #include <dali/internal/event/events/actor-observer.h>
 #include <dali/internal/event/render-tasks/render-task-impl.h>
@@ -52,7 +53,7 @@ class UpdateManager;
  * A proxy for the scene-graph RenderTaskList.
  * A separate LayerList is maintained for actors added via the SystemLevel::Add().
  */
-class RenderTaskList : public BaseObject, public CompleteNotificationInterface, public SceneGraphNotifierInterfaceMapper<RenderTask>
+class RenderTaskList : public BaseObject, public CompleteNotificationInterface, public SceneGraphNotifierInterfaceMapper<RenderTask>, public EventThreadServicesHolder
 {
 public:
   using RenderTaskContainer = std::vector<RenderTaskPtr>;
@@ -221,8 +222,7 @@ private: // from CompleteNotificationInterface
   void NotifyCompleted(CompleteNotificationInterface::ParameterList notifierList) override;
 
 private:
-  EventThreadServices& mEventThreadServices;
-  RenderTaskDefaults&  mDefaults;
+  RenderTaskDefaults& mDefaults;
 
   SceneGraph::RenderTaskList* mSceneObject; ///< Raw-pointer to the scene-graph object; not owned.
 
index 4b37a4a8bc9380e4af5e95aa4f1b3320469b11c9..317ffd4cc12a1c9b168931f67aa5c8703ea64d56 100644 (file)
@@ -39,7 +39,7 @@ Render::FrameBuffer* FrameBuffer::GetRenderObject() const
 }
 
 FrameBuffer::FrameBuffer(uint32_t width, uint32_t height, Mask attachments)
-: mEventThreadServices(EventThreadServices::Get()),
+: EventThreadServicesHolder(EventThreadServices::Get()),
   mRenderObject(nullptr),
   mColor{nullptr},
   mDepth(nullptr),
@@ -56,7 +56,7 @@ void FrameBuffer::Initialize()
   mRenderObject = new Render::FrameBuffer(mWidth, mHeight, mAttachments);
 
   OwnerPointer<Render::FrameBuffer> transferOwnership(mRenderObject);
-  AddFrameBuffer(mEventThreadServices.GetUpdateManager(), transferOwnership);
+  AddFrameBuffer(GetEventThreadServices().GetUpdateManager(), transferOwnership);
 }
 
 void FrameBuffer::AttachColorTexture(TexturePtr texture, uint32_t mipmapLevel, uint32_t layer)
@@ -75,7 +75,7 @@ void FrameBuffer::AttachColorTexture(TexturePtr texture, uint32_t mipmapLevel, u
     mColor[mColorAttachmentCount] = texture;
     ++mColorAttachmentCount;
 
-    AttachColorTextureToFrameBuffer(mEventThreadServices.GetUpdateManager(), *mRenderObject, texture->GetRenderTextureKey().Get(), mipmapLevel, layer);
+    AttachColorTextureToFrameBuffer(GetEventThreadServices().GetUpdateManager(), *mRenderObject, texture->GetRenderTextureKey().Get(), mipmapLevel, layer);
   }
 }
 
@@ -89,7 +89,7 @@ void FrameBuffer::AttachDepthTexture(TexturePtr texture, uint32_t mipmapLevel)
   else
   {
     mDepth = texture;
-    AttachDepthTextureToFrameBuffer(mEventThreadServices.GetUpdateManager(), *mRenderObject, texture->GetRenderTextureKey().Get(), mipmapLevel);
+    AttachDepthTextureToFrameBuffer(GetEventThreadServices().GetUpdateManager(), *mRenderObject, texture->GetRenderTextureKey().Get(), mipmapLevel);
   }
 }
 
@@ -103,13 +103,13 @@ void FrameBuffer::AttachDepthStencilTexture(TexturePtr texture, unsigned int mip
   else
   {
     mStencil = texture;
-    AttachDepthStencilTextureToFrameBuffer(mEventThreadServices.GetUpdateManager(), *mRenderObject, texture->GetRenderTextureKey().Get(), mipmapLevel);
+    AttachDepthStencilTextureToFrameBuffer(GetEventThreadServices().GetUpdateManager(), *mRenderObject, texture->GetRenderTextureKey().Get(), mipmapLevel);
   }
 }
 
 void FrameBuffer::SetMultiSamplingLevel(uint8_t multiSamplingLevel)
 {
-  SetMultiSamplingLevelToFrameBuffer(mEventThreadServices.GetUpdateManager(), *mRenderObject, multiSamplingLevel);
+  SetMultiSamplingLevelToFrameBuffer(GetEventThreadServices().GetUpdateManager(), *mRenderObject, multiSamplingLevel);
 }
 
 Texture* FrameBuffer::GetColorTexture(uint8_t index) const
@@ -142,7 +142,7 @@ FrameBuffer::~FrameBuffer()
 
   if(DALI_LIKELY(EventThreadServices::IsCoreRunning() && mRenderObject))
   {
-    RemoveFrameBuffer(mEventThreadServices.GetUpdateManager(), *mRenderObject);
+    RemoveFrameBuffer(GetEventThreadServices().GetUpdateManager(), *mRenderObject);
   }
 }
 
index 906633456e335b55ce8df191b411a750a1c4f2ac..341e9de053cb81f7a6348b1cb480fd151ebd6389 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_FRAME_BUFFER_H
 
 /*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@
 
 // INTERNAL INCLUDES
 #include <dali/devel-api/rendering/frame-buffer-devel.h>
+#include <dali/internal/event/common/event-thread-services-holder.h>
 #include <dali/internal/event/common/event-thread-services.h>
 #include <dali/internal/event/rendering/texture-impl.h>
 #include <dali/public-api/common/dali-common.h>   // DALI_ASSERT_ALWAYS
@@ -41,7 +42,7 @@ class FrameBuffer;
 class FrameBuffer;
 using FrameBufferPtr = IntrusivePtr<FrameBuffer>;
 
-class FrameBuffer : public BaseObject
+class FrameBuffer : public BaseObject, public EventThreadServicesHolder
 {
 public:
   using Mask = Dali::FrameBuffer::Attachment::Mask;
@@ -124,15 +125,13 @@ private: // implementation
    */
   void Initialize();
 
-protected:
 private: // unimplemented methods
   FrameBuffer()                   = delete;
   FrameBuffer(const FrameBuffer&) = delete;
   FrameBuffer& operator=(const FrameBuffer&) = delete;
 
-private:                                               // data
-  Internal::EventThreadServices& mEventThreadServices; ///< Used to send messages to the render thread via update thread
-  Internal::Render::FrameBuffer* mRenderObject;        ///< The Render::Texture associated to this texture
+private:                                        // data
+  Internal::Render::FrameBuffer* mRenderObject; ///< The Render::Texture associated to this texture
 
   TexturePtr mColor[Dali::DevelFrameBuffer::MAX_COLOR_ATTACHMENTS];
   TexturePtr mDepth;
index 1b965c85e419b86a32949f68c9a5cebcc79dad0f..5bf78a6c7c13ec88c7a2737106e2f728b21a3814 100644 (file)
@@ -37,7 +37,7 @@ GeometryPtr Geometry::New()
 uint32_t Geometry::AddVertexBuffer(VertexBuffer& vertexBuffer)
 {
   mVertexBuffers.push_back(&vertexBuffer);
-  SceneGraph::AttachVertexBufferMessage(mEventThreadServices.GetUpdateManager(), *mRenderObject, *vertexBuffer.GetRenderObject());
+  SceneGraph::AttachVertexBufferMessage(GetEventThreadServices().GetUpdateManager(), *mRenderObject, *vertexBuffer.GetRenderObject());
   return static_cast<uint32_t>(mVertexBuffers.size() - 1u);
 }
 
@@ -49,7 +49,7 @@ uint32_t Geometry::GetNumberOfVertexBuffers() const
 void Geometry::RemoveVertexBuffer(uint32_t index)
 {
   const Render::VertexBuffer& renderVertexBuffer = static_cast<const Render::VertexBuffer&>(*(mVertexBuffers[index]->GetRenderObject()));
-  SceneGraph::RemoveVertexBufferMessage(mEventThreadServices.GetUpdateManager(), *mRenderObject, renderVertexBuffer);
+  SceneGraph::RemoveVertexBufferMessage(GetEventThreadServices().GetUpdateManager(), *mRenderObject, renderVertexBuffer);
 
   mVertexBuffers.erase(mVertexBuffers.begin() + index);
 }
@@ -63,7 +63,7 @@ void Geometry::SetIndexBuffer(const uint16_t* indices, uint32_t count)
     std::copy(indices, indices + count, indexData.Begin());
   }
 
-  SceneGraph::SetIndexBufferMessage(mEventThreadServices.GetUpdateManager(), *mRenderObject, indexData);
+  SceneGraph::SetIndexBufferMessage(GetEventThreadServices().GetUpdateManager(), *mRenderObject, indexData);
 }
 
 void Geometry::SetIndexBuffer(const uint32_t* indices, uint32_t count)
@@ -75,14 +75,14 @@ void Geometry::SetIndexBuffer(const uint32_t* indices, uint32_t count)
     std::copy(indices, indices + count, indexData.Begin());
   }
 
-  SceneGraph::SetIndexBufferMessage(mEventThreadServices.GetUpdateManager(), *mRenderObject, indexData);
+  SceneGraph::SetIndexBufferMessage(GetEventThreadServices().GetUpdateManager(), *mRenderObject, indexData);
 }
 
 void Geometry::SetType(Dali::Geometry::Type geometryType)
 {
   if(geometryType != mType)
   {
-    SceneGraph::SetGeometryTypeMessage(mEventThreadServices.GetUpdateManager(), *mRenderObject, geometryType);
+    SceneGraph::SetGeometryTypeMessage(GetEventThreadServices().GetUpdateManager(), *mRenderObject, geometryType);
 
     mType = geometryType;
   }
@@ -99,7 +99,7 @@ const Render::Geometry* Geometry::GetRenderObject() const
 }
 
 Geometry::Geometry()
-: mEventThreadServices(EventThreadServices::Get()),
+: EventThreadServicesHolder(EventThreadServices::Get()),
   mRenderObject(nullptr),
   mType(Dali::Geometry::TRIANGLES)
 {
@@ -109,7 +109,7 @@ void Geometry::Initialize()
 {
   mRenderObject = new Render::Geometry();
   OwnerPointer<Render::Geometry> transferOwnership(mRenderObject);
-  AddGeometry(mEventThreadServices.GetUpdateManager(), transferOwnership);
+  AddGeometry(GetEventThreadServices().GetUpdateManager(), transferOwnership);
 }
 
 Geometry::~Geometry()
@@ -121,7 +121,7 @@ Geometry::~Geometry()
 
   if(DALI_LIKELY(EventThreadServices::IsCoreRunning() && mRenderObject))
   {
-    RemoveGeometry(mEventThreadServices.GetUpdateManager(), *mRenderObject);
+    RemoveGeometry(GetEventThreadServices().GetUpdateManager(), *mRenderObject);
   }
 }
 
index 261ca3cb6cd712866d370282022f8bd59eccbebd..9a892872d0737a2c04cb87e0e305a17752d2d695 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_GEOMETRY_H
 
 /*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -27,6 +27,7 @@
 #include <dali/public-api/object/base-object.h>
 #include <dali/public-api/rendering/geometry.h> // Dali::Geometry
 
+#include <dali/internal/event/common/event-thread-services-holder.h>
 #include <dali/internal/event/rendering/vertex-buffer-impl.h> // Dali::Internal::VertexBuffer
 #include <dali/internal/render/renderers/render-geometry.h>
 
@@ -46,7 +47,7 @@ using GeometryPtr = IntrusivePtr<Geometry>;
  * Geometry is an object that contains an array of structures of values that
  * can be accessed as properties.
  */
-class Geometry : public BaseObject
+class Geometry : public BaseObject, public EventThreadServicesHolder
 {
 public:
   /**
@@ -118,9 +119,8 @@ private: // unimplemented methods
   Geometry(const Geometry&);
   Geometry& operator=(const Geometry&);
 
-private:                                     // data
-  EventThreadServices& mEventThreadServices; ///<Used to send messages to the render thread via update thread
-  Render::Geometry*    mRenderObject;
+private: // data
+  Render::Geometry* mRenderObject;
 
   std::vector<VertexBufferPtr> mVertexBuffers; ///< Vector of intrusive pointers to vertex buffers
   Dali::Geometry::Type         mType;          ///< Geometry type (cached)
index b3ed0a3c66f714e3c437d87aa47f946e27af33e4..be79d822cd0ede46cc3fa7f2a6d5a2dcd65ba3af 100644 (file)
@@ -38,7 +38,7 @@ void Sampler::SetFilterMode(Dali::FilterMode::Type minFilter, Dali::FilterMode::
 {
   if(nullptr != mRenderObject)
   {
-    SetFilterModeMessage(mEventThreadServices.GetUpdateManager(), *mRenderObject, static_cast<unsigned int>(minFilter), static_cast<unsigned int>(magFilter));
+    SetFilterModeMessage(GetEventThreadServices().GetUpdateManager(), *mRenderObject, static_cast<unsigned int>(minFilter), static_cast<unsigned int>(magFilter));
   }
 }
 
@@ -46,7 +46,7 @@ void Sampler::SetWrapMode(Dali::WrapMode::Type rWrap, Dali::WrapMode::Type sWrap
 {
   if(nullptr != mRenderObject)
   {
-    SetWrapModeMessage(mEventThreadServices.GetUpdateManager(), *mRenderObject, static_cast<unsigned int>(rWrap), static_cast<unsigned int>(sWrap), static_cast<unsigned int>(tWrap));
+    SetWrapModeMessage(GetEventThreadServices().GetUpdateManager(), *mRenderObject, static_cast<unsigned int>(rWrap), static_cast<unsigned int>(sWrap), static_cast<unsigned int>(tWrap));
   }
 }
 
@@ -56,14 +56,14 @@ Render::Sampler* Sampler::GetSamplerRenderObject()
 }
 
 Sampler::Sampler()
-: mEventThreadServices(EventThreadServices::Get()),
+: EventThreadServicesHolder(EventThreadServices::Get()),
   mRenderObject(nullptr)
 {
 }
 
 void Sampler::Initialize()
 {
-  SceneGraph::UpdateManager& updateManager = mEventThreadServices.GetUpdateManager();
+  SceneGraph::UpdateManager& updateManager = GetEventThreadServices().GetUpdateManager();
 
   mRenderObject = new Render::Sampler();
   OwnerPointer<Render::Sampler> transferOwnership(mRenderObject);
@@ -79,7 +79,7 @@ Sampler::~Sampler()
 
   if(DALI_LIKELY(EventThreadServices::IsCoreRunning() && mRenderObject))
   {
-    SceneGraph::UpdateManager& updateManager = mEventThreadServices.GetUpdateManager();
+    SceneGraph::UpdateManager& updateManager = GetEventThreadServices().GetUpdateManager();
     RemoveSamplerMessage(updateManager, *mRenderObject);
   }
 }
index 243f743c29b07945351f7013375120c59cc4cc3e..185db17f65f7751cdf61ce04ead87d05de167a96 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_SAMPLER_H
 
 /*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,7 +19,8 @@
  */
 
 // INTERNAL INCLUDES
-#include <dali/internal/event/common/connectable.h>      // Dali::Internal::Connectable
+#include <dali/internal/event/common/connectable.h> // Dali::Internal::Connectable
+#include <dali/internal/event/common/event-thread-services-holder.h>
 #include <dali/internal/event/common/object-connector.h> // Dali::Internal::ObjectConnector
 #include <dali/internal/event/common/object-impl.h>      // Dali::Internal::Object
 #include <dali/public-api/actors/sampling.h>
@@ -43,7 +44,7 @@ using SamplerPtr = IntrusivePtr<Sampler>;
  * Sampler is an object that contains an array of structures of values that
  * can be accessed as properties.
  */
-class Sampler : public BaseObject
+class Sampler : public BaseObject, public EventThreadServicesHolder
 {
 public:
   /**
@@ -83,9 +84,8 @@ protected:
    */
   ~Sampler() override;
 
-private:                                     // data
-  EventThreadServices& mEventThreadServices; ///<Used to send messages to the render thread via the update thread
-  Render::Sampler*     mRenderObject;        ///<Render thread sampler for this sampler
+private:                          // data
+  Render::Sampler* mRenderObject; ///<Render thread sampler for this sampler
 };
 
 } // namespace Internal
index 15a861ad3b66c91afb78cf524d07f60aebdbaa03..bb105f8be1a47e6b49b0fe3673d9ce221c916341 100644 (file)
@@ -56,7 +56,7 @@ Render::TextureKey Texture::GetRenderTextureKey() const
 }
 
 Texture::Texture(TextureType::Type type, Pixel::Format format, ImageDimensions size)
-: mEventThreadServices(EventThreadServices::Get()),
+: EventThreadServicesHolder(EventThreadServices::Get()),
   mTextureKey{},
   mNativeImage(),
   mSize(size),
@@ -68,7 +68,7 @@ Texture::Texture(TextureType::Type type, Pixel::Format format, ImageDimensions s
 }
 
 Texture::Texture(NativeImageInterfacePtr nativeImageInterface)
-: mEventThreadServices(EventThreadServices::Get()),
+: EventThreadServicesHolder(EventThreadServices::Get()),
   mTextureKey{},
   mNativeImage(nativeImageInterface),
   mSize(nativeImageInterface->GetWidth(), nativeImageInterface->GetHeight()),
@@ -80,7 +80,7 @@ Texture::Texture(NativeImageInterfacePtr nativeImageInterface)
 }
 
 Texture::Texture(TextureType::Type type, uint32_t resourceId)
-: mEventThreadServices(EventThreadServices::Get()),
+: EventThreadServicesHolder(EventThreadServices::Get()),
   mTextureKey{},
   mNativeImage(),
   mSize(),
@@ -111,7 +111,7 @@ void Texture::Initialize()
       }
     }
 
-    AddTextureMessage(mEventThreadServices.GetUpdateManager(), mTextureKey);
+    AddTextureMessage(GetEventThreadServices().GetUpdateManager(), mTextureKey);
   }
 }
 
@@ -124,7 +124,7 @@ Texture::~Texture()
 
   if(DALI_LIKELY(EventThreadServices::IsCoreRunning() && mTextureKey))
   {
-    RemoveTextureMessage(mEventThreadServices.GetUpdateManager(), mTextureKey);
+    RemoveTextureMessage(GetEventThreadServices().GetUpdateManager(), mTextureKey);
   }
 }
 
@@ -239,7 +239,7 @@ bool Texture::UploadSubPixelData(PixelDataPtr pixelData,
                                              static_cast<uint16_t>(yOffset),
                                              static_cast<uint16_t>(width),
                                              static_cast<uint16_t>(height)};
-            UploadTextureMessage(mEventThreadServices.GetUpdateManager(), mTextureKey, pixelData, params);
+            UploadTextureMessage(GetEventThreadServices().GetUpdateManager(), mTextureKey, pixelData, params);
 
             result = true;
           }
@@ -263,7 +263,7 @@ void Texture::GenerateMipmaps()
 {
   if(DALI_LIKELY(EventThreadServices::IsCoreRunning() && mTextureKey))
   {
-    GenerateMipmapsMessage(mEventThreadServices.GetUpdateManager(), mTextureKey);
+    GenerateMipmapsMessage(GetEventThreadServices().GetUpdateManager(), mTextureKey);
   }
   else
   {
@@ -301,7 +301,7 @@ void Texture::SetSize(const ImageDimensions& size)
   mSize = size;
   if(DALI_LIKELY(EventThreadServices::IsCoreRunning() && mTextureKey))
   {
-    SetTextureSizeMessage(mEventThreadServices.GetUpdateManager(), mTextureKey, mSize);
+    SetTextureSizeMessage(GetEventThreadServices().GetUpdateManager(), mTextureKey, mSize);
   }
 }
 
@@ -310,7 +310,7 @@ void Texture::SetPixelFormat(Pixel::Format format)
   mFormat = format;
   if(DALI_LIKELY(EventThreadServices::IsCoreRunning() && mTextureKey))
   {
-    SetTextureFormatMessage(mEventThreadServices.GetUpdateManager(), mTextureKey, mFormat);
+    SetTextureFormatMessage(GetEventThreadServices().GetUpdateManager(), mTextureKey, mFormat);
   }
 }
 
index 4d3a1330ee539c9c53ba72f15a46f4cac333b659..5089a74caf299b2ec75490b31c6232b8fb46a1dd 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_NEW_TEXTURE_H
 
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@
  */
 
 // INTERNAL INCLUDES
+#include <dali/internal/event/common/event-thread-services-holder.h>
 #include <dali/internal/event/common/event-thread-services.h>
 #include <dali/internal/event/images/pixel-data-impl.h>
 #include <dali/internal/render/renderers/render-texture-key.h>
@@ -36,7 +37,7 @@ namespace Internal
 class Texture;
 using TexturePtr = IntrusivePtr<Texture>;
 
-class Texture : public BaseObject
+class Texture : public BaseObject, public EventThreadServicesHolder
 {
 public:
   /**
@@ -205,9 +206,8 @@ private: // unimplemented methods
   Texture(const Texture&);
   Texture& operator=(const Texture&);
 
-private:                                               // data
-  Internal::EventThreadServices& mEventThreadServices; ///<Used to send messages to the render thread via update thread
-  Internal::Render::TextureKey   mTextureKey;          ///<The Render::Texture associated to this texture
+private:                                    // data
+  Internal::Render::TextureKey mTextureKey; ///<The Render::Texture associated to this texture
 
   NativeImageInterfacePtr mNativeImage; ///< Pointer to native image
   ImageDimensions         mSize;        ///< Size of the texture
index fc99607b90648b74e7904527aea508a61c4f99a9..2d7c29070def1a8c3922243ec7acc5c995e5e602 100644 (file)
@@ -51,7 +51,7 @@ void TextureSet::SetTexture(uint32_t index, TexturePtr texture)
     renderTexture = texture->GetRenderTextureKey();
   }
 
-  SceneGraph::SetTextureMessage(mEventThreadServices, *mSceneObject, index, renderTexture);
+  SceneGraph::SetTextureMessage(GetEventThreadServices(), *mSceneObject, index, renderTexture);
 
   if(!texture)
   {
@@ -91,7 +91,7 @@ void TextureSet::SetSampler(uint32_t index, SamplerPtr sampler)
     renderSampler = sampler->GetSamplerRenderObject();
   }
 
-  SceneGraph::SetSamplerMessage(mEventThreadServices, *mSceneObject, index, renderSampler);
+  SceneGraph::SetSamplerMessage(GetEventThreadServices(), *mSceneObject, index, renderSampler);
 
   if(!sampler)
   {
@@ -171,14 +171,14 @@ void TextureSet::TrimContainers()
 }
 
 TextureSet::TextureSet()
-: mEventThreadServices(EventThreadServices::Get()),
+: EventThreadServicesHolder(EventThreadServices::Get()),
   mSceneObject(nullptr)
 {
 }
 
 void TextureSet::Initialize()
 {
-  SceneGraph::UpdateManager& updateManager = mEventThreadServices.GetUpdateManager();
+  SceneGraph::UpdateManager& updateManager = GetEventThreadServices().GetUpdateManager();
 
   mSceneObject = SceneGraph::TextureSet::New();
   OwnerPointer<SceneGraph::TextureSet> transferOwnership(mSceneObject);
@@ -194,7 +194,7 @@ TextureSet::~TextureSet()
 
   if(DALI_LIKELY(EventThreadServices::IsCoreRunning()))
   {
-    SceneGraph::UpdateManager& updateManager = mEventThreadServices.GetUpdateManager();
+    SceneGraph::UpdateManager& updateManager = GetEventThreadServices().GetUpdateManager();
     RemoveTextureSetMessage(updateManager, *mSceneObject);
   }
 }
index 260a485fe0d8782121bce304191499d77b1f1043..e107c7a7d70edc9709324f21e10e013074a0d1b1 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_TEXTURE_SET_H
 
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@
 #include <dali/public-api/common/vector-wrapper.h> // std::vector
 
 // INTERNAL INCLUDES
+#include <dali/internal/event/common/event-thread-services-holder.h>
 #include <dali/internal/event/common/object-impl.h>     // Dali::Internal::Object
 #include <dali/internal/event/rendering/sampler-impl.h> // Dali::Internal::Sampler
 #include <dali/internal/event/rendering/shader-impl.h>  // Dali::Internal::Shader
@@ -45,7 +46,7 @@ using TextureSetPtr = IntrusivePtr<TextureSet>;
 /**
  * TextureSet is an object that holds all the textures used by a renderer
  */
-class TextureSet : public BaseObject
+class TextureSet : public BaseObject, public EventThreadServicesHolder
 {
 public:
   /**
@@ -122,8 +123,7 @@ private: // unimplemented methods
   TextureSet(const TextureSet&);
   TextureSet& operator=(const TextureSet&);
 
-private:                                        // Data
-  EventThreadServices&    mEventThreadServices; ///<Used to send messages to the update thread
+private: // Data
   SceneGraph::TextureSet* mSceneObject;
   std::vector<SamplerPtr> mSamplers;
   std::vector<TexturePtr> mTextures;
index 28bcc798418965b4ea3c93f017fec2ef200f3750..90f378bcc488d23397124e9d9d66cac52f5d91b9 100644 (file)
@@ -163,7 +163,7 @@ void VertexBuffer::SetData(const void* data, uint32_t size)
   std::copy(source, source + bufferSize, destination);
 
   // Ownership of the bufferCopy is passed to the message ( uses an owner pointer )
-  SceneGraph::SetVertexBufferData(mEventThreadServices.GetUpdateManager(), *mRenderObject, bufferCopy, mSize);
+  SceneGraph::SetVertexBufferData(GetEventThreadServices().GetUpdateManager(), *mRenderObject, bufferCopy, mSize);
 }
 
 uint32_t VertexBuffer::GetSize() const
@@ -173,7 +173,7 @@ uint32_t VertexBuffer::GetSize() const
 
 void VertexBuffer::SetDivisor(uint32_t divisor)
 {
-  SceneGraph::SetVertexBufferDivisorMessage(mEventThreadServices.GetUpdateManager(), *mRenderObject, divisor);
+  SceneGraph::SetVertexBufferDivisorMessage(GetEventThreadServices().GetUpdateManager(), *mRenderObject, divisor);
   mDivisor = divisor;
 }
 
@@ -189,7 +189,7 @@ void VertexBuffer::SetVertexBufferUpdateCallback(VertexBufferUpdateCallback& cal
     ClearVertexBufferUpdateCallback();
   }
   mVertexBufferUpdateCallback = &callback;
-  SceneGraph::SetVertexBufferUpdateCallbackMessage(mEventThreadServices.GetUpdateManager(), *mRenderObject, &callback);
+  SceneGraph::SetVertexBufferUpdateCallbackMessage(GetEventThreadServices().GetUpdateManager(), *mRenderObject, &callback);
 }
 
 void VertexBuffer::ClearVertexBufferUpdateCallback()
@@ -222,12 +222,12 @@ VertexBuffer::~VertexBuffer()
 
   if(DALI_LIKELY(EventThreadServices::IsCoreRunning() && mRenderObject))
   {
-    SceneGraph::RemoveVertexBuffer(mEventThreadServices.GetUpdateManager(), *mRenderObject);
+    SceneGraph::RemoveVertexBuffer(GetEventThreadServices().GetUpdateManager(), *mRenderObject);
   }
 }
 
 VertexBuffer::VertexBuffer()
-: mEventThreadServices(EventThreadServices::Get()),
+: EventThreadServicesHolder(EventThreadServices::Get()),
   mRenderObject(nullptr),
   mBufferFormatSize(0),
   mSize(0)
@@ -238,7 +238,7 @@ void VertexBuffer::Initialize(Dali::Property::Map& formatMap)
 {
   mRenderObject = new Render::VertexBuffer();
   OwnerPointer<Render::VertexBuffer> transferOwnership(mRenderObject);
-  SceneGraph::AddVertexBuffer(mEventThreadServices.GetUpdateManager(), transferOwnership);
+  SceneGraph::AddVertexBuffer(GetEventThreadServices().GetUpdateManager(), transferOwnership);
 
   uint32_t numComponents = static_cast<uint32_t>(formatMap.Count());
 
@@ -321,7 +321,7 @@ void VertexBuffer::Initialize(Dali::Property::Map& formatMap)
 
   mBufferFormatSize = format->size;
 
-  SceneGraph::SetVertexBufferFormat(mEventThreadServices.GetUpdateManager(), *mRenderObject, format);
+  SceneGraph::SetVertexBufferFormat(GetEventThreadServices().GetUpdateManager(), *mRenderObject, format);
 }
 
 uint32_t GetPropertyImplementationSize(Property::Type& propertyType)
index 1dd8fcbf5b0643202a54abf1756881ab92944361..12116d06a1be7758896839af91ae3c6121611899 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_VERTEX_BUFFER_H
 
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,6 +25,7 @@
 #include <dali/public-api/object/property-map.h>     // Dali::Property::Map
 #include <dali/public-api/rendering/vertex-buffer.h> // Dali::VertexBuffer
 
+#include <dali/internal/event/common/event-thread-services-holder.h>
 #include <dali/internal/event/common/event-thread-services.h>
 #include <dali/internal/render/renderers/render-vertex-buffer.h>
 
@@ -40,7 +41,7 @@ using VertexBufferPtr = IntrusivePtr<VertexBuffer>;
  * VertexBuffer is an object that contains an array of structures of values that
  * can be accessed as properties.
  */
-class VertexBuffer : public BaseObject
+class VertexBuffer : public BaseObject, public EventThreadServicesHolder
 {
 public:
   /**
@@ -108,7 +109,6 @@ private: // unimplemented methods
   VertexBuffer& operator=(const VertexBuffer&);
 
 private:                                                            // data
-  EventThreadServices&        mEventThreadServices;                 ///<Used to send messages to the render thread via update thread
   Render::VertexBuffer*       mRenderObject{nullptr};               ///<Render side object
   VertexBufferUpdateCallback* mVertexBufferUpdateCallback{nullptr}; ///<Vertex buffer update callback pointer
   uint32_t                    mBufferFormatSize{0};