Fix background blur double downscaling 65/318565/3
authorjmm <j0064423.lee@samsung.com>
Mon, 20 Jan 2025 13:09:21 +0000 (22:09 +0900)
committerjmm <j0064423.lee@samsung.com>
Mon, 20 Jan 2025 13:34:33 +0000 (22:34 +0900)
Change-Id: Ib58d31033282b2d062be3a017040d81ce7b0a224

dali-toolkit/internal/controls/render-effects/blur-effect-impl.cpp
dali-toolkit/internal/controls/render-effects/blur-effect-impl.h

index c39aec040fa677a88162fcc9c995553d3ad63bd5..d3321262d88a5ee97a50322349eb83d6e47689a7 100644 (file)
@@ -75,6 +75,7 @@ BlurEffectImpl::BlurEffectImpl(bool isBackground)
   mInternalRoot(Actor::New()),
   mDownscaleFactor(BLUR_EFFECT_DOWNSCALE_FACTOR),
   mPixelRadius(BLUR_EFFECT_PIXEL_RADIUS),
+  mDownscaledPixelRadius(static_cast<uint32_t>(BLUR_EFFECT_PIXEL_RADIUS * BLUR_EFFECT_DOWNSCALE_FACTOR)),
   mBellCurveWidth(Math::MACHINE_EPSILON_1),
   mSkipBlur(false),
   mIsBackground(isBackground)
@@ -86,6 +87,7 @@ BlurEffectImpl::BlurEffectImpl(float downscaleFactor, uint32_t blurRadius, bool
   mInternalRoot(Actor::New()),
   mDownscaleFactor(downscaleFactor),
   mPixelRadius(blurRadius),
+  mDownscaledPixelRadius(BLUR_EFFECT_PIXEL_RADIUS),
   mBellCurveWidth(Math::MACHINE_EPSILON_1),
   mSkipBlur(false),
   mIsBackground(isBackground)
@@ -113,9 +115,9 @@ BlurEffectImpl::BlurEffectImpl(float downscaleFactor, uint32_t blurRadius, bool
     mPixelRadius     = fixedBlurRadius;
   }
 
-  mPixelRadius = static_cast<uint32_t>(mPixelRadius * mDownscaleFactor);
+  mDownscaledPixelRadius = static_cast<uint32_t>(mPixelRadius * mDownscaleFactor);
 
-  if(DALI_UNLIKELY((mPixelRadius >> 1) < MINIMUM_GPU_ARRAY_SIZE))
+  if(DALI_UNLIKELY((mDownscaledPixelRadius >> 1) < MINIMUM_GPU_ARRAY_SIZE))
   {
     mSkipBlur = true;
     DALI_LOG_ERROR("Blur radius is too small. This blur will be ignored.\n");
@@ -194,8 +196,8 @@ void BlurEffectImpl::OnInitialize()
 
   // Calculate bell curve width
   {
-    const float epsilon     = 1e-2f / (mPixelRadius * 2);
-    const float localOffset = (mPixelRadius * 2) - 1;
+    const float epsilon     = 1e-2f / (mDownscaledPixelRadius * 2);
+    const float localOffset = (mDownscaledPixelRadius * 2) - 1;
 
     float lowerBoundBellCurveWidth = Math::MACHINE_EPSILON_10000;
     float upperBoundBellCurveWidth = MAXIMUM_BELL_CURVE_WIDTH;
@@ -223,7 +225,7 @@ void BlurEffectImpl::OnInitialize()
 
     // shader
     std::ostringstream fragmentStringStream;
-    fragmentStringStream << "#define NUM_SAMPLES " << (mPixelRadius >> 1) << "\n";
+    fragmentStringStream << "#define NUM_SAMPLES " << (mDownscaledPixelRadius >> 1) << "\n";
     fragmentStringStream << SHADER_BLUR_EFFECT_FRAG;
     std::string fragmentSource(fragmentStringStream.str());
 
@@ -426,7 +428,7 @@ void BlurEffectImpl::ApplyRenderTaskSourceActor(RenderTask sourceRenderTask, con
 
 void BlurEffectImpl::SetShaderConstants(uint32_t downsampledWidth, uint32_t downsampledHeight)
 {
-  const uint32_t sampleCount    = mPixelRadius >> 1; // compression
+  const uint32_t sampleCount    = mDownscaledPixelRadius >> 1; // compression
   const uint32_t kernelSize     = sampleCount * 4 - 1;
   const uint32_t halfKernelSize = kernelSize / 2 + 1; // Gaussian curve is symmetric
 
index c60ce241ac613e7d45fa00e2de536ee824f5fdc8..655b1847145ed16873b543527ef88c88bef51719 100644 (file)
@@ -188,6 +188,7 @@ private:
   // Variables
   float    mDownscaleFactor;
   uint32_t mPixelRadius;
+  uint32_t mDownscaledPixelRadius;
   float    mBellCurveWidth;
 
   bool mSkipBlur : 1;