From 2c58c8d6b86c4071f60e24ff2927da596487fe34 Mon Sep 17 00:00:00 2001 From: Eunki Hong Date: Sun, 26 Mar 2023 16:08:30 +0900 Subject: [PATCH] Mark as do not skip rendering if SceneGraphRenderer dirty 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 --- automated-tests/src/dali/utc-Dali-Renderer.cpp | 53 ++++++++++++++++++++++ .../update/rendering/scene-graph-renderer.cpp | 5 +- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/automated-tests/src/dali/utc-Dali-Renderer.cpp b/automated-tests/src/dali/utc-Dali-Renderer.cpp index 763fa67..b99feb0 100644 --- a/automated-tests/src/dali/utc-Dali-Renderer.cpp +++ b/automated-tests/src/dali/utc-Dali-Renderer.cpp @@ -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 diff --git a/dali/internal/update/rendering/scene-graph-renderer.cpp b/dali/internal/update/rendering/scene-graph-renderer.cpp index 1b666a4..c7f20c9 100644 --- a/dali/internal/update/rendering/scene-graph-renderer.cpp +++ b/dali/internal/update/rendering/scene-graph-renderer.cpp @@ -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); } -- 2.7.4