From 9272f2161230ab3fae0051e90131648da55aa0ad Mon Sep 17 00:00:00 2001 From: Nader Jawad Date: Mon, 10 May 2021 13:27:52 -0700 Subject: [PATCH] Updated StretchEffect types Added additional shader stretch effect type to distinguish between shader based stretches that are configured in HWUI as well as those that are configured in both HWUI and SurfaceFlinger Bug: 184297961 Test: manual Change-Id: Ie1083cef7cbaf4f877783d67d429af7f5edd0a3c --- libs/hwui/Properties.cpp | 2 +- libs/hwui/Properties.h | 5 +- libs/hwui/jni/android_graphics_RenderNode.cpp | 49 ++++++++++--------- .../hwui/pipeline/skia/RenderNodeDrawable.cpp | 4 +- 4 files changed, 32 insertions(+), 28 deletions(-) diff --git a/libs/hwui/Properties.cpp b/libs/hwui/Properties.cpp index c58c888b8a216..9ed801baf5ea9 100644 --- a/libs/hwui/Properties.cpp +++ b/libs/hwui/Properties.cpp @@ -84,7 +84,7 @@ float Properties::defaultSdrWhitePoint = 200.f; bool Properties::useHintManager = true; int Properties::targetCpuTimePercentage = 70; -StretchEffectBehavior Properties::stretchEffectBehavior = StretchEffectBehavior::Shader; +StretchEffectBehavior Properties::stretchEffectBehavior = StretchEffectBehavior::ShaderHWUI; bool Properties::load() { bool prevDebugLayersUpdates = debugLayersUpdates; diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h index d06410e8252a2..bebfbee55f12e 100644 --- a/libs/hwui/Properties.h +++ b/libs/hwui/Properties.h @@ -200,8 +200,9 @@ enum class OverdrawColorSet { Default = 0, Deuteranomaly }; enum class RenderPipelineType { SkiaGL, SkiaVulkan, NotInitialized = 128 }; enum class StretchEffectBehavior { - Shader, - LinearScale, + ShaderHWUI, // Stretch shader in HWUI only, matrix scale in SF + Shader, // Stretch shader in both HWUI and SF + LinearScale // Linear stretch everywhere }; /** diff --git a/libs/hwui/jni/android_graphics_RenderNode.cpp b/libs/hwui/jni/android_graphics_RenderNode.cpp index 6123c05fb22ab..cd0783f75106a 100644 --- a/libs/hwui/jni/android_graphics_RenderNode.cpp +++ b/libs/hwui/jni/android_graphics_RenderNode.cpp @@ -573,8 +573,9 @@ static void android_view_RenderNode_requestPositionUpdates(JNIEnv* env, jobject, const RenderProperties& props = node.properties(); uirenderer::Rect bounds(props.getWidth(), props.getHeight()); - if (Properties::stretchEffectBehavior == StretchEffectBehavior::Shader && - info.stretchEffectCount) { + bool useStretchShader = Properties::stretchEffectBehavior != + StretchEffectBehavior::LinearScale; + if (useStretchShader && info.stretchEffectCount) { handleStretchEffect(info, bounds); } @@ -679,30 +680,32 @@ static void android_view_RenderNode_requestPositionUpdates(JNIEnv* env, jobject, stretchTargetBounds(*effect, result.width, result.height, childRelativeBounds,targetBounds); - JNIEnv* env = jnienv(); + if (Properties::stretchEffectBehavior == StretchEffectBehavior::Shader) { + JNIEnv* env = jnienv(); - jobject localref = env->NewLocalRef(mWeakRef); - if (CC_UNLIKELY(!localref)) { - env->DeleteWeakGlobalRef(mWeakRef); - mWeakRef = nullptr; - return; - } + jobject localref = env->NewLocalRef(mWeakRef); + if (CC_UNLIKELY(!localref)) { + env->DeleteWeakGlobalRef(mWeakRef); + mWeakRef = nullptr; + return; + } #ifdef __ANDROID__ // Layoutlib does not support CanvasContext - SkVector stretchDirection = effect->getStretchDirection(); - env->CallVoidMethod(localref, gPositionListener_ApplyStretchMethod, - info.canvasContext.getFrameNumber(), - result.width, - result.height, - stretchDirection.fX, - stretchDirection.fY, - effect->maxStretchAmountX, - effect->maxStretchAmountY, - childRelativeBounds.left(), - childRelativeBounds.top(), - childRelativeBounds.right(), - childRelativeBounds.bottom()); + SkVector stretchDirection = effect->getStretchDirection(); + env->CallVoidMethod(localref, gPositionListener_ApplyStretchMethod, + info.canvasContext.getFrameNumber(), + result.width, + result.height, + stretchDirection.fX, + stretchDirection.fY, + effect->maxStretchAmountX, + effect->maxStretchAmountY, + childRelativeBounds.left(), + childRelativeBounds.top(), + childRelativeBounds.right(), + childRelativeBounds.bottom()); #endif - env->DeleteLocalRef(localref); + env->DeleteLocalRef(localref); + } } void doUpdatePositionAsync(jlong frameNumber, jint left, jint top, diff --git a/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp b/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp index 509884e23c26e..57cdde2e8f10f 100644 --- a/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp +++ b/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp @@ -172,7 +172,7 @@ void RenderNodeDrawable::forceDraw(SkCanvas* canvas) const { } static bool stretchNeedsLayer(const LayerProperties& properties) { - return Properties::stretchEffectBehavior == StretchEffectBehavior::Shader && + return Properties::stretchEffectBehavior != StretchEffectBehavior::LinearScale && !properties.getStretchEffect().isEmpty(); } @@ -253,7 +253,7 @@ void RenderNodeDrawable::drawContent(SkCanvas* canvas) const { const StretchEffect& stretch = properties.layerProperties().getStretchEffect(); if (stretch.isEmpty() || - Properties::stretchEffectBehavior != StretchEffectBehavior::Shader) { + Properties::stretchEffectBehavior == StretchEffectBehavior::LinearScale) { // If we don't have any stretch effects, issue the filtered // canvas draw calls to make sure we still punch a hole // with the same canvas transformation + clip into the target