From 06e29f89f57a1219bbb8af322bf07de0da1dbe3d Mon Sep 17 00:00:00 2001 From: "Eunki, Hong" Date: Thu, 18 Apr 2024 18:02:25 +0900 Subject: [PATCH] Do not create unneccessary sampler We can 'skip' sampler for TextureSet if we want to use default wrap mode. So usual cases, we don't need to create and set Sampler objects. Change-Id: Ic1d0cf21d80e62f5bdf8209402e2a3a4612bd598 Signed-off-by: Eunki, Hong --- .../src/dali-toolkit/utc-Dali-ImageVisual.cpp | 87 ++++++++++++++++++++++ .../visuals/animated-image/fixed-image-cache.cpp | 6 -- .../rolling-animated-image-cache.cpp | 6 +- .../visuals/animated-image/rolling-image-cache.cpp | 6 -- .../internal/visuals/gradient/gradient-visual.cpp | 11 ++- .../internal/visuals/image/image-visual.cpp | 15 ++-- .../internal/visuals/npatch/npatch-visual.cpp | 16 +--- 7 files changed, 108 insertions(+), 39 deletions(-) diff --git a/automated-tests/src/dali-toolkit/utc-Dali-ImageVisual.cpp b/automated-tests/src/dali-toolkit/utc-Dali-ImageVisual.cpp index 0bd455b..319d4d4 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-ImageVisual.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-ImageVisual.cpp @@ -1384,6 +1384,93 @@ int UtcDaliImageVisualCustomWrapModePixelArea(void) END_TEST; } + +int UtcDaliImageVisualCustomWrapModePixelArea02(void) +{ + ToolkitTestApplication application; + tet_infoline("Request image visual with a Property::Map, test custom wrap mode and pixel area"); + + static std::vector customUniforms = + { + UniformData("pixelArea", Property::Type::VECTOR4), + UniformData("wrapMode", Property::Type::VECTOR2), + }; + + TestGraphicsController& graphics = application.GetGraphicsController(); + graphics.AddCustomUniforms(customUniforms); + + VisualFactory factory = VisualFactory::Get(); + DALI_TEST_CHECK(factory); + + // Test wrap mode with atlasing. Image with a size smaller than 512*512 will be uploaded as a part of the atlas. + const int width = 34; + const int height = 34; + const Vector4 pixelArea(-0.5f, -0.5f, 2.f, 2.f); + + Property::Map propertyMap; + propertyMap.Insert(Toolkit::Visual::Property::TYPE, Visual::IMAGE); + propertyMap.Insert(ImageVisual::Property::URL, TEST_SMALL_IMAGE_FILE_NAME); + propertyMap.Insert(ImageVisual::Property::DESIRED_WIDTH, width); + propertyMap.Insert(ImageVisual::Property::DESIRED_HEIGHT, height); + propertyMap.Insert(ImageVisual::Property::SYNCHRONOUS_LOADING, false); + propertyMap.Insert(ImageVisual::Property::PIXEL_AREA, pixelArea); + propertyMap.Insert(ImageVisual::Property::WRAP_MODE_U, WrapMode::MIRRORED_REPEAT); + propertyMap.Insert(ImageVisual::Property::WRAP_MODE_V, WrapMode::CLAMP_TO_EDGE); + + Visual::Base visual = factory.CreateVisual(propertyMap); + DALI_TEST_CHECK(visual); + + TestGlAbstraction& gl = application.GetGlAbstraction(); + TraceCallStack& textureTrace = gl.GetTextureTrace(); + textureTrace.Enable(true); + TraceCallStack& texParameterTrace = gl.GetTexParameterTrace(); + texParameterTrace.Enable(true); + + DummyControl actor = DummyControl::New(); + DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual(Control::CONTROL_PROPERTY_END_INDEX + 1, visual); + actor.SetProperty(Actor::Property::SIZE, Vector2(2000, 2000)); + actor.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); + application.GetScene().Add(actor); + + // loading started + application.SendNotification(); + application.Render(); + + // Wait image load complete. + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + DALI_TEST_CHECK(actor.GetRendererCount() == 1u); + + DALI_TEST_EQUALS(textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION); + + // Following gl function should not be called + std::stringstream out; + out << std::hex << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_S << ", " << GL_MIRRORED_REPEAT; + DALI_TEST_CHECK(texParameterTrace.FindMethodAndParams("TexParameteri", out.str())); + out.str(""); + out << std::hex << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_T << ", " << GL_CLAMP_TO_EDGE; + DALI_TEST_CHECK(texParameterTrace.FindMethodAndParams("TexParameteri", out.str())); + + // test the uniforms which used to handle the wrap mode + Renderer renderer = actor.GetRendererAt(0u); + DALI_TEST_CHECK(renderer); + + Property::Value pixelAreaValue = renderer.GetProperty(renderer.GetPropertyIndex("pixelArea")); + DALI_TEST_EQUALS(pixelAreaValue.Get(), pixelArea, TEST_LOCATION); + Vector4 pixelAreaUniform; + DALI_TEST_CHECK(gl.GetUniformValue("pixelArea", pixelAreaUniform)); + DALI_TEST_EQUALS(pixelArea, pixelAreaUniform, Math::MACHINE_EPSILON_100, TEST_LOCATION); + + actor.Unparent(); + DALI_TEST_CHECK(actor.GetRendererCount() == 0u); + + END_TEST; +} + int UtcDaliImageVisualCustomWrapModeNoAtlas(void) { ToolkitTestApplication application; diff --git a/dali-toolkit/internal/visuals/animated-image/fixed-image-cache.cpp b/dali-toolkit/internal/visuals/animated-image/fixed-image-cache.cpp index 508a50e..e751f90 100644 --- a/dali-toolkit/internal/visuals/animated-image/fixed-image-cache.cpp +++ b/dali-toolkit/internal/visuals/animated-image/fixed-image-cache.cpp @@ -147,12 +147,6 @@ void FixedImageCache::LoadBatch() TextureSet FixedImageCache::GetTextureSet(uint32_t frameIndex) const { TextureSet textureSet = mTextureManager.GetTextureSet(mImageUrls[frameIndex].mTextureId); - if(textureSet) - { - Sampler sampler = Sampler::New(); - sampler.SetWrapMode(Dali::WrapMode::Type::DEFAULT, Dali::WrapMode::Type::DEFAULT); - textureSet.SetSampler(0u, sampler); - } return textureSet; } diff --git a/dali-toolkit/internal/visuals/animated-image/rolling-animated-image-cache.cpp b/dali-toolkit/internal/visuals/animated-image/rolling-animated-image-cache.cpp index 93e4358..562a832 100644 --- a/dali-toolkit/internal/visuals/animated-image/rolling-animated-image-cache.cpp +++ b/dali-toolkit/internal/visuals/animated-image/rolling-animated-image-cache.cpp @@ -221,7 +221,7 @@ TextureSet RollingAnimatedImageCache::RequestFrameLoading(uint32_t frameIndex, b synchronousLoading, this, preMultiplyOnLoading); - if(textureSet) + if(textureSet && (mWrapModeU != Dali::WrapMode::DEFAULT || mWrapModeU != Dali::WrapMode::DEFAULT)) { Sampler sampler = Sampler::New(); sampler.SetWrapMode(mWrapModeU, mWrapModeV); @@ -275,7 +275,7 @@ TextureSet RollingAnimatedImageCache::GetFrontTextureSet() const TextureManager::TextureId textureId = GetCachedTextureId(0); TextureSet textureSet = mTextureManager.GetTextureSet(textureId); - if(textureSet) + if(textureSet && (mWrapModeU != Dali::WrapMode::DEFAULT || mWrapModeU != Dali::WrapMode::DEFAULT)) { Sampler sampler = Sampler::New(); sampler.SetWrapMode(mWrapModeU, mWrapModeV); @@ -354,7 +354,7 @@ void RollingAnimatedImageCache::LoadComplete(bool loadSuccess, TextureInformatio DALI_LOG_INFO(gAnimImgLogFilter, Debug::Concise, "AnimatedImageVisual::LoadComplete(textureId:%d) start\n", textureInformation.textureId); LOG_CACHE; - if(textureInformation.textureSet) + if(textureInformation.textureSet && (mWrapModeU != Dali::WrapMode::DEFAULT || mWrapModeU != Dali::WrapMode::DEFAULT)) { Sampler sampler = Sampler::New(); sampler.SetWrapMode(mWrapModeU, mWrapModeV); diff --git a/dali-toolkit/internal/visuals/animated-image/rolling-image-cache.cpp b/dali-toolkit/internal/visuals/animated-image/rolling-image-cache.cpp index 06c57f2..d818417 100644 --- a/dali-toolkit/internal/visuals/animated-image/rolling-image-cache.cpp +++ b/dali-toolkit/internal/visuals/animated-image/rolling-image-cache.cpp @@ -258,12 +258,6 @@ void RollingImageCache::LoadComplete(bool loadSuccess, TextureInformation textur if(!frontFrameReady && IsFrontReady()) { - if(textureInformation.textureSet) - { - Sampler sampler = Sampler::New(); - sampler.SetWrapMode(Dali::WrapMode::Type::DEFAULT, Dali::WrapMode::Type::DEFAULT); - textureInformation.textureSet.SetSampler(0u, sampler); - } mObserver.FrameReady(textureInformation.textureSet, mInterval, textureInformation.preMultiplied); } } diff --git a/dali-toolkit/internal/visuals/gradient/gradient-visual.cpp b/dali-toolkit/internal/visuals/gradient/gradient-visual.cpp index 1aa9bd8..066d506 100644 --- a/dali-toolkit/internal/visuals/gradient/gradient-visual.cpp +++ b/dali-toolkit/internal/visuals/gradient/gradient-visual.cpp @@ -258,10 +258,13 @@ void GradientVisual::OnInitialize() TextureSet textureSet = TextureSet::New(); Dali::Texture lookupTexture = mGradient->GenerateLookupTexture(); textureSet.SetTexture(0u, lookupTexture); - Dali::WrapMode::Type wrap = GetWrapMode(mGradient->GetSpreadMethod()); - Sampler sampler = Sampler::New(); - sampler.SetWrapMode(wrap, wrap); - textureSet.SetSampler(0u, sampler); + Dali::WrapMode::Type wrap = GetWrapMode(mGradient->GetSpreadMethod()); + if(wrap != Dali::WrapMode::DEFAULT) + { + Sampler sampler = Sampler::New(); + sampler.SetWrapMode(wrap, wrap); + textureSet.SetSampler(0u, sampler); + } mImpl->mRenderer = DecoratedVisualRenderer::New(geometry, shader); mImpl->mRenderer.ReserveCustomProperties(CUSTOM_PROPERTY_COUNT); diff --git a/dali-toolkit/internal/visuals/image/image-visual.cpp b/dali-toolkit/internal/visuals/image/image-visual.cpp index 6b30a02..95c560b 100644 --- a/dali-toolkit/internal/visuals/image/image-visual.cpp +++ b/dali-toolkit/internal/visuals/image/image-visual.cpp @@ -694,7 +694,7 @@ void ImageVisual::LoadTexture(bool& atlasing, Vector4& atlasRect, TextureSet& te } EnablePreMultipliedAlpha(preMultiplyOnLoad == TextureManager::MultiplyOnLoad::MULTIPLY_ON_LOAD); - if(!atlasing) + if(!atlasing && (mWrapModeU != Dali::WrapMode::DEFAULT || mWrapModeU != Dali::WrapMode::DEFAULT)) { Sampler sampler = Sampler::New(); sampler.SetWrapMode(mWrapModeU, mWrapModeV); @@ -744,7 +744,9 @@ void ImageVisual::InitializeRenderer() else { mTextures = mFactoryCache.GetTextureManager().GetTextureSet(mTextureId); - if(!(mImpl->mFlags & Visual::Base::Impl::IS_ATLASING_APPLIED) && mTextures) + if(!(mImpl->mFlags & Visual::Base::Impl::IS_ATLASING_APPLIED) && + mTextures && + (mWrapModeU != Dali::WrapMode::DEFAULT || mWrapModeU != Dali::WrapMode::DEFAULT)) { Sampler sampler = Sampler::New(); sampler.SetWrapMode(mWrapModeU, mWrapModeV); @@ -1057,9 +1059,12 @@ void ImageVisual::LoadComplete(bool loadingSuccess, TextureInformation textureIn } else { - Sampler sampler = Sampler::New(); - sampler.SetWrapMode(mWrapModeU, mWrapModeV); - textureInformation.textureSet.SetSampler(0u, sampler); + if(mWrapModeU != Dali::WrapMode::DEFAULT || mWrapModeU != Dali::WrapMode::DEFAULT) + { + Sampler sampler = Sampler::New(); + sampler.SetWrapMode(mWrapModeU, mWrapModeV); + textureInformation.textureSet.SetSampler(0u, sampler); + } mImpl->mRenderer.SetTextures(textureInformation.textureSet); ComputeTextureSize(); diff --git a/dali-toolkit/internal/visuals/npatch/npatch-visual.cpp b/dali-toolkit/internal/visuals/npatch/npatch-visual.cpp index 2544899..1047eaf 100644 --- a/dali-toolkit/internal/visuals/npatch/npatch-visual.cpp +++ b/dali-toolkit/internal/visuals/npatch/npatch-visual.cpp @@ -105,13 +105,6 @@ void NPatchVisual::LoadImages() // Load the auxiliary image mAuxiliaryTextureSet = textureManager.LoadTexture(mAuxiliaryUrl, Dali::ImageDimensions(), FittingMode::DEFAULT, SamplingMode::BOX_THEN_LINEAR, maskingDataPtr, synchronousLoading, mAuxiliaryTextureId, atlasRect, atlasRectSize, atlasing, loadingStatus, this, nullptr, imageAtlasManagerPtr, true, TextureManager::ReloadPolicy::CACHED, preMultiplyOnLoad); - if(mAuxiliaryTextureSet) - { - Sampler sampler = Sampler::New(); - sampler.SetWrapMode(WrapMode::DEFAULT, WrapMode::DEFAULT); - mAuxiliaryTextureSet.SetSampler(0u, sampler); - } - // If synchronousLoading is true, we can check the auxiliaryResource's status now. if(synchronousLoading) { @@ -613,14 +606,7 @@ void NPatchVisual::LoadComplete(bool loadSuccess, TextureInformation textureInfo } if(loadSuccess) { - mAuxiliaryTextureSet = textureInformation.textureSet; - if(mAuxiliaryTextureSet) - { - Sampler sampler = Sampler::New(); - sampler.SetWrapMode(WrapMode::DEFAULT, WrapMode::DEFAULT); - mAuxiliaryTextureSet.SetSampler(0u, sampler); - } - + mAuxiliaryTextureSet = textureInformation.textureSet; mAuxiliaryResourceStatus = Toolkit::Visual::ResourceStatus::READY; } else -- 2.7.4