From 503d2bd9a0c64f90fc321f9d65fc65e592f1fa2b Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Mon, 4 Dec 2017 15:49:47 -0800 Subject: Correct setLayer variants. Correct a legitimate bug in setLayer where it would fail to clear a relative layer equal to the new absolute layer. Optimize all the other variants to not trigger rebuilding of layer stacks in the case of redundant Z setting. Test: Existing tests pass. Change-Id: I6559322017a7b8c5510f8ff265216af3d414696a --- services/surfaceflinger/Layer.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 298f597f34..ff5e6f6e36 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -1109,8 +1109,9 @@ bool Layer::setChildLayer(const sp& childLayer, int32_t z) { if (childLayer->setLayer(z)) { mCurrentChildren.removeAt(idx); mCurrentChildren.add(childLayer); + return true; } - return true; + return false; } bool Layer::setChildRelativeLayer(const sp& childLayer, @@ -1122,12 +1123,13 @@ bool Layer::setChildRelativeLayer(const sp& childLayer, if (childLayer->setRelativeLayer(relativeToHandle, relativeZ)) { mCurrentChildren.removeAt(idx); mCurrentChildren.add(childLayer); + return true; } - return true; + return false; } bool Layer::setLayer(int32_t z) { - if (mCurrentState.z == z) return false; + if (mCurrentState.z == z && !usingRelativeZ(LayerVector::StateSet::Current)) return false; mCurrentState.sequence++; mCurrentState.z = z; mCurrentState.modified = true; @@ -1158,7 +1160,7 @@ void Layer::addZOrderRelative(const wp& relative) { setTransactionFlags(eTransactionNeeded); } -bool Layer::setRelativeLayer(const sp& relativeToHandle, int32_t z) { +bool Layer::setRelativeLayer(const sp& relativeToHandle, int32_t relativeZ) { sp handle = static_cast(relativeToHandle.get()); if (handle == nullptr) { return false; @@ -1168,9 +1170,14 @@ bool Layer::setRelativeLayer(const sp& relativeToHandle, int32_t z) { return false; } + if (mCurrentState.z == relativeZ && usingRelativeZ(LayerVector::StateSet::Current) && + mCurrentState.zOrderRelativeOf == relative) { + return false; + } + mCurrentState.sequence++; mCurrentState.modified = true; - mCurrentState.z = z; + mCurrentState.z = relativeZ; auto oldZOrderRelativeOf = mCurrentState.zOrderRelativeOf.promote(); if (oldZOrderRelativeOf != nullptr) { -- cgit v1.2.3-59-g8ed1b