summaryrefslogtreecommitdiff
path: root/drmdisplaycomposition.cpp
diff options
context:
space:
mode:
authorSean Paul <seanpaul@chromium.org>2016-05-10 03:42:55 -0400
committerSean Paul <seanpaul@chromium.org>2016-05-10 04:26:11 -0400
commitf1d2579822fcce9bfff996d8bd95d81136459b59 (patch)
tree7ba109eba2166745167e3b0c70b680b435fd71d3 /drmdisplaycomposition.cpp
parent6b9647f3d666fad92985d0b6cef7a5b199a71687 (diff)
drm_hwcomposer: Fix protected layer hole punch
The old code didn't dereference the layer index from the bitmask which caused it to subtract layers it shouldn't have. In order to do this right, we need to look at the layer index corresponding to the bit in the id_set to ensure we're excluding the correct layers. BUG=None TEST=Precomposition doesn't draw over dedicated layers Change-Id: I8531e1ef3b2beb4674041145e2b38ce4b3dbe346 Signed-off-by: Sean Paul <seanpaul@chromium.org>
Diffstat (limited to 'drmdisplaycomposition.cpp')
-rw-r--r--drmdisplaycomposition.cpp10
1 files changed, 6 insertions, 4 deletions
diff --git a/drmdisplaycomposition.cpp b/drmdisplaycomposition.cpp
index d5e97b4..2c5ef09 100644
--- a/drmdisplaycomposition.cpp
+++ b/drmdisplaycomposition.cpp
@@ -238,15 +238,17 @@ static void SeparateLayers(DrmHwcLayer *layers, size_t *used_layers,
if (!(protected_intersect & (1 << (i + num_exclude_rects))))
continue;
- region.id_set.subtract(layer_offset, layer_offset + protected_layers[i]);
+ for (size_t j = 0; j < num_used_layers; ++j) {
+ if (used_layers[j] < protected_layers[i])
+ region.id_set.subtract(j + layer_offset);
+ }
}
- if (region.id_set.isEmpty())
+ if (!(region.id_set.getBits() >> layer_offset))
continue;
regions.emplace_back(DrmCompositionRegion{
region.rect,
- SetBitsToVector(region.id_set.getBits() >> layer_offset,
- used_layers)});
+ SetBitsToVector(region.id_set.getBits() >> layer_offset, used_layers)});
}
}