diff options
author | Marissa Wall <marissaw@google.com> | 2019-04-23 14:10:15 -0700 |
---|---|---|
committer | Marissa Wall <marissaw@google.com> | 2019-04-23 14:10:15 -0700 |
commit | bb9b14f0209d9a83df38c3fdcd27ea0fe4255fc0 (patch) | |
tree | 6f16ecb74cfcf53cf1631ae1f972d18743b053f7 /native/android/surface_control.cpp | |
parent | 7feb1a1f7d0526dc0518be1ee5068ef51a48e074 (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.cpp | 10 |
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); |