drm_hwcomposer: Populate retireFenceFd
Join all layer releaseFenceFd fences together to get the
retireFenceFd for the display.
Change-Id: I431ee227a62397b1900adb0caaf8b16b319a99cd
Signed-off-by: Sean Paul <seanpaul@chromium.org>
diff --git a/hwcomposer.cpp b/hwcomposer.cpp
index b4fb340..18f6921 100644
--- a/hwcomposer.cpp
+++ b/hwcomposer.cpp
@@ -235,6 +235,21 @@
return ret;
}
+static void hwc_add_layer_to_retire_fence(hwc_layer_1_t *layer,
+ hwc_display_contents_1_t *display_contents) {
+ if (layer->releaseFenceFd < 0)
+ return;
+
+ if (display_contents->retireFenceFd >= 0) {
+ int old_retire_fence = display_contents->retireFenceFd;
+ display_contents->retireFenceFd = sync_merge("dc_retire", old_retire_fence,
+ layer->releaseFenceFd);
+ close(old_retire_fence);
+ } else {
+ display_contents->retireFenceFd = dup(layer->releaseFenceFd);
+ }
+}
+
static int hwc_set(hwc_composer_device_1_t *dev, size_t num_displays,
hwc_display_contents_1_t **display_contents) {
ATRACE_CALL();
@@ -286,6 +301,8 @@
hwc_set_cleanup(num_displays, display_contents, composition);
return ret;
}
+ hwc_add_layer_to_retire_fence(layer, dc);
+
--num_planes;
}
@@ -400,6 +417,7 @@
hwc_set_cleanup(num_displays, display_contents, composition);
return ret;
}
+ hwc_add_layer_to_retire_fence(&composite_layer, dc);
fb->set_release_fence_fd(composite_layer.releaseFenceFd);
hd->fb_idx = (hd->fb_idx + 1) % HWC_FB_BUFFERS;