diff options
| -rw-r--r-- | services/surfaceflinger/BufferLayer.cpp | 9 | ||||
| -rw-r--r-- | services/surfaceflinger/BufferLayer.h | 7 | ||||
| -rw-r--r-- | services/surfaceflinger/BufferQueueLayer.cpp | 16 | ||||
| -rw-r--r-- | services/surfaceflinger/BufferQueueLayer.h | 2 | ||||
| -rw-r--r-- | services/surfaceflinger/Layer.h | 2 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 18 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 1 |
7 files changed, 28 insertions, 27 deletions
diff --git a/services/surfaceflinger/BufferLayer.cpp b/services/surfaceflinger/BufferLayer.cpp index 13c748f24c..e9af9e292b 100644 --- a/services/surfaceflinger/BufferLayer.cpp +++ b/services/surfaceflinger/BufferLayer.cpp @@ -668,6 +668,15 @@ FloatRect BufferLayer::computeSourceBounds(const FloatRect& parentBounds) const return FloatRect(0, 0, bufWidth, bufHeight); } +void BufferLayer::latchAndReleaseBuffer() { + mRefreshPending = false; + if (hasReadyFrame()) { + bool ignored = false; + latchBuffer(ignored, systemTime(), 0 /* expectedPresentTime */); + } + releasePendingBuffer(systemTime()); +} + } // namespace android #if defined(__gl_h_) diff --git a/services/surfaceflinger/BufferLayer.h b/services/surfaceflinger/BufferLayer.h index 7a0f82b5c0..fb8d7d027f 100644 --- a/services/surfaceflinger/BufferLayer.h +++ b/services/surfaceflinger/BufferLayer.h @@ -103,6 +103,13 @@ public: // Returns the current scaling mode, unless mOverrideScalingMode // is set, in which case, it returns mOverrideScalingMode uint32_t getEffectiveScalingMode() const override; + + // Calls latchBuffer if the buffer has a frame queued and then releases the buffer. + // This is used if the buffer is just latched and releases to free up the buffer + // and will not be shown on screen. + // Should only be called on the main thread. + void latchAndReleaseBuffer() override; + // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- diff --git a/services/surfaceflinger/BufferQueueLayer.cpp b/services/surfaceflinger/BufferQueueLayer.cpp index 12be00f116..5f494ff3d5 100644 --- a/services/surfaceflinger/BufferQueueLayer.cpp +++ b/services/surfaceflinger/BufferQueueLayer.cpp @@ -412,14 +412,6 @@ void BufferQueueLayer::latchPerFrameState( // Interface implementation for BufferLayerConsumer::ContentsChangedListener // ----------------------------------------------------------------------- -void BufferQueueLayer::fakeVsync() { - mRefreshPending = false; - bool ignored = false; - latchBuffer(ignored, systemTime(), 0 /* expectedPresentTime */); - usleep(16000); - releasePendingBuffer(systemTime()); -} - void BufferQueueLayer::onFrameAvailable(const BufferItem& item) { ATRACE_CALL(); // Add this buffer from our internal queue tracker @@ -456,13 +448,7 @@ void BufferQueueLayer::onFrameAvailable(const BufferItem& item) { mFlinger->mInterceptor->saveBufferUpdate(this, item.mGraphicBuffer->getWidth(), item.mGraphicBuffer->getHeight(), item.mFrameNumber); - // If this layer is orphaned, then we run a fake vsync pulse so that - // dequeueBuffer doesn't block indefinitely. - if (isRemovedFromCurrentState()) { - fakeVsync(); - } else { - mFlinger->signalLayerUpdate(); - } + mFlinger->signalLayerUpdate(); mConsumer->onBufferAvailable(item); } diff --git a/services/surfaceflinger/BufferQueueLayer.h b/services/surfaceflinger/BufferQueueLayer.h index 231a531f58..392b706416 100644 --- a/services/surfaceflinger/BufferQueueLayer.h +++ b/services/surfaceflinger/BufferQueueLayer.h @@ -138,8 +138,6 @@ private: // thread-safe std::atomic<int32_t> mQueuedFrames{0}; std::atomic<bool> mSidebandStreamChanged{false}; - - void fakeVsync(); }; } // namespace android diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index 87a5896c6a..2a1564a440 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -544,6 +544,8 @@ public: virtual bool isBufferLatched() const { return false; } + virtual void latchAndReleaseBuffer() {} + /* * Remove relative z for the layer if its relative parent is not part of the * provided layer tree. diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 16b19e8350..7a8eb6b2da 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -2870,14 +2870,6 @@ void SurfaceFlinger::updateCursorAsync() } } -void SurfaceFlinger::latchAndReleaseBuffer(const sp<Layer>& layer) { - if (layer->hasReadyFrame()) { - bool ignored = false; - layer->latchBuffer(ignored, systemTime(), 0 /* expectedPresentTime */); - } - layer->releasePendingBuffer(systemTime()); -} - void SurfaceFlinger::commitTransaction() { if (!mLayersPendingRemoval.isEmpty()) { @@ -2888,7 +2880,7 @@ void SurfaceFlinger::commitTransaction() // Ensure any buffers set to display on any children are released. if (l->isRemovedFromCurrentState()) { - latchAndReleaseBuffer(l); + l->latchAndReleaseBuffer(); } // If the layer has been removed and has no parent, then it will not be reachable @@ -3146,6 +3138,14 @@ bool SurfaceFlinger::handlePageFlip() } }); + // The client can continue submitting buffers for offscreen layers, but they will not + // be shown on screen. Therefore, we need to latch and release buffers of offscreen + // layers to ensure dequeueBuffer doesn't block indefinitely. + for (Layer* offscreenLayer : mOffscreenLayers) { + offscreenLayer->traverseInZOrder(LayerVector::StateSet::Drawing, + [&](Layer* l) { l->latchAndReleaseBuffer(); }); + } + if (!mLayersWithQueuedFrames.empty()) { // mStateLock is needed for latchBuffer as LayerRejecter::reject() // writes to Layer current state. See also b/119481871 diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index e199ad55f8..27a0f6bbaf 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -576,7 +576,6 @@ private: // Can only be called from the main thread or with mStateLock held uint32_t setTransactionFlags(uint32_t flags); uint32_t setTransactionFlags(uint32_t flags, Scheduler::TransactionStart transactionStart); - void latchAndReleaseBuffer(const sp<Layer>& layer); void commitTransaction() REQUIRES(mStateLock); void commitOffscreenLayers(); bool transactionIsReadyToBeApplied(int64_t desiredPresentTime, |