diff options
author | Robert Carr <racarr@google.com> | 2021-06-11 13:21:09 -0700 |
---|---|---|
committer | Rob Carr <racarr@google.com> | 2021-06-18 23:14:46 +0000 |
commit | e450fb5c322249a2b421f99161e5476015b20b0c (patch) | |
tree | 47ba1520320c87c44273e3d618102bf9d6119c50 | |
parent | 26953ee25d470a7f54d3b789ab57a1f304327a6a (diff) | |
download | native-e450fb5c322249a2b421f99161e5476015b20b0c.tar.gz |
Factor our mChildrenChanged from doTransaction
We are trying to eliminate the whole doTransaction traversal. Following
queued-transaction changes we can update various values on flinger
directly rather than in-directing through the main-thread.
Test: Existing tests pass. simpleperf
Bug: 186200583
Change-Id: I0536f889602ce0801e9f79881bbe1adb7b163d46
-rw-r--r-- | services/surfaceflinger/Layer.cpp | 9 | ||||
-rw-r--r-- | services/surfaceflinger/Layer.h | 3 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 5 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 7 |
4 files changed, 13 insertions, 11 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index b819dbe7ce..6c9905e7da 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -679,11 +679,6 @@ bool Layer::isSecure() const { uint32_t Layer::doTransaction(uint32_t flags) { ATRACE_CALL(); - if (mChildrenChanged) { - flags |= eVisibleRegion; - mChildrenChanged = false; - } - // TODO: This is unfortunate. mDrawingStateModified = mDrawingState.modified; mDrawingState.modified = false; @@ -1562,7 +1557,7 @@ void Layer::setGameModeForTree(int parentGameMode) { } void Layer::addChild(const sp<Layer>& layer) { - mChildrenChanged = true; + mFlinger->mSomeChildrenChanged = true; setTransactionFlags(eTransactionNeeded); mCurrentChildren.add(layer); @@ -1572,7 +1567,7 @@ void Layer::addChild(const sp<Layer>& layer) { } ssize_t Layer::removeChild(const sp<Layer>& layer) { - mChildrenChanged = true; + mFlinger->mSomeChildrenChanged = true; setTransactionFlags(eTransactionNeeded); layer->setParent(nullptr); diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index 9b30fcb315..84d6d3f93e 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -1003,9 +1003,6 @@ protected: wp<Layer> mCurrentParent; wp<Layer> mDrawingParent; - // Can only be accessed with the SF state lock held. - bool mChildrenChanged{false}; - // Window types from WindowManager.LayoutParams const InputWindowInfo::Type mWindowType; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index c6841ed6e6..26581a07ea 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -2942,6 +2942,11 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) { }); } + if (mSomeChildrenChanged) { + mVisibleRegionsDirty = true; + mSomeChildrenChanged = false; + } + // Update transform hint if (transactionFlags & (eTransformHintUpdateNeeded | eDisplayTransactionNeeded)) { // The transform hint might have changed for some layers diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 22d17eb153..81f569ae9b 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -1228,8 +1228,13 @@ private: // don't need synchronization State mDrawingState{LayerVector::StateSet::Drawing}; bool mVisibleRegionsDirty = false; - // Set during transaction commit stage to track if the input info for a layer has changed. + + // Set during transaction application stage to track if the input info or children + // for a layer has changed. + // TODO: Also move visibleRegions over to a boolean system. bool mInputInfoChanged = false; + bool mSomeChildrenChanged; + bool mGeometryInvalid = false; bool mAnimCompositionPending = false; |