drm_hwcomposer: make sure all fences are released for DrmDisplayComposition

This change will release the layers passed back to SurfaceFlinger even on an
error in the compositor thread.

Change-Id: I22f622855c8c953a058b4a08d0af1ae427e4cbbd
diff --git a/drmdisplaycomposition.cpp b/drmdisplaycomposition.cpp
index d8dc886..cce1d56 100644
--- a/drmdisplaycomposition.cpp
+++ b/drmdisplaycomposition.cpp
@@ -45,6 +45,7 @@
       type_(DRM_COMPOSITION_TYPE_EMPTY),
       timeline_fd_(-1),
       timeline_(0),
+      timeline_current_(0),
       dpms_mode_(DRM_MODE_DPMS_ON) {
 }
 
@@ -58,8 +59,11 @@
       close(iter->layer.acquireFenceFd);
   }
 
-  if (timeline_fd_ >= 0)
+  if (timeline_fd_ >= 0) {
+    FinishComposition();
     close(timeline_fd_);
+    timeline_fd_ = -1;
+  }
 }
 
 int DrmDisplayComposition::Init(DrmResources *drm, Importer *importer) {
@@ -125,9 +129,15 @@
 }
 
 int DrmDisplayComposition::FinishComposition() {
-  int ret = sw_sync_timeline_inc(timeline_fd_, timeline_);
+  int timeline_increase = timeline_ - timeline_current_;
+  if (timeline_increase <= 0)
+    return 0;
+
+  int ret = sw_sync_timeline_inc(timeline_fd_, timeline_increase);
   if (ret)
     ALOGE("Failed to increment sync timeline %d", ret);
+  else
+    timeline_current_ = timeline_;
 
   return ret;
 }
diff --git a/drmdisplaycomposition.h b/drmdisplaycomposition.h
index 09ad3ff..1df8dee 100644
--- a/drmdisplaycomposition.h
+++ b/drmdisplaycomposition.h
@@ -76,6 +76,7 @@
 
   int timeline_fd_;
   int timeline_;
+  int timeline_current_;
 
   DrmCompositionLayerVector_t layers_;
   uint32_t dpms_mode_;