[Tizen] Use DepthIndex for 3D rendering order 39/302539/1 accepted/tizen/7.0/unified/20231218.070957 accepted/tizen/7.0/unified/20231219.155806
authorseungho baek <sbsh.baek@samsung.com>
Tue, 5 Dec 2023 08:20:18 +0000 (17:20 +0900)
committerseungho baek <sbsh.baek@samsung.com>
Fri, 8 Dec 2023 06:57:57 +0000 (15:57 +0900)
Change-Id: I898668b515410c888e616b64ce103f833cc4f399
Signed-off-by: seungho baek <sbsh.baek@samsung.com>
automated-tests/src/dali/utc-Dali-Renderer.cpp
dali/internal/update/manager/render-instruction-processor.cpp

index 9dfa046..f3c0b1c 100644 (file)
@@ -2299,6 +2299,87 @@ int UtcDaliRendererRenderOrder2DLayerOverlay(void)
   END_TEST;
 }
 
+int UtcDaliRendererRenderOrder3DLayer(void)
+{
+  TestApplication application;
+  tet_infoline("Test the rendering order in a 3D layer is correct");
+
+  Shader   shader   = Shader::New("VertexSource", "FragmentSource");
+  Geometry geometry = CreateQuadGeometry();
+
+  application.GetScene().GetRootLayer().SetProperty(Layer::Property::BEHAVIOR, Layer::Behavior::LAYER_3D);
+  Actor root = application.GetScene().GetRootLayer();
+
+  Actor    actor0    = CreateActor(root, 0, TEST_LOCATION);
+  Renderer renderer0 = CreateRenderer(actor0, geometry, shader, 300);
+  actor0.SetProperty(Dali::Actor::Property::COLOR_MODE, USE_OWN_COLOR);
+
+  Actor    actor1    = CreateActor(root, 0, TEST_LOCATION);
+  Renderer renderer1 = CreateRenderer(actor1, geometry, shader, 200);
+  actor1.SetProperty(Dali::Actor::Property::OPACITY, 0.5f);
+  actor1.SetProperty(Dali::Actor::Property::COLOR_MODE, USE_OWN_COLOR);
+
+  Actor    actor2    = CreateActor(root, 0, TEST_LOCATION);
+  Renderer renderer2 = CreateRenderer(actor2, geometry, shader, 100);
+  actor2.SetProperty(Dali::Actor::Property::OPACITY, 0.5f);
+  actor2.SetProperty(Dali::Actor::Property::COLOR_MODE, USE_OWN_COLOR);
+
+  Actor    actor3    = CreateActor(root, 0, TEST_LOCATION);
+  Renderer renderer3 = CreateRenderer(actor3, geometry, shader, 0);
+  actor3.SetProperty(Dali::Actor::Property::OPACITY, 0.5f);
+  actor3.SetProperty(Dali::Actor::Property::COLOR_MODE, USE_OWN_COLOR);
+
+  application.SendNotification();
+  application.Render(0);
+
+  /*
+   * Create the following hierarchy:
+   *
+   *            actor2
+   *              /
+   *             /
+   *          actor1
+   *           /
+   *          /
+   *       actor0
+   *        /
+   *       /
+   *    actor3
+   *
+   *  Expected rendering order : actor0 - actor3 - actor2 - actor1
+   */
+  actor2.Add(actor1);
+  actor1.Add(actor0);
+  actor0.Add(actor3);
+  application.SendNotification();
+  application.Render(0);
+
+  TestGlAbstraction& gl = application.GetGlAbstraction();
+  gl.GetTextureTrace().Reset();
+  gl.EnableTextureCallTrace(true);
+  application.SendNotification();
+  application.Render(0);
+
+  int textureBindIndex[4];
+  for(unsigned int i(0); i < 4; ++i)
+  {
+    std::stringstream params;
+    params << std::hex << GL_TEXTURE_2D << std::dec << ", " << i + 1;
+    textureBindIndex[i] = gl.GetTextureTrace().FindIndexFromMethodAndParams("BindTexture", params.str());
+  }
+
+  //Check that actor3 has been rendered after actor0
+  DALI_TEST_GREATER(textureBindIndex[3], textureBindIndex[0], TEST_LOCATION);
+
+  //Check that actor2 has been rendered after actor3
+  DALI_TEST_GREATER(textureBindIndex[2], textureBindIndex[3], TEST_LOCATION);
+
+  //Check that actor1 has been rendered after actor2
+  DALI_TEST_GREATER(textureBindIndex[1], textureBindIndex[2], TEST_LOCATION);
+
+  END_TEST;
+}
+
 int UtcDaliRendererSetIndexRange(void)
 {
   std::string
index 86406ae..c55c95e 100644 (file)
@@ -106,6 +106,11 @@ bool CompareItems3D(const RenderInstructionProcessor::SortAttributes& lhs, const
     }
     else
     {
+      if(lhs.renderItem->mDepthIndex != rhs.renderItem->mDepthIndex)
+      {
+        return lhs.renderItem->mDepthIndex < rhs.renderItem->mDepthIndex;
+      }
+
       // If both RenderItems are transparent, sort using Z, then shader, then material, then geometry.
       if(Equals(lhs.zValue, rhs.zValue))
       {
@@ -254,7 +259,8 @@ inline void AddRendererToRenderList(BufferIndex               updateBufferIndex,
     bool isOpaque = true;
     if(!hasRenderCallback)
     {
-      Renderer::OpacityType opacityType = renderable.mRenderer ? renderable.mRenderer->GetOpacityType(updateBufferIndex, renderPass, *node) : Renderer::OPAQUE;
+      bool isVisualRenderer = (isLayer3d && !!(renderable.mRenderer->GetVisualProperties()));
+      Renderer::OpacityType opacityType = renderable.mRenderer ? (isVisualRenderer ? Renderer::TRANSLUCENT : renderable.mRenderer->GetOpacityType(updateBufferIndex, renderPass, *node)) : Renderer::OPAQUE;
 
       // We can skip render when node is not clipping and transparent
       skipRender = (opacityType == Renderer::TRANSPARENT && node->GetClippingMode() == ClippingMode::DISABLED);