DirectRendering:
[platform/core/uifw/dali-core.git] / dali / internal / update / rendering / scene-graph-renderer.cpp
index dd765b8..9e982a8 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.
@@ -22,6 +22,7 @@
 #include <dali/internal/common/internal-constants.h>
 #include <dali/internal/common/memory-pool-object-allocator.h>
 #include <dali/internal/render/data-providers/node-data-provider.h>
+#include <dali/internal/render/data-providers/render-data-provider.h>
 #include <dali/internal/render/queue/render-queue.h>
 #include <dali/internal/render/renderers/render-geometry.h>
 #include <dali/internal/render/shaders/program.h>
@@ -115,7 +116,8 @@ enum Flags
   RESEND_STENCIL_OPERATION_ON_Z_PASS = 1 << 17,
   RESEND_WRITE_TO_COLOR_BUFFER       = 1 << 18,
   RESEND_SHADER                      = 1 << 19,
-  RESEND_DRAW_COMMANDS               = 1 << 20
+  RESEND_DRAW_COMMANDS               = 1 << 20,
+  RESEND_SET_RENDER_CALLBACK         = 1 << 21
 };
 
 } // Anonymous namespace
@@ -131,7 +133,6 @@ Renderer::Renderer()
   mTextureSet(nullptr),
   mGeometry(nullptr),
   mShader(nullptr),
-  mRenderDataProvider(nullptr),
   mBlendColor(nullptr),
   mStencilParameters(RenderMode::AUTO, StencilFunction::ALWAYS, 0xFF, 0x00, 0xFF, StencilOperation::KEEP, StencilOperation::KEEP, StencilOperation::KEEP),
   mIndexedDrawFirstElement(0u),
@@ -160,7 +161,6 @@ Renderer::~Renderer()
 {
   if(mTextureSet)
   {
-    mTextureSet->RemoveObserver(this);
     mTextureSet = nullptr;
   }
   if(mShader)
@@ -368,6 +368,13 @@ bool Renderer::PrepareRender(BufferIndex updateBufferIndex)
       new(slot) DerivedType(mRenderer, &Render::Renderer::SetShaderChanged, true);
     }
 
+    if(mResendFlag & RESEND_SET_RENDER_CALLBACK)
+    {
+      using DerivedType = MessageValue1<Render::Renderer, Dali::RenderCallback*>;
+      uint32_t* slot    = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType));
+      new(slot) DerivedType(mRenderer, &Render::Renderer::SetRenderCallback, mRenderCallback);
+    }
+
     mResendFlag = 0;
   }
 
@@ -378,16 +385,18 @@ void Renderer::SetTextures(TextureSet* textureSet)
 {
   DALI_ASSERT_DEBUG(textureSet != NULL && "Texture set pointer is NULL");
 
-  if(mTextureSet)
-  {
-    mTextureSet->RemoveObserver(this);
-  }
-
-  mTextureSet = textureSet;
-  mTextureSet->AddObserver(this);
+  mTextureSet           = textureSet;
   mRegenerateUniformMap = REGENERATE_UNIFORM_MAP;
+}
 
-  UpdateTextureSet();
+const Vector<Render::Texture*>* Renderer::GetTextures() const
+{
+  return mTextureSet ? &(mTextureSet->GetTextures()) : nullptr;
+}
+
+const Vector<Render::Sampler*>* Renderer::GetSamplers() const
+{
+  return mTextureSet ? &(mTextureSet->GetSamplers()) : nullptr;
 }
 
 void Renderer::SetShader(Shader* shader)
@@ -403,11 +412,6 @@ void Renderer::SetShader(Shader* shader)
   mShader->AddConnectionObserver(*this);
   mRegenerateUniformMap = REGENERATE_UNIFORM_MAP;
   mResendFlag |= RESEND_GEOMETRY | RESEND_SHADER;
-
-  if(mRenderDataProvider)
-  {
-    mRenderDataProvider->mShader = mShader;
-  }
 }
 
 void Renderer::SetGeometry(Render::Geometry* geometry)
@@ -605,6 +609,12 @@ void Renderer::SetStencilOperationOnZPass(StencilOperation::Type stencilOperatio
   mResendFlag |= RESEND_STENCIL_OPERATION_ON_Z_PASS;
 }
 
+void Renderer::SetRenderCallback(RenderCallback* callback)
+{
+  mRenderCallback = callback;
+  mResendFlag |= RESEND_SET_RENDER_CALLBACK;
+}
+
 const Render::Renderer::StencilParameters& Renderer::GetStencilParameters() const
 {
   return mStencilParameters;
@@ -636,10 +646,7 @@ void Renderer::ConnectToSceneGraph(SceneController& sceneController, BufferIndex
   mRegenerateUniformMap = REGENERATE_UNIFORM_MAP;
   mSceneController      = &sceneController;
 
-  mRenderDataProvider                          = new RenderDataProvider(mOpacity);
-  mRenderDataProvider->mUniformMapDataProvider = this;
-
-  mRenderer = Render::Renderer::New(mRenderDataProvider, mGeometry, mBlendBitmask, GetBlendColor(), static_cast<FaceCullingMode::Type>(mFaceCullingMode), mPremultipledAlphaEnabled, mDepthWriteMode, mDepthTestMode, mDepthFunction, mStencilParameters);
+  mRenderer = Render::Renderer::New(this, mGeometry, mBlendBitmask, GetBlendColor(), static_cast<FaceCullingMode::Type>(mFaceCullingMode), mPremultipledAlphaEnabled, mDepthWriteMode, mDepthTestMode, mDepthFunction, mStencilParameters);
 
   OwnerPointer<Render::Renderer> transferOwnership(mRenderer);
   mSceneController->GetRenderMessageDispatcher().AddRenderer(transferOwnership);
@@ -654,31 +661,7 @@ void Renderer::DisconnectFromSceneGraph(SceneController& sceneController, Buffer
     mSceneController->GetRenderMessageDispatcher().RemoveRenderer(*mRenderer);
     mRenderer = nullptr;
   }
-  mSceneController    = nullptr;
-  mRenderDataProvider = nullptr;
-}
-
-void Renderer::UpdateTextureSet()
-{
-  if(mRenderDataProvider)
-  {
-    if(mTextureSet)
-    {
-      uint32_t textureCount = mTextureSet->GetTextureCount();
-      mRenderDataProvider->mTextures.resize(textureCount);
-      mRenderDataProvider->mSamplers.resize(textureCount);
-      for(uint32_t i = 0; i < textureCount; ++i)
-      {
-        mRenderDataProvider->mTextures[i] = mTextureSet->GetTexture(i);
-        mRenderDataProvider->mSamplers[i] = mTextureSet->GetTextureSampler(i);
-      }
-    }
-    else
-    {
-      mRenderDataProvider->mTextures.clear();
-      mRenderDataProvider->mSamplers.clear();
-    }
-  }
+  mSceneController = nullptr;
 }
 
 Render::Renderer& Renderer::GetRenderer()
@@ -702,6 +685,11 @@ Renderer::OpacityType Renderer::GetOpacityType(BufferIndex updateBufferIndex, co
 
   switch(mBlendMode)
   {
+    case BlendMode::ON_WITHOUT_CULL: // If the renderer should always be use blending and never want to be transparent by alpha.
+    {
+      opacityType = Renderer::TRANSLUCENT;
+      break;
+    }
     case BlendMode::ON: // If the renderer should always be use blending
     {
       float alpha = node.GetWorldColor(updateBufferIndex).a * mOpacity[updateBufferIndex];
@@ -753,22 +741,6 @@ Renderer::OpacityType Renderer::GetOpacityType(BufferIndex updateBufferIndex, co
   return opacityType;
 }
 
-void Renderer::TextureSetChanged()
-{
-  mRegenerateUniformMap = REGENERATE_UNIFORM_MAP;
-
-  UpdateTextureSet();
-}
-
-void Renderer::TextureSetDeleted()
-{
-  mTextureSet = nullptr;
-
-  mRegenerateUniformMap = REGENERATE_UNIFORM_MAP;
-
-  UpdateTextureSet();
-}
-
 void Renderer::ConnectionsChanged(PropertyOwner& object)
 {
   // One of our child objects has changed it's connections. Ensure the uniform