diff options
| author | 2018-12-12 22:59:52 +0000 | |
|---|---|---|
| committer | 2018-12-12 22:59:52 +0000 | |
| commit | c8fa5ce6da6a5ab7ccea68b7deee29160c952761 (patch) | |
| tree | bf16c5e2f37761d2073c40bbf7b83ad20612401e /services/surfaceflinger/BufferLayer.cpp | |
| parent | 48eead91fa9aa6c793b44fc674d515bc6b88117c (diff) | |
| parent | 83729883eecd31a9907bc79bc21998a90f17105c (diff) | |
Merge "SurfaceFlinger: protect state members in Layer"
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 4e4d7dd371..0a3be71b79 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; @@ -502,7 +503,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 @@ -550,7 +551,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); @@ -603,6 +604,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); @@ -621,9 +623,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(); @@ -642,7 +644,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); @@ -664,7 +666,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; @@ -691,7 +698,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); |