tdm_hwc: add fence api and backend interface
authorChangyeon Lee <cyeon.lee@samsung.com>
Mon, 22 Jun 2020 04:26:27 +0000 (13:26 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Mon, 22 Jun 2020 04:45:21 +0000 (13:45 +0900)
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
include/tdm_backend.h
include/tdm_common.h
src/tdm_hwc.c
src/tdm_hwc_window.c

index 685c4ec..5dddc18 100644 (file)
@@ -992,6 +992,16 @@ 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.
+ * @since 2.0.0
+ */
+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 +1069,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 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
+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 +1241,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
index 8d6bba9..60ddd1a 100644 (file)
@@ -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;
 
 /**
index bfb4cc6..2b56a28 100644 (file)
@@ -269,6 +269,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;
 
 /**
index 5f43860..9238b29 100644 (file)
@@ -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)
 {
index 1dd9e54..2e861d8 100644 (file)
@@ -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;