Let we use shared uniform blocks for VisualRenderer if we use Visual by visual factory.
If we don't change default value, we can use shared visual properties.
Change-Id: Icc3dc9c955c2e350f1922b9c76e75cc8e2561986
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
/*
- * Copyright (c) 2024 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2025 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
// Set default broken image
factoryCache->SetBrokenImageUrl(defaultBrokenImageUrl, std::vector<std::string>());
- //Created dummy renderer
+ //Created dummy visual renderer
Geometry geometry = factoryCache->GetGeometry(Toolkit::Internal::VisualFactoryCache::QUAD_GEOMETRY);
Shader shader = Shader::New("foo", "bar");
- Renderer renderer = Renderer::New(geometry, shader);
+
+ VisualRenderer renderer = VisualRenderer::New(geometry, shader);
DALI_TEST_CHECK(renderer);
{
if(mImpl->mRenderer && mImpl->mTransformMapChanged)
{
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+
+ // TODO : We many need to less call it.
+ UpdateShader();
+ }
+}
+
+void AnimatedGradientVisual::UpdateShader()
+{
+ if(mImpl->mRenderer)
+ {
+ Shader shader = GetOrCreateShader();
+ mImpl->mRenderer.SetShader(shader);
}
}
VisualFactoryCache::ShaderType shaderType = GetShaderType(mGradientType, mUnitType, mSpreadType);
- std::string tagUnit;
- std::string tagGrad;
- std::string tagSpread;
- switch(mUnitType)
- {
- case Toolkit::DevelAnimatedGradientVisual::UnitType::OBJECT_BOUNDING_BOX:
- {
- tagUnit = "UNIT_TYPE_BOUNDING_BOX";
- break;
- }
- case Toolkit::DevelAnimatedGradientVisual::UnitType::USER_SPACE:
- {
- tagUnit = "UNIT_TYPE_USER";
- break;
- }
- }
- switch(mGradientType)
- {
- case Toolkit::DevelAnimatedGradientVisual::GradientType::LINEAR:
- {
- tagGrad = "GRADIENT_TYPE_LINEAR";
- break;
- }
- case Toolkit::DevelAnimatedGradientVisual::GradientType::RADIAL:
- {
- tagGrad = "GRADIENT_TYPE_RADIAL";
- break;
- }
- }
- switch(mSpreadType)
+ shader = mFactoryCache.GetShader(shaderType, mImpl->mTransformMapUsingDefault);
+ if(!shader)
{
- case Toolkit::DevelAnimatedGradientVisual::SpreadType::REFLECT:
+ std::string tagUnit;
+ std::string tagGrad;
+ std::string tagSpread;
+ switch(mUnitType)
{
- tagSpread = "SPREAD_TYPE_REFLECT";
- break;
+ case Toolkit::DevelAnimatedGradientVisual::UnitType::OBJECT_BOUNDING_BOX:
+ {
+ tagUnit = "UNIT_TYPE_BOUNDING_BOX";
+ break;
+ }
+ case Toolkit::DevelAnimatedGradientVisual::UnitType::USER_SPACE:
+ {
+ tagUnit = "UNIT_TYPE_USER";
+ break;
+ }
}
- case Toolkit::DevelAnimatedGradientVisual::SpreadType::REPEAT:
+ switch(mGradientType)
{
- tagSpread = "SPREAD_TYPE_REPEAT";
- break;
+ case Toolkit::DevelAnimatedGradientVisual::GradientType::LINEAR:
+ {
+ tagGrad = "GRADIENT_TYPE_LINEAR";
+ break;
+ }
+ case Toolkit::DevelAnimatedGradientVisual::GradientType::RADIAL:
+ {
+ tagGrad = "GRADIENT_TYPE_RADIAL";
+ break;
+ }
}
- case Toolkit::DevelAnimatedGradientVisual::SpreadType::CLAMP:
+ switch(mSpreadType)
{
- tagSpread = "SPREAD_TYPE_CLAMP";
- break;
+ case Toolkit::DevelAnimatedGradientVisual::SpreadType::REFLECT:
+ {
+ tagSpread = "SPREAD_TYPE_REFLECT";
+ break;
+ }
+ case Toolkit::DevelAnimatedGradientVisual::SpreadType::REPEAT:
+ {
+ tagSpread = "SPREAD_TYPE_REPEAT";
+ break;
+ }
+ case Toolkit::DevelAnimatedGradientVisual::SpreadType::CLAMP:
+ {
+ tagSpread = "SPREAD_TYPE_CLAMP";
+ break;
+ }
}
- }
- std::string vert;
- std::string frag;
+ std::string vert;
+ std::string frag;
- vert = "#define " + tagUnit + "\n" + SHADER_ANIMATED_GRADIENT_VISUAL_SHADER_VERT.data();
- frag = "#define " + tagGrad + "\n" + "#define " + tagSpread + "\n" + SHADER_ANIMATED_GRADIENT_VISUAL_SHADER_FRAG.data();
+ vert = "#define " + tagUnit + "\n" + SHADER_ANIMATED_GRADIENT_VISUAL_SHADER_VERT.data();
+ frag = "#define " + tagGrad + "\n" + "#define " + tagSpread + "\n" + SHADER_ANIMATED_GRADIENT_VISUAL_SHADER_FRAG.data();
- shader = mFactoryCache.GenerateAndSaveShader(shaderType, vert, frag);
+ shader = mFactoryCache.GenerateAndSaveShader(shaderType, vert, frag, mImpl->mTransformMapUsingDefault);
+ }
return shader;
}
mImpl->mRenderer.RegisterUniqueProperty(UNIFORM_OFFSET_NAME, GetStartValue(mValueMap, Toolkit::DevelAnimatedGradientVisual::Property::OFFSET, OFFSET_NAME));
//Register transform properties
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
}
} //namespace Internal
#define DALI_TOOLKIT_INTERNAL_ANIMATED_GRADIENT_VISUAL_H
/*
- * Copyright (c) 2024 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2025 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/
void DoSetProperties(const Property::Map& propertyMap) override;
- /**
- * @copydoc Visual::Base::OnSetTransform
- */
- void OnSetTransform() override;
-
/**
* @copydoc Visual::Base::DoSetOnScene
*/
*/
void DoSetOffScene(Actor& actor) override;
+ /**
+ * @copydoc Visual::Base::OnSetTransform
+ */
+ void OnSetTransform() override;
+
+ /**
+ * @copydoc Visual::Base::UpdateShader
+ */
+ void UpdateShader() override;
+
private:
/**
* @brief Initialize the default value of properies.
{
if(mImpl->mRenderer && mImpl->mTransformMapChanged)
{
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+
+ // TODO : We many need to less call it.
+ UpdateShader();
}
}
// Most of image visual shader user (like svg, animated vector image visual) use pre-multiplied alpha.
// If the visual dont want to using pre-multiplied alpha, it should be set as 0.0f as renderer side.
shader.RegisterProperty(PREMULTIPLIED_ALPHA, ALPHA_VALUE_PREMULTIPLIED);
+
+ if(mImpl->mRenderer)
+ {
+ mImpl->mRenderer.RegisterVisualTransformUniform();
+ }
}
else
{
.ApplyDefaultTextureWrapMode(defaultWrapMode)
.EnableRoundedCorner(IsRoundedCornerRequired(), IsSquircleCornerRequired())
.EnableBorderline(IsBorderlineRequired())
- .EnableAlphaMaskingOnRendering(requiredAlphaMaskingOnRendering));
+ .EnableAlphaMaskingOnRendering(requiredAlphaMaskingOnRendering)
+ .UseDefaultTransform(mImpl->mTransformMapUsingDefault));
}
return shader;
}
mImpl->mRenderer.ReserveCustomProperties(CUSTOM_PROPERTY_COUNT);
// Register transform properties
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ if(mImpl->mCustomShader)
+ {
+ mImpl->mRenderer.RegisterVisualTransformUniform();
+ }
if(!defaultWrapMode) // custom wrap mode
{
mImpl->mRenderer.SetTextures(textureSet);
// Register transform properties
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ if(mImpl->mCustomShader)
+ {
+ mImpl->mRenderer.RegisterVisualTransformUniform();
+ }
mVectorAnimationTask->SetRenderer(mImpl->mRenderer);
}
{
if(mImpl->mRenderer && mImpl->mTransformMapChanged)
{
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+
+ // TODO : We many need to less call it.
+ UpdateShader();
}
if(IsOnScene())
// Most of image visual shader user (like svg, animated vector image visual) use pre-multiplied alpha.
// If the visual dont want to using pre-multiplied alpha, it should be set as 0.0f as renderer side.
shader.RegisterProperty(PREMULTIPLIED_ALPHA, ALPHA_VALUE_PREMULTIPLIED);
+
+ if(mImpl->mRenderer)
+ {
+ mImpl->mRenderer.RegisterVisualTransformUniform();
+ }
}
else
{
ImageVisualShaderFeature::FeatureBuilder()
.EnableRoundedCorner(IsRoundedCornerRequired(), IsSquircleCornerRequired())
.EnableBorderline(IsBorderlineRequired())
- .SetTextureForFragmentShaderCheck(mUseNativeImage ? mImpl->mRenderer.GetTextures().GetTexture(0) : Dali::Texture()));
+ .SetTextureForFragmentShaderCheck(mUseNativeImage ? mImpl->mRenderer.GetTextures().GetTexture(0) : Dali::Texture())
+ .UseDefaultTransform(mImpl->mTransformMapUsingDefault));
}
return shader;
}
if(mImpl->mTransformMapChanged)
{
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
}
}
}
Shader shader;
if(mCapType == DevelArcVisual::Cap::BUTT)
{
- shader = mFactoryCache.GetShader(VisualFactoryCache::ARC_BUTT_CAP_SHADER);
+ shader = mFactoryCache.GetShader(VisualFactoryCache::ARC_BUTT_CAP_SHADER, mImpl->mTransformMapUsingDefault);
if(!shader)
{
- shader = mFactoryCache.GenerateAndSaveShader(VisualFactoryCache::ARC_BUTT_CAP_SHADER, Dali::Shader::GetVertexShaderPrefix() + SHADER_ARC_VISUAL_SHADER_VERT.data(), Dali::Shader::GetFragmentShaderPrefix() + SHADER_ARC_VISUAL_BUTT_CAP_SHADER_FRAG.data());
+ shader = mFactoryCache.GenerateAndSaveShader(VisualFactoryCache::ARC_BUTT_CAP_SHADER, Dali::Shader::GetVertexShaderPrefix() + SHADER_ARC_VISUAL_SHADER_VERT.data(), Dali::Shader::GetFragmentShaderPrefix() + SHADER_ARC_VISUAL_BUTT_CAP_SHADER_FRAG.data(), mImpl->mTransformMapUsingDefault);
}
}
else
{
- shader = mFactoryCache.GetShader(VisualFactoryCache::ARC_ROUND_CAP_SHADER);
+ shader = mFactoryCache.GetShader(VisualFactoryCache::ARC_ROUND_CAP_SHADER, mImpl->mTransformMapUsingDefault);
if(!shader)
{
- shader = mFactoryCache.GenerateAndSaveShader(VisualFactoryCache::ARC_ROUND_CAP_SHADER, Dali::Shader::GetVertexShaderPrefix() + SHADER_ARC_VISUAL_SHADER_VERT.data(), Dali::Shader::GetFragmentShaderPrefix() + SHADER_ARC_VISUAL_ROUND_CAP_SHADER_FRAG.data());
+ shader = mFactoryCache.GenerateAndSaveShader(VisualFactoryCache::ARC_ROUND_CAP_SHADER, Dali::Shader::GetVertexShaderPrefix() + SHADER_ARC_VISUAL_SHADER_VERT.data(), Dali::Shader::GetFragmentShaderPrefix() + SHADER_ARC_VISUAL_ROUND_CAP_SHADER_FRAG.data(), mImpl->mTransformMapUsingDefault);
}
}
mImpl->mRenderer.SetProperty(Renderer::Property::BLEND_MODE, BlendMode::ON);
// Register transform properties
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
}
} // namespace Internal
{
if(mImpl->mRenderer && mImpl->mTransformMapChanged)
{
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+
+ // TODO : We many need to less call it.
+ UpdateShader();
}
}
mImpl->mRenderer.ReserveCustomProperties(CUSTOM_PROPERTY_COUNT);
//Register transform properties
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
}
Shader BorderVisual::GetBorderShader()
Shader shader;
if(mAntiAliasing)
{
- shader = mFactoryCache.GetShader(VisualFactoryCache::BORDER_SHADER_ANTI_ALIASING);
+ shader = mFactoryCache.GetShader(VisualFactoryCache::BORDER_SHADER_ANTI_ALIASING, mImpl->mTransformMapUsingDefault);
if(!shader)
{
- shader = mFactoryCache.GenerateAndSaveShader(VisualFactoryCache::BORDER_SHADER_ANTI_ALIASING, Dali::Shader::GetVertexShaderPrefix() + SHADER_BORDER_VISUAL_ANTI_ALIASING_SHADER_VERT.data(), Dali::Shader::GetFragmentShaderPrefix() + SHADER_BORDER_VISUAL_ANTI_ALIASING_SHADER_FRAG.data());
+ shader = mFactoryCache.GenerateAndSaveShader(VisualFactoryCache::BORDER_SHADER_ANTI_ALIASING, Dali::Shader::GetVertexShaderPrefix() + SHADER_BORDER_VISUAL_ANTI_ALIASING_SHADER_VERT.data(), Dali::Shader::GetFragmentShaderPrefix() + SHADER_BORDER_VISUAL_ANTI_ALIASING_SHADER_FRAG.data(), mImpl->mTransformMapUsingDefault);
}
}
else
{
- shader = mFactoryCache.GetShader(VisualFactoryCache::BORDER_SHADER);
+ shader = mFactoryCache.GetShader(VisualFactoryCache::BORDER_SHADER, mImpl->mTransformMapUsingDefault);
if(!shader)
{
- shader = mFactoryCache.GenerateAndSaveShader(VisualFactoryCache::BORDER_SHADER, Dali::Shader::GetVertexShaderPrefix() + SHADER_BORDER_VISUAL_SHADER_VERT.data(), Dali::Shader::GetFragmentShaderPrefix() + SHADER_BORDER_VISUAL_SHADER_FRAG.data());
+ shader = mFactoryCache.GenerateAndSaveShader(VisualFactoryCache::BORDER_SHADER, Dali::Shader::GetVertexShaderPrefix() + SHADER_BORDER_VISUAL_SHADER_VERT.data(), Dali::Shader::GetFragmentShaderPrefix() + SHADER_BORDER_VISUAL_SHADER_FRAG.data(), mImpl->mTransformMapUsingDefault);
}
}
: mColorRoundCorner(RoundedCorner::DISABLED),
mColorBorderline(Borderline::DISABLED),
mColorBlur(Blur::DISABLED),
- mColorCutout(Cutout::DISABLED)
+ mColorCutout(Cutout::DISABLED),
+ mUseDefaultTransform(true)
{
}
return *this;
}
+FeatureBuilder& FeatureBuilder::UseDefaultTransform(bool useDefaultTransform)
+{
+ mUseDefaultTransform = useDefaultTransform;
+ return *this;
+}
+
VisualFactoryCache::ShaderType FeatureBuilder::GetShaderType() const
{
VisualFactoryCache::ShaderType shaderType = VisualFactoryCache::COLOR_SHADER;
}
}
+bool FeatureBuilder::IsDefaultTransformUsed() const
+{
+ return mUseDefaultTransform;
+}
+
} // namespace ColorVisualShaderFeature
ColorVisualShaderFactory::ColorVisualShaderFactory()
{
Shader shader;
VisualFactoryCache::ShaderType shaderType = featureBuilder.GetShaderType();
- shader = factoryCache.GetShader(shaderType);
+ shader = factoryCache.GetShader(shaderType, featureBuilder.IsDefaultTransformUsed());
if(!shader)
{
std::string vertexShader = std::string(Dali::Shader::GetVertexShaderPrefix() + vertexShaderPrefixList + SHADER_COLOR_VISUAL_SHADER_VERT.data());
std::string fragmentShader = std::string(Dali::Shader::GetFragmentShaderPrefix() + fragmentShaderPrefixList + SHADER_COLOR_VISUAL_SHADER_FRAG.data());
- shader = factoryCache.GenerateAndSaveShader(shaderType, vertexShader, fragmentShader);
+ shader = factoryCache.GenerateAndSaveShader(shaderType, vertexShader, fragmentShader, featureBuilder.IsDefaultTransformUsed());
}
return shader;
}
FeatureBuilder& EnableBorderLine(bool enableBorderLine);
FeatureBuilder& EnableBlur(bool enableBlur);
FeatureBuilder& EnableCutout(bool enableCutout);
+ FeatureBuilder& UseDefaultTransform(bool useDefaultTransform);
VisualFactoryCache::ShaderType GetShaderType() const;
void GetVertexShaderPrefixList(std::string& vertexShaderPrefixList) const;
void GetFragmentShaderPrefixList(std::string& fragmentShaderPrefixList) const;
+ bool IsDefaultTransformUsed() const;
+
private:
RoundedCorner::Type mColorRoundCorner : 3; ///< Whether use rounded corner, or not. default as RoundedCorner::DISABLED
Borderline::Type mColorBorderline : 2; ///< Whether use border line, or not. default as Borderline::DISABLED
Blur::Type mColorBlur : 2; ///< Whether use blur, or not. default as Blur::DISABLED
Cutout::Type mColorCutout : 2; ///< Whether use cutout, or not. default as Cutout::DISABLED
+ bool mUseDefaultTransform : 1;
};
} // namespace ColorVisualShaderFeature
// EXTERNAL INCLUDES
#include <dali/devel-api/rendering/renderer-devel.h>
+#include <dali/integration-api/adaptor-framework/adaptor.h>
#include <dali/integration-api/debug.h>
#include <dali/public-api/rendering/decorated-visual-renderer.h>
{
if(mImpl->mRenderer && mImpl->mTransformMapChanged)
{
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+
+ // TODO : We many need to less call it.
+ UpdateShader();
}
}
}
// Register transform properties
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
}
Shader ColorVisual::GenerateShader() const
.EnableBlur(IsBlurRequired())
.EnableBorderLine(IsBorderlineRequired())
.EnableRoundCorner(IsRoundedCornerRequired(), IsSquircleCornerRequired())
- .EnableCutout(IsCutoutRequired()));
+ .EnableCutout(IsCutoutRequired())
+ .UseDefaultTransform(mImpl->mTransformMapUsingDefault));
return shader;
}
{
if(mImpl->mRenderer && mImpl->mTransformMapChanged)
{
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+
+ // TODO : We many need to less call it.
+ UpdateShader();
}
}
mImpl->mRenderer.RegisterUniqueProperty(UNIFORM_TEXTURE_COORDINATE_SCALE_FACTOR_NAME, (textureSize - 1.0f) / textureSize);
// Register transform properties
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
}
bool GradientVisual::NewGradient(Type gradientType, const Property::Map& propertyMap)
DALI_ASSERT_DEBUG(shaderTypeFlag < SHADER_TYPE_TABLE_COUNT && "Invalid gradient shader type generated!");
VisualFactoryCache::ShaderType shaderType = SHADER_TYPE_TABLE[shaderTypeFlag];
- Shader shader = mFactoryCache.GetShader(shaderType);
+ Shader shader = mFactoryCache.GetShader(shaderType, mImpl->mTransformMapUsingDefault);
if(!shader)
{
std::string vertexShaderPrefixList;
shader = mFactoryCache.GenerateAndSaveShader(shaderType,
Dali::Shader::GetVertexShaderPrefix() + vertexShaderPrefixList + SHADER_GRADIENT_VISUAL_SHADER_VERT.data(),
- Dali::Shader::GetFragmentShaderPrefix() + fragmentShaderPrefixList + SHADER_GRADIENT_VISUAL_SHADER_FRAG.data());
+ Dali::Shader::GetFragmentShaderPrefix() + fragmentShaderPrefixList + SHADER_GRADIENT_VISUAL_SHADER_FRAG.data(),
+ mImpl->mTransformMapUsingDefault);
}
return shader;
#define DALI_TOOLKIT_INTERNAL_GRADIENT_VISUAL_H
/*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
/*
- * Copyright (c) 2024 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2025 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
shaderType = static_cast<VisualFactoryCache::ShaderType>(static_cast<int>(shaderType) + NATIVE_SHADER_TYPE_OFFSET);
}
- shader = factoryCache.GetShader(shaderType);
+ shader = factoryCache.GetShader(shaderType, featureBuilder.IsDefaultTransformUsed());
if(shader)
{
return shader;
if(mFragmentShaderNeedChange == ImageVisualShaderFeature::ChangeFragmentShader::DONT_CHANGE)
{
shaderType = static_cast<VisualFactoryCache::ShaderType>(static_cast<int>(shaderType) - NATIVE_SHADER_TYPE_OFFSET);
- shader = factoryCache.GetShader(shaderType);
+ shader = factoryCache.GetShader(shaderType, featureBuilder.IsDefaultTransformUsed());
}
}
}
return shader;
}
- shader = factoryCache.GenerateAndSaveShader(shaderType, vertexShader, fragmentShader);
+ shader = factoryCache.GenerateAndSaveShader(shaderType, vertexShader, fragmentShader, featureBuilder.IsDefaultTransformUsed());
shader.ReserveCustomProperties(CUSTOM_PROPERTY_COUNT +
((featureBuilder.IsEnabledAlphaMaskingOnRendering() ? 1 : 0)));
/*
- * Copyright (c) 2024 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2025 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
mBorderline(Borderline::DISABLED),
mAlphaMaskingOnRendering(AlphaMaskingOnRendering::DISABLED),
mColorConversion(ColorConversion::DONT_NEED),
+ mUseDefaultTransform(true),
mTexture()
{
}
return *this;
}
+FeatureBuilder& FeatureBuilder::UseDefaultTransform(bool useDefaultTransform)
+{
+ mUseDefaultTransform = useDefaultTransform;
+ return *this;
+}
+
VisualFactoryCache::ShaderType FeatureBuilder::GetShaderType() const
{
VisualFactoryCache::ShaderType shaderType = VisualFactoryCache::IMAGE_SHADER;
return mAlphaMaskingOnRendering == AlphaMaskingOnRendering::ENABLED;
}
+bool FeatureBuilder::IsDefaultTransformUsed() const
+{
+ return mUseDefaultTransform;
+}
+
} // namespace ImageVisualShaderFeature
} // namespace Internal
#define DALI_TOOLKIT_IMAGE_VISUAL_SHADER_FEATURE_BUILDER_H
/*
- * Copyright (c) 2024 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2025 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
FeatureBuilder& EnableYuvToRgb(bool enableYuvToRgb, bool enableUnifiedYuvAndRgb = false);
+ FeatureBuilder& UseDefaultTransform(bool useDefaultTransform);
+
VisualFactoryCache::ShaderType GetShaderType() const;
ChangeFragmentShader::Type NeedToChangeFragmentShader() const;
Dali::Texture GetTexture() const;
bool IsEnabledAlphaMaskingOnRendering() const;
+ bool IsDefaultTransformUsed() const;
private:
TextureAtlas::Type mTextureAtlas : 2; ///< Whether use texture with atlas, or not. default as TextureAtlas::DISABLED
Borderline::Type mBorderline : 2; ///< Whether use borderline, or not. default as Borderline::DISABLED
AlphaMaskingOnRendering::Type mAlphaMaskingOnRendering : 2; ///< Whether use runtime alpha masking, or not. default as AlphaMaskingOnRendering::DISABLED
ColorConversion::Type mColorConversion : 2; ///< Whether the color format conversion is needed or not
- Dali::Texture mTexture; ///< Texture to check whether we need to change fragment shader or not
+ bool mUseDefaultTransform : 1;
+ Dali::Texture mTexture; ///< Texture to check whether we need to change fragment shader or not
};
} // namespace ImageVisualShaderFeature
}
//Register transform properties
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ if(mImpl->mCustomShader)
+ {
+ mImpl->mRenderer.RegisterVisualTransformUniform();
+ }
EnablePreMultipliedAlpha(IsPreMultipliedAlphaEnabled());
{
if(mImpl->mRenderer && mImpl->mTransformMapChanged)
{
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+
+ // TODO : We many need to less call it.
+ UpdateShader();
}
if(mUseSynchronousSizing)
.EnableBorderline(IsBorderlineRequired())
.SetTextureForFragmentShaderCheck(useNativeImage ? mNativeTexture : Dali::Texture())
.EnableAlphaMaskingOnRendering(requiredAlphaMaskingOnRendering)
- .EnableYuvToRgb(mNeedYuvToRgb, mNeedUnifiedYuvAndRgb));
+ .EnableYuvToRgb(mNeedYuvToRgb, mNeedUnifiedYuvAndRgb)
+ .UseDefaultTransform(mImpl->mTransformMapUsingDefault));
}
else
{
// Most of image visual shader user (like svg, animated vector image visual) use pre-multiplied alpha.
// If the visual dont want to using pre-multiplied alpha, it should be set as 0.0f as renderer side.
shader.RegisterProperty(PREMULTIPLIED_ALPHA, ALPHA_VALUE_PREMULTIPLIED);
+
+ if(mImpl->mRenderer)
+ {
+ mImpl->mRenderer.RegisterVisualTransformUniform();
+ }
}
return shader;
#include <dali/devel-api/common/stage.h>
#include <dali/devel-api/scripting/enum-helper.h>
#include <dali/devel-api/scripting/scripting.h>
+#include <dali/integration-api/adaptor-framework/adaptor.h>
#include <dali/integration-api/debug.h>
//INTERNAL INCLUDES
{
if(mImpl->mRenderer && mImpl->mTransformMapChanged)
{
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+
+ // TODO : We many need to less call it.
+ UpdateShader();
+ }
+}
+
+void MeshVisual::UpdateShader()
+{
+ if(mImpl->mRenderer)
+ {
+ if(!mImpl->mTransformMapUsingDefault)
+ {
+ // Unregister default uniform blocks if transform changed.
+ if(DALI_LIKELY(Dali::Adaptor::IsAvailable()) && mShader)
+ {
+ mFactoryCache.GetDefaultUniformBlock().DisconnectFromShader(mShader);
+ }
+ mImpl->mRenderer.RegisterVisualTransformUniform();
+ }
}
}
}
mImpl->mRenderer = VisualRenderer::New(mGeometry, mShader);
+ if(DALI_LIKELY(Dali::Adaptor::IsAvailable()) && mImpl->mTransformMapUsingDefault)
+ {
+ mFactoryCache.GetDefaultUniformBlock().ConnectToShader(mShader);
+ }
mImpl->mRenderer.SetTextures(mTextureSet);
mImpl->mRenderer.SetProperty(Renderer::Property::DEPTH_WRITE_MODE, DepthWriteMode::ON);
mImpl->mRenderer.SetProperty(Renderer::Property::DEPTH_TEST_MODE, DepthTestMode::ON);
//Register transform properties
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
}
void MeshVisual::SupplyEmptyGeometry()
#define DALI_TOOLKIT_INTERNAL_MESH_VISUAL_H
/*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2025 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/
void DoSetProperties(const Property::Map& propertyMap) override;
+ /**
+ * @copydoc Visual::Base::DoSetOnScene
+ */
+ void DoSetOnScene(Actor& actor) override;
+
/**
* @copydoc Visual::Base::OnSetTransform
*/
void OnSetTransform() override;
/**
- * @copydoc Visual::Base::DoSetOnScene
+ * @copydoc Visual::Base::UpdateShader
*/
- void DoSetOnScene(Actor& actor) override;
+ void UpdateShader() override;
private:
/**
{
if(mImpl->mRenderer && mImpl->mTransformMapChanged)
{
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+
+ // TODO : We many need to less call it.
+ UpdateShader();
+ }
+}
+
+void NPatchVisual::UpdateShader()
+{
+ if(mImpl->mRenderer)
+ {
+ Shader shader = CreateShader();
+ mImpl->mRenderer.SetShader(shader);
}
}
mImpl->mRenderer.ReserveCustomProperties(CUSTOM_PROPERTY_COUNT);
//Register transform properties
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
}
Geometry NPatchVisual::CreateGeometry()
if(DALI_LIKELY((xStretchCount == 1 && yStretchCount == 1) ||
(xStretchCount == 0 && yStretchCount == 0)))
{
- shader = mFactoryCache.GetShader(shaderType);
+ shader = mFactoryCache.GetShader(shaderType, mImpl->mTransformMapUsingDefault);
if(DALI_UNLIKELY(!shader))
{
- shader = mFactoryCache.GenerateAndSaveShader(shaderType, SHADER_NPATCH_VISUAL_3X3_SHADER_VERT, fragmentShader);
+ shader = mFactoryCache.GenerateAndSaveShader(shaderType, SHADER_NPATCH_VISUAL_3X3_SHADER_VERT, fragmentShader, mImpl->mTransformMapUsingDefault);
}
}
else if(xStretchCount > 0 || yStretchCount > 0)
<< SHADER_NPATCH_VISUAL_SHADER_VERT;
shader = Shader::New(vertexShader.str(), fragmentShader, Dali::Shader::Hint::NONE, shaderName.str());
+
+ if(DALI_LIKELY(mImpl->mRenderer))
+ {
+ mImpl->mRenderer.RegisterVisualTransformUniform();
+ }
}
}
else
shader = Shader::New(vertexShader.str(), fragmentShader, hints, shaderName.str());
}
+
+ if(DALI_LIKELY(mImpl->mRenderer))
+ {
+ mImpl->mRenderer.RegisterVisualTransformUniform();
+ }
}
return shader;
}
// Register transform properties
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
}
Geometry NPatchVisual::GetNinePatchGeometry(VisualFactoryCache::GeometryType subType)
#define DALI_TOOLKIT_INTERNAL_N_PATCH_VISUAL_H
/*
- * Copyright (c) 2024 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2025 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/
void OnSetTransform() override;
+ /**
+ * @copydoc Visual::Base::UpdateShader
+ */
+ void UpdateShader() override;
+
private:
/**
* Loads the NPatch image and the Auxiliary image if needed
#include <dali/devel-api/common/stage.h>
#include <dali/devel-api/scripting/enum-helper.h>
#include <dali/devel-api/scripting/scripting.h>
+#include <dali/integration-api/adaptor-framework/adaptor.h>
#include <dali/integration-api/debug.h>
#include <dali/public-api/common/constants.h>
{
if(mImpl->mRenderer && mImpl->mTransformMapChanged)
{
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+
+ // TODO : We many need to less call it.
+ UpdateShader();
+ }
+}
+
+void PrimitiveVisual::UpdateShader()
+{
+ if(mImpl->mRenderer)
+ {
+ if(!mImpl->mTransformMapUsingDefault)
+ {
+ // Unregister default uniform blocks if transform changed.
+ if(DALI_LIKELY(Dali::Adaptor::IsAvailable()) && mShader)
+ {
+ mFactoryCache.GetDefaultUniformBlock().DisconnectFromShader(mShader);
+ }
+ mImpl->mRenderer.RegisterVisualTransformUniform();
+ }
}
}
}
mImpl->mRenderer = VisualRenderer::New(mGeometry, mShader);
+ if(mImpl->mTransformMapUsingDefault)
+ {
+ mFactoryCache.GetDefaultUniformBlock().ConnectToShader(mShader);
+ }
mImpl->mRenderer.SetProperty(Renderer::Property::FACE_CULLING_MODE, FaceCullingMode::BACK);
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
}
void PrimitiveVisual::UpdateShaderUniforms()
#define DALI_TOOLKIT_INTERNAL_PRIMITIVE_VISUAL_H
/*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2025 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/
void OnSetTransform() override;
+ /**
+ * @copydoc Visual::Base::UpdateShader
+ */
+ void UpdateShader() override;
+
private:
//Simple struct to store the position and normal of a single vertex.
struct Vertex
mImpl->mRenderer = DecoratedVisualRenderer::New(geometry, shader);
mImpl->mRenderer.ReserveCustomProperties(CUSTOM_PROPERTY_COUNT);
+ if(mImpl->mCustomShader)
+ {
+ mImpl->mRenderer.RegisterVisualTransformUniform();
+ }
+
Vector2 dpi = Stage::GetCurrent().GetDpi();
float meanDpi = (dpi.height + dpi.width) * 0.5f;
mImpl->mRenderer.SetTextures(textureSet);
// Register transform properties
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
// Defer the rasterisation task until we get given a size (by Size Negotiation algorithm)
{
if(mImpl->mRenderer && mImpl->mTransformMapChanged)
{
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+
+ // TODO : We many need to less call it.
+ UpdateShader();
}
if(IsOnScene() && !mLoadFailed)
ImageVisualShaderFeature::FeatureBuilder()
.EnableTextureAtlas(mImpl->mFlags & Visual::Base::Impl::IS_ATLASING_APPLIED)
.EnableRoundedCorner(IsRoundedCornerRequired(), IsSquircleCornerRequired())
- .EnableBorderline(IsBorderlineRequired()));
+ .EnableBorderline(IsBorderlineRequired())
+ .UseDefaultTransform(mImpl->mTransformMapUsingDefault));
}
else
{
// Most of image visual shader user (like svg, animated vector image visual) use pre-multiplied alpha.
// If the visual dont want to using pre-multiplied alpha, it should be set as 0.0f as renderer side.
shader.RegisterProperty(PREMULTIPLIED_ALPHA, ALPHA_VALUE_PREMULTIPLIED);
+
+ if(mImpl->mRenderer)
+ {
+ mImpl->mRenderer.RegisterVisualTransformUniform();
+ }
}
return shader;
}
/*
- * Copyright (c) 2024 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2025 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
{
Shader shader;
VisualFactoryCache::ShaderType shaderType = featureBuilder.GetShaderType();
- shader = factoryCache.GetShader(shaderType);
+ shader = factoryCache.GetShader(shaderType, false);
if(!shader)
{
std::string vertexShader = std::string(Dali::Shader::GetVertexShaderPrefix() + vertexShaderPrefixList + SHADER_TEXT_VISUAL_SHADER_VERT.data());
std::string fragmentShader = std::string(Dali::Shader::GetFragmentShaderPrefix() + fragmentShaderPrefixList + SHADER_TEXT_VISUAL_SHADER_FRAG.data());
- shader = factoryCache.GenerateAndSaveShader(shaderType, vertexShader, fragmentShader);
+ shader = factoryCache.GenerateAndSaveShader(shaderType, vertexShader, fragmentShader, false);
}
return shader;
}
/*
- * Copyright (c) 2024 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2025 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Shader shader = GetTextShader(mFactoryCache, featureBuilder);
mImpl->mRenderer = VisualRenderer::New(geometry, shader);
+ mImpl->mRenderer.RegisterVisualTransformUniform();
mImpl->mRenderer.ReserveCustomProperties(CUSTOM_PROPERTY_COUNT);
mTextRequireRenderPropertyIndex = mImpl->mRenderer.RegisterUniqueProperty("requireRender", mTextRequireRender);
mHasMultipleTextColorsIndex = mImpl->mRenderer.RegisterUniqueProperty("uHasMultipleTextColors", static_cast<float>(false));
renderer.SetTextures(textureSet);
// Register transform properties
- mImpl->mTransform.SetUniforms(renderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(renderer, Direction::LEFT_TO_RIGHT);
// Enable the pre-multiplied alpha to improve the text quality
renderer.SetProperty(Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA, true);
mImpl->mRenderer.SetTextures(textureSet);
// Register transform properties
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
mImpl->mRenderer.SetProperty(mHasMultipleTextColorsIndex, static_cast<float>(mTextShaderFeatureCache.IsEnabledMultiColor()));
mImpl->mRenderer.SetProperty(Renderer::Property::BLEND_MODE, BlendMode::ON);
while(verifiedHeight > 0)
{
VisualRenderer tilingRenderer = VisualRenderer::New(geometry, shader);
+ tilingRenderer.RegisterVisualTransformUniform();
tilingRenderer.SetProperty(Dali::Renderer::Property::DEPTH_INDEX, Toolkit::DepthIndex::CONTENT);
// New offset position of buffer for tiling.
info.offsetHeight += static_cast<uint32_t>(maxTextureSize);
mImpl->mRenderer.SetTextures(textureSet);
// Register transform properties
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
mImpl->mRenderer.SetProperty(mHasMultipleTextColorsIndex, static_cast<float>(hasMultipleTextColors));
mImpl->mRenderer.SetProperty(Renderer::Property::BLEND_MODE, BlendMode::ON);
while(verifiedHeight > 0)
{
VisualRenderer tilingRenderer = VisualRenderer::New(geometry, shader);
+ tilingRenderer.RegisterVisualTransformUniform();
tilingRenderer.SetProperty(Dali::Renderer::Property::DEPTH_INDEX, Toolkit::DepthIndex::CONTENT);
// New offset position of buffer for tiling.
info.offsetHeight += maxTextureSize;
mIgnoreFittingMode(false),
mPixelAreaSetByFittingMode(false),
mTransformMapSetForFittingMode(false),
+ mTransformMapUsingDefault(true),
mTransformMapChanged(false)
{
}
int mCornerRadiusPolicy;
};
+ /**
+ * @brief Set the uniform properties onto the renderer.
+ * And Register visual transform uniforms if neccessary.
+ */
+ void SetTransformUniforms(VisualRenderer renderer, Toolkit::Direction::Type direction)
+ {
+ if(!mTransformMapUsingDefault || direction != Toolkit::Direction::LEFT_TO_RIGHT)
+ {
+ renderer.RegisterVisualTransformUniform();
+ mTransform.SetUniforms(renderer, direction);
+ }
+ }
+
DecorationData* EnsureDecorationData()
{
if(mDecorationData == nullptr)
bool mIgnoreFittingMode : 1; ///< Whether we need to ignore fitting mode.
bool mPixelAreaSetByFittingMode : 1; ///< Whether the pixel area is set for fitting mode.
bool mTransformMapSetForFittingMode : 1; ///< Whether the transformMap is set for fitting mode.
- bool mTransformMapChanged : 1; ///< Whether the transformMap is changed or not. We'll be false after SetTransform called.
+ bool mTransformMapUsingDefault : 1; ///< Whether we are using the default transformMap not. We'll be false after SetTransform called, or animated.
+ ///< Note : If it change to false, never be true again.
+ bool mTransformMapChanged : 1; ///< Whether the transformMap is changed or not. We'll be false after SetTransform called.
};
} // namespace Visual
// Unusual case. SetProperty called after OnInitialize().
// Assume that DoAction call UPDATE_PROPERTY.
mImpl->mTransformMapChanged |= !map.Empty();
+ if(mImpl->mTransformMapChanged)
+ {
+ mImpl->mTransformMapUsingDefault = false;
+ mImpl->mRenderer.RegisterVisualTransformUniform();
+ }
mImpl->mTransform.UpdatePropertyMap(map);
// Set Renderer uniforms, and change logics for subclasses.
}
else
{
+ mImpl->mTransformMapUsingDefault &= map.Empty();
mImpl->mTransform.SetPropertyMap(map);
}
}
{
mImpl->mControlSize = controlSize;
mImpl->mTransformMapChanged |= !transform.Empty();
+ if(mImpl->mTransformMapChanged)
+ {
+ mImpl->mTransformMapUsingDefault = false;
+ mImpl->mRenderer.RegisterVisualTransformUniform();
+ }
mImpl->mTransform.UpdatePropertyMap(transform);
#if defined(DEBUG_ENABLED)
}
case Toolkit::Visual::Transform::Property::OFFSET:
{
+ // Need to change visual transform is not default anymore.
+ mImpl->mTransformMapUsingDefault = false;
+ mImpl->mRenderer.RegisterVisualTransformUniform();
+
+ // Change shader
+ UpdateShader();
+
return Dali::Property(mImpl->mRenderer, VisualRenderer::Property::TRANSFORM_OFFSET);
}
case Toolkit::Visual::Transform::Property::SIZE:
{
+ // Need to change visual transform is not default anymore.
+ mImpl->mTransformMapUsingDefault = false;
+ mImpl->mRenderer.RegisterVisualTransformUniform();
+
+ // Change shader
+ UpdateShader();
+
return Dali::Property(mImpl->mRenderer, VisualRenderer::Property::TRANSFORM_SIZE);
}
/**
* @brief Generate a shader by the current properties from each sub classes's own shader-generate logic.
- * @param[in] factoryCache The visual factory cache to store the generated shader.
* @return If the function defined, Generated shader by the current properties. Else, empty shader.
+ * @todo This function should be removed after refactoring the shader generation logic.
*/
virtual Dali::Shader GenerateShader() const
{
/*
- * Copyright (c) 2024 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2025 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include <dali/devel-api/scripting/enum-helper.h>
#include <dali/devel-api/scripting/scripting.h>
#include <dali/integration-api/debug.h>
+#include <dali/integration-api/shader-integ.h>
#include <dali/public-api/math/math-utils.h>
// INTERNAL INCLUDES
mGeometry[type] = geometry;
}
-Shader VisualFactoryCache::GetShader(ShaderType type)
+Shader VisualFactoryCache::GetShader(ShaderType type, bool useDefaultUniforms)
{
+ if(useDefaultUniforms)
+ {
+ return mDefaultShader[type];
+ }
return mShader[type];
}
-Shader VisualFactoryCache::GenerateAndSaveShader(ShaderType type, std::string_view vertexShader, std::string_view fragmentShader)
+Shader VisualFactoryCache::GenerateAndSaveShader(ShaderType type, std::string_view vertexShader, std::string_view fragmentShader, bool useDefaultUniforms)
{
- Shader shader = Shader::New(vertexShader, fragmentShader, Shader::Hint::NONE, Scripting::GetLinearEnumerationName<ShaderType>(type, VISUAL_SHADER_TYPE_TABLE, VISUAL_SHADER_TYPE_TABLE_COUNT));
- mShader[type] = shader;
+ Shader shader;
+ if(useDefaultUniforms)
+ {
+ shader = Integration::ShaderNewWithUniformBlock(vertexShader, fragmentShader, Shader::Hint::NONE, Scripting::GetLinearEnumerationName<ShaderType>(type, VISUAL_SHADER_TYPE_TABLE, VISUAL_SHADER_TYPE_TABLE_COUNT), {GetDefaultUniformBlock()});
+ mDefaultShader[type] = shader;
+ }
+ else
+ {
+ shader = Shader::New(vertexShader, fragmentShader, Shader::Hint::NONE, Scripting::GetLinearEnumerationName<ShaderType>(type, VISUAL_SHADER_TYPE_TABLE, VISUAL_SHADER_TYPE_TABLE_COUNT));
+ mShader[type] = shader;
+ }
return shader;
}
return *mVectorAnimationManager;
}
+Dali::UniformBlock& VisualFactoryCache::GetDefaultUniformBlock()
+{
+ if(!mDefaultUniformBlock)
+ {
+ // We should make default uniform block as overwritable.
+ mDefaultUniformBlock = Dali::UniformBlock::New("VisualVertBlock");
+
+ mDefaultUniformBlock.RegisterUniqueProperty("offset", Vector2::ZERO);
+ mDefaultUniformBlock.RegisterUniqueProperty("size", Vector2::ONE);
+ mDefaultUniformBlock.RegisterUniqueProperty("offsetSizeMode", Vector4::ZERO);
+ mDefaultUniformBlock.RegisterUniqueProperty("origin", -Vector2(0.5f, 0.5f)); ///< TOP_BEGIN for LTR
+ mDefaultUniformBlock.RegisterUniqueProperty("anchorPoint", Vector2(0.5f, 0.5f)); ///< TOP_BEGIN for LTR
+ mDefaultUniformBlock.RegisterUniqueProperty("extraSize", Vector2::ZERO);
+ }
+ return mDefaultUniformBlock;
+}
+
void VisualFactoryCache::FinalizeVectorAnimationManager()
{
if(mVectorAnimationManager)
if(DALI_LIKELY((xStretchCount == 0 && yStretchCount == 0) || (xStretchCount == 1 && yStretchCount == 1)))
{
- shader = GetShader(VisualFactoryCache::NINE_PATCH_SHADER);
+ shader = GetShader(VisualFactoryCache::NINE_PATCH_SHADER, false);
if(DALI_UNLIKELY(!shader))
{
// Only cache vanilla 9 patch shaders
- shader = GenerateAndSaveShader(VisualFactoryCache::NINE_PATCH_SHADER, SHADER_NPATCH_VISUAL_3X3_SHADER_VERT, SHADER_NPATCH_VISUAL_SHADER_FRAG);
+ shader = GenerateAndSaveShader(VisualFactoryCache::NINE_PATCH_SHADER, SHADER_NPATCH_VISUAL_3X3_SHADER_VERT, SHADER_NPATCH_VISUAL_SHADER_FRAG, false);
}
}
else if(xStretchCount > 0 || yStretchCount > 0)
}
}
-void VisualFactoryCache::UpdateBrokenImageRenderer(Renderer& renderer, const Vector2& size, const bool rendererIsImage)
+void VisualFactoryCache::UpdateBrokenImageRenderer(VisualRenderer& renderer, const Vector2& size, const bool rendererIsImage)
{
bool useDefaultBrokenImage = false;
if(mBrokenImageInfoContainer.size() == 0)
// Set geometry and shader for npatch
Geometry geometry = GetNPatchGeometry(brokenIndex);
Shader shader = GetNPatchShader(brokenIndex);
+ renderer.RegisterVisualTransformUniform();
renderer.SetGeometry(geometry);
renderer.SetShader(shader);
ApplyTextureAndUniforms(renderer, brokenIndex);
if(!rendererIsImage)
{
Geometry geometry = GetGeometry(QUAD_GEOMETRY);
- Shader shader = GetShader(IMAGE_SHADER);
+ Shader shader = GetShader(IMAGE_SHADER, false);
if(!shader)
{
- shader = GenerateAndSaveShader(IMAGE_SHADER, Dali::Shader::GetVertexShaderPrefix() + SHADER_IMAGE_VISUAL_SHADER_VERT.data(), Dali::Shader::GetFragmentShaderPrefix() + SHADER_IMAGE_VISUAL_SHADER_FRAG.data());
+ shader = GenerateAndSaveShader(IMAGE_SHADER, Dali::Shader::GetVertexShaderPrefix() + SHADER_IMAGE_VISUAL_SHADER_VERT.data(), Dali::Shader::GetFragmentShaderPrefix() + SHADER_IMAGE_VISUAL_SHADER_FRAG.data(), false);
shader.RegisterProperty(PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT);
shader.RegisterProperty(PREMULTIPLIED_ALPHA, ALPHA_VALUE_PREMULTIPLIED);
}
+ renderer.RegisterVisualTransformUniform();
renderer.SetGeometry(geometry);
renderer.SetShader(shader);
}
#include <dali/public-api/object/ref-object.h>
#include <dali/public-api/rendering/geometry.h>
#include <dali/public-api/rendering/shader.h>
+#include <dali/public-api/rendering/uniform-block.h>
+#include <dali/public-api/rendering/visual-renderer.h>
// INTERNAL INCLUDES
#include <dali-toolkit/internal/texture-manager/texture-manager-impl.h>
* Request shader of the given type.
* @return The shader of the required type if it exist in the cache. Otherwise, an empty handle is returned.
*/
- Shader GetShader(ShaderType type);
+ Shader GetShader(ShaderType type, bool useDefaultUniforms = false);
/**
* Generate and cache the shader of the give type. The name of shader will be installed to shader.
* @param[in] type The shder type.
* @param[in] vertexShader The vertex shader code.
* @param[in] fragmentShader The fragment shader code.
+ * @param[in] useDefaultUniforms Whether to use default uniforms or not.
* @return The shader created by given vertex and fragment shader code.
*/
- Shader GenerateAndSaveShader(ShaderType type, std::string_view vertexShader, std::string_view fragmentShader);
+ Shader GenerateAndSaveShader(ShaderType type, std::string_view vertexShader, std::string_view fragmentShader, bool useDefaultUniforms = false);
/*
* Greate the quad geometry.
* If true, we don't need to create new renderer when broken image is single image.
* Most of user experience use normal images. So It can reduce runtime.
*/
- void UpdateBrokenImageRenderer(Renderer& renderer, const Vector2& size, const bool rendererIsImage = true);
+ void UpdateBrokenImageRenderer(VisualRenderer& renderer, const Vector2& size, const bool rendererIsImage = true);
/**
* @brief Get whether we support YUV Planes load or not.
*/
VectorAnimationManager& GetVectorAnimationManager();
+ /**
+ * @brief Get the default uniform block. This is used to share common uniforms between different visuals.
+ * @return The uniform block with default value registered.
+ */
+ Dali::UniformBlock& GetDefaultUniformBlock();
+
/**
* @brief Finalize vector animation manager.
* It will be called when application is terminated.
Geometry mGeometry[GEOMETRY_TYPE_MAX];
Shader mShader[SHADER_TYPE_MAX];
+ Shader mDefaultShader[SHADER_TYPE_MAX];
bool mLoadYuvPlanes; ///< A global flag to specify if the image should be loaded as yuv planes
NPatchLoader mNPatchLoader;
SvgLoader mSvgLoader;
+ Dali::UniformBlock mDefaultUniformBlock;
+
std::unique_ptr<VectorAnimationManager> mVectorAnimationManager;
bool mPreMultiplyOnLoad;
std::vector<BrokenImageInfo> mBrokenImageInfoContainer;
mImpl->mRenderer = VisualRenderer::New(geometry, shader);
//Register transform properties
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
}
Geometry WireframeVisual::CreateQuadWireframeGeometry()
if(mImpl->mRenderer && mImpl->mTransformMapChanged)
{
//Register transform properties
- mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
+ mImpl->SetTransformUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
}
}