summaryrefslogtreecommitdiffstats
path: root/services/surfaceflinger/BufferQueueLayer.cpp
diff options
context:
space:
mode:
authorchaviw <chaviw@google.com>2019-01-11 13:07:19 -0800
committerchaviw <chaviw@google.com>2019-01-11 13:12:44 -0800
commitf206b66d770b2221384431cd5fd221266b891461 (patch)
tree8b9af5f9a03ba400703d871153ed39d49e06b30f /services/surfaceflinger/BufferQueueLayer.cpp
parent92357f3949442023d821600b71d63339e3d632d5 (diff)
downloadandroid_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.cpp13
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();
}