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
diff --git a/libs/gui/BufferQueueProducer.cpp b/libs/gui/BufferQueueProducer.cpp
index 9c311a3..92ab410 100644
--- a/libs/gui/BufferQueueProducer.cpp
+++ b/libs/gui/BufferQueueProducer.cpp
@@ -936,6 +936,15 @@
                     }
                 }
 
+                // 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;