From e2a12a8f6a0d9b09e31fb13296680c5f74c1bafe Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Sun, 11 Feb 2018 21:51:40 +0900 Subject: [PATCH] mode Change-Id: I42284f33efc8234f53cd8cfce3444ab5130d3fe7 --- src/tdm_hwc_window.c | 31 +++++++++++++++++++++---------- src/tdm_layer.c | 25 +++++++++++++++++-------- src/tdm_output.c | 43 ++++++++++++++++++++++++++++++++++++++++--- src/tdm_private.h | 6 ++++++ src/tdm_private_types.h | 2 ++ 5 files changed, 86 insertions(+), 21 deletions(-) diff --git a/src/tdm_hwc_window.c b/src/tdm_hwc_window.c index 342b9db..e541c19 100644 --- a/src/tdm_hwc_window.c +++ b/src/tdm_hwc_window.c @@ -389,8 +389,8 @@ 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, +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) { @@ -411,6 +411,7 @@ tdm_hwc_window_commit(tdm_hwc_window *hwc_window, tdm_hwc_window_commit_handler tdm_private_hwc_window_commit_handler *hwc_window_commit_handler; tdm_layer *layer = NULL; tdm_private_layer *private_layer; + tdm_info_layer *info_layer; HWC_WINDOW_FUNC_ENTRY(); @@ -436,17 +437,27 @@ tdm_hwc_window_commit(tdm_hwc_window *hwc_window, tdm_hwc_window_commit_handler /* LCOV_EXCL_STOP */ } - layer = func_hwc_window->hwc_window_get_layer(private_hwc_window->hwc_window_backend, - &ret); - if (!layer) { + private_layer = (tdm_private_layer*)layer; + + info_layer = (tdm_info_layer *)&private_window->info; + ret = tdm_layer_set_info_internal(private_layer, info_layer); + if (ret != TDM_ERROR_NONE) { /* LCOV_EXCL_START */ - _pthread_mutex_unlock(&private_display->lock); - TDM_ERR("no assigned layer!!"); - return TDM_ERROR_INVALID_PARAMETER; + TDM_ERR("failed: layer set info(window)"); /* LCOV_EXCL_STOP */ + return ret; + } + + if (private_window->buffer) + ret = tdm_layer_set_buffer_internal(private_layer, private_window->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; } - - private_layer = (tdm_private_layer*)layer; hwc_window_commit_handler = calloc(1, sizeof(tdm_private_hwc_window_commit_handler)); if (!hwc_window_commit_handler) { diff --git a/src/tdm_layer.c b/src/tdm_layer.c index 6787258..df09520 100644 --- a/src/tdm_layer.c +++ b/src/tdm_layer.c @@ -205,18 +205,12 @@ 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_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) @@ -248,6 +242,21 @@ tdm_layer_set_info(tdm_layer *layer, tdm_info_layer *info) private_layer->pending_info_changed = 1; private_layer->pending_info = *info; +} + +EXTERN tdm_error +tdm_layer_set_info(tdm_layer *layer, tdm_info_layer *info) +{ + 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); + + ret = tdm_layer_set_info_internal(private_layer, info); _pthread_mutex_unlock(&private_display->lock); diff --git a/src/tdm_output.c b/src/tdm_output.c index 1595cce..9beb5fe 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -1826,8 +1826,8 @@ tdm_output_hwc_set_client_target_buffer(tdm_output *output, tbm_surface_h target return ret; } -static -void _tdm_output_hwc_layer_commit_handler(tdm_layer *layer, unsigned int sequence, +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) { @@ -1848,7 +1848,9 @@ tdm_output_hwc_commit_target_buffer(tdm_output *output, tdm_output_hwc_target_bu tdm_private_output_hwc_target_buffer_commit_handler *output_hwc_target_buffer_commit_handler; tdm_layer *layer = NULL; tdm_private_layer *private_layer; - + tdm_info_layer layer_info; + const tdm_output_mode *mode; + OUTPUT_FUNC_ENTRY(); _pthread_mutex_lock(&private_display->lock); @@ -1880,6 +1882,41 @@ tdm_output_hwc_commit_target_buffer(tdm_output *output, tdm_output_hwc_target_bu } private_layer = (tdm_private_layer*)layer; + + /* set layer_info only one time */ + if (&private_output->target_buffer_info == NULL) { + mode = private_output->current_mode + info_layer.src_config.size.h = mode->hdisplay; + info_layer.src_config.size.v = mode->vdisplay; + info_layer.src_config.pos.x = 0; + info_layer.src_config.pos.y = 0; + info_layer.src_config.pos.w = mode->hdisplay; + info_layer.src_config.pos.h = mode->vdisplay; + info_layer.dst_pos.x = 0; + info_layer.dst_pos.y = 0; + info_layer.dst_pos.w = mode->hdisplay; + info_layer.dst_pos.h = mode->vdisplay; + info_layer.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; + } + + if (private_window->buffer) + ret = tdm_layer_set_buffer_internal(private_layer, private_window->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; + } output_hwc_target_buffer_commit_handler = calloc(1, sizeof(tdm_private_output_hwc_target_buffer_commit_handler)); if (!output_hwc_target_buffer_commit_handler) { diff --git a/src/tdm_private.h b/src/tdm_private.h index eea36d4..57f97b2 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -141,6 +141,12 @@ 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); +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, diff --git a/src/tdm_private_types.h b/src/tdm_private_types.h index 7a1829d..4075b1e 100644 --- a/src/tdm_private_types.h +++ b/src/tdm_private_types.h @@ -206,6 +206,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; -- 2.7.4