drm_hwcomposer: duplicate buffer_handles before hwc_set returns

This is needed because SF will sometimes release buffer_handles before GL gets
to using them for composition.

Change-Id: I01db0975cc82d6b59bf4f9521a24071baf89c38a
diff --git a/drmdisplaycompositor.cpp b/drmdisplaycompositor.cpp
index b76d81d..1e02e73 100644
--- a/drmdisplaycompositor.cpp
+++ b/drmdisplaycompositor.cpp
@@ -186,11 +186,6 @@
     return -ENOMEM;
   }
 
-  std::vector<hwc_layer_1_t> pre_comp_layers;
-  for (const auto &comp_layer : *layers)
-    if (comp_layer.plane == NULL)
-      pre_comp_layers.push_back(comp_layer.layer);
-
   if (!pre_compositor_) {
     pre_compositor_.reset(new GLWorkerCompositor());
     ret = pre_compositor_->Init();
@@ -199,20 +194,32 @@
       return ret;
     }
   }
+
+  std::vector<hwc_layer_1_t> pre_comp_layers;
+  for (auto &comp_layer : *layers) {
+    if (comp_layer.plane == NULL) {
+      pre_comp_layers.push_back(comp_layer.layer);
+      pre_comp_layers.back().handle = comp_layer.handle;
+      comp_layer.layer.acquireFenceFd = -1;
+    }
+  }
+
   ret = pre_compositor_->CompositeAndFinish(
       pre_comp_layers.data(), pre_comp_layers.size(), fb.buffer());
+
+  for (auto &pre_comp_layer : pre_comp_layers) {
+    if (pre_comp_layer.acquireFenceFd >= 0) {
+      close(pre_comp_layer.acquireFenceFd);
+      pre_comp_layer.acquireFenceFd = -1;
+    }
+  }
+
   if (ret) {
     ALOGE("Failed to composite layers");
     return ret;
   }
 
-  for (auto &comp_layer : *layers)
-    if (comp_layer.plane == NULL)
-      display_comp->importer()->ReleaseBuffer(&comp_layer.bo);
-
-  layers->erase(std::remove_if(layers->begin(), layers->end(),
-                               drm_composition_layer_has_no_plane),
-                layers->end());
+  display_comp->RemoveNoPlaneLayers();
 
   hwc_layer_1_t pre_comp_output_layer;
   memset(&pre_comp_output_layer, 0, sizeof(pre_comp_output_layer));