diff options
author | 2018-12-07 12:26:48 -0800 | |
---|---|---|
committer | 2018-12-12 11:26:51 -0800 | |
commit | 83729883eecd31a9907bc79bc21998a90f17105c (patch) | |
tree | c1aca6e748ad8418883b758125bc56b85e52a19f /services/surfaceflinger/BufferQueueLayer.cpp | |
parent | 227d1b1098a8d4fa562ca23914c7472c337acf26 (diff) |
SurfaceFlinger: protect state members in Layer
Add proper locking to protect state members in Layer.
These members are accessed by both the main thread and binder.
Bug: 119481871
Test: SurfaceFlinger unit tests
Test: go/wm-smoke
Change-Id: I12d47711992e09c0677b77f7e1b36c1254b63a1b
Diffstat (limited to 'services/surfaceflinger/BufferQueueLayer.cpp')
-rw-r--r-- | services/surfaceflinger/BufferQueueLayer.cpp | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/services/surfaceflinger/BufferQueueLayer.cpp b/services/surfaceflinger/BufferQueueLayer.cpp index b784d1195d..70d52f1848 100644 --- a/services/surfaceflinger/BufferQueueLayer.cpp +++ b/services/surfaceflinger/BufferQueueLayer.cpp @@ -51,7 +51,7 @@ std::vector<OccupancyTracker::Segment> BufferQueueLayer::getOccupancyHistory(boo return history; } -bool BufferQueueLayer::getTransformToDisplayInverse() const { +bool BufferQueueLayer::getTransformToDisplayInverseLocked() const { return mConsumer->getTransformToDisplayInverse(); } @@ -131,7 +131,7 @@ nsecs_t BufferQueueLayer::getDesiredPresentTime() { return mConsumer->getTimestamp(); } -std::shared_ptr<FenceTime> BufferQueueLayer::getCurrentFenceTime() const { +std::shared_ptr<FenceTime> BufferQueueLayer::getCurrentFenceTimeLocked() const { return mConsumer->getCurrentFenceTime(); } @@ -192,6 +192,7 @@ bool BufferQueueLayer::getSidebandStreamChanged() const { std::optional<Region> BufferQueueLayer::latchSidebandStream(bool& recomputeVisibleRegions) { bool sidebandStreamChanged = true; + Mutex::Autolock lock(mStateMutex); if (mSidebandStreamChanged.compare_exchange_strong(sidebandStreamChanged, false)) { // mSidebandStreamChanged was changed to false // replicated in LayerBE until FE/BE is ready to be synchronized @@ -200,15 +201,15 @@ std::optional<Region> BufferQueueLayer::latchSidebandStream(bool& recomputeVisib setTransactionFlags(eTransactionNeeded); mFlinger->setTransactionFlags(eTraversalNeeded); } - recomputeVisibleRegions = true; + recomputeVisibleRegions = true; const State& s(getDrawingState()); - return getTransform().transform(Region(Rect(s.active_legacy.w, s.active_legacy.h))); + return getTransformLocked().transform(Region(Rect(s.active_legacy.w, s.active_legacy.h))); } return {}; } -bool BufferQueueLayer::hasFrameUpdate() const { +bool BufferQueueLayer::hasFrameUpdateLocked() const { return mQueuedFrames > 0; } @@ -228,16 +229,18 @@ status_t BufferQueueLayer::updateTexImage(bool& recomputeVisibleRegions, nsecs_t // buffer mode. bool queuedBuffer = false; const int32_t layerID = getSequence(); - LayerRejecter r(mDrawingState, getCurrentState(), recomputeVisibleRegions, + status_t updateResult; + LayerRejecter r(mState.drawing, getCurrentState(), recomputeVisibleRegions, getProducerStickyTransform() != 0, mName.string(), mOverrideScalingMode, - getTransformToDisplayInverse(), mFreezeGeometryUpdates); + getTransformToDisplayInverseLocked(), mFreezeGeometryUpdates); const nsecs_t expectedPresentTime = mFlinger->mUseScheduler ? mFlinger->mScheduler->mPrimaryDispSync->expectedPresentTime() : mFlinger->mPrimaryDispSync->expectedPresentTime(); - status_t updateResult = - mConsumer->updateTexImage(&r, expectedPresentTime, &mAutoRefresh, &queuedBuffer, - mLastFrameNumberReceived, releaseFence); + + updateResult = mConsumer->updateTexImage(&r, expectedPresentTime, &mAutoRefresh, &queuedBuffer, + mLastFrameNumberReceived, releaseFence); + if (updateResult == BufferQueue::PRESENT_LATER) { // Producer doesn't want buffer to be displayed yet. Signal a // layer update so we check again at the next opportunity. |