drm_hwcomposer: Handle unused planes by DrmDisplayCompositor

Rationale:
1. Cleanup/Simplify DrmDisplayComposition class
2. Prepare for shared planes support

Signed-off-by: Roman Stratiienko <roman.o.stratiienko@globallogic.com>
Tested-by: Martin Juecker <martin.juecker@gmail.com>
Reviewed-by: Matvii Zorin <matvii.zorin@globallogic.com>
diff --git a/DrmHwcTwo.cpp b/DrmHwcTwo.cpp
index abf24e1..b57d2f3 100644
--- a/DrmHwcTwo.cpp
+++ b/DrmHwcTwo.cpp
@@ -790,16 +790,6 @@
     return HWC2::Error::BadConfig;
   }
 
-  // Disable the planes we're not using
-  for (auto i = primary_planes.begin(); i != primary_planes.end();) {
-    composition->AddPlaneDisable(*i);
-    i = primary_planes.erase(i);
-  }
-  for (auto i = overlay_planes.begin(); i != overlay_planes.end();) {
-    composition->AddPlaneDisable(*i);
-    i = overlay_planes.erase(i);
-  }
-
   a_args.composition = composition;
   ret = compositor_.ExecuteAtomicCommit(a_args);
 
diff --git a/compositor/DrmDisplayComposition.cpp b/compositor/DrmDisplayComposition.cpp
index cd95267..96e95ad 100644
--- a/compositor/DrmDisplayComposition.cpp
+++ b/compositor/DrmDisplayComposition.cpp
@@ -45,11 +45,6 @@
   return 0;
 }
 
-int DrmDisplayComposition::AddPlaneDisable(DrmPlane *plane) {
-  composition_planes_.emplace_back(DrmCompositionPlane::Type::kDisable, plane);
-  return 0;
-}
-
 int DrmDisplayComposition::AddPlaneComposition(DrmCompositionPlane plane) {
   composition_planes_.emplace_back(std::move(plane));
   return 0;
diff --git a/compositor/DrmDisplayComposition.h b/compositor/DrmDisplayComposition.h
index f1958d7..2ddfaac 100644
--- a/compositor/DrmDisplayComposition.h
+++ b/compositor/DrmDisplayComposition.h
@@ -34,22 +34,13 @@
 
 class DrmCompositionPlane {
  public:
-  enum class Type : int32_t {
-    kDisable,
-    kLayer,
-  };
-
   DrmCompositionPlane() = default;
   DrmCompositionPlane(DrmCompositionPlane &&rhs) = default;
   DrmCompositionPlane &operator=(DrmCompositionPlane &&other) = default;
-  DrmCompositionPlane(Type type, DrmPlane *plane) : type_(type), plane_(plane) {
+  DrmCompositionPlane(DrmPlane *plane) : plane_(plane) {
   }
-  DrmCompositionPlane(Type type, DrmPlane *plane, size_t source_layer)
-      : type_(type), plane_(plane), source_layers_(1, source_layer) {
-  }
-
-  Type type() const {
-    return type_;
+  DrmCompositionPlane(DrmPlane *plane, size_t source_layer)
+      : plane_(plane), source_layers_(1, source_layer) {
   }
 
   DrmPlane *plane() const {
@@ -68,7 +59,6 @@
   }
 
  private:
-  Type type_ = Type::kDisable;
   DrmPlane *plane_ = NULL;
   std::vector<size_t> source_layers_;
 };
@@ -81,7 +71,6 @@
 
   int SetLayers(DrmHwcLayer *layers, size_t num_layers);
   int AddPlaneComposition(DrmCompositionPlane plane);
-  int AddPlaneDisable(DrmPlane *plane);
 
   int Plan(std::vector<DrmPlane *> *primary_planes,
            std::vector<DrmPlane *> *overlay_planes);
diff --git a/compositor/DrmDisplayCompositor.cpp b/compositor/DrmDisplayCompositor.cpp
index dcc82fe..660052a 100644
--- a/compositor/DrmDisplayCompositor.cpp
+++ b/compositor/DrmDisplayCompositor.cpp
@@ -140,6 +140,8 @@
     }
   }
 
+  auto unused_planes = new_frame_state.used_planes;
+
   if (args.composition) {
     new_frame_state.used_framebuffers.clear();
     new_frame_state.used_planes.clear();
@@ -152,31 +154,29 @@
       DrmPlane *plane = comp_plane.plane();
       std::vector<size_t> &source_layers = comp_plane.source_layers();
 
-      if (comp_plane.type() != DrmCompositionPlane::Type::kDisable) {
-        if (source_layers.size() > 1) {
-          ALOGE("Can't handle more than one source layer sz=%zu type=%d",
-                source_layers.size(), comp_plane.type());
-          continue;
-        }
+      if (source_layers.size() > 1) {
+        ALOGE("Can't handle more than one source layer sz=%zu",
+              source_layers.size());
+        continue;
+      }
 
-        if (source_layers.empty() || source_layers.front() >= layers.size()) {
-          ALOGE("Source layer index %zu out of bounds %zu type=%d",
-                source_layers.front(), layers.size(), comp_plane.type());
-          return -EINVAL;
-        }
-        DrmHwcLayer &layer = layers[source_layers.front()];
+      if (source_layers.empty() || source_layers.front() >= layers.size()) {
+        ALOGE("Source layer index %zu out of bounds %zu", source_layers.front(),
+              layers.size());
+        return -EINVAL;
+      }
+      DrmHwcLayer &layer = layers[source_layers.front()];
 
-        new_frame_state.used_framebuffers.emplace_back(layer.FbIdHandle);
-        new_frame_state.used_planes.emplace_back(plane);
+      new_frame_state.used_framebuffers.emplace_back(layer.FbIdHandle);
+      new_frame_state.used_planes.emplace_back(plane);
 
-        if (plane->AtomicSetState(*pset, layer, source_layers.front(),
-                                  crtc->id()) != 0) {
-          return -EINVAL;
-        }
-      } else {
-        if (plane->AtomicDisablePlane(*pset) != 0) {
-          return -EINVAL;
-        }
+      /* Remove from 'unused' list, since plane is re-used */
+      auto &v = unused_planes;
+      v.erase(std::remove(v.begin(), v.end(), plane), v.end());
+
+      if (plane->AtomicSetState(*pset, layer, source_layers.front(),
+                                crtc->id()) != 0) {
+        return -EINVAL;
       }
     }
   }
@@ -184,7 +184,10 @@
   if (args.clear_active_composition) {
     new_frame_state.used_framebuffers.clear();
     new_frame_state.used_planes.clear();
-    for (auto *plane : active_frame_state.used_planes) {
+  }
+
+  if (args.clear_active_composition || args.composition) {
+    for (auto *plane : unused_planes) {
       if (plane->AtomicDisablePlane(*pset) != 0) {
         return -EINVAL;
       }
diff --git a/compositor/Planner.cpp b/compositor/Planner.cpp
index 9db03c3..fd9678c 100644
--- a/compositor/Planner.cpp
+++ b/compositor/Planner.cpp
@@ -70,8 +70,7 @@
 
 int PlanStageProtected::ProvisionPlanes(
     std::vector<DrmCompositionPlane> *composition,
-    std::map<size_t, DrmHwcLayer *> &layers,
-    std::vector<DrmPlane *> *planes) {
+    std::map<size_t, DrmHwcLayer *> &layers, std::vector<DrmPlane *> *planes) {
   int ret = 0;
   for (auto i = layers.begin(); i != layers.end();) {
     if (!i->second->protected_usage()) {
@@ -79,8 +78,7 @@
       continue;
     }
 
-    ret = Emplace(composition, planes, DrmCompositionPlane::Type::kLayer,
-                  std::make_pair(i->first, i->second));
+    ret = Emplace(composition, planes, std::make_pair(i->first, i->second));
     if (ret) {
       ALOGE("Failed to dedicate protected layer! Dropping it.");
       return ret;
@@ -94,12 +92,10 @@
 
 int PlanStageGreedy::ProvisionPlanes(
     std::vector<DrmCompositionPlane> *composition,
-    std::map<size_t, DrmHwcLayer *> &layers,
-    std::vector<DrmPlane *> *planes) {
+    std::map<size_t, DrmHwcLayer *> &layers, std::vector<DrmPlane *> *planes) {
   // Fill up the remaining planes
   for (auto i = layers.begin(); i != layers.end(); i = layers.erase(i)) {
-    int ret = Emplace(composition, planes, DrmCompositionPlane::Type::kLayer,
-                      std::make_pair(i->first, i->second));
+    int ret = Emplace(composition, planes, std::make_pair(i->first, i->second));
     // We don't have any planes left
     if (ret == -ENOENT)
       break;
diff --git a/compositor/Planner.h b/compositor/Planner.h
index 3390acb..b54a9be 100644
--- a/compositor/Planner.h
+++ b/compositor/Planner.h
@@ -55,7 +55,6 @@
     // Inserts the given layer:plane in the composition at the back
     static int Emplace(std::vector<DrmCompositionPlane> *composition,
                        std::vector<DrmPlane *> *planes,
-                       DrmCompositionPlane::Type type,
                        std::pair<size_t, DrmHwcLayer *> layer) {
       DrmPlane *plane = PopPlane(planes);
       std::vector<DrmPlane *> unused_planes;
@@ -70,7 +69,7 @@
       }
 
       if (!ret) {
-        composition->emplace_back(type, plane, layer.first);
+        composition->emplace_back(plane, layer.first);
         planes->insert(planes->begin(), unused_planes.begin(),
                        unused_planes.end());
       }