2 * Copyright (c) 2024 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 #include <dali/internal/update/rendering/scene-graph-renderer.h>
21 #include <dali/internal/common/blending-options.h>
22 #include <dali/internal/common/internal-constants.h>
23 #include <dali/internal/common/memory-pool-object-allocator.h>
24 #include <dali/internal/render/data-providers/node-data-provider.h>
25 #include <dali/internal/render/data-providers/render-data-provider.h>
26 #include <dali/internal/render/queue/render-queue.h>
27 #include <dali/internal/render/renderers/render-geometry.h>
28 #include <dali/internal/render/shaders/program.h>
29 #include <dali/internal/render/shaders/render-shader.h>
30 #include <dali/internal/update/controllers/render-message-dispatcher.h>
31 #include <dali/internal/update/controllers/scene-controller.h>
32 #include <dali/internal/update/nodes/node.h>
33 #include <dali/internal/update/rendering/scene-graph-texture-set.h>
35 #include <dali/internal/update/common/property-resetter.h>
36 #include <dali/internal/update/common/resetter-manager.h> ///< For AddInitializeResetter
38 #include <dali/integration-api/debug.h>
47 Debug::Filter* gSceneGraphRendererLogFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_SG_RENDERER");
50 namespace // unnamed namespace
52 // Memory pool used to allocate new renderers. Memory used by this pool will be released when shutting down DALi
53 MemoryPoolObjectAllocator<Renderer>& GetRendererMemoryPool()
55 static MemoryPoolObjectAllocator<Renderer> gRendererMemoryPool;
56 return gRendererMemoryPool;
59 // Flags for re-sending data to renderer.
62 RESEND_GEOMETRY = 1 << 0,
63 RESEND_FACE_CULLING_MODE = 1 << 1,
64 RESEND_BLEND_COLOR = 1 << 2,
65 RESEND_BLEND_BIT_MASK = 1 << 3,
66 RESEND_PREMULTIPLIED_ALPHA = 1 << 4,
67 RESEND_INDEXED_DRAW_FIRST_ELEMENT = 1 << 5,
68 RESEND_INDEXED_DRAW_ELEMENTS_COUNT = 1 << 6,
69 RESEND_DEPTH_WRITE_MODE = 1 << 7,
70 RESEND_DEPTH_TEST_MODE = 1 << 8,
71 RESEND_DEPTH_FUNCTION = 1 << 9,
72 RESEND_RENDER_MODE = 1 << 10,
73 RESEND_STENCIL_FUNCTION = 1 << 11,
74 RESEND_STENCIL_FUNCTION_MASK = 1 << 12,
75 RESEND_STENCIL_FUNCTION_REFERENCE = 1 << 13,
76 RESEND_STENCIL_MASK = 1 << 14,
77 RESEND_STENCIL_OPERATION_ON_FAIL = 1 << 15,
78 RESEND_STENCIL_OPERATION_ON_Z_FAIL = 1 << 16,
79 RESEND_STENCIL_OPERATION_ON_Z_PASS = 1 << 17,
80 RESEND_WRITE_TO_COLOR_BUFFER = 1 << 18,
81 RESEND_SHADER = 1 << 19,
82 RESEND_DRAW_COMMANDS = 1 << 20,
83 RESEND_SET_RENDER_CALLBACK = 1 << 21
86 } // Anonymous namespace
88 RendererKey Renderer::NewKey()
90 void* ptr = GetRendererMemoryPool().AllocateRawThreadSafe();
91 auto key = GetRendererMemoryPool().GetKeyFromPtr(static_cast<Renderer*>(ptr));
93 return RendererKey(key);
97 : mSceneController(nullptr),
102 mBlendColor(nullptr),
103 mStencilParameters(RenderMode::AUTO, StencilFunction::ALWAYS, 0xFF, 0x00, 0xFF, StencilOperation::KEEP, StencilOperation::KEEP, StencilOperation::KEEP),
104 mIndexedDrawFirstElement(0u),
105 mIndexedDrawElementsCount(0u),
108 mDepthFunction(DepthFunction::LESS),
109 mFaceCullingMode(FaceCullingMode::NONE),
110 mBlendMode(BlendMode::AUTO),
111 mDepthWriteMode(DepthWriteMode::AUTO),
112 mDepthTestMode(DepthTestMode::AUTO),
113 mRenderingBehavior(DevelRenderer::Rendering::IF_REQUIRED),
114 mUpdateDecay(Renderer::Decay::INITIAL),
115 mRegenerateUniformMap(false),
116 mPremultipledAlphaEnabled(false),
122 Renderer::~Renderer()
126 void Renderer::operator delete(void* ptr)
128 GetRendererMemoryPool().FreeThreadSafe(static_cast<Renderer*>(ptr));
131 Renderer* Renderer::Get(RendererKey::KeyType rendererKey)
133 return GetRendererMemoryPool().GetPtrFromKey(rendererKey);
136 RendererKey Renderer::GetKey(const Renderer& renderer)
138 return RendererKey(GetRendererMemoryPool().GetKeyFromPtr(const_cast<Renderer*>(&renderer)));
141 RendererKey Renderer::GetKey(Renderer* renderer)
143 return RendererKey(GetRendererMemoryPool().GetKeyFromPtr(renderer));
146 bool Renderer::PrepareRender(BufferIndex updateBufferIndex)
148 bool rendererUpdated = Updated() || mResendFlag || mRenderingBehavior == DevelRenderer::Rendering::CONTINUOUSLY || mUpdateDecay > 0;
149 auto shaderMapChangeCounter = mShader ? mShader->GetUniformMap().GetChangeCounter() : 0u;
150 bool shaderMapChanged = mShader && (mShaderMapChangeCounter != shaderMapChangeCounter);
153 mShaderMapChangeCounter = shaderMapChangeCounter;
156 if(mUniformMapChangeCounter != mUniformMaps.GetChangeCounter() || shaderMapChanged)
158 // The map has changed since the last time we checked.
159 rendererUpdated = true;
160 mRegenerateUniformMap = true;
161 mUpdateDecay = Renderer::Decay::INITIAL; // Render at least twice if the map has changed/actor has been added
163 // Update local counters to identify any future changes to maps
164 // (unlikely, but allowed by API).
165 mUniformMapChangeCounter = mUniformMaps.GetChangeCounter();
169 mUpdateDecay = static_cast<Renderer::Decay>(static_cast<int>(mUpdateDecay) - 1);
172 if(mResendFlag || mRenderingBehavior == DevelRenderer::Rendering::CONTINUOUSLY) // We don't check mUpdateDecay
179 Render::Renderer* rendererPtr = mRenderer.Get();
180 if(mResendFlag & RESEND_GEOMETRY)
182 typedef MessageValue1<Render::Renderer, Render::Geometry*> DerivedType;
183 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
184 new(slot) DerivedType(rendererPtr, &Render::Renderer::SetGeometry, mGeometry);
187 if(mResendFlag & RESEND_DRAW_COMMANDS)
189 using DerivedType = MessageValue2<Render::Renderer, Dali::DevelRenderer::DrawCommand*, uint32_t>;
190 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
191 new(slot) DerivedType(rendererPtr, &Render::Renderer::SetDrawCommands, mDrawCommands.data(), mDrawCommands.size());
194 if(mResendFlag & RESEND_FACE_CULLING_MODE)
196 using DerivedType = MessageValue1<Render::Renderer, FaceCullingMode::Type>;
197 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
198 new(slot) DerivedType(rendererPtr, &Render::Renderer::SetFaceCullingMode, mFaceCullingMode);
201 if(mResendFlag & RESEND_BLEND_BIT_MASK)
203 using DerivedType = MessageValue1<Render::Renderer, uint32_t>;
204 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
205 new(slot) DerivedType(rendererPtr, &Render::Renderer::SetBlendingBitMask, mBlendBitmask);
208 if(mResendFlag & RESEND_BLEND_COLOR)
210 using DerivedType = MessageValue1<Render::Renderer, Vector4>;
211 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
212 new(slot) DerivedType(rendererPtr, &Render::Renderer::SetBlendColor, GetBlendColor());
215 if(mResendFlag & RESEND_PREMULTIPLIED_ALPHA)
217 using DerivedType = MessageValue1<Render::Renderer, bool>;
218 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
219 new(slot) DerivedType(rendererPtr, &Render::Renderer::EnablePreMultipliedAlpha, mPremultipledAlphaEnabled);
222 if(mResendFlag & RESEND_INDEXED_DRAW_FIRST_ELEMENT)
224 using DerivedType = MessageValue1<Render::Renderer, uint32_t>;
225 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
226 new(slot) DerivedType(rendererPtr, &Render::Renderer::SetIndexedDrawFirstElement, mIndexedDrawFirstElement);
229 if(mResendFlag & RESEND_INDEXED_DRAW_ELEMENTS_COUNT)
231 using DerivedType = MessageValue1<Render::Renderer, uint32_t>;
232 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
233 new(slot) DerivedType(rendererPtr, &Render::Renderer::SetIndexedDrawElementsCount, mIndexedDrawElementsCount);
236 if(mResendFlag & RESEND_DEPTH_WRITE_MODE)
238 using DerivedType = MessageValue1<Render::Renderer, DepthWriteMode::Type>;
239 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
240 new(slot) DerivedType(rendererPtr, &Render::Renderer::SetDepthWriteMode, mDepthWriteMode);
243 if(mResendFlag & RESEND_DEPTH_TEST_MODE)
245 using DerivedType = MessageValue1<Render::Renderer, DepthTestMode::Type>;
246 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
247 new(slot) DerivedType(rendererPtr, &Render::Renderer::SetDepthTestMode, mDepthTestMode);
250 if(mResendFlag & RESEND_DEPTH_FUNCTION)
252 using DerivedType = MessageValue1<Render::Renderer, DepthFunction::Type>;
253 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
254 new(slot) DerivedType(rendererPtr, &Render::Renderer::SetDepthFunction, mDepthFunction);
257 if(mResendFlag & RESEND_RENDER_MODE)
259 using DerivedType = MessageValue1<Render::Renderer, RenderMode::Type>;
260 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
261 new(slot) DerivedType(rendererPtr, &Render::Renderer::SetRenderMode, mStencilParameters.renderMode);
264 if(mResendFlag & RESEND_STENCIL_FUNCTION)
266 using DerivedType = MessageValue1<Render::Renderer, StencilFunction::Type>;
267 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
268 new(slot) DerivedType(rendererPtr, &Render::Renderer::SetStencilFunction, mStencilParameters.stencilFunction);
271 if(mResendFlag & RESEND_STENCIL_FUNCTION_MASK)
273 using DerivedType = MessageValue1<Render::Renderer, int>;
274 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
275 new(slot) DerivedType(rendererPtr, &Render::Renderer::SetStencilFunctionMask, mStencilParameters.stencilFunctionMask);
278 if(mResendFlag & RESEND_STENCIL_FUNCTION_REFERENCE)
280 using DerivedType = MessageValue1<Render::Renderer, int>;
281 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
282 new(slot) DerivedType(rendererPtr, &Render::Renderer::SetStencilFunctionReference, mStencilParameters.stencilFunctionReference);
285 if(mResendFlag & RESEND_STENCIL_MASK)
287 using DerivedType = MessageValue1<Render::Renderer, int>;
288 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
289 new(slot) DerivedType(rendererPtr, &Render::Renderer::SetStencilMask, mStencilParameters.stencilMask);
292 if(mResendFlag & RESEND_STENCIL_OPERATION_ON_FAIL)
294 using DerivedType = MessageValue1<Render::Renderer, StencilOperation::Type>;
295 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
296 new(slot) DerivedType(rendererPtr, &Render::Renderer::SetStencilOperationOnFail, mStencilParameters.stencilOperationOnFail);
299 if(mResendFlag & RESEND_STENCIL_OPERATION_ON_Z_FAIL)
301 using DerivedType = MessageValue1<Render::Renderer, StencilOperation::Type>;
302 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
303 new(slot) DerivedType(rendererPtr, &Render::Renderer::SetStencilOperationOnZFail, mStencilParameters.stencilOperationOnZFail);
306 if(mResendFlag & RESEND_STENCIL_OPERATION_ON_Z_PASS)
308 using DerivedType = MessageValue1<Render::Renderer, StencilOperation::Type>;
309 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
310 new(slot) DerivedType(rendererPtr, &Render::Renderer::SetStencilOperationOnZPass, mStencilParameters.stencilOperationOnZPass);
313 if(mResendFlag & RESEND_SHADER)
315 using DerivedType = MessageValue1<Render::Renderer, bool>;
316 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
317 new(slot) DerivedType(rendererPtr, &Render::Renderer::SetShaderChanged, true);
320 if(mResendFlag & RESEND_SET_RENDER_CALLBACK)
322 using DerivedType = MessageValue1<Render::Renderer, Dali::RenderCallback*>;
323 uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
324 new(slot) DerivedType(rendererPtr, &Render::Renderer::SetRenderCallback, mRenderCallback);
329 // Ensure collected map is up to date
330 UpdateUniformMap(updateBufferIndex);
332 return rendererUpdated;
335 void Renderer::SetTextures(TextureSet* textureSet)
337 DALI_ASSERT_DEBUG(textureSet != NULL && "Texture set pointer is NULL");
339 if(mTextureSet != textureSet)
341 mTextureSet = textureSet;
347 const Vector<Render::TextureKey>* Renderer::GetTextures() const
349 return mTextureSet ? &(mTextureSet->GetTextures()) : nullptr;
352 const Vector<Render::Sampler*>* Renderer::GetSamplers() const
354 return mTextureSet ? &(mTextureSet->GetSamplers()) : nullptr;
357 void Renderer::SetShader(Shader* shader)
359 DALI_ASSERT_DEBUG(shader != NULL && "Shader pointer is NULL");
361 if(mShader != shader)
364 mShaderMapChangeCounter = 0u;
365 mRegenerateUniformMap = true;
366 mResendFlag |= RESEND_GEOMETRY | RESEND_SHADER;
372 void Renderer::SetGeometry(Render::Geometry* geometry)
374 DALI_ASSERT_DEBUG(geometry != NULL && "Geometry pointer is NULL");
375 if(mGeometry != geometry)
377 mGeometry = geometry;
381 mResendFlag |= RESEND_GEOMETRY;
387 void Renderer::SetDepthIndex(int depthIndex)
389 if(mDepthIndex != depthIndex)
391 mDepthIndex = depthIndex;
397 void Renderer::SetFaceCullingMode(FaceCullingMode::Type faceCullingMode)
399 if(mFaceCullingMode != faceCullingMode)
401 mFaceCullingMode = faceCullingMode;
402 mResendFlag |= RESEND_FACE_CULLING_MODE;
408 FaceCullingMode::Type Renderer::GetFaceCullingMode() const
410 return mFaceCullingMode;
413 void Renderer::SetBlendMode(BlendMode::Type blendingMode)
415 if(mBlendMode != blendingMode)
417 mBlendMode = blendingMode;
423 BlendMode::Type Renderer::GetBlendMode() const
428 void Renderer::SetBlendingOptions(uint32_t options)
430 if(mBlendBitmask != options)
432 mBlendBitmask = options;
433 mResendFlag |= RESEND_BLEND_BIT_MASK;
439 uint32_t Renderer::GetBlendingOptions() const
441 return mBlendBitmask;
444 void Renderer::SetBlendColor(const Vector4& blendColor)
446 if(blendColor == Color::TRANSPARENT)
448 mBlendColor = nullptr;
454 mBlendColor = new Vector4(blendColor);
458 *mBlendColor = blendColor;
462 mResendFlag |= RESEND_BLEND_COLOR;
467 Vector4 Renderer::GetBlendColor() const
473 return Color::TRANSPARENT;
476 void Renderer::SetIndexedDrawFirstElement(uint32_t firstElement)
478 if(mIndexedDrawFirstElement != firstElement)
480 mIndexedDrawFirstElement = firstElement;
481 mResendFlag |= RESEND_INDEXED_DRAW_FIRST_ELEMENT;
487 uint32_t Renderer::GetIndexedDrawFirstElement() const
489 return mIndexedDrawFirstElement;
492 void Renderer::SetIndexedDrawElementsCount(uint32_t elementsCount)
494 if(mIndexedDrawElementsCount != elementsCount)
496 mIndexedDrawElementsCount = elementsCount;
497 mResendFlag |= RESEND_INDEXED_DRAW_ELEMENTS_COUNT;
503 uint32_t Renderer::GetIndexedDrawElementsCount() const
505 return mIndexedDrawElementsCount;
508 void Renderer::EnablePreMultipliedAlpha(bool preMultipled)
510 if(mPremultipledAlphaEnabled != preMultipled)
512 mPremultipledAlphaEnabled = preMultipled;
513 mResendFlag |= RESEND_PREMULTIPLIED_ALPHA;
519 bool Renderer::IsPreMultipliedAlphaEnabled() const
521 return mPremultipledAlphaEnabled;
524 void Renderer::SetDepthWriteMode(DepthWriteMode::Type depthWriteMode)
526 mDepthWriteMode = depthWriteMode;
527 mResendFlag |= RESEND_DEPTH_WRITE_MODE;
530 DepthWriteMode::Type Renderer::GetDepthWriteMode() const
532 return mDepthWriteMode;
535 void Renderer::SetDepthTestMode(DepthTestMode::Type depthTestMode)
537 mDepthTestMode = depthTestMode;
538 mResendFlag |= RESEND_DEPTH_TEST_MODE;
541 DepthTestMode::Type Renderer::GetDepthTestMode() const
543 return mDepthTestMode;
546 void Renderer::SetDepthFunction(DepthFunction::Type depthFunction)
548 mDepthFunction = depthFunction;
549 mResendFlag |= RESEND_DEPTH_FUNCTION;
552 DepthFunction::Type Renderer::GetDepthFunction() const
554 return mDepthFunction;
557 void Renderer::SetRenderMode(RenderMode::Type mode)
559 mStencilParameters.renderMode = mode;
560 mResendFlag |= RESEND_RENDER_MODE;
563 void Renderer::SetStencilFunction(StencilFunction::Type stencilFunction)
565 mStencilParameters.stencilFunction = stencilFunction;
566 mResendFlag |= RESEND_STENCIL_FUNCTION;
569 void Renderer::SetStencilFunctionMask(int stencilFunctionMask)
571 mStencilParameters.stencilFunctionMask = stencilFunctionMask;
572 mResendFlag |= RESEND_STENCIL_FUNCTION_MASK;
575 void Renderer::SetStencilFunctionReference(int stencilFunctionReference)
577 mStencilParameters.stencilFunctionReference = stencilFunctionReference;
578 mResendFlag |= RESEND_STENCIL_FUNCTION_REFERENCE;
581 void Renderer::SetStencilMask(int stencilMask)
583 mStencilParameters.stencilMask = stencilMask;
584 mResendFlag |= RESEND_STENCIL_MASK;
587 void Renderer::SetStencilOperationOnFail(StencilOperation::Type stencilOperationOnFail)
589 mStencilParameters.stencilOperationOnFail = stencilOperationOnFail;
590 mResendFlag |= RESEND_STENCIL_OPERATION_ON_FAIL;
593 void Renderer::SetStencilOperationOnZFail(StencilOperation::Type stencilOperationOnZFail)
595 mStencilParameters.stencilOperationOnZFail = stencilOperationOnZFail;
596 mResendFlag |= RESEND_STENCIL_OPERATION_ON_Z_FAIL;
599 void Renderer::SetStencilOperationOnZPass(StencilOperation::Type stencilOperationOnZPass)
601 mStencilParameters.stencilOperationOnZPass = stencilOperationOnZPass;
602 mResendFlag |= RESEND_STENCIL_OPERATION_ON_Z_PASS;
605 void Renderer::SetRenderCallback(RenderCallback* callback)
607 if(mRenderCallback != callback)
609 mRenderCallback = callback;
610 mResendFlag |= RESEND_SET_RENDER_CALLBACK;
616 const Render::Renderer::StencilParameters& Renderer::GetStencilParameters() const
618 return mStencilParameters;
621 void Renderer::BakeOpacity(BufferIndex updateBufferIndex, float opacity)
623 mOpacity.Bake(updateBufferIndex, opacity);
628 float Renderer::GetOpacity(BufferIndex updateBufferIndex) const
630 return mOpacity[updateBufferIndex];
633 void Renderer::SetRenderingBehavior(DevelRenderer::Rendering::Type renderingBehavior)
635 if(mRenderingBehavior != renderingBehavior)
637 mRenderingBehavior = renderingBehavior;
643 DevelRenderer::Rendering::Type Renderer::GetRenderingBehavior() const
645 return mRenderingBehavior;
648 void Renderer::DetachFromNodeDataProvider(const NodeDataProvider& node)
650 // TODO : Can we send this by Resend flag, or message?
651 // Currently, we call DetachFromNodeDataProvider function even if Renderer is destroyed case.
652 // We don't need to call that function if mRenderer is destroyed.
654 // But also, there is no way to validate node's lifecycle. So just detach synchronously.
657 Render::Renderer* rendererPtr = mRenderer.Get();
658 rendererPtr->DetachFromNodeDataProvider(node);
662 // Called when SceneGraph::Renderer is added to update manager ( that happens when an "event-thread renderer" is created )
663 void Renderer::ConnectToSceneGraph(SceneController& sceneController, BufferIndex bufferIndex)
665 mRegenerateUniformMap = true;
666 mSceneController = &sceneController;
668 mRenderer = Render::Renderer::NewKey(this, mGeometry, mBlendBitmask, GetBlendColor(), static_cast<FaceCullingMode::Type>(mFaceCullingMode), mPremultipledAlphaEnabled, mDepthWriteMode, mDepthTestMode, mDepthFunction, mStencilParameters);
670 mSceneController->GetRenderMessageDispatcher().AddRenderer(mRenderer);
673 // Called just before destroying the scene-graph renderer ( when the "event-thread renderer" is no longer referenced )
674 void Renderer::DisconnectFromSceneGraph(SceneController& sceneController, BufferIndex bufferIndex)
676 // Remove renderer from RenderManager
679 mSceneController->GetRenderMessageDispatcher().RemoveRenderer(mRenderer);
680 mRenderer = Render::RendererKey{};
682 mSceneController = nullptr;
685 Render::RendererKey Renderer::GetRenderer() const
690 Renderer::OpacityType Renderer::GetOpacityType(BufferIndex updateBufferIndex, uint32_t renderPass, const Node& node) const
692 Renderer::OpacityType opacityType = Renderer::OPAQUE;
694 if(node.IsTransparent())
696 return Renderer::TRANSPARENT;
701 case BlendMode::ON_WITHOUT_CULL: // If the renderer should always be use blending and never want to be transparent by alpha.
703 opacityType = Renderer::TRANSLUCENT;
706 case BlendMode::ON: // If the renderer should always be use blending
708 float alpha = node.GetWorldColor(updateBufferIndex).a * mOpacity[updateBufferIndex];
709 if(alpha <= FULLY_TRANSPARENT)
711 opacityType = Renderer::TRANSPARENT;
715 opacityType = Renderer::TRANSLUCENT;
719 case BlendMode::AUTO:
721 if(BlendingOptions::IsAdvancedBlendEquationIncluded(mBlendBitmask))
723 opacityType = Renderer::TRANSLUCENT;
727 if(mTextureSet && mTextureSet->HasAlpha())
729 opacityType = Renderer::TRANSLUCENT;
733 const auto& shaderData = mShader->GetShaderData(renderPass);
734 if(shaderData && shaderData->HintEnabled(Dali::Shader::Hint::OUTPUT_IS_TRANSPARENT))
736 opacityType = Renderer::TRANSLUCENT;
740 // renderer should determine opacity using the actor color
741 float alpha = node.GetWorldColor(updateBufferIndex).a * mOpacity[updateBufferIndex];
742 if(alpha <= FULLY_TRANSPARENT)
744 opacityType = Renderer::TRANSPARENT;
746 else if(alpha <= FULLY_OPAQUE)
748 opacityType = Renderer::TRANSLUCENT;
753 case BlendMode::USE_ACTOR_OPACITY: // the renderer should never use blending
755 // renderer should determine opacity using the actor color
756 float alpha = node.GetWorldColor(updateBufferIndex).a;
757 if(alpha <= FULLY_TRANSPARENT)
759 opacityType = Renderer::TRANSPARENT;
761 else if(alpha < FULLY_OPAQUE)
763 opacityType = Renderer::TRANSLUCENT;
767 opacityType = Renderer::OPAQUE;
771 case BlendMode::OFF: // the renderer should never use blending
774 opacityType = Renderer::OPAQUE;
782 void Renderer::UpdateUniformMap(BufferIndex updateBufferIndex)
784 if(mRegenerateUniformMap)
786 CollectedUniformMap& localMap = mCollectedUniformMap;
789 const UniformMap& rendererUniformMap = PropertyOwner::GetUniformMap();
791 auto size = rendererUniformMap.Count();
794 size += mShader->GetUniformMap().Count();
797 localMap.Reserve(size);
798 localMap.AddMappings(rendererUniformMap);
801 localMap.AddMappings(mShader->GetUniformMap());
803 localMap.UpdateChangeCounter();
805 mRegenerateUniformMap = false;
810 void Renderer::SetDrawCommands(Dali::DevelRenderer::DrawCommand* pDrawCommands, uint32_t size)
812 mDrawCommands.clear();
813 mDrawCommands.insert(mDrawCommands.end(), pDrawCommands, pDrawCommands + size);
814 mResendFlag |= RESEND_DRAW_COMMANDS;
817 bool Renderer::IsDirty() const
819 // Check whether the opacity property has changed
820 return (Updated() || !mOpacity.IsClean());
823 void Renderer::ResetToBaseValues(BufferIndex updateBufferIndex)
825 mOpacity.ResetToBaseValue(updateBufferIndex);
826 if(mVisualProperties)
828 mVisualProperties->ResetToBaseValues(updateBufferIndex);
832 void Renderer::MarkAsDirty()
834 mOpacity.MarkAsDirty();
835 if(mVisualProperties)
837 mVisualProperties->MarkAsDirty();
841 uint32_t Renderer::GetMemoryPoolCapacity()
843 return GetRendererMemoryPool().GetCapacity();
846 void Renderer::OnMappingChanged()
848 // Properties have been registered on the base class.
849 mRegenerateUniformMap = true; // Should remain true until this renderer is added to a RenderList.
852 void Renderer::AddInitializeResetter(ResetterManager& manager) const
854 manager.AddRendererResetter(*this);
857 const CollectedUniformMap& Renderer::GetCollectedUniformMap() const
859 return mCollectedUniformMap;
862 bool Renderer::IsUpdated() const
864 if(Updated() || (mShader && mShader->Updated()))
871 Vector4 Renderer::GetVisualTransformedUpdateArea(BufferIndex updateBufferIndex, const Vector4& originalUpdateArea) noexcept
873 if(mVisualProperties)
875 return mVisualProperties->GetVisualTransformedUpdateArea(updateBufferIndex, originalUpdateArea);
877 return originalUpdateArea;
880 } // namespace SceneGraph
881 } // namespace Internal