hwc: Return a release fence for the FRAMEBUFFER_TARGET layer

Bug: 7123196
Change-Id: I2236b187dc6fa8e8504c667797bc73efe596dc05
diff --git a/libhwc/hwc.cpp b/libhwc/hwc.cpp
index cdcc5e5..ae37f25 100644
--- a/libhwc/hwc.cpp
+++ b/libhwc/hwc.cpp
@@ -580,6 +580,7 @@
 static int hdmi_configure_fblayer(struct exynos5_hwc_composer_device_1_t *dev,
                                   hwc_layer_1_t &layer)
 {
+    int ret = 0;
     exynos_gsc_img src_cfg, dst_cfg;
     memset(&src_cfg, 0, sizeof(src_cfg));
     memset(&dst_cfg, 0, sizeof(dst_cfg));
@@ -593,6 +594,7 @@
     src_cfg.fh = h->vstride;
     src_cfg.format = HAL_PIXEL_FORMAT_BGRA_8888;
     src_cfg.yaddr = h->fd;
+    src_cfg.acquireFenceFd = layer.acquireFenceFd;
 
     dst_cfg.w = dev->hdmi_w;
     dst_cfg.fw = dev->hdmi_w;
@@ -611,23 +613,28 @@
 
         exynos_gsc_stop_exclusive(dev->hdmi_gsc);
 
-        int ret = exynos_gsc_config_exclusive(dev->hdmi_gsc, &src_cfg, &dst_cfg);
+        ret = exynos_gsc_config_exclusive(dev->hdmi_gsc, &src_cfg, &dst_cfg);
         if (ret < 0) {
             ALOGE("%s: exynos_gsc_config_exclusive failed %d", __func__, ret);
-            return ret;
+            goto err;
         }
 
         dev->hdmi_src = src_cfg;
         dev->hdmi_dst = dst_cfg;
     }
 
-    int ret = exynos_gsc_run_exclusive(dev->hdmi_gsc, &src_cfg, NULL);
+    ret = exynos_gsc_run_exclusive(dev->hdmi_gsc, &src_cfg, NULL);
     if (ret < 0) {
         ALOGE("%s: exynos_gsc_run_exclusive failed %d", __func__, ret);
-        return ret;
+        goto err;
     }
 
-    return 0;
+    layer.releaseFenceFd = src_cfg.releaseFenceFd;
+
+err:
+    if (layer.acquireFenceFd >= 0)
+        close(layer.acquireFenceFd);
+    return ret;
 }
 
 bool exynos5_is_offscreen(hwc_layer_1_t &layer,
@@ -1305,20 +1312,14 @@
 static int exynos5_set_hdmi(exynos5_hwc_composer_device_1_t *pdev,
         hwc_display_contents_1_t* contents)
 {
-    for (size_t i = 0; i < contents->numHwLayers; i++) {
-        hwc_layer_1_t &layer = contents->hwLayers[i];
-
-        if (layer.acquireFenceFd != -1) {
-            int err = sync_wait(layer.acquireFenceFd, 100);
-            if (err != 0)
-                ALOGW("fence for layer %zu didn't signal in 100 ms: %s",
-                          i, strerror(errno));
-            close(layer.acquireFenceFd);
+    if (!pdev->hdmi_enabled) {
+        for (size_t i = 0; i < contents->numHwLayers; i++) {
+            hwc_layer_1_t &layer = contents->hwLayers[i];
+            if (layer.acquireFenceFd != -1)
+                close(layer.acquireFenceFd);
         }
-    }
-
-    if (!pdev->hdmi_enabled)
         return 0;
+    }
 
     for (size_t i = 0; i < contents->numHwLayers; i++) {
         hwc_layer_1_t &layer = contents->hwLayers[i];