From 7c68f4df75da68306d168c2bea1076f3a45bdeaf Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 12 Feb 2018 10:38:42 +0900 Subject: [PATCH 01/16] hwc: add output_hwc_get_client_target_buffer_layer at backend function Change-Id: Icbfda1122a75db3f0a88ed7aff7ac511617b9009 --- include/tdm_backend.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/include/tdm_backend.h b/include/tdm_backend.h index f3e21d6..5980dfc 100644 --- a/include/tdm_backend.h +++ b/include/tdm_backend.h @@ -604,6 +604,16 @@ typedef struct _tdm_func_output { tdm_error (*output_hwc_unset_client_target_buffer)(tdm_output *output); /** + * @brief Get the layer associated with the client target buffer + * @details TODO: + * @param[in] output A output object + * @param[out] error #TDM_ERROR_NONE if success. Otherwise, error value. + * @return A layer object. + * @since 2.0.0 + */ + tdm_layer *(*output_hwc_get_client_target_buffer_layer)(tdm_output *output, tdm_error *error); + + /** * @brief Validate the output * @details Instructs the device to inspect all of the layer state and * determine if there are any composition type changes necessary before -- 2.7.4 From f3154c33ed163e694efb2b1d50d2310a56bad24a Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 12 Feb 2018 10:39:15 +0900 Subject: [PATCH 02/16] hwc : add output_hwc_get_client_target_buffer at backend function Change-Id: I6356f108c69e5bb255d9aef1a0fc81cb3b27aa37 --- include/tdm_backend.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/include/tdm_backend.h b/include/tdm_backend.h index 5980dfc..e424110 100644 --- a/include/tdm_backend.h +++ b/include/tdm_backend.h @@ -614,6 +614,16 @@ typedef struct _tdm_func_output { tdm_layer *(*output_hwc_get_client_target_buffer_layer)(tdm_output *output, tdm_error *error); /** + * @brief Get the buffer which is set to the client target buffer + * @details TODO: + * @param[in] output A output object + * @param[out] error #TDM_ERROR_NONE if success. Otherwise, error value. + * @return A layer object. + * @since 2.0.0 + */ + tbm_surface_h (*output_hwc_get_client_target_buffer)(tdm_output *output, tdm_error *error); + + /** * @brief Validate the output * @details Instructs the device to inspect all of the layer state and * determine if there are any composition type changes necessary before -- 2.7.4 From 8f200724a4e783e61d40374e699e37f4114a5c41 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 12 Feb 2018 10:39:53 +0900 Subject: [PATCH 03/16] hwc: add hwc_window_get_info at backend function Change-Id: Ia117ec0acb961611175a86d421032326f07902a9 --- include/tdm_backend.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/include/tdm_backend.h b/include/tdm_backend.h index e424110..cbd8a82 100644 --- a/include/tdm_backend.h +++ b/include/tdm_backend.h @@ -910,6 +910,15 @@ typedef struct _tdm_func_window { tdm_hwc_window_info *info); /** + * @brief Get the geometry information to a layer object + * @param[in] layer A layer object + * @param[out] info The geometry information + * @return #TDM_ERROR_NONE if success. Otherwise, error value. + */ + tdm_error (*hwc_window_get_info)(tdm_hwc_window *hwc_window, + tdm_hwc_window_info *info); + + /** * @brief Set a TDM buffer to a window object * @details A TDM buffer will be applied when the output object * of a layer object is committed. -- 2.7.4 From de319d72948f8839bc78b7ca8cca87fc3d0abe17 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 12 Feb 2018 10:40:26 +0900 Subject: [PATCH 04/16] hwc: add hwc_window_get_buffer at backend function Change-Id: I4ca3a45175259f57a2ca073293e73d13744224c3 --- include/tdm_backend.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/include/tdm_backend.h b/include/tdm_backend.h index cbd8a82..01c0233 100644 --- a/include/tdm_backend.h +++ b/include/tdm_backend.h @@ -947,6 +947,21 @@ typedef struct _tdm_func_window { tdm_error (*hwc_window_unset_buffer)(tdm_hwc_window *hwc_window); /** + * @brief Get a buffer which is set to a window object + * @details A TDM buffer will be applied when the output object + * of a layer object is committed. + * @param[in] hwc_window A window object + * @param[out] error #TDM_ERROR_NONE if success. Otherwise, error value. + * @return A buffer which is @b assigend to a window object + * + * Implementation should return #TDM_ERROR_BUSY if #hwc_window can't + * be updated right now, this won't be interpreted like some critical + * error. + */ + tbm_surface_h (*hwc_window_get_buffer)(tdm_hwc_window *hwc_window, + tdm_error *error); + + /** * @brief Set a flags to a window object * @param[in] hwc_window A window object * @param[in] flags A hwc_window flags -- 2.7.4 From e93c19d94e9540af5e081beefca00a915c63b149 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 12 Feb 2018 10:41:04 +0900 Subject: [PATCH 05/16] hwc: add hwc_window_get_layer at backend function Change-Id: I42ce34f3b72a030542ec86a0c865bc38e34733ec --- include/tdm_backend.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/include/tdm_backend.h b/include/tdm_backend.h index 01c0233..09b1377 100644 --- a/include/tdm_backend.h +++ b/include/tdm_backend.h @@ -962,6 +962,19 @@ typedef struct _tdm_func_window { tdm_error *error); /** + * @brief Get a layer associated with a window object + * @param[in] hwc_window A window object + * @param[out] error #TDM_ERROR_NONE if success. Otherwise, error value. + * @return A layer which is @b assigend to a window object + * @remark + * A backend module @b SHOULD implement this function. The backend should + * return the tdm_layer assoicated with a hwc_window which must be assigend + * hw overlay.\n + */ + tdm_layer *(*hwc_window_get_layer)(tdm_hwc_window *hwc_window, + tdm_error *error); + + /** * @brief Set a flags to a window object * @param[in] hwc_window A window object * @param[in] flags A hwc_window flags -- 2.7.4 From fa893e5861c98199c833a52016cf44fad82c2581 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 12 Feb 2018 10:45:19 +0900 Subject: [PATCH 06/16] layer: add tdm_layer_set_info_internal Change-Id: I66f1c28cd95b2355e7a98387abf8c048c07d2e24 --- src/tdm_layer.c | 27 ++++++++++++++++++--------- src/tdm_private.h | 2 ++ 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/tdm_layer.c b/src/tdm_layer.c index 8ef46a6..b942b8f 100644 --- a/src/tdm_layer.c +++ b/src/tdm_layer.c @@ -205,18 +205,14 @@ tdm_layer_get_property(tdm_layer *layer, unsigned int id, tdm_value *value) return ret; } -EXTERN tdm_error -tdm_layer_set_info(tdm_layer *layer, tdm_info_layer *info) +INTERN tdm_error +tdm_layer_set_info_internal(tdm_private_layer *private_layer, tdm_info_layer *info) { + tdm_private_output *private_output = private_layer->private_output; + tdm_private_display *private_display = private_output->private_display; tdm_func_layer *func_layer; char fmtstr[128]; - LAYER_FUNC_ENTRY(); - - TDM_RETURN_VAL_IF_FAIL(info != NULL, TDM_ERROR_INVALID_PARAMETER); - - _pthread_mutex_lock(&private_display->lock); - func_layer = &private_display->func_layer; if (private_layer->usable) @@ -226,7 +222,6 @@ tdm_layer_set_info(tdm_layer *layer, tdm_info_layer *info) if (!func_layer->layer_set_info) { /* LCOV_EXCL_START */ - _pthread_mutex_unlock(&private_display->lock); TDM_ERR("not implemented!!"); return TDM_ERROR_NOT_IMPLEMENTED; /* LCOV_EXCL_STOP */ @@ -249,6 +244,20 @@ tdm_layer_set_info(tdm_layer *layer, tdm_info_layer *info) private_layer->pending_info_changed = 1; private_layer->pending_info = *info; + return TDM_ERROR_NONE; +} + +EXTERN tdm_error +tdm_layer_set_info(tdm_layer *layer, tdm_info_layer *info) +{ + LAYER_FUNC_ENTRY(); + + TDM_RETURN_VAL_IF_FAIL(info != NULL, TDM_ERROR_INVALID_PARAMETER); + + _pthread_mutex_lock(&private_display->lock); + + ret = tdm_layer_set_info_internal(private_layer, info); + _pthread_mutex_unlock(&private_display->lock); return ret; diff --git a/src/tdm_private.h b/src/tdm_private.h index 6cf2a6d..d2565ae 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -139,6 +139,8 @@ tdm_error tdm_layer_commit_pending_data(tdm_private_layer *private_layer); void tdm_layer_committed(tdm_private_layer *private_layer, tdm_private_layer_buffer **committed_buffer); +tdm_error +tdm_layer_set_info_internal(tdm_private_layer *private_layer, tdm_info_layer *info); void tdm_pp_cb_done(tdm_pp *pp_backend, tbm_surface_h src, tbm_surface_h dst, -- 2.7.4 From 92593db55dd1dd710d043236e5c72177e025b8d4 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 12 Feb 2018 10:47:51 +0900 Subject: [PATCH 07/16] layer: add tdm_layer_commit_internal Change-Id: I9ceeba70ea836953a145dc6f5a049a9311d453b5 --- src/tdm_layer.c | 27 ++++++++++++++++++--------- src/tdm_private.h | 2 ++ 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/tdm_layer.c b/src/tdm_layer.c index b942b8f..ed86c37 100644 --- a/src/tdm_layer.c +++ b/src/tdm_layer.c @@ -943,12 +943,11 @@ commit_failed: return ret; } -EXTERN tdm_error -tdm_layer_commit(tdm_layer *layer, tdm_layer_commit_handler func, void *user_data) +INTERN tdm_error +tdm_layer_commit_internal(tdm_private_layer *private_layer, tdm_layer_commit_handler func, void *user_data) { - LAYER_FUNC_ENTRY(); - - _pthread_mutex_lock(&private_display->lock); + tdm_private_output *private_output = private_layer->private_output; + tdm_error ret = TDM_ERROR_NONE; /* default TDM_ERROR_NONE */ if (private_output->commit_type == TDM_COMMIT_TYPE_NONE) { if (!private_output->commit_per_vblank) @@ -958,22 +957,32 @@ tdm_layer_commit(tdm_layer *layer, tdm_layer_commit_handler func, void *user_dat } if (TDM_OUTPUT_DPMS_VSYNC_IS_OFF(private_output->current_dpms_value)) { - TDM_ERR("layer(%p)'s output(%d) dpms: %s", layer, private_output->pipe, + TDM_ERR("layer(%p)'s output(%d) dpms: %s", private_layer, private_output->pipe, tdm_dpms_str(private_output->current_dpms_value)); - _pthread_mutex_unlock(&private_display->lock); return TDM_ERROR_DPMS_OFF; } /* don't call this inside of _tdm_layer_commit */ ret = tdm_layer_commit_pending_data(private_layer); if (ret != TDM_ERROR_NONE) { - TDM_ERR("layer(%p) committing pending data failed", layer); - _pthread_mutex_unlock(&private_display->lock); + TDM_ERR("layer(%p) committing pending data failed", private_layer); return ret; } ret = _tdm_layer_commit(private_layer, func, user_data); + return ret; +} + +EXTERN tdm_error +tdm_layer_commit(tdm_layer *layer, tdm_layer_commit_handler func, void *user_data) +{ + LAYER_FUNC_ENTRY(); + + _pthread_mutex_lock(&private_display->lock); + + ret = tdm_layer_commit_internal(private_layer, func, user_data); + _pthread_mutex_unlock(&private_display->lock); return ret; diff --git a/src/tdm_private.h b/src/tdm_private.h index d2565ae..c771bb0 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -136,6 +136,8 @@ void tdm_layer_remove_commit_handler_internal(tdm_layer *layer, tdm_layer_commit_handler func, void *user_data); tdm_error +tdm_layer_commit_internal(tdm_private_layer *private_layer, tdm_layer_commit_handler func, void *user_data); +tdm_error tdm_layer_commit_pending_data(tdm_private_layer *private_layer); void tdm_layer_committed(tdm_private_layer *private_layer, tdm_private_layer_buffer **committed_buffer); -- 2.7.4 From b96127801d279b915365c3cbe8aaba99b5be3fec Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 12 Feb 2018 10:50:31 +0900 Subject: [PATCH 08/16] layer: add tdm_layer_set_buffer_internal Change-Id: Iba8154071512bbd86d80666a8a84b33b9cb8f0e2 --- src/tdm_layer.c | 27 ++++++++++++++++++--------- src/tdm_private.h | 2 ++ 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/tdm_layer.c b/src/tdm_layer.c index ed86c37..325752e 100644 --- a/src/tdm_layer.c +++ b/src/tdm_layer.c @@ -415,17 +415,13 @@ _tdm_layer_free_all_buffers(tdm_private_layer *private_layer) } } -EXTERN tdm_error -tdm_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer) +INTERN tdm_error +tdm_layer_set_buffer_internal(tdm_private_layer *private_layer, tbm_surface_h buffer) { + tdm_private_output *private_output = private_layer->private_output; + tdm_private_display *private_display = private_output->private_display; tdm_func_layer *func_layer; - LAYER_FUNC_ENTRY(); - - TDM_RETURN_VAL_IF_FAIL(buffer != NULL, TDM_ERROR_INVALID_PARAMETER); - - _pthread_mutex_lock(&private_display->lock); - /* LCOV_EXCL_START */ /* dump buffer */ if (tdm_dump_enable && !(private_layer->caps.capabilities & TDM_LAYER_CAPABILITY_VIDEO)) @@ -450,7 +446,6 @@ tdm_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer) if (!func_layer->layer_set_buffer) { /* LCOV_EXCL_START */ - _pthread_mutex_unlock(&private_display->lock); TDM_ERR("not implemented!!"); return TDM_ERROR_NOT_IMPLEMENTED; /* LCOV_EXCL_START */ @@ -484,6 +479,20 @@ tdm_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer) TDM_TRACE_ASYNC_BEGIN((intptr_t)private_layer, "[LAYER] %d", tbm_bo_export(bo)); } + return TDM_ERROR_NONE; +} + +EXTERN tdm_error +tdm_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer) +{ + LAYER_FUNC_ENTRY(); + + TDM_RETURN_VAL_IF_FAIL(buffer != NULL, TDM_ERROR_INVALID_PARAMETER); + + _pthread_mutex_lock(&private_display->lock); + + ret = tdm_layer_set_buffer_internal(private_layer, buffer); + _pthread_mutex_unlock(&private_display->lock); return ret; diff --git a/src/tdm_private.h b/src/tdm_private.h index c771bb0..1747bb5 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -143,6 +143,8 @@ void tdm_layer_committed(tdm_private_layer *private_layer, tdm_private_layer_buffer **committed_buffer); tdm_error tdm_layer_set_info_internal(tdm_private_layer *private_layer, tdm_info_layer *info); +tdm_error +tdm_layer_set_buffer_internal(tdm_private_layer *private_layer, tbm_surface_h buffer); void tdm_pp_cb_done(tdm_pp *pp_backend, tbm_surface_h src, tbm_surface_h dst, -- 2.7.4 From c5e2cf130bda40bd8cbc93ca1b43b33f47895e77 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 12 Feb 2018 10:51:11 +0900 Subject: [PATCH 09/16] layer: add tdm_layer_unset_buffer_internal Change-Id: If9004eeabdcc0138d4b1fcaa6da4de84e133eff0 --- src/tdm_layer.c | 23 +++++++++++++++++------ src/tdm_private.h | 2 ++ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/tdm_layer.c b/src/tdm_layer.c index 325752e..2f97c5c 100644 --- a/src/tdm_layer.c +++ b/src/tdm_layer.c @@ -498,13 +498,13 @@ tdm_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer) return ret; } -EXTERN tdm_error -tdm_layer_unset_buffer(tdm_layer *layer) +INTERN tdm_error +tdm_layer_unset_buffer_internal(tdm_private_layer *private_layer) { + tdm_private_output *private_output = private_layer->private_output; + tdm_private_display *private_display = private_output->private_display; tdm_func_layer *func_layer; - LAYER_FUNC_ENTRY(); - - _pthread_mutex_lock(&private_display->lock); + tdm_error ret = TDM_ERROR_NONE; func_layer = &private_display->func_layer; @@ -517,7 +517,6 @@ tdm_layer_unset_buffer(tdm_layer *layer) if (!func_layer->layer_unset_buffer) { /* LCOV_EXCL_START */ - _pthread_mutex_unlock(&private_display->lock); TDM_ERR("not implemented!!"); return TDM_ERROR_NOT_IMPLEMENTED; /* LCOV_EXCL_START */ @@ -526,6 +525,18 @@ tdm_layer_unset_buffer(tdm_layer *layer) ret = func_layer->layer_unset_buffer(private_layer->layer_backend); TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); + return ret; +} + +EXTERN tdm_error +tdm_layer_unset_buffer(tdm_layer *layer) +{ + LAYER_FUNC_ENTRY(); + + _pthread_mutex_lock(&private_display->lock); + + ret = tdm_layer_unset_buffer_internal(private_layer); + _pthread_mutex_unlock(&private_display->lock); return ret; diff --git a/src/tdm_private.h b/src/tdm_private.h index 1747bb5..57f97b2 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -145,6 +145,8 @@ tdm_error tdm_layer_set_info_internal(tdm_private_layer *private_layer, tdm_info_layer *info); tdm_error tdm_layer_set_buffer_internal(tdm_private_layer *private_layer, tbm_surface_h buffer); +tdm_error +tdm_layer_unset_buffer_internal(tdm_private_layer *private_layer); void tdm_pp_cb_done(tdm_pp *pp_backend, tbm_surface_h src, tbm_surface_h dst, -- 2.7.4 From 12851c901363be59735440f9070dcc2180b17bdd Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 12 Feb 2018 11:04:06 +0900 Subject: [PATCH 10/16] hwc: add tdm_hwc_window_commit Change-Id: Ic6282508e8ce1a075c340b167ae821512de7bf90 --- include/tdm.h | 12 +++++ include/tdm_types.h | 7 +++ src/tdm_hwc_window.c | 117 ++++++++++++++++++++++++++++++++++++++++++++++++ src/tdm_private_types.h | 7 +++ 4 files changed, 143 insertions(+) diff --git a/include/tdm.h b/include/tdm.h index e317832..7437d86 100644 --- a/include/tdm.h +++ b/include/tdm.h @@ -1083,6 +1083,18 @@ tdm_error tdm_hwc_window_unset_flags(tdm_hwc_window *hwc_window, tdm_hwc_window_flag flags); /** + * @brief Commit changes for a window object + * @details After all change of a window object are applied, a user commit handler + * will be called. + * @param[in] hwc_window A window object + * @param[in] func A user commit handler + * @param[in] user_data The user data + * @return #TDM_ERROR_NONE if success. Otherwise, error value. + */ +tdm_error +tdm_hwc_window_commit(tdm_hwc_window *hwc_window, tdm_hwc_window_commit_handler func, void *user_data); + +/** * @brief Get the available property array of a video hwc window object. * @param[in] hwc window A video hwc window object * @param[out] props The available property array diff --git a/include/tdm_types.h b/include/tdm_types.h index a20049f..f08d347 100644 --- a/include/tdm_types.h +++ b/include/tdm_types.h @@ -267,6 +267,13 @@ typedef void (*tdm_layer_commit_handler)(tdm_layer *layer, unsigned int sequence void *user_data); /** + * @brief The hwc_window commit handler + */ +typedef void (*tdm_hwc_window_commit_handler)(tdm_hwc_window *hwc_window, unsigned int sequence, + unsigned int tv_sec, unsigned int tv_usec, + void *user_data); + +/** * @brief The done handler of a pp object */ typedef void (*tdm_pp_done_handler)(tdm_pp *pp, tbm_surface_h src, diff --git a/src/tdm_hwc_window.c b/src/tdm_hwc_window.c index 96d2698..08fc80c 100644 --- a/src/tdm_hwc_window.c +++ b/src/tdm_hwc_window.c @@ -409,6 +409,123 @@ tdm_hwc_window_unset_flags(tdm_hwc_window *hwc_window, tdm_hwc_window_flag flags return ret; } +static void +_tdm_hwc_window_layer_commit_handler(tdm_layer *layer, unsigned int sequence, + unsigned int tv_sec, unsigned int tv_usec, + void *user_data) +{ + tdm_private_hwc_window_commit_handler *hwc_window_commit_handler = (tdm_private_hwc_window_commit_handler *)user_data; + tdm_hwc_window_commit_handler func = hwc_window_commit_handler->func; + tdm_hwc_window *hwc_window = (tdm_hwc_window *)hwc_window_commit_handler->private_hwc_window; + void *data = hwc_window_commit_handler->user_data; + + func(hwc_window, sequence, tv_sec, tv_usec, data); + + free(hwc_window_commit_handler); +} + +tdm_error +tdm_hwc_window_commit(tdm_hwc_window *hwc_window, tdm_hwc_window_commit_handler func, void *user_data) +{ + tdm_func_hwc_window *func_hwc_window = NULL; + tdm_private_hwc_window_commit_handler *hwc_window_commit_handler; + tdm_layer *layer = NULL; + tdm_private_layer *private_layer; + tdm_info_layer *info_layer; + tdm_hwc_window_info window_info; + tbm_surface_h buffer; + + HWC_WINDOW_FUNC_ENTRY(); + + _pthread_mutex_lock(&private_display->lock); + + func_hwc_window = &private_display->func_hwc_window; + + if (!func_hwc_window->hwc_window_get_layer) { + /* LCOV_EXCL_START */ + _pthread_mutex_unlock(&private_display->lock); + TDM_ERR("not implemented!!"); + return TDM_ERROR_NOT_IMPLEMENTED; + /* LCOV_EXCL_STOP */ + } + + layer = func_hwc_window->hwc_window_get_layer(private_hwc_window->hwc_window_backend, + &ret); + if (!layer) { + /* LCOV_EXCL_START */ + _pthread_mutex_unlock(&private_display->lock); + TDM_ERR("no assigned layer!!"); + return TDM_ERROR_INVALID_PARAMETER; + /* LCOV_EXCL_STOP */ + } + + private_layer = (tdm_private_layer*)layer; + + buffer = func_hwc_window->hwc_window_get_buffer(private_hwc_window->hwc_window_backend, + &ret); + if (!buffer) { + /* LCOV_EXCL_START */ + _pthread_mutex_unlock(&private_display->lock); + TDM_ERR("no assigned buffer!!"); + return TDM_ERROR_INVALID_PARAMETER; + /* LCOV_EXCL_STOP */ + } + + if (buffer) + ret = tdm_layer_set_buffer_internal(private_layer, buffer); + else + ret = tdm_layer_unset_buffer_internal(private_layer); + if (ret != TDM_ERROR_NONE) { + /* LCOV_EXCL_START */ + TDM_ERR("failed: layer set buffer(window)"); + /* LCOV_EXCL_STOP */ + return ret; + } + + ret = func_hwc_window->hwc_window_get_info(private_hwc_window->hwc_window_backend, + &window_info); + if (ret != TDM_ERROR_NONE) { + /* LCOV_EXCL_START */ + TDM_ERR("failed: commit layer(window)"); + /* LCOV_EXCL_STOP */ + return ret; + } + + info_layer = (tdm_info_layer *)&window_info; + ret = tdm_layer_set_info_internal(private_layer, info_layer); + if (ret != TDM_ERROR_NONE) { + /* LCOV_EXCL_START */ + TDM_ERR("failed: layer set info(window)"); + /* LCOV_EXCL_STOP */ + return ret; + } + + hwc_window_commit_handler = calloc(1, sizeof(tdm_private_hwc_window_commit_handler)); + if (!hwc_window_commit_handler) { + /* LCOV_EXCL_START */ + TDM_ERR("failed: alloc memory"); + return TDM_ERROR_OUT_OF_MEMORY; + /* LCOV_EXCL_STOP */ + } + + hwc_window_commit_handler->private_hwc_window = private_hwc_window; + hwc_window_commit_handler->func = func; + hwc_window_commit_handler->user_data = user_data; + + ret = tdm_layer_commit_internal(private_layer, _tdm_hwc_window_layer_commit_handler, user_data); + if (ret != TDM_ERROR_NONE) { + /* LCOV_EXCL_START */ + TDM_ERR("failed: commit layer(window)"); + free(hwc_window_commit_handler); + /* LCOV_EXCL_STOP */ + return ret; + } + + _pthread_mutex_unlock(&private_display->lock); + + return ret; +} + EXTERN tdm_error tdm_hwc_window_video_get_capability(tdm_hwc_window *hwc_window, tdm_hwc_window_video_capability *video_capability) diff --git a/src/tdm_private_types.h b/src/tdm_private_types.h index 8f7fb7d..642e962 100644 --- a/src/tdm_private_types.h +++ b/src/tdm_private_types.h @@ -107,6 +107,7 @@ typedef struct _tdm_private_thread tdm_private_thread; typedef struct _tdm_private_vblank_handler tdm_private_vblank_handler; typedef struct _tdm_private_output_commit_handler tdm_private_output_commit_handler; typedef struct _tdm_private_layer_commit_handler tdm_private_layer_commit_handler; +typedef struct _tdm_private_hwc_window_commit_handler tdm_private_hwc_window_commit_handler; typedef struct _tdm_private_change_handler tdm_private_change_handler; typedef struct _tdm_private_layer_buffer tdm_private_layer_buffer; @@ -368,6 +369,12 @@ struct _tdm_private_layer_commit_handler { tdm_private_layer_buffer *committed_buffer; /* for layer_commit */ }; +struct _tdm_private_hwc_window_commit_handler { + tdm_private_hwc_window *private_hwc_window; + tdm_hwc_window_commit_handler func; + void *user_data; +}; + struct _tdm_private_change_handler { struct list_head link; -- 2.7.4 From 1eeff4b0b05d15287ed013a3529a3abe18563b8d Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 12 Feb 2018 11:17:05 +0900 Subject: [PATCH 11/16] hwc: add tdm_output_hwc_commit_client_target_buffer Change-Id: I48164e6e2ea918567355c7bf69a751e0dfdee472 --- include/tdm.h | 12 +++++ include/tdm_types.h | 7 +++ src/tdm_output.c | 137 ++++++++++++++++++++++++++++++++++++++++++++++++ src/tdm_private_types.h | 10 ++++ 4 files changed, 166 insertions(+) diff --git a/include/tdm.h b/include/tdm.h index 7437d86..f90fbe8 100644 --- a/include/tdm.h +++ b/include/tdm.h @@ -645,6 +645,18 @@ tdm_error tdm_output_hwc_unset_client_target_buffer(tdm_output *output); /** + * @brief Commit changes for a target_window + * @details After all change of a window object are applied, a user commit handler + * will be called. + * @param[in] hwc_window A window object + * @param[in] func A user commit handler + * @param[in] user_data The user data + * @return #TDM_ERROR_NONE if success. Otherwise, error value. + */ +tdm_error +tdm_output_hwc_commit_client_target_buffer(tdm_output *output, tdm_output_hwc_target_buffer_commit_handler func, void *user_data); + +/** * @brief Validate the output * @details Instructs the device to inspect all of the layer state and * determine if there are any composition type changes necessary before diff --git a/include/tdm_types.h b/include/tdm_types.h index f08d347..d2013b7 100644 --- a/include/tdm_types.h +++ b/include/tdm_types.h @@ -274,6 +274,13 @@ typedef void (*tdm_hwc_window_commit_handler)(tdm_hwc_window *hwc_window, unsign void *user_data); /** + * @brief The output target_buffer commit handler + */ +typedef void (*tdm_output_hwc_target_buffer_commit_handler)(tdm_output *output, unsigned int sequence, + unsigned int tv_sec, unsigned int tv_usec, + void *user_data); + +/** * @brief The done handler of a pp object */ typedef void (*tdm_pp_done_handler)(tdm_pp *pp, tbm_surface_h src, diff --git a/src/tdm_output.c b/src/tdm_output.c index e5edf93..74745bd 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -1858,6 +1858,143 @@ tdm_output_hwc_unset_client_target_buffer(tdm_output *output) return ret; } +static void +_tdm_output_hwc_layer_commit_handler(tdm_layer *layer, unsigned int sequence, + unsigned int tv_sec, unsigned int tv_usec, + void *user_data) +{ + tdm_private_output_hwc_target_buffer_commit_handler *output_hwc_target_buffer_commit_handler = (tdm_private_output_hwc_target_buffer_commit_handler *)user_data; + tdm_output_hwc_target_buffer_commit_handler func = output_hwc_target_buffer_commit_handler->func; + tdm_output *output = (tdm_output *)output_hwc_target_buffer_commit_handler->private_output; + void *data = output_hwc_target_buffer_commit_handler->user_data; + + func(output, sequence, tv_sec, tv_usec, data); + + free(output_hwc_target_buffer_commit_handler); +} + +tdm_error +tdm_output_hwc_commit_client_target_buffer(tdm_output *output, tdm_output_hwc_target_buffer_commit_handler func, void *user_data) +{ + tdm_func_output *func_output; + tdm_private_output_hwc_target_buffer_commit_handler *output_hwc_target_buffer_commit_handler; + tdm_layer *layer = NULL; + tdm_private_layer *private_layer; + const tdm_output_mode *mode; + tbm_surface_h buffer; + + OUTPUT_FUNC_ENTRY(); + + _pthread_mutex_lock(&private_display->lock); + + if (!(private_output->caps.capabilities & TDM_OUTPUT_CAPABILITY_HWC)) { + TDM_ERR("output(%p) not support HWC", private_output); + _pthread_mutex_unlock(&private_display->lock); + return TDM_ERROR_BAD_REQUEST; + } + + func_output = &private_display->func_output; + + if (!func_output->output_hwc_get_client_target_buffer_layer) { + /* LCOV_EXCL_START */ + _pthread_mutex_unlock(&private_display->lock); + TDM_ERR("not implemented!!"); + return TDM_ERROR_NOT_IMPLEMENTED; + /* LCOV_EXCL_STOP */ + } + + layer = func_output->output_hwc_get_client_target_buffer_layer(private_output->output_backend, + &ret); + if (!layer) { + /* LCOV_EXCL_START */ + _pthread_mutex_unlock(&private_display->lock); + TDM_ERR("no assigned layer!!"); + return TDM_ERROR_INVALID_PARAMETER; + /* LCOV_EXCL_STOP */ + } + + private_layer = (tdm_private_layer*)layer; + + if (!func_output->output_hwc_get_client_target_buffer) { + /* LCOV_EXCL_START */ + _pthread_mutex_unlock(&private_display->lock); + TDM_ERR("not implemented!!"); + return TDM_ERROR_NOT_IMPLEMENTED; + /* LCOV_EXCL_STOP */ + } + + buffer = func_output->output_hwc_get_client_target_buffer(private_output->output_backend, + &ret); + if (!buffer) { + /* LCOV_EXCL_START */ + _pthread_mutex_unlock(&private_display->lock); + TDM_ERR("no assigned buffer!!"); + return TDM_ERROR_INVALID_PARAMETER; + /* LCOV_EXCL_STOP */ + } + + if (buffer) + ret = tdm_layer_set_buffer_internal(private_layer, buffer); + else + ret = tdm_layer_unset_buffer_internal(private_layer); + if (ret != TDM_ERROR_NONE) { + /* LCOV_EXCL_START */ + TDM_ERR("failed: layer set info(window)"); + /* LCOV_EXCL_STOP */ + return ret; + } + + /* set layer_info only one time */ + /* TODO: if the mode changes, set again the target_buffer_info. */ + if (&private_output->target_buffer_info == NULL) { + mode = private_output->current_mode; + private_output->target_buffer_info.src_config.size.h = mode->hdisplay; + private_output->target_buffer_info.src_config.size.v = mode->vdisplay; + private_output->target_buffer_info.src_config.pos.x = 0; + private_output->target_buffer_info.src_config.pos.y = 0; + private_output->target_buffer_info.src_config.pos.w = mode->hdisplay; + private_output->target_buffer_info.src_config.pos.h = mode->vdisplay; + private_output->target_buffer_info.dst_pos.x = 0; + private_output->target_buffer_info.dst_pos.y = 0; + private_output->target_buffer_info.dst_pos.w = mode->hdisplay; + private_output->target_buffer_info.dst_pos.h = mode->vdisplay; + private_output->target_buffer_info.transform = TDM_TRANSFORM_NORMAL; + } + + ret = tdm_layer_set_info_internal(private_layer, &private_output->target_buffer_info); + if (ret != TDM_ERROR_NONE) { + /* LCOV_EXCL_START */ + TDM_ERR("failed: layer set info(window)"); + /* LCOV_EXCL_STOP */ + return ret; + } + + output_hwc_target_buffer_commit_handler = calloc(1, sizeof(tdm_private_output_hwc_target_buffer_commit_handler)); + if (!output_hwc_target_buffer_commit_handler) { + /* LCOV_EXCL_START */ + TDM_ERR("failed: alloc memory"); + return TDM_ERROR_OUT_OF_MEMORY; + /* LCOV_EXCL_STOP */ + } + + output_hwc_target_buffer_commit_handler->private_output = private_output; + output_hwc_target_buffer_commit_handler->func = func; + output_hwc_target_buffer_commit_handler->user_data = user_data; + + ret = tdm_layer_commit_internal(private_layer, _tdm_output_hwc_layer_commit_handler, user_data); + if (ret != TDM_ERROR_NONE) { + /* LCOV_EXCL_START */ + TDM_ERR("failed: commit layer(target buffer)"); + free(output_hwc_target_buffer_commit_handler); + /* LCOV_EXCL_STOP */ + return ret; + } + + _pthread_mutex_unlock(&private_display->lock); + + return ret; +} + tdm_error tdm_output_hwc_get_video_supported_formats(tdm_output *output, const tbm_format **formats, int *count) diff --git a/src/tdm_private_types.h b/src/tdm_private_types.h index 642e962..021be9c 100644 --- a/src/tdm_private_types.h +++ b/src/tdm_private_types.h @@ -108,6 +108,8 @@ typedef struct _tdm_private_vblank_handler tdm_private_vblank_handler; typedef struct _tdm_private_output_commit_handler tdm_private_output_commit_handler; typedef struct _tdm_private_layer_commit_handler tdm_private_layer_commit_handler; typedef struct _tdm_private_hwc_window_commit_handler tdm_private_hwc_window_commit_handler; +typedef struct _tdm_private_output_hwc_target_buffer_window_commit_handler tdm_private_output_hwc_target_buffer_commit_handler; + typedef struct _tdm_private_change_handler tdm_private_change_handler; typedef struct _tdm_private_layer_buffer tdm_private_layer_buffer; @@ -205,6 +207,8 @@ struct _tdm_private_output { tdm_event_loop_source *event_source; } need_validate; + tdm_info_layer target_buffer_info; /* layer_info for the target_buffer */ + /* calling a output commit per a vblank */ int commit_per_vblank; tdm_commit_type commit_type; @@ -375,6 +379,12 @@ struct _tdm_private_hwc_window_commit_handler { void *user_data; }; +struct _tdm_private_output_hwc_target_buffer_window_commit_handler { + tdm_private_output *private_output; + tdm_output_hwc_target_buffer_commit_handler func; + void *user_data; +}; + struct _tdm_private_change_handler { struct list_head link; -- 2.7.4 From 61a8f253c9196953a34e39a60c841a0b60c66caa Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 12 Feb 2018 12:44:53 +0900 Subject: [PATCH 12/16] hwc: remove the window zpos Change-Id: I15f6636b1875059ebe98742e7949ca97f2aeae10 --- src/tdm_private_types.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/tdm_private_types.h b/src/tdm_private_types.h index 021be9c..4ef5922 100644 --- a/src/tdm_private_types.h +++ b/src/tdm_private_types.h @@ -256,7 +256,6 @@ struct _tdm_private_hwc_window { struct list_head link; int index; - uint32_t zpos; tdm_private_display *private_display; tdm_private_output *private_output; -- 2.7.4 From 85530bee1c1714e2c8abf38d1612310063d7e6d5 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Thu, 8 Feb 2018 11:30:36 +0900 Subject: [PATCH 13/16] do not update caps.status in sub thread Change-Id: Ib11fb4b9d448ade7740887b6aad9cc6a9ee3d91d Signed-off-by: Junkyeong Kim --- src/tdm_output.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/tdm_output.c b/src/tdm_output.c index 74745bd..67ec7e9 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -223,7 +223,6 @@ tdm_output_cb_status(tdm_output *output_backend, tdm_output_conn_status status, TDM_INFO("output(%d) %s", private_output->pipe, tdm_status_str(status)); _tdm_output_update(output_backend, user_data); - private_output->caps.status = status; output_status.base.type = TDM_THREAD_CB_OUTPUT_STATUS; output_status.base.length = sizeof output_status; -- 2.7.4 From fab10fef52eb5ace3c8e2d9db498f92b6578b24d Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Thu, 8 Feb 2018 11:34:41 +0900 Subject: [PATCH 14/16] enhance log for distinguishment of output status cb thread Change-Id: Ib78ddd3d3f6c9e1203512e451bf29a171b80d37d Signed-off-by: Junkyeong Kim --- src/tdm_output.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tdm_output.c b/src/tdm_output.c index 67ec7e9..068cdcd 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -220,7 +220,7 @@ tdm_output_cb_status(tdm_output *output_backend, tdm_output_conn_status status, tdm_thread_cb_output_status output_status; tdm_error ret; - TDM_INFO("output(%d) %s", private_output->pipe, tdm_status_str(status)); + TDM_INFO("output(%d) sub %s", private_output->pipe, tdm_status_str(status)); _tdm_output_update(output_backend, user_data); @@ -242,7 +242,7 @@ tdm_output_cb_status(tdm_output *output_backend, tdm_output_conn_status status, return; } - TDM_INFO("output(%d) %s", private_output->pipe, tdm_status_str(status)); + TDM_INFO("output(%d) main %s", private_output->pipe, tdm_status_str(status)); if (!tdm_thread_is_running()) _tdm_output_update(output_backend, user_data); -- 2.7.4 From 18692b83856bce6d37967718f3258201bcd58220 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 12 Feb 2018 15:54:34 +0900 Subject: [PATCH 15/16] package version up to 1.13.0 Change-Id: I193a586223f9ca8c9a1dfd36257e146d08905eac --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 7fa85d4..226fcc0 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -2,7 +2,7 @@ %define UTEST_GCOV 0 Name: libtdm -Version: 1.12.0 +Version: 1.13.0 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From cfd12ac159e0bf0557aabfb7c62869b704f8e335 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 19 Feb 2018 11:36:37 +0900 Subject: [PATCH 16/16] tdm_hwc_window: do not check the null buffer Change-Id: Iffb2096ff4523d5416c01496a79c4d89413fb831 --- src/tdm_hwc_window.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/tdm_hwc_window.c b/src/tdm_hwc_window.c index 08fc80c..417fcd0 100644 --- a/src/tdm_hwc_window.c +++ b/src/tdm_hwc_window.c @@ -463,14 +463,6 @@ tdm_hwc_window_commit(tdm_hwc_window *hwc_window, tdm_hwc_window_commit_handler buffer = func_hwc_window->hwc_window_get_buffer(private_hwc_window->hwc_window_backend, &ret); - if (!buffer) { - /* LCOV_EXCL_START */ - _pthread_mutex_unlock(&private_display->lock); - TDM_ERR("no assigned buffer!!"); - return TDM_ERROR_INVALID_PARAMETER; - /* LCOV_EXCL_STOP */ - } - if (buffer) ret = tdm_layer_set_buffer_internal(private_layer, buffer); else -- 2.7.4