From 862e753dd00172801d7757a47e0324c9d3e27f86 Mon Sep 17 00:00:00 2001 From: Steven Thomas Date: Wed, 10 Jul 2019 19:21:03 -0700 Subject: When dropping a frame, merge its damage region When queuing a new buffer to a buffer queue that is in async mode (which an app can set via eglSwapInterval(display, 0)), we drop any buffer currently in the queue. We'd throw out the dropped buffer's damage region, which is obviously not ok, and causes broken rendering on devices that actually use the damage region info. Instead, merge the dropped buffer's damage region with the new buffer's damage region. Bug: 136158117 Test: Verified correct behavior using a test app provided by John Reck in b/136158117. Test: Verified the Oslo tutorial no longer has broken rendering. Change-Id: I0b069e650e7bed7c1a36e962e681cc5a86700444 --- libs/gui/BufferQueueProducer.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'libs/gui/BufferQueueProducer.cpp') diff --git a/libs/gui/BufferQueueProducer.cpp b/libs/gui/BufferQueueProducer.cpp index 9c311a314f..92ab41019e 100644 --- a/libs/gui/BufferQueueProducer.cpp +++ b/libs/gui/BufferQueueProducer.cpp @@ -936,6 +936,15 @@ status_t BufferQueueProducer::queueBuffer(int slot, } } + // Make sure to merge the damage rect from the frame we're about + // to drop into the new frame's damage rect. + if (last.mSurfaceDamage.bounds() == Rect::INVALID_RECT || + item.mSurfaceDamage.bounds() == Rect::INVALID_RECT) { + item.mSurfaceDamage = Region::INVALID_REGION; + } else { + item.mSurfaceDamage |= last.mSurfaceDamage; + } + // Overwrite the droppable buffer with the incoming one mCore->mQueue.editItemAt(mCore->mQueue.size() - 1) = item; frameReplacedListener = mCore->mConsumerListener; -- cgit v1.2.3-59-g8ed1b