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:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user