From: Eunki Hong Date: Sun, 26 Mar 2023 07:08:30 +0000 (+0900) Subject: Mark as do not skip rendering if SceneGraphRenderer dirty X-Git-Tag: dali_2.2.20~4 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F57%2F290457%2F3;p=platform%2Fcore%2Fuifw%2Fdali-core.git 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 --- 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); }