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
This commit is contained in:
Marissa Wall
2019-04-23 14:10:15 -07:00
parent 7feb1a1f7d
commit bb9b14f020

View File

@@ -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);