Merge changes I8783ad29,I2c860a84 into devel/master
[platform/core/uifw/dali-core.git] / dali / internal / update / rendering / scene-graph-renderer-messages.h
1 #ifndef DALI_INTERNAL_SCENE_GRAPH_RENDERER_MESSAGES_H
2 #define DALI_INTERNAL_SCENE_GRAPH_RENDERER_MESSAGES_H
3
4 /*
5  * Copyright (c) 2023 Samsung Electronics Co., Ltd.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19
20 #include <dali/internal/common/message.h>
21 #include <dali/internal/common/type-abstraction-enums.h>
22 #include <dali/internal/event/common/event-thread-services.h>
23 #include <dali/internal/update/common/property-resetter.h>
24 #include <dali/internal/update/manager/update-manager.h>
25 #include <dali/internal/update/rendering/scene-graph-renderer.h>
26
27 namespace Dali::Internal::SceneGraph
28 {
29 class TextureSet;
30
31 /// Messages
32 inline void SetTexturesMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, const TextureSet& textureSet)
33 {
34   using LocalType = MessageValue1<Renderer, TextureSet*>;
35
36   // Reserve some memory inside the message queue
37   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
38
39   // Construct message in the message queue memory; note that delete should not be called on the return value
40   new(slot) LocalType(&renderer, &Renderer::SetTextures, const_cast<TextureSet*>(&textureSet));
41 }
42
43 inline void SetGeometryMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, const Render::Geometry& geometry)
44 {
45   using LocalType = MessageValue1<Renderer, Render::Geometry*>;
46
47   // Reserve some memory inside the message queue
48   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
49
50   // Construct message in the message queue memory; note that delete should not be called on the return value
51   new(slot) LocalType(&renderer, &Renderer::SetGeometry, const_cast<Render::Geometry*>(&geometry));
52 }
53
54 inline void SetShaderMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, const Shader& shader)
55 {
56   using LocalType = MessageValue1<Renderer, Shader*>;
57
58   // Reserve some memory inside the message queue
59   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
60
61   // Construct message in the message queue memory; note that delete should not be called on the return value
62   new(slot) LocalType(&renderer, &Renderer::SetShader, const_cast<Shader*>(&shader));
63 }
64
65 inline void SetDepthIndexMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, int depthIndex)
66 {
67   using LocalType = MessageValue1<Renderer, int>;
68
69   // Reserve some memory inside the message queue
70   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
71
72   // Construct message in the message queue memory; note that delete should not be called on the return value
73   new(slot) LocalType(&renderer, &Renderer::SetDepthIndex, depthIndex);
74 }
75
76 inline void SetFaceCullingModeMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, FaceCullingMode::Type faceCullingMode)
77 {
78   using LocalType = MessageValue1<Renderer, FaceCullingMode::Type>;
79
80   // Reserve some memory inside the message queue
81   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
82
83   new(slot) LocalType(&renderer, &Renderer::SetFaceCullingMode, faceCullingMode);
84 }
85
86 inline void SetBlendModeMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, BlendMode::Type blendingMode)
87 {
88   using LocalType = MessageValue1<Renderer, BlendMode::Type>;
89
90   // Reserve some memory inside the message queue
91   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
92
93   new(slot) LocalType(&renderer, &Renderer::SetBlendMode, blendingMode);
94 }
95
96 inline void SetBlendingOptionsMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, uint32_t options)
97 {
98   using LocalType = MessageValue1<Renderer, uint32_t>;
99
100   // Reserve some memory inside the message queue
101   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
102
103   new(slot) LocalType(&renderer, &Renderer::SetBlendingOptions, options);
104 }
105
106 inline void SetBlendColorMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, const Vector4& blendColor)
107 {
108   using LocalType = MessageValue1<Renderer, Vector4>;
109
110   // Reserve some memory inside the message queue
111   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
112
113   new(slot) LocalType(&renderer, &Renderer::SetBlendColor, blendColor);
114 }
115
116 inline void SetIndexedDrawFirstElementMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, uint32_t firstElement)
117 {
118   using LocalType = MessageValue1<Renderer, uint32_t>;
119
120   // Reserve some memory inside the message queue
121   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
122
123   new(slot) LocalType(&renderer, &Renderer::SetIndexedDrawFirstElement, firstElement);
124 }
125
126 inline void SetIndexedDrawElementsCountMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, uint32_t elementsCount)
127 {
128   using LocalType = MessageValue1<Renderer, uint32_t>;
129
130   // Reserve some memory inside the message queue
131   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
132
133   new(slot) LocalType(&renderer, &Renderer::SetIndexedDrawElementsCount, elementsCount);
134 }
135
136 inline void SetEnablePreMultipliedAlphaMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, bool preMultiplied)
137 {
138   using LocalType = MessageValue1<Renderer, bool>;
139
140   // Reserve some memory inside the message queue
141   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
142
143   new(slot) LocalType(&renderer, &Renderer::EnablePreMultipliedAlpha, preMultiplied);
144 }
145
146 inline void SetDepthWriteModeMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, DepthWriteMode::Type depthWriteMode)
147 {
148   using LocalType = MessageValue1<Renderer, DepthWriteMode::Type>;
149
150   // Reserve some memory inside the message queue
151   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
152
153   new(slot) LocalType(&renderer, &Renderer::SetDepthWriteMode, depthWriteMode);
154 }
155
156 inline void SetDepthTestModeMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, DepthTestMode::Type depthTestMode)
157 {
158   using LocalType = MessageValue1<Renderer, DepthTestMode::Type>;
159
160   // Reserve some memory inside the message queue
161   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
162
163   new(slot) LocalType(&renderer, &Renderer::SetDepthTestMode, depthTestMode);
164 }
165
166 inline void SetDepthFunctionMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, DepthFunction::Type depthFunction)
167 {
168   using LocalType = MessageValue1<Renderer, DepthFunction::Type>;
169
170   // Reserve some memory inside the message queue
171   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
172
173   new(slot) LocalType(&renderer, &Renderer::SetDepthFunction, depthFunction);
174 }
175
176 inline void SetRenderModeMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, RenderMode::Type mode)
177 {
178   using LocalType = MessageValue1<Renderer, RenderMode::Type>;
179
180   // Reserve some memory inside the message queue
181   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
182
183   new(slot) LocalType(&renderer, &Renderer::SetRenderMode, mode);
184 }
185
186 inline void SetStencilFunctionMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, StencilFunction::Type stencilFunction)
187 {
188   using LocalType = MessageValue1<Renderer, StencilFunction::Type>;
189
190   // Reserve some memory inside the message queue
191   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
192
193   new(slot) LocalType(&renderer, &Renderer::SetStencilFunction, stencilFunction);
194 }
195
196 inline void SetStencilFunctionMaskMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, int mask)
197 {
198   using LocalType = MessageValue1<Renderer, int>;
199
200   // Reserve some memory inside the message queue
201   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
202
203   new(slot) LocalType(&renderer, &Renderer::SetStencilFunctionMask, mask);
204 }
205
206 inline void SetStencilFunctionReferenceMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, int stencilFunctionReference)
207 {
208   using LocalType = MessageValue1<Renderer, int>;
209
210   // Reserve some memory inside the message queue
211   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
212
213   new(slot) LocalType(&renderer, &Renderer::SetStencilFunctionReference, stencilFunctionReference);
214 }
215
216 inline void SetStencilMaskMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, int stencilMask)
217 {
218   using LocalType = MessageValue1<Renderer, int>;
219
220   // Reserve some memory inside the message queue
221   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
222
223   new(slot) LocalType(&renderer, &Renderer::SetStencilMask, stencilMask);
224 }
225
226 inline void SetStencilOperationOnFailMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, StencilOperation::Type stencilOperation)
227 {
228   using LocalType = MessageValue1<Renderer, StencilOperation::Type>;
229
230   // Reserve some memory inside the message queue
231   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
232
233   new(slot) LocalType(&renderer, &Renderer::SetStencilOperationOnFail, stencilOperation);
234 }
235
236 inline void SetStencilOperationOnZFailMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, StencilOperation::Type stencilOperation)
237 {
238   using LocalType = MessageValue1<Renderer, StencilOperation::Type>;
239
240   // Reserve some memory inside the message queue
241   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
242
243   new(slot) LocalType(&renderer, &Renderer::SetStencilOperationOnZFail, stencilOperation);
244 }
245
246 inline void SetStencilOperationOnZPassMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, StencilOperation::Type stencilOperation)
247 {
248   using LocalType = MessageValue1<Renderer, StencilOperation::Type>;
249
250   // Reserve some memory inside the message queue
251   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
252
253   new(slot) LocalType(&renderer, &Renderer::SetStencilOperationOnZPass, stencilOperation);
254 }
255
256 inline void BakeOpacityMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, float opacity)
257 {
258   using LocalType = MessageDoubleBuffered1<Renderer, float>;
259
260   // Reserve some memory inside the message queue
261   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
262
263   new(slot) LocalType(&renderer, &Renderer::BakeOpacity, opacity);
264
265   OwnerPointer<SceneGraph::PropertyResetterBase> resetter(
266     new SceneGraph::BakerResetter(const_cast<Renderer*>(&renderer),
267                                   const_cast<AnimatableProperty<float>*>(&renderer.mOpacity),
268                                   SceneGraph::BakerResetter::Lifetime::BAKE));
269   SceneGraph::AddResetterMessage(eventThreadServices.GetUpdateManager(), resetter);
270 }
271
272 inline void SetRenderingBehaviorMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, DevelRenderer::Rendering::Type renderingBehavior)
273 {
274   using LocalType = MessageValue1<Renderer, DevelRenderer::Rendering::Type>;
275
276   // Reserve some memory inside the message queue
277   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
278
279   new(slot) LocalType(&renderer, &Renderer::SetRenderingBehavior, renderingBehavior);
280 }
281
282 inline void SetDrawCommandsMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, Dali::DevelRenderer::DrawCommand* pDrawCommands, uint32_t size)
283 {
284   using LocalType = MessageValue2<Renderer, Dali::DevelRenderer::DrawCommand*, uint32_t>;
285
286   // Reserve some memory inside the message queue
287   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
288
289   new(slot) LocalType(&renderer, &Renderer::SetDrawCommands, pDrawCommands, size);
290 }
291
292 inline void SetRenderCallbackMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, Dali::RenderCallback* callback)
293 {
294   using LocalType = MessageValue1<Renderer, Dali::RenderCallback*>;
295
296   // Reserve some memory inside the message queue
297   uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
298
299   new(slot) LocalType(&renderer, &Renderer::SetRenderCallback, callback);
300 }
301
302 } // namespace Dali::Internal::SceneGraph
303
304 #endif //DALI_INTERNAL_SCENE_GRAPH_RENDERER_MESSAGES_H