hwc: Handle acquire fence closure in session

Move CloseAcquireFences implementation from hwc display objects
to hwc session.

CRs-Fixed: 936068
Change-Id: Ib29781b6aec2ae33c831b807b2ee747186768ada
diff --git a/sdm/libs/hwc/hwc_display.cpp b/sdm/libs/hwc/hwc_display.cpp
index d96c3bb..706e549 100644
--- a/sdm/libs/hwc/hwc_display.cpp
+++ b/sdm/libs/hwc/hwc_display.cpp
@@ -1247,15 +1247,6 @@
   }
 }
 
-void HWCDisplay::CloseAcquireFences(hwc_display_contents_1_t *content_list) {
-  for (size_t i = 0; i < content_list->numHwLayers; i++) {
-    if (content_list->hwLayers[i].acquireFenceFd >= 0) {
-      close(content_list->hwLayers[i].acquireFenceFd);
-      content_list->hwLayers[i].acquireFenceFd = -1;
-    }
-  }
-}
-
 uint32_t HWCDisplay::RoundToStandardFPS(uint32_t fps) {
   static const uint32_t standard_fps[4] = {30, 24, 48, 60};
 
diff --git a/sdm/libs/hwc/hwc_display.h b/sdm/libs/hwc/hwc_display.h
index 53d9c40..0b2c039 100644
--- a/sdm/libs/hwc/hwc_display.h
+++ b/sdm/libs/hwc/hwc_display.h
@@ -141,7 +141,6 @@
   const char *GetDisplayString();
   void ScaleDisplayFrame(hwc_rect_t *display_frame);
   void MarkLayersForGPUBypass(hwc_display_contents_1_t *content_list);
-  void CloseAcquireFences(hwc_display_contents_1_t *content_list);
   uint32_t RoundToStandardFPS(uint32_t fps);
   virtual void ApplyScanAdjustment(hwc_rect_t *display_frame);
   DisplayError SetCSC(ColorSpace_t source, LayerCSC *target);
diff --git a/sdm/libs/hwc/hwc_display_external.cpp b/sdm/libs/hwc/hwc_display_external.cpp
index 28582f1..3fe283f 100755
--- a/sdm/libs/hwc/hwc_display_external.cpp
+++ b/sdm/libs/hwc/hwc_display_external.cpp
@@ -109,7 +109,6 @@
   int status = 0;
 
   if (secure_display_active_) {
-    CloseAcquireFences(content_list);
     return status;
   }
 
diff --git a/sdm/libs/hwc/hwc_display_primary.cpp b/sdm/libs/hwc/hwc_display_primary.cpp
index fb134a9..569fc0f 100755
--- a/sdm/libs/hwc/hwc_display_primary.cpp
+++ b/sdm/libs/hwc/hwc_display_primary.cpp
@@ -164,7 +164,6 @@
       close(content_list->outbufAcquireFenceFd);
       content_list->outbufAcquireFenceFd = -1;
     }
-    CloseAcquireFences(content_list);
 
     DisplayError error = display_intf_->Flush();
     if (error != kErrorNone) {
diff --git a/sdm/libs/hwc/hwc_display_virtual.cpp b/sdm/libs/hwc/hwc_display_virtual.cpp
index 4d8c24e..f216f89 100644
--- a/sdm/libs/hwc/hwc_display_virtual.cpp
+++ b/sdm/libs/hwc/hwc_display_virtual.cpp
@@ -163,15 +163,6 @@
 int HWCDisplayVirtual::Commit(hwc_display_contents_1_t *content_list) {
   int status = 0;
   if (display_paused_) {
-    if (content_list->outbufAcquireFenceFd >= 0) {
-      // If we do not handle the frame set retireFenceFd to outbufAcquireFenceFd,
-      // which will make sure the framework waits on it and closes it.
-      content_list->retireFenceFd = dup(content_list->outbufAcquireFenceFd);
-      close(content_list->outbufAcquireFenceFd);
-      content_list->outbufAcquireFenceFd = -1;
-    }
-    CloseAcquireFences(content_list);
-
     DisplayError error = display_intf_->Flush();
     if (error != kErrorNone) {
       DLOGE("Flush failed. Error = %d", error);
@@ -191,11 +182,6 @@
     return status;
   }
 
-  if (content_list->outbufAcquireFenceFd >= 0) {
-    close(content_list->outbufAcquireFenceFd);
-    content_list->outbufAcquireFenceFd = -1;
-  }
-
   return 0;
 }
 
diff --git a/sdm/libs/hwc/hwc_session.cpp b/sdm/libs/hwc/hwc_session.cpp
index 779b440..ea9f8f3 100644
--- a/sdm/libs/hwc/hwc_session.cpp
+++ b/sdm/libs/hwc/hwc_session.cpp
@@ -337,32 +337,18 @@
     // Drop virtual display composition if virtual display object could not be created
     // due to HDMI concurrency.
     if (dpy == HWC_DISPLAY_VIRTUAL && !hwc_session->hwc_display_[HWC_DISPLAY_VIRTUAL]) {
-      if (!content_list) {
-        continue;
+      CloseAcquireFds(content_list);
+      if (content_list) {
+        content_list->retireFenceFd = -1;
       }
 
-      for (size_t i = 0; i < content_list->numHwLayers; i++) {
-        int &acquireFenceFd = content_list->hwLayers[i].acquireFenceFd;
-        if (acquireFenceFd >= 0) {
-          close(acquireFenceFd);
-          acquireFenceFd = -1;
-        }
-      }
-
-      int &outbufAcquireFenceFd = content_list->outbufAcquireFenceFd;
-      if (outbufAcquireFenceFd >= 0) {
-        close(outbufAcquireFenceFd);
-        outbufAcquireFenceFd = -1;
-      }
-
-      content_list->retireFenceFd = -1;
-
       continue;
     }
 
     if (hwc_session->hwc_display_[dpy]) {
       hwc_session->hwc_display_[dpy]->Commit(content_list);
     }
+    CloseAcquireFds(content_list);
   }
 
   if (hwc_session->new_bw_mode_) {
@@ -378,6 +364,24 @@
   return 0;
 }
 
+void HWCSession::CloseAcquireFds(hwc_display_contents_1_t *content_list) {
+  if (content_list) {
+    for (size_t i = 0; i < content_list->numHwLayers; i++) {
+      int &acquireFenceFd = content_list->hwLayers[i].acquireFenceFd;
+      if (acquireFenceFd >= 0) {
+        close(acquireFenceFd);
+        acquireFenceFd = -1;
+      }
+    }
+
+    int &outbufAcquireFenceFd = content_list->outbufAcquireFenceFd;
+    if (outbufAcquireFenceFd >= 0) {
+      close(outbufAcquireFenceFd);
+      outbufAcquireFenceFd = -1;
+    }
+  }
+}
+
 int HWCSession::EventControl(hwc_composer_device_1 *device, int disp, int event, int enable) {
   SEQUENCE_WAIT_SCOPE_LOCK(locker_);
 
diff --git a/sdm/libs/hwc/hwc_session.h b/sdm/libs/hwc/hwc_session.h
index 455ea83..01cd8ec 100644
--- a/sdm/libs/hwc/hwc_session.h
+++ b/sdm/libs/hwc/hwc_session.h
@@ -73,6 +73,7 @@
   static int GetActiveConfig(hwc_composer_device_1 *device, int disp);
   static int SetActiveConfig(hwc_composer_device_1 *device, int disp, int index);
   static int SetCursorPositionAsync(hwc_composer_device_1 *device, int disp, int x, int y);
+  static void CloseAcquireFds(hwc_display_contents_1_t *content_list);
 
   // Uevent thread
   static void* HWCUeventThread(void *context);