summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Robert Carr <racarr@google.com> 2017-12-04 15:49:47 -0800
committer Robert Carr <racarr@google.com> 2017-12-06 07:59:02 -0800
commit503d2bd9a0c64f90fc321f9d65fc65e592f1fa2b (patch)
tree71b01b99ef475dd4f9d8a7b7c1a5fd0f4acd3c2b
parent069ac6a5dd9af2ee596efb628988520fbdd4a001 (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.cpp17
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) {