diff options
author | Sean Paul <seanpaul@chromium.org> | 2016-05-10 03:42:55 -0400 |
---|---|---|
committer | Sean Paul <seanpaul@chromium.org> | 2016-05-10 04:26:11 -0400 |
commit | f1d2579822fcce9bfff996d8bd95d81136459b59 (patch) | |
tree | 7ba109eba2166745167e3b0c70b680b435fd71d3 /drmdisplaycomposition.cpp | |
parent | 6b9647f3d666fad92985d0b6cef7a5b199a71687 (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.cpp | 10 |
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)}); } } |