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
This commit is contained in:
Nader Jawad
2021-05-10 13:27:52 -07:00
parent 8ed00dc56d
commit 9272f21612
4 changed files with 32 additions and 28 deletions

View File

@@ -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;

View File

@@ -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
};
/**

View File

@@ -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,

View File

@@ -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