diff options
| author | 2017-12-04 15:49:47 -0800 | |
|---|---|---|
| committer | 2017-12-06 07:59:02 -0800 | |
| commit | 503d2bd9a0c64f90fc321f9d65fc65e592f1fa2b (patch) | |
| tree | 71b01b99ef475dd4f9d8a7b7c1a5fd0f4acd3c2b | |
| parent | 069ac6a5dd9af2ee596efb628988520fbdd4a001 (diff) | |
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
| -rw-r--r-- | services/surfaceflinger/Layer.cpp | 17 |
1 files 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<Layer>& 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<Layer>& childLayer, @@ -1122,12 +1123,13 @@ bool Layer::setChildRelativeLayer(const sp<Layer>& 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<Layer>& relative) { setTransactionFlags(eTransactionNeeded); } -bool Layer::setRelativeLayer(const sp<IBinder>& relativeToHandle, int32_t z) { +bool Layer::setRelativeLayer(const sp<IBinder>& relativeToHandle, int32_t relativeZ) { sp<Handle> handle = static_cast<Handle*>(relativeToHandle.get()); if (handle == nullptr) { return false; @@ -1168,9 +1170,14 @@ bool Layer::setRelativeLayer(const sp<IBinder>& 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) { |