diff options
Diffstat (limited to 'services/surfaceflinger/Layer.cpp')
| -rw-r--r-- | services/surfaceflinger/Layer.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 64cfb3d699..3765d0d39d 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -993,6 +993,9 @@ uint32_t Layer::doTransaction(uint32_t flags) { commitTransaction(c); mPendingStatesSnapshot = mPendingStates; mCurrentState.callbackHandles = {}; + + maybeDirtyInput(); + return flags; } @@ -2472,6 +2475,32 @@ Layer::FrameRateCompatibility Layer::FrameRate::convertCompatibility(int8_t comp } } +bool Layer::maybeDirtyInput() { + // No sense redirtying input. + if (mFlinger->inputDirty()) return true; + + if (hasInput()) { + mFlinger->dirtyInput(); + return true; + } + + // If a child or relative dirties the input, no sense continuing to traverse + // so we return early and halt the recursion. We traverse ourselves instead + // of using traverse() so we can implement this early halt. + for (const sp<Layer>& child : mDrawingChildren) { + if (child->maybeDirtyInput()) { + return true; + } + } + for (const wp<Layer>& weakRelative : mDrawingState.zOrderRelatives) { + sp<Layer> relative = weakRelative.promote(); + if (relative && relative->maybeDirtyInput()) { + return true; + } + } + return false; +} + // --------------------------------------------------------------------------- }; // namespace android |