[dali_2.3.27] Merge branch 'devel/master'
[platform/core/uifw/dali-core.git] / dali / internal / update / controllers / render-message-dispatcher.cpp
1 /*
2  * Copyright (c) 2023 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // CLASS HEADER
19 #include <dali/internal/update/controllers/render-message-dispatcher.h>
20
21 // INTERNAL INCLUDES
22 #include <dali/internal/common/message.h>
23 #include <dali/internal/render/common/render-manager.h>
24 #include <dali/internal/render/queue/render-queue.h>
25 #include <dali/internal/render/renderers/render-renderer.h>
26
27 namespace Dali
28 {
29 namespace Internal
30 {
31 namespace SceneGraph
32 {
33 RenderMessageDispatcher::RenderMessageDispatcher(RenderManager& renderManager, RenderQueue& renderQueue, const SceneGraphBuffers& buffers)
34 : mRenderManager(renderManager),
35   mRenderQueue(renderQueue),
36   mBuffers(buffers)
37 {
38 }
39
40 RenderMessageDispatcher::~RenderMessageDispatcher() = default;
41
42 void RenderMessageDispatcher::AddRenderer(const Render::RendererKey& renderer)
43 {
44   // Message has ownership of renderer while in transit from update -> render
45   typedef MessageValue1<RenderManager, Render::RendererKey> DerivedType;
46
47   // Reserve some memory inside the render queue
48   uint32_t* slot = mRenderQueue.ReserveMessageSlot(mBuffers.GetUpdateBufferIndex(), sizeof(DerivedType));
49
50   // Construct message in the render queue memory; note that delete should not be called on the return value
51   new(slot) DerivedType(&mRenderManager, &RenderManager::AddRenderer, renderer);
52 }
53
54 void RenderMessageDispatcher::RemoveRenderer(const Render::RendererKey& renderer)
55 {
56   using DerivedType = MessageValue1<RenderManager, Render::RendererKey>;
57
58   // Reserve some memory inside the render queue
59   uint32_t* slot = mRenderQueue.ReserveMessageSlot(mBuffers.GetUpdateBufferIndex(), sizeof(DerivedType));
60
61   // Construct message in the render queue memory; note that delete should not be called on the return value
62   new(slot) DerivedType(&mRenderManager, &RenderManager::RemoveRenderer, renderer);
63 }
64
65 void RenderMessageDispatcher::AddRenderTracker(Render::RenderTracker& renderTracker)
66 {
67   using DerivedType = MessageValue1<RenderManager, Render::RenderTracker*>;
68
69   // Reserve some memory inside the render queue
70   uint32_t* slot = mRenderQueue.ReserveMessageSlot(mBuffers.GetUpdateBufferIndex(), sizeof(DerivedType));
71
72   // Construct message in the render queue memory; note that delete should not be called on the return value
73   new(slot) DerivedType(&mRenderManager, &RenderManager::AddRenderTracker, &renderTracker);
74 }
75
76 void RenderMessageDispatcher::RemoveRenderTracker(Render::RenderTracker& renderTracker)
77 {
78   using DerivedType = MessageValue1<RenderManager, Render::RenderTracker*>;
79
80   // Reserve some memory inside the render queue
81   uint32_t* slot = mRenderQueue.ReserveMessageSlot(mBuffers.GetUpdateBufferIndex(), sizeof(DerivedType));
82
83   // Construct message in the render queue memory; note that delete should not be called on the return value
84   new(slot) DerivedType(&mRenderManager, &RenderManager::RemoveRenderTracker, &renderTracker);
85 }
86
87 RenderManager& RenderMessageDispatcher::GetRenderManager()
88 {
89   return mRenderManager;
90 }
91
92 uint32_t* RenderMessageDispatcher::ReserveMessageSlot(std::size_t size)
93 {
94   return mRenderQueue.ReserveMessageSlot(mBuffers.GetUpdateBufferIndex(), size);
95 }
96
97 } // namespace SceneGraph
98
99 } // namespace Internal
100
101 } // namespace Dali