1 #ifndef DALI_INTERNAL_SCENE_GRAPH_RENDERER_MESSAGES_H
2 #define DALI_INTERNAL_SCENE_GRAPH_RENDERER_MESSAGES_H
5 * Copyright (c) 2023 Samsung Electronics Co., Ltd.
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
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>
27 namespace Dali::Internal::SceneGraph
32 inline void SetTexturesMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, const TextureSet& textureSet)
34 using LocalType = MessageValue1<Renderer, TextureSet*>;
36 // Reserve some memory inside the message queue
37 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
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));
43 inline void SetGeometryMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, const Render::Geometry& geometry)
45 using LocalType = MessageValue1<Renderer, Render::Geometry*>;
47 // Reserve some memory inside the message queue
48 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
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));
54 inline void SetShaderMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, const Shader& shader)
56 using LocalType = MessageValue1<Renderer, Shader*>;
58 // Reserve some memory inside the message queue
59 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
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));
65 inline void SetDepthIndexMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, int depthIndex)
67 using LocalType = MessageValue1<Renderer, int>;
69 // Reserve some memory inside the message queue
70 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
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);
76 inline void SetFaceCullingModeMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, FaceCullingMode::Type faceCullingMode)
78 using LocalType = MessageValue1<Renderer, FaceCullingMode::Type>;
80 // Reserve some memory inside the message queue
81 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
83 new(slot) LocalType(&renderer, &Renderer::SetFaceCullingMode, faceCullingMode);
86 inline void SetBlendModeMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, BlendMode::Type blendingMode)
88 using LocalType = MessageValue1<Renderer, BlendMode::Type>;
90 // Reserve some memory inside the message queue
91 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
93 new(slot) LocalType(&renderer, &Renderer::SetBlendMode, blendingMode);
96 inline void SetBlendingOptionsMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, uint32_t options)
98 using LocalType = MessageValue1<Renderer, uint32_t>;
100 // Reserve some memory inside the message queue
101 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
103 new(slot) LocalType(&renderer, &Renderer::SetBlendingOptions, options);
106 inline void SetBlendColorMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, const Vector4& blendColor)
108 using LocalType = MessageValue1<Renderer, Vector4>;
110 // Reserve some memory inside the message queue
111 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
113 new(slot) LocalType(&renderer, &Renderer::SetBlendColor, blendColor);
116 inline void SetIndexedDrawFirstElementMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, uint32_t firstElement)
118 using LocalType = MessageValue1<Renderer, uint32_t>;
120 // Reserve some memory inside the message queue
121 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
123 new(slot) LocalType(&renderer, &Renderer::SetIndexedDrawFirstElement, firstElement);
126 inline void SetIndexedDrawElementsCountMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, uint32_t elementsCount)
128 using LocalType = MessageValue1<Renderer, uint32_t>;
130 // Reserve some memory inside the message queue
131 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
133 new(slot) LocalType(&renderer, &Renderer::SetIndexedDrawElementsCount, elementsCount);
136 inline void SetEnablePreMultipliedAlphaMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, bool preMultiplied)
138 using LocalType = MessageValue1<Renderer, bool>;
140 // Reserve some memory inside the message queue
141 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
143 new(slot) LocalType(&renderer, &Renderer::EnablePreMultipliedAlpha, preMultiplied);
146 inline void SetDepthWriteModeMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, DepthWriteMode::Type depthWriteMode)
148 using LocalType = MessageValue1<Renderer, DepthWriteMode::Type>;
150 // Reserve some memory inside the message queue
151 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
153 new(slot) LocalType(&renderer, &Renderer::SetDepthWriteMode, depthWriteMode);
156 inline void SetDepthTestModeMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, DepthTestMode::Type depthTestMode)
158 using LocalType = MessageValue1<Renderer, DepthTestMode::Type>;
160 // Reserve some memory inside the message queue
161 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
163 new(slot) LocalType(&renderer, &Renderer::SetDepthTestMode, depthTestMode);
166 inline void SetDepthFunctionMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, DepthFunction::Type depthFunction)
168 using LocalType = MessageValue1<Renderer, DepthFunction::Type>;
170 // Reserve some memory inside the message queue
171 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
173 new(slot) LocalType(&renderer, &Renderer::SetDepthFunction, depthFunction);
176 inline void SetRenderModeMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, RenderMode::Type mode)
178 using LocalType = MessageValue1<Renderer, RenderMode::Type>;
180 // Reserve some memory inside the message queue
181 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
183 new(slot) LocalType(&renderer, &Renderer::SetRenderMode, mode);
186 inline void SetStencilFunctionMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, StencilFunction::Type stencilFunction)
188 using LocalType = MessageValue1<Renderer, StencilFunction::Type>;
190 // Reserve some memory inside the message queue
191 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
193 new(slot) LocalType(&renderer, &Renderer::SetStencilFunction, stencilFunction);
196 inline void SetStencilFunctionMaskMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, int mask)
198 using LocalType = MessageValue1<Renderer, int>;
200 // Reserve some memory inside the message queue
201 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
203 new(slot) LocalType(&renderer, &Renderer::SetStencilFunctionMask, mask);
206 inline void SetStencilFunctionReferenceMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, int stencilFunctionReference)
208 using LocalType = MessageValue1<Renderer, int>;
210 // Reserve some memory inside the message queue
211 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
213 new(slot) LocalType(&renderer, &Renderer::SetStencilFunctionReference, stencilFunctionReference);
216 inline void SetStencilMaskMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, int stencilMask)
218 using LocalType = MessageValue1<Renderer, int>;
220 // Reserve some memory inside the message queue
221 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
223 new(slot) LocalType(&renderer, &Renderer::SetStencilMask, stencilMask);
226 inline void SetStencilOperationOnFailMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, StencilOperation::Type stencilOperation)
228 using LocalType = MessageValue1<Renderer, StencilOperation::Type>;
230 // Reserve some memory inside the message queue
231 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
233 new(slot) LocalType(&renderer, &Renderer::SetStencilOperationOnFail, stencilOperation);
236 inline void SetStencilOperationOnZFailMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, StencilOperation::Type stencilOperation)
238 using LocalType = MessageValue1<Renderer, StencilOperation::Type>;
240 // Reserve some memory inside the message queue
241 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
243 new(slot) LocalType(&renderer, &Renderer::SetStencilOperationOnZFail, stencilOperation);
246 inline void SetStencilOperationOnZPassMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, StencilOperation::Type stencilOperation)
248 using LocalType = MessageValue1<Renderer, StencilOperation::Type>;
250 // Reserve some memory inside the message queue
251 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
253 new(slot) LocalType(&renderer, &Renderer::SetStencilOperationOnZPass, stencilOperation);
256 inline void BakeOpacityMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, float opacity)
258 using LocalType = MessageDoubleBuffered1<Renderer, float>;
260 // Reserve some memory inside the message queue
261 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
263 new(slot) LocalType(&renderer, &Renderer::BakeOpacity, opacity);
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);
272 inline void SetRenderingBehaviorMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, DevelRenderer::Rendering::Type renderingBehavior)
274 using LocalType = MessageValue1<Renderer, DevelRenderer::Rendering::Type>;
276 // Reserve some memory inside the message queue
277 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
279 new(slot) LocalType(&renderer, &Renderer::SetRenderingBehavior, renderingBehavior);
282 inline void SetDrawCommandsMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, Dali::DevelRenderer::DrawCommand* pDrawCommands, uint32_t size)
284 using LocalType = MessageValue2<Renderer, Dali::DevelRenderer::DrawCommand*, uint32_t>;
286 // Reserve some memory inside the message queue
287 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
289 new(slot) LocalType(&renderer, &Renderer::SetDrawCommands, pDrawCommands, size);
292 inline void SetRenderCallbackMessage(EventThreadServices& eventThreadServices, const Renderer& renderer, Dali::RenderCallback* callback)
294 using LocalType = MessageValue1<Renderer, Dali::RenderCallback*>;
296 // Reserve some memory inside the message queue
297 uint32_t* slot = eventThreadServices.ReserveMessageSlot(sizeof(LocalType));
299 new(slot) LocalType(&renderer, &Renderer::SetRenderCallback, callback);
302 } // namespace Dali::Internal::SceneGraph
304 #endif //DALI_INTERNAL_SCENE_GRAPH_RENDERER_MESSAGES_H