diff options
author | Vishnu Nair <vishnun@google.com> | 2020-08-27 11:41:20 -0700 |
---|---|---|
committer | Vishnu Nair <vishnun@google.com> | 2020-09-16 15:32:58 +0000 |
commit | 63bd9936da85a2119b6137d85cd1abed8c608029 (patch) | |
tree | 42cd761890e68a0110e7f1aa6ead2ea1b0dac399 | |
parent | ec3b36a49b0dc802a7dbdb15b2836c1afe6be98f (diff) | |
download | native-63bd9936da85a2119b6137d85cd1abed8c608029.tar.gz |
Handle defer transactions on a detached layer
If a defer transaction is applied on a detached layer, the barrier layer
cannot dequeue its buffer since it incorrectly waits for the detached
layer to commit its dependent pending states. When a layer is detached
we remove all remove sync points. This fix ensures that an already
detached layer does not add any pending states or sync points.
Test: atest SurfaceFlinger_test:DetachChildren#DeferredTransactionOnDetachedChildren
Fixes: 150924737
Change-Id: Iefe4248b1c2f4273d07a0324697a82d0fe9c5e52
(cherry picked from commit edbe6d264ccd2a277b87577b931aa22ad7d9a90f)
-rw-r--r-- | services/surfaceflinger/Layer.cpp | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 03903f6d07..3b9c7b77c7 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -1445,6 +1445,13 @@ Layer::FrameRate Layer::getFrameRateForLayerTree() const { void Layer::deferTransactionUntil_legacy(const sp<Layer>& barrierLayer, uint64_t frameNumber) { ATRACE_CALL(); + if (mLayerDetached) { + // If the layer is detached, then we don't defer this transaction since we will not + // commit the pending state while the layer is detached. Adding sync points may cause + // the barrier layer to wait for the states to be committed before dequeuing a buffer. + return; + } + mCurrentState.barrierLayer_legacy = barrierLayer; mCurrentState.frameNumber_legacy = frameNumber; // We don't set eTransactionNeeded, because just receiving a deferral |