Mark as do not skip rendering if SceneGraphRenderer dirty 57/290457/3
authorEunki Hong <eunkiki.hong@samsung.com>
Sun, 26 Mar 2023 07:08:30 +0000 (16:08 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Mon, 27 Mar 2023 11:40:07 +0000 (20:40 +0900)
Previously, when we change textureset into renderer,
RenderTaskProcessor didn't process, and mark as "SkipRendering".

To avoid this bug, mark rendererUpdated if mDirtyFlag true,
so let we make mImpl->renderingRequired as true.

Change-Id: Ibace1fbddb7ba46f3cefca6d3e475ce34d414123
Signed-off-by: Eunki Hong <eunkiki.hong@samsung.com>
automated-tests/src/dali/utc-Dali-Renderer.cpp
dali/internal/update/rendering/scene-graph-renderer.cpp

index 763fa67..b99feb0 100644 (file)
@@ -4255,3 +4255,56 @@ int utcDaliRendererPartialUpdateAddRemoveRenderer(void)
 
   END_TEST;
 }
+
+int utcDaliRendererDoNotSkipRenderIfTextureSetChanged(void)
+{
+  TestApplication application;
+  tet_infoline("Check to not skip rendering in case of the TextureSet Changed");
+
+  TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
+  drawTrace.Enable(true);
+  drawTrace.Reset();
+
+  Actor actor = CreateRenderableActor();
+  actor.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+  actor.SetProperty(Actor::Property::SIZE, Vector3(80.0f, 80.0f, 0.0f));
+  application.GetScene().Add(actor);
+
+  // Make any animation to skip rendering.
+  // Delay duration must be bigger than 0.0f
+  Animation animation = Animation::New(2.0f);
+  animation.AnimateTo(Property(actor, Actor::Property::POSITION_X), 1.0f, TimePeriod(1.0f, 1.0f));
+  animation.Play();
+
+  DALI_TEST_EQUALS(actor.GetRendererCount(), 1u, TEST_LOCATION);
+
+  Renderer renderer = actor.GetRendererAt(0u);
+
+  Texture    image      = CreateTexture(TextureType::TEXTURE_2D, Pixel::RGB888, 64, 64);
+  TextureSet textureSet = CreateTextureSet(image);
+
+  // Render at least 2 frames
+  application.SendNotification();
+  application.Render();
+  application.SendNotification();
+  application.Render();
+
+  drawTrace.Reset();
+
+  application.SendNotification();
+  application.Render();
+
+  // Skip rendering
+  DALI_TEST_EQUALS(drawTrace.CountMethod("DrawElements"), 0, TEST_LOCATION);
+
+  // Change TextureSet
+  renderer.SetTextures(textureSet);
+
+  application.SendNotification();
+  application.Render(16u);
+
+  // Should not Skip rendering!
+  DALI_TEST_GREATER(drawTrace.CountMethod("DrawElements"), 0, TEST_LOCATION);
+
+  END_TEST;
+}
\ No newline at end of file
index 1b666a4..c7f20c9 100644 (file)
@@ -143,7 +143,7 @@ RendererKey Renderer::GetKey(Renderer* renderer)
 
 bool Renderer::PrepareRender(BufferIndex updateBufferIndex)
 {
-  bool rendererUpdated        = mResendFlag || mRenderingBehavior == DevelRenderer::Rendering::CONTINUOUSLY || mUpdateDecay > 0;
+  bool rendererUpdated        = mDirtyFlag || mResendFlag || mRenderingBehavior == DevelRenderer::Rendering::CONTINUOUSLY || mUpdateDecay > 0;
   auto shaderMapChangeCounter = mShader ? mShader->GetUniformMap().GetChangeCounter() : 0u;
   bool shaderMapChanged       = mShader && (mShaderMapChangeCounter != shaderMapChangeCounter);
   if(shaderMapChanged)
@@ -364,6 +364,7 @@ void Renderer::SetGeometry(Render::Geometry* geometry)
   DALI_ASSERT_DEBUG(geometry != NULL && "Geometry pointer is NULL");
   mGeometry = geometry;
 
+  mDirtyFlag = true;
   if(mRenderer)
   {
     mResendFlag |= RESEND_GEOMETRY;
@@ -589,6 +590,8 @@ float Renderer::GetOpacity(BufferIndex updateBufferIndex) const
 void Renderer::SetRenderingBehavior(DevelRenderer::Rendering::Type renderingBehavior)
 {
   mRenderingBehavior = renderingBehavior;
+
+  mDirtyFlag = true;
   SetUpdated(true);
 }