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
diff --git a/libs/hwui/Properties.cpp b/libs/hwui/Properties.cpp
index c58c888..9ed801b 100644
--- a/libs/hwui/Properties.cpp
+++ b/libs/hwui/Properties.cpp
@@ -84,7 +84,7 @@
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 d06410e..bebfbee 100644
--- a/libs/hwui/Properties.h
+++ b/libs/hwui/Properties.h
@@ -200,8 +200,9 @@
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 6123c05..cd0783f 100644
--- a/libs/hwui/jni/android_graphics_RenderNode.cpp
+++ b/libs/hwui/jni/android_graphics_RenderNode.cpp
@@ -573,8 +573,9 @@
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 @@
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 509884e..57cdde2 100644
--- a/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp
+++ b/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp
@@ -172,7 +172,7 @@
}
static bool stretchNeedsLayer(const LayerProperties& properties) {
- return Properties::stretchEffectBehavior == StretchEffectBehavior::Shader &&
+ return Properties::stretchEffectBehavior != StretchEffectBehavior::LinearScale &&
!properties.getStretchEffect().isEmpty();
}
@@ -253,7 +253,7 @@
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