OSDN Git Service

drm_hwcomposer: Fix protected layer hole punch
authorSean Paul <seanpaul@chromium.org>
Tue, 10 May 2016 07:42:55 +0000 (03:42 -0400)
committerSean Paul <seanpaul@chromium.org>
Tue, 10 May 2016 08:26:11 +0000 (04:26 -0400)
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>
drmdisplaycomposition.cpp
separate_rects.h

index d5e97b4..2c5ef09 100644 (file)
@@ -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)});
   }
 }
 
index cb46ecb..de8b660 100644 (file)
@@ -105,14 +105,6 @@ struct IdSet {
     bitset &= ~(((TUInt)1) << id);
   }
 
-  void subtract(TId start, TId end) {
-    if (start > end)
-      return;
-    TId start_mask = (1 << start) - 1;
-    TId end_mask = (1 << end) - 1;
-    bitset &= ~(start_mask ^ end_mask);
-  }
-
   bool isEmpty() const {
     return bitset == 0;
   }