summaryrefslogtreecommitdiff
path: root/native/android/surface_control.cpp
diff options
context:
space:
mode:
authorMarissa Wall <marissaw@google.com>2019-04-23 14:10:15 -0700
committerMarissa Wall <marissaw@google.com>2019-04-23 14:10:15 -0700
commitbb9b14f0209d9a83df38c3fdcd27ea0fe4255fc0 (patch)
tree6f16ecb74cfcf53cf1631ae1f972d18743b053f7 /native/android/surface_control.cpp
parent7feb1a1f7d0526dc0518be1ee5068ef51a48e074 (diff)
ASurfaceControl: fix surface damage
There are two problems with surface control. 1) By merging the rects, the Region turned into 0,0,0,0 instead of an or of the Rects. 2) In the case where an app intends to have a region of 0,0,0,0, we should treat it the same as a region of 0,0,-1,-1. Bug: 131175047 Test: ASurfaceControl Change-Id: Ib2e3b90ac215e069d3d3c2eca81ff1013b4287aa
Diffstat (limited to 'native/android/surface_control.cpp')
-rw-r--r--native/android/surface_control.cpp10
1 files changed, 9 insertions, 1 deletions
diff --git a/native/android/surface_control.cpp b/native/android/surface_control.cpp
index d07052bb3b3f..7ee2f0a1db18 100644
--- a/native/android/surface_control.cpp
+++ b/native/android/surface_control.cpp
@@ -411,7 +411,15 @@ void ASurfaceTransaction_setDamageRegion(ASurfaceTransaction* aSurfaceTransactio
Region region;
for (uint32_t i = 0; i < count; ++i) {
- region.merge(static_cast<const Rect&>(rects[i]));
+ region.orSelf(static_cast<const Rect&>(rects[i]));
+ }
+
+ // Hardware composer interprets a DamageRegion with a single Rect of {0,0,0,0} to be an
+ // undamaged region and {0,0,-1,-1} to be a fully damaged buffer. This is a confusing
+ // distinction for a public api. Instead, default both cases to be a fully damaged buffer.
+ if (count == 1 && region.getBounds().isEmpty()) {
+ transaction->setSurfaceDamageRegion(surfaceControl, Region::INVALID_REGION);
+ return;
}
transaction->setSurfaceDamageRegion(surfaceControl, region);