From 4f2ba911f53218aeb8ec9b95efc5947061354275 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Mon, 22 Jun 2020 13:26:27 +0900 Subject: [PATCH] tdm_hwc: add fence api and backend interface add fence api in tdm.h tdm_error tdm_hwc_set_client_target_acquire_fence(tdm_hwc *hwc, int acquire_fence) tdm_error tdm_hwc_get_commit_fence(tdm_hwc *hwc, int *commit_fence) tdm_error tdm_hwc_window_set_acquire_fence(tdm_hwc_window *hwc_window, int acquire_fence) tdm_common.h TDM_HWC_CAPABILITY_FENCE backend interface tdm_error (*hwc_set_client_target_acquire_fence)(tdm_hwc *hwc, int acquire_fence) tdm_error (*hwc_get_commit_fence)(tdm_hwc *hwc, int *commit_fence); tdm_error (*hwc_window_set_acquire_fence)(tdm_hwc_window *hwc_window, int acquire_fence) Change-Id: I706a27341fa14c6cd1bc4ec8fb49bd4f7a8079c8 --- include/tdm.h | 29 +++++++++++++++++++++++++++ include/tdm_backend.h | 30 ++++++++++++++++++++++++++++ include/tdm_common.h | 1 + src/tdm_hwc.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/tdm_hwc_window.c | 26 ++++++++++++++++++++++++ 5 files changed, 141 insertions(+) diff --git a/include/tdm.h b/include/tdm.h index 685c4ec..d064db3 100644 --- a/include/tdm.h +++ b/include/tdm.h @@ -992,6 +992,15 @@ tdm_error tdm_hwc_set_client_target_buffer(tdm_hwc *hwc, tbm_surface_h target_buffer, tdm_region damage); /** + * @brief Set the acquire fence fd of client(relative to the TDM) target + * @param[in] hwc A output hwc + * @param[in] acquire_fence The acquire fence fd of target + * @return #TDM_ERROR_NONE if success. Otherwise, error value. + */ +tdm_error +tdm_hwc_set_client_target_acquire_fence(tdm_hwc *hwc, int acquire_fence); + +/** * @brief Validate the output * @details Instructs the backend to inspect all of the hw layer state and * determine if there are any composition type changes necessary before @@ -1059,6 +1068,17 @@ tdm_error tdm_hwc_commit(tdm_hwc *hwc, int sync, tdm_hwc_commit_handler func, void *user_data); /** + * @brief Get commit fence + * @details After all change of a window object are applied to last tdm_hwc_commit, + * the fence is signaled. + * @param[in] hwc A hwc object + * @param[out] commit_fence the commit fence fd of tdm_hwc_commit + * @return #TDM_ERROR_NONE if success. Otherwise, error value. + */ +tdm_error +tdm_hwc_get_commit_fence(tdm_hwc *hwc, int *commit_fence); + +/** * @brief Set the property which has a given id on the hwc object. * @param[in] hwc A hwc object * @param[in] id The property id @@ -1220,6 +1240,15 @@ tdm_error tdm_hwc_window_set_cursor_image(tdm_hwc_window *hwc_window, int width, int height, int stride, void *ptr); /** + * @brief Set the acquire fence of hwc_window + * @param[in] hwc_window A hwc window object + * @param[in] acquire_fence the acquire fence fd of a hwc window object + * @return #TDM_ERROR_NONE if success. Otherwise, error value. + */ +tdm_error +tdm_hwc_window_set_acquire_fence(tdm_hwc_window *hwc_window, int acquire_fence); + +/** * @brief Destroy a pp object * @param[in] pp A pp object * @see tdm_display_create_pp diff --git a/include/tdm_backend.h b/include/tdm_backend.h index 8d6bba9..60ddd1a 100644 --- a/include/tdm_backend.h +++ b/include/tdm_backend.h @@ -891,6 +891,17 @@ typedef struct _tdm_func_hwc { tdm_region damage); /** + * @brief Set the acquire fence of client(relative to the TDM) target buffer + * @param[in] hwc A output hwc + * @param[in] acquire_fence The acquire fence fd of target + * @return #TDM_ERROR_NONE if success. Otherwise, error value. + * @since 2.0.0 + */ + tdm_error (*hwc_set_client_target_acquire_fence)(tdm_hwc *hwc, + int acquire_fence); + + + /** * @brief Validate the hwc * @details Instructs the backend to inspect all of the hw layer state and * determine if there are any composition type changes necessary before @@ -965,6 +976,16 @@ typedef struct _tdm_func_hwc { tdm_error (*hwc_set_commit_handler)(tdm_hwc *hwc, tdm_hwc_commit_handler func); /** + * @brief Get commit fence + * @details After all change of a window object are applied about last tdm_hwc_commit, + * the fence is signaled. + * @param[in] hwc A hwc object + * @param[out] commit_fence the commit fence fd of tdm_hwc_commit + * @return #TDM_ERROR_NONE if success. Otherwise, error value. + */ + tdm_error (*hwc_get_commit_fence)(tdm_hwc *hwc, int *commit_fence); + + /** * @brief Set the property which has a given id on the hwc object. * @param[in] hwc A hwc object * @param[in] id The property id @@ -1120,6 +1141,15 @@ typedef struct _tdm_func_hwc_window { */ tdm_error (*hwc_window_set_cursor_image)(tdm_hwc_window *hwc_window, int width, int height, int stride, void *ptr); + + /** + * @brief Set the acquire fence of hwc_window + * @param[in] hwc_window A hwc window object + * @param[in] acquire_fence the acquire fence fd of a hwc window object + * @return #TDM_ERROR_NONE if success. Otherwise, error value. + */ + tdm_error (*hwc_window_set_acquire_fence)(tdm_hwc_window *hwc_window, + int acquire_fence); } tdm_func_hwc_window; /** diff --git a/include/tdm_common.h b/include/tdm_common.h index eb856a7..a661a6d 100644 --- a/include/tdm_common.h +++ b/include/tdm_common.h @@ -270,6 +270,7 @@ typedef enum { TDM_HWC_CAPABILITY_VIDEO_SCALE = (1 << 2), /**< if a hwc allows to scale the video buffer */ TDM_HWC_CAPABILITY_VIDEO_TRANSFORM = (1 << 3), /**< if a hwc allows video to transform the video buffer */ TDM_HWC_CAPABILITY_VIDEO_SCANOUT = (1 << 4), /**< if a hwc allows video to accept the scanout buffer only */ + TDM_HWC_CAPABILITY_FENCE = (1 << 5), /**< if a hwc allows fence */ } tdm_hwc_capability; /** diff --git a/src/tdm_hwc.c b/src/tdm_hwc.c index 5f43860..9238b29 100644 --- a/src/tdm_hwc.c +++ b/src/tdm_hwc.c @@ -524,6 +524,33 @@ tdm_hwc_set_client_target_buffer(tdm_hwc *hwc, tbm_surface_h target_buffer, tdm_ return ret; } +EXTERN tdm_error +tdm_hwc_set_client_target_acquire_fence(tdm_hwc *hwc, int acquire_fence) +{ + tdm_private_module *private_module; + tdm_func_hwc *func_hwc = NULL; + + HWC_FUNC_ENTRY(); + + _pthread_mutex_lock(&private_display->lock); + + private_module = private_hwc->private_module; + func_hwc = &private_module->func_hwc; + + if (!func_hwc->hwc_set_client_target_acquire_fence) { + /* LCOV_EXCL_START */ + _pthread_mutex_unlock(&private_display->lock); + TDM_WRN("not implemented!!"); + return TDM_ERROR_NOT_IMPLEMENTED; + /* LCOV_EXCL_STOP */ + } + + ret = func_hwc->hwc_set_client_target_acquire_fence(private_hwc->hwc_backend, acquire_fence); + + _pthread_mutex_unlock(&private_display->lock); + + return ret; +} EXTERN tdm_error tdm_hwc_validate(tdm_hwc *hwc, tdm_hwc_window **composited_wnds, uint32_t num_wnds, uint32_t *num_types) @@ -798,6 +825,34 @@ commit_failed: /* LCOV_EXCL_STOP */ } +EXTERN tdm_error +tdm_hwc_get_commit_fence(tdm_hwc *hwc, int *commit_fence) +{ + tdm_private_module *private_module; + tdm_func_hwc *func_hwc = NULL; + + HWC_FUNC_ENTRY(); + + _pthread_mutex_lock(&private_display->lock); + + private_module = private_hwc->private_module; + func_hwc = &private_module->func_hwc; + + if (!func_hwc->hwc_get_commit_fence) { + /* LCOV_EXCL_START */ + _pthread_mutex_unlock(&private_display->lock); + TDM_WRN("not implemented!!"); + return TDM_ERROR_NOT_IMPLEMENTED; + /* LCOV_EXCL_STOP */ + } + + ret = func_hwc->hwc_get_commit_fence(private_hwc->hwc_backend, commit_fence); + + _pthread_mutex_unlock(&private_display->lock); + + return ret; +} + tdm_error tdm_hwc_set_property(tdm_hwc *hwc, uint32_t id, tdm_value value) { diff --git a/src/tdm_hwc_window.c b/src/tdm_hwc_window.c index 1dd9e54..2e861d8 100644 --- a/src/tdm_hwc_window.c +++ b/src/tdm_hwc_window.c @@ -387,6 +387,32 @@ tdm_hwc_window_set_buffer(tdm_hwc_window *hwc_window, tbm_surface_h buffer) } EXTERN tdm_error +tdm_hwc_window_set_acquire_fence(tdm_hwc_window *hwc_window, int acquire_fence) +{ + tdm_private_module *private_module; + tdm_func_hwc_window *func_hwc_window; + + HWC_WINDOW_FUNC_ENTRY(); + + _pthread_mutex_lock(&private_display->lock); + + private_module = private_output->private_module; + func_hwc_window = &private_module->func_hwc_window; + + if (!func_hwc_window->hwc_window_set_acquire_fence) { + _pthread_mutex_unlock(&private_display->lock); + TDM_WRN("not implemented!!"); + return TDM_ERROR_NOT_IMPLEMENTED; + } + + ret = func_hwc_window->hwc_window_set_acquire_fence(private_hwc_window->hwc_window_backend, acquire_fence); + + _pthread_mutex_unlock(&private_display->lock); + + return ret; +} + +EXTERN tdm_error tdm_hwc_window_get_property(tdm_hwc_window *hwc_window, unsigned int id, tdm_value *value) { tdm_private_module *private_module; -- 2.7.4