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/BufferLayer.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/BufferLayer.cpp')
| -rw-r--r-- | services/surfaceflinger/BufferLayer.cpp | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/services/surfaceflinger/BufferLayer.cpp b/services/surfaceflinger/BufferLayer.cpp index 9b1c0dbc53..e4fcfc809e 100644 --- a/services/surfaceflinger/BufferLayer.cpp +++ b/services/surfaceflinger/BufferLayer.cpp @@ -396,6 +396,7 @@ Region BufferLayer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime } // Capture the old state of the layer for comparisons later + Mutex::Autolock lock(mStateMutex); const State& s(getDrawingState()); const bool oldOpacity = isOpaque(s); sp<GraphicBuffer> oldBuffer = mActiveBuffer; @@ -503,7 +504,7 @@ Region BufferLayer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime // FIXME: postedRegion should be dirty & bounds // transform the dirty region to window-manager space - return getTransform().transform(Region(getBufferSize(s))); + return getTransformLocked().transform(Region(getBufferSize(s))); } // transaction @@ -551,7 +552,7 @@ bool BufferLayer::latchUnsignaledBuffers() { // h/w composer set-up bool BufferLayer::allTransactionsSignaled() { - auto headFrameNumber = getHeadFrameNumber(); + auto headFrameNumber = getHeadFrameNumberLocked(); bool matchingFramesFound = false; bool allTransactionsApplied = true; Mutex::Autolock lock(mLocalSyncPointMutex); @@ -604,6 +605,7 @@ bool BufferLayer::needsFiltering(const RenderArea& renderArea) const { void BufferLayer::drawWithOpenGL(const RenderArea& renderArea, bool useIdentityTransform) const { ATRACE_CALL(); + Mutex::Autolock lock(mStateMutex); const State& s(getDrawingState()); computeGeometry(renderArea, getBE().mMesh, useIdentityTransform); @@ -622,9 +624,9 @@ void BufferLayer::drawWithOpenGL(const RenderArea& renderArea, bool useIdentityT * minimal value)? Or, we could make GL behave like HWC -- but this feel * like more of a hack. */ - const Rect bounds{computeBounds()}; // Rounds from FloatRect + const Rect bounds{computeBoundsLocked()}; // Rounds from FloatRect - ui::Transform t = getTransform(); + ui::Transform t = getTransformLocked(); Rect win = bounds; const int bufferWidth = getBufferSize(s).getWidth(); const int bufferHeight = getBufferSize(s).getHeight(); @@ -643,7 +645,7 @@ void BufferLayer::drawWithOpenGL(const RenderArea& renderArea, bool useIdentityT texCoords[2] = vec2(right, 1.0f - bottom); texCoords[3] = vec2(right, 1.0f - top); - const auto roundedCornerState = getRoundedCornerState(); + const auto roundedCornerState = getRoundedCornerStateLocked(); const auto cropRect = roundedCornerState.cropRect; setupRoundedCornersCropCoordinates(win, cropRect); @@ -665,7 +667,12 @@ void BufferLayer::drawWithOpenGL(const RenderArea& renderArea, bool useIdentityT } uint64_t BufferLayer::getHeadFrameNumber() const { - if (hasFrameUpdate()) { + Mutex::Autolock lock(mStateMutex); + return getHeadFrameNumberLocked(); +} + +uint64_t BufferLayer::getHeadFrameNumberLocked() const { + if (hasFrameUpdateLocked()) { return getFrameNumber(); } else { return mCurrentFrameNumber; @@ -692,7 +699,7 @@ Rect BufferLayer::getBufferSize(const State& s) const { std::swap(bufWidth, bufHeight); } - if (getTransformToDisplayInverse()) { + if (getTransformToDisplayInverseLocked()) { uint32_t invTransform = DisplayDevice::getPrimaryDisplayOrientationTransform(); if (invTransform & ui::Transform::ROT_90) { std::swap(bufWidth, bufHeight); |