diff options
author | chaviw <chaviw@google.com> | 2019-01-11 13:07:19 -0800 |
---|---|---|
committer | chaviw <chaviw@google.com> | 2019-01-11 13:12:44 -0800 |
commit | f206b66d770b2221384431cd5fd221266b891461 (patch) | |
tree | 8b9af5f9a03ba400703d871153ed39d49e06b30f /services/surfaceflinger/BufferQueueLayer.cpp | |
parent | 92357f3949442023d821600b71d63339e3d632d5 (diff) | |
download | android_frameworks_native-f206b66d770b2221384431cd5fd221266b891461.tar.gz android_frameworks_native-f206b66d770b2221384431cd5fd221266b891461.tar.bz2 android_frameworks_native-f206b66d770b2221384431cd5fd221266b891461.zip |
Mark refreshPending as false when calling the fakeVsync
The fake vsync needs to get called to ensure dequeueBuffer doesn't get
stuck. However, latchBuffer will not call updateTexImage if the layer
thinks it already has a latched buffer (mRefreshPending = true). Since
mRefreshPending is normally set to false in onPreComposition, removed
layers will not get updated since they are no longer in the layer
hierarchy.
This change sets refreshPending to false for removed layers to ensure
that latchBuffer will attempt to call updateTexImage, allow
dequeueBuffer to continue.
Change-Id: If2a45b2d4cec069068466e0192355999ec265a66
Fixes: 119310197
Test: Open camera, press back, open camera again quickly
Diffstat (limited to 'services/surfaceflinger/BufferQueueLayer.cpp')
-rw-r--r-- | services/surfaceflinger/BufferQueueLayer.cpp | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/services/surfaceflinger/BufferQueueLayer.cpp b/services/surfaceflinger/BufferQueueLayer.cpp index 5a6112258..42021d118 100644 --- a/services/surfaceflinger/BufferQueueLayer.cpp +++ b/services/surfaceflinger/BufferQueueLayer.cpp @@ -352,6 +352,14 @@ void BufferQueueLayer::setHwcLayerBuffer(DisplayId displayId) { // Interface implementation for BufferLayerConsumer::ContentsChangedListener // ----------------------------------------------------------------------- +void BufferQueueLayer::fakeVsync() { + mRefreshPending = false; + bool ignored = false; + latchBuffer(ignored, systemTime(), Fence::NO_FENCE); + usleep(16000); + releasePendingBuffer(systemTime()); +} + void BufferQueueLayer::onFrameAvailable(const BufferItem& item) { // Add this buffer from our internal queue tracker { // Autolock scope @@ -390,10 +398,7 @@ void BufferQueueLayer::onFrameAvailable(const BufferItem& item) { // If this layer is orphaned, then we run a fake vsync pulse so that // dequeueBuffer doesn't block indefinitely. if (isRemovedFromCurrentState()) { - bool ignored = false; - latchBuffer(ignored, systemTime(), Fence::NO_FENCE); - usleep(16000); - releasePendingBuffer(systemTime()); + fakeVsync(); } else { mFlinger->signalLayerUpdate(); } |