Created PartialRenderingDataProvider to store per-frame data
[platform/core/uifw/dali-core.git] / dali / internal / update / manager / render-instruction-processor.cpp
index 37f9236..7508c73 100644 (file)
@@ -31,7 +31,6 @@
 #include <dali/internal/render/common/render-instruction-container.h>
 #include <dali/internal/render/shaders/scene-graph-shader.h>
 #include <dali/internal/render/renderers/render-renderer.h>
-#include <dali/internal/render/renderers/render-property-buffer.h>
 #include <dali/internal/update/nodes/scene-graph-layer.h>
 
 namespace
@@ -177,27 +176,36 @@ inline void AddRendererToRenderList(BufferIndex updateBufferIndex,
       // Get the next free RenderItem.
       RenderItem& item = renderList.GetNextFreeItem();
 
-      item.mIsUpdated = (item.mNode != renderable.mNode);
-      item.mNode = renderable.mNode;
+      // Get cached values
+      auto& partialRenderingData = node->GetPartialRenderingData();
+
+      auto& partialRenderingCacheInfo = node->GetPartialRenderingData().GetCurrentCacheInfo();
+
+      partialRenderingCacheInfo.node = node;
+      partialRenderingCacheInfo.isOpaque = (opacityType == Renderer::OPAQUE);
+      partialRenderingCacheInfo.renderer = renderable.mRenderer;
+      partialRenderingCacheInfo.color = renderable.mNode->GetColor(updateBufferIndex);
+      partialRenderingCacheInfo.depthIndex = renderable.mNode->GetDepthIndex();
 
-      bool prevIsOpaque = item.mIsOpaque;
+      if( renderable.mRenderer )
+      {
+        partialRenderingCacheInfo.textureSet = renderable.mRenderer->GetTextures();
+      }
+
+      item.mNode = renderable.mNode;
       item.mIsOpaque = (opacityType == Renderer::OPAQUE);
-      item.mIsUpdated |= (prevIsOpaque != item.mIsOpaque);
+      item.mColor = renderable.mNode->GetColor(updateBufferIndex);
 
-      int prevDepthIndex = item.mDepthIndex;
       item.mDepthIndex = 0;
       if (!isLayer3d)
       {
         item.mDepthIndex = renderable.mNode->GetDepthIndex();
       }
 
-      Render::Renderer* prevRenderer = item.mRenderer;
       if (DALI_LIKELY(renderable.mRenderer))
       {
         item.mRenderer = &renderable.mRenderer->GetRenderer();
-        const void* prevTextureSet = item.mTextureSet;
         item.mTextureSet = renderable.mRenderer->GetTextures();
-        item.mIsUpdated |= (prevTextureSet != item.mTextureSet);
         item.mDepthIndex += renderable.mRenderer->GetDepthIndex();
       }
       else
@@ -205,29 +213,15 @@ inline void AddRendererToRenderList(BufferIndex updateBufferIndex,
         item.mRenderer = nullptr;
       }
 
-      item.mIsUpdated |= (prevDepthIndex != item.mDepthIndex);
-      item.mIsUpdated |= (prevRenderer != item.mRenderer);
       item.mIsUpdated |= isLayer3d;
 
-      if (!item.mIsUpdated)
-      {
-        Matrix prevModelViewMatrix = item.mModelViewMatrix;
-        Vector3 prevSize = item.mSize;
+      // Save ModelView matrix onto the item.
+      node->GetWorldMatrixAndSize( item.mModelMatrix, item.mSize );
+      Matrix::Multiply( item.mModelViewMatrix, item.mModelMatrix, viewMatrix );
 
-        // Save ModelView matrix onto the item.
-        node->GetWorldMatrixAndSize( item.mModelMatrix, item.mSize );
-        Matrix::Multiply( item.mModelViewMatrix, item.mModelMatrix, viewMatrix );
+      partialRenderingCacheInfo.matrix = item.mModelViewMatrix;
+      partialRenderingCacheInfo.size = item.mSize;
 
-        item.mIsUpdated = ((prevSize != item.mSize) || (item.mModelViewMatrix != prevModelViewMatrix));
-      }
-      else
-      {
-        // Save ModelView matrix onto the item.
-        node->GetWorldMatrixAndSize( item.mModelMatrix, item.mSize );
-        Matrix::Multiply( item.mModelViewMatrix, item.mModelMatrix, viewMatrix );
-      }
-
-      item.mUpdateSize = node->GetUpdateSizeHint();
       if (item.mUpdateSize == Vector3::ZERO)
       {
         // RenderItem::CalculateViewportSpaceAABB cannot cope with z transform
@@ -237,8 +231,11 @@ inline void AddRendererToRenderList(BufferIndex updateBufferIndex,
           item.mUpdateSize = item.mSize;
         }
       }
-    }
+      partialRenderingCacheInfo.updatedSize = item.mUpdateSize;
 
+      item.mIsUpdated = partialRenderingData.IsUpdated() || item.mIsUpdated;
+      partialRenderingData.SwapBuffers();
+    }
     node->SetCulled( updateBufferIndex, false );
   }
   else
@@ -348,9 +345,7 @@ RenderInstructionProcessor::RenderInstructionProcessor()
   mSortComparitors.PushBack( CompareItems3DWithClipping );
 }
 
-RenderInstructionProcessor::~RenderInstructionProcessor()
-{
-}
+RenderInstructionProcessor::~RenderInstructionProcessor() = default;
 
 inline void RenderInstructionProcessor::SortRenderItems( BufferIndex bufferIndex, RenderList& renderList, Layer& layer, bool respectClippingOrder )
 {
@@ -434,7 +429,6 @@ inline void RenderInstructionProcessor::SortRenderItems( BufferIndex bufferIndex
 
 void RenderInstructionProcessor::Prepare( BufferIndex updateBufferIndex,
                                           SortedLayerPointers& sortedLayers,
-                                          Context& context,
                                           RenderTask& renderTask,
                                           bool cull,
                                           bool hasClippingNodes,
@@ -456,7 +450,7 @@ void RenderInstructionProcessor::Prepare( BufferIndex updateBufferIndex,
     Layer& layer = **iter;
     const bool tryReuseRenderList( viewMatrixHasNotChanged && layer.CanReuseRenderers( &renderTask.GetCamera() ) );
     const bool isLayer3D = layer.GetBehavior() == Dali::Layer::LAYER_3D;
-    RenderList* renderList = NULL;
+    RenderList* renderList = nullptr;
 
     if( layer.IsRoot() && ( layer.GetDirtyFlags() != NodePropertyFlags::NOTHING ) )
     {
@@ -514,7 +508,6 @@ void RenderInstructionProcessor::Prepare( BufferIndex updateBufferIndex,
 
   if( isRenderListAdded || instruction.mIsClearColorSet || isRootLayerDirty )
   {
-    instruction.mContext = &context;
     instructions.PushBack( updateBufferIndex, &instruction );
   }
 }