DirectRendering:
[platform/core/uifw/dali-core.git] / dali / internal / update / manager / render-instruction-processor.cpp
index 15a58e8..1ff28a8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2022 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.
@@ -194,7 +194,10 @@ inline void AddRendererToRenderList(BufferIndex         updateBufferIndex,
   Matrix  nodeModelViewMatrix(false);
   bool    nodeModelViewMatrixSet(false);
 
-  if(cull && renderable.mRenderer && !renderable.mRenderer->GetShader().HintEnabled(Dali::Shader::Hint::MODIFIES_GEOMETRY) && node->GetClippingMode() == ClippingMode::DISABLED)
+  // Don't cull items which have render callback
+  bool hasRenderCallback = (renderable.mRenderer && renderable.mRenderer->GetRenderCallback());
+
+  if(cull && renderable.mRenderer && (hasRenderCallback || (!renderable.mRenderer->GetShader().HintEnabled(Dali::Shader::Hint::MODIFIES_GEOMETRY) && node->GetClippingMode() == ClippingMode::DISABLED)))
   {
     const Vector4& boundingSphere = node->GetBoundingSphere();
     inside                        = (boundingSphere.w > Math::MACHINE_EPSILON_1000) &&
@@ -222,10 +225,18 @@ inline void AddRendererToRenderList(BufferIndex         updateBufferIndex,
 
   if(inside)
   {
-    Renderer::OpacityType opacityType = renderable.mRenderer ? renderable.mRenderer->GetOpacityType(updateBufferIndex, *node) : Renderer::OPAQUE;
+    bool skipRender(false);
+    bool isOpaque = true;
+    if(!hasRenderCallback)
+    {
+      Renderer::OpacityType opacityType = renderable.mRenderer ? renderable.mRenderer->GetOpacityType(updateBufferIndex, *node) : Renderer::OPAQUE;
+
+      // We can skip render when node is not clipping and transparent
+      skipRender = (opacityType == Renderer::TRANSPARENT && node->GetClippingMode() == ClippingMode::DISABLED);
+
+      isOpaque = (opacityType == Renderer::OPAQUE);
+    }
 
-    // We can skip render when node is not clipping and transparent
-    const bool skipRender(opacityType == Renderer::TRANSPARENT && node->GetClippingMode() == ClippingMode::DISABLED);
     if(!skipRender)
     {
       // Get the next free RenderItem.
@@ -237,18 +248,18 @@ inline void AddRendererToRenderList(BufferIndex         updateBufferIndex,
       auto& partialRenderingCacheInfo = node->GetPartialRenderingData().GetCurrentCacheInfo();
 
       partialRenderingCacheInfo.node       = node;
-      partialRenderingCacheInfo.isOpaque   = (opacityType == Renderer::OPAQUE);
+      partialRenderingCacheInfo.isOpaque   = isOpaque;
       partialRenderingCacheInfo.renderer   = renderable.mRenderer;
-      partialRenderingCacheInfo.color      = node->GetColor(updateBufferIndex);
+      partialRenderingCacheInfo.color      = node->GetWorldColor(updateBufferIndex);
       partialRenderingCacheInfo.depthIndex = node->GetDepthIndex();
 
-      if(renderable.mRenderer)
+      if(DALI_LIKELY(renderable.mRenderer))
       {
         partialRenderingCacheInfo.textureSet = renderable.mRenderer->GetTextureSet();
       }
 
       item.mNode     = node;
-      item.mIsOpaque = (opacityType == Renderer::OPAQUE);
+      item.mIsOpaque = isOpaque;
       item.mColor    = node->GetColor(updateBufferIndex);
 
       item.mDepthIndex = 0;
@@ -290,12 +301,26 @@ inline void AddRendererToRenderList(BufferIndex         updateBufferIndex,
       partialRenderingCacheInfo.updatedSize = item.mUpdateSize;
 
       item.mIsUpdated = partialRenderingData.IsUpdated() || item.mIsUpdated;
+
+      partialRenderingData.mRendered = true;
+
       partialRenderingData.SwapBuffers();
     }
+    else
+    {
+      // Mark as not rendered
+      auto& partialRenderingData     = node->GetPartialRenderingData();
+      partialRenderingData.mRendered = false;
+    }
+
     node->SetCulled(updateBufferIndex, false);
   }
   else
   {
+    // Mark as not rendered
+    auto& partialRenderingData     = node->GetPartialRenderingData();
+    partialRenderingData.mRendered = false;
+
     node->SetCulled(updateBufferIndex, true);
   }
 }
@@ -362,9 +387,15 @@ inline bool TryReuseCachedRenderers(Layer&               layer,
     size_t checkSumOld = 0;
     for(uint32_t index = 0; index < renderableCount; ++index)
     {
-      const Render::Renderer& renderer = renderables[index].mRenderer->GetRenderer();
-      checkSumNew += reinterpret_cast<std::size_t>(&renderer);
-      checkSumOld += reinterpret_cast<std::size_t>(&renderList.GetRenderer(index));
+      if(DALI_LIKELY(renderables[index].mRenderer))
+      {
+        const Render::Renderer& renderer = renderables[index].mRenderer->GetRenderer();
+        checkSumNew += reinterpret_cast<std::size_t>(&renderer);
+      }
+      if(DALI_LIKELY(renderList.GetItem(index).mRenderer))
+      {
+        checkSumOld += reinterpret_cast<std::size_t>(&renderList.GetRenderer(index));
+      }
     }
     if(checkSumNew == checkSumOld)
     {
@@ -433,7 +464,7 @@ inline void RenderInstructionProcessor::SortRenderItems(BufferIndex bufferIndex,
     {
       RenderItem& item = renderList.GetItem(index);
 
-      if(item.mRenderer)
+      if(DALI_LIKELY(item.mRenderer))
       {
         item.mRenderer->SetSortAttributes(mSortingHelper[index]);
       }
@@ -455,7 +486,10 @@ inline void RenderInstructionProcessor::SortRenderItems(BufferIndex bufferIndex,
     {
       RenderItem& item = renderList.GetItem(index);
 
-      item.mRenderer->SetSortAttributes(mSortingHelper[index]);
+      if(DALI_LIKELY(item.mRenderer))
+      {
+        item.mRenderer->SetSortAttributes(mSortingHelper[index]);
+      }
 
       // texture set
       mSortingHelper[index].textureSet = item.mTextureSet;