From 7f7926a8187728a1a4290b61204492ce086c3026 Mon Sep 17 00:00:00 2001 From: xuxinyu Date: Sat, 13 Sep 2025 16:44:38 +0800 Subject: [PATCH] HPS fix upscale Signed-off-by: xuxinyu --- include/ge_hps_effect_filter.h | 2 ++ src/ge_hps_effect_filter.cpp | 34 ++++++++++++++++++++++++++++++---- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/include/ge_hps_effect_filter.h b/include/ge_hps_effect_filter.h index 5255a9b..3ad1b1c 100644 --- a/include/ge_hps_effect_filter.h +++ b/include/ge_hps_effect_filter.h @@ -58,6 +58,7 @@ public: private: std::vector> hpsEffect_; bool isBlur_ {false}; + bool needClampFilter_ {true}; Drawing::Matrix upscale_matrix_; void GenerateMesaBlurEffect(const Drawing::GEMESABlurShaderFilterParams& params, const Drawing::Rect& src, const Drawing::Rect& dst); @@ -73,6 +74,7 @@ private: bool ApplyHpsSmallCanvas(Drawing::Canvas& canvas, const std::shared_ptr& image, std::shared_ptr& outImage, const HpsEffectContext& hpsContext); std::shared_ptr GetUpscaleEffect() const; + std::shared_ptr GetClampUpscaleEffect() const; bool DrawImageWithHps(Drawing::Canvas& canvas, const std::shared_ptr& imageCache, std::shared_ptr& outImage, const Drawing::Rect& dst, const HpsEffectContext& hpsContext); // Used in unit tests due to non-Mockable Drawing::GPUContext, don't use in general cases diff --git a/src/ge_hps_effect_filter.cpp b/src/ge_hps_effect_filter.cpp index d67b26c..9376886 100644 --- a/src/ge_hps_effect_filter.cpp +++ b/src/ge_hps_effect_filter.cpp @@ -328,6 +328,31 @@ std::shared_ptr HpsEffectFilter::GetUpscaleEffect() cons return s_upscaleEffect; } +std::shared_ptr HpsEffectFilter::GetClampUpscaleEffect() const +{ + static std::shared_ptr s_upclampscaleEffect = [] { + static const std::string mixclampString(R"( + uniform shader blurredInput; + uniform float inColorFactor; + + highp float random(float2 xy) { + float t = dot(xy, float2(78.233, 12.9898)); + return fract(sin(t) * 43758.5453); + } + half4 main(float2 xy) { + highp float noiseGranularity = inColorFactor / 255.0; + half4 finalColor = blurredInput.eval(xy); + float noise = mix(-noiseGranularity, noiseGranularity, random(xy)); + finalColor.rgb += noise; + finalColor.rgb = clamp(finalColor.rgb, vec3(0.0), vec3(1.0)); + return finalColor; + } + )"); + return Drawing::RuntimeEffect::CreateForShader(mixclampString); + }(); + return s_upclampscaleEffect; +} + bool HpsEffectFilter::DrawImageWithHps(Drawing::Canvas& canvas, const std::shared_ptr& imageCache, std::shared_ptr& outImage, const Drawing::Rect& dst, const HpsEffectContext& hpsContext) { @@ -339,15 +364,15 @@ bool HpsEffectFilter::DrawImageWithHps(Drawing::Canvas& canvas, const std::share const auto blurShader = Drawing::ShaderEffect::CreateImageShader(*imageCache, Drawing::TileMode::CLAMP, Drawing::TileMode::CLAMP, linear, upscale_matrix_); auto upscaleEffect = GetUpscaleEffect(); - if (upscaleEffect == nullptr) { + auto upscaleClampEffect = GetClampUpscaleEffect(); + if (upscaleEffect == nullptr || upscaleClampEffect == nullptr) { return false; } Drawing::Brush brush; float factor = GetHpsEffectBlurNoiseFactor(); - LOGD("HpsEffectFilter::DrawImageWithHps HpsNoise %{public}f", factor); static constexpr float epsilon = 0.1f; if (!ROSEN_LE(factor, epsilon)) { - Drawing::RuntimeShaderBuilder mixBuilder(upscaleEffect); + Drawing::RuntimeShaderBuilder mixBuilder(needClampFilter_ ? upscaleClampEffect : upscaleEffect); mixBuilder.SetChild("blurredInput", blurShader); mixBuilder.SetUniform("inColorFactor", factor); brush.SetShaderEffect(mixBuilder.MakeShader(nullptr, imageCache->IsOpaque())); @@ -426,7 +451,7 @@ bool HpsEffectFilter::ApplyHpsEffect(Drawing::Canvas& canvas, const std::shared_ std::shared_ptr& outImage, const HpsEffectContext& hpsContext) { if (image == nullptr || hpsEffect_.empty()) { - LOGE("HpsEffectFilter::ApplyHpsEffect image is null or hpsEffect_ is empty"); + LOGD("HpsEffectFilter::ApplyHpsEffect image is null or hpsEffect_ is empty"); return false; } @@ -435,6 +460,7 @@ bool HpsEffectFilter::ApplyHpsEffect(Drawing::Canvas& canvas, const std::shared_ LOGE("HpsEffectFilter::ApplyHpsEffect image size is zero"); return false; } + needClampFilter_ = ((imageInfo.GetColorType() == Drawing::ColorType::COLORTYPE_RGBA_F16) ? false : true); if (isBlur_) { isBlur_ = false; return ApplyHpsSmallCanvas(canvas, image, outImage, hpsContext); -- Gitee