diff options
author | Changyeon Lee <cyeon.lee@samsung.com> | 2018-04-26 20:55:33 +0900 |
---|---|---|
committer | Changyeon Lee <cyeon.lee@samsung.com> | 2018-05-08 16:01:26 +0900 |
commit | ba9215ab3bc1829e9e3ff67e9df1c7d83b066b23 (patch) | |
tree | cf9098f6a406d9dfab6fb6b3a1195473513a8a1b | |
parent | a8584002a969e6f47d1a3e0ad6ea574677389a56 (diff) | |
download | libtdm-exynos-ba9215ab3bc1829e9e3ff67e9df1c7d83b066b23.tar.gz libtdm-exynos-ba9215ab3bc1829e9e3ff67e9df1c7d83b066b23.tar.bz2 libtdm-exynos-ba9215ab3bc1829e9e3ff67e9df1c7d83b066b23.zip |
hwc: implement initial hwc_commit
Change-Id: Ib0cfac9a6b05eb9909bee401650ee1b20ac8d824
-rw-r--r-- | src/tdm_exynos_hwc.c | 117 |
1 files changed, 33 insertions, 84 deletions
diff --git a/src/tdm_exynos_hwc.c b/src/tdm_exynos_hwc.c index 953f6b6..01f47b8 100644 --- a/src/tdm_exynos_hwc.c +++ b/src/tdm_exynos_hwc.c @@ -58,11 +58,12 @@ _can_set_hwc_window_on_hw_layer(tdm_exynos_hwc_window_data *hwc_window_data) return 1; } -#if 0 tdm_exynos_layer_data * -_exynos_output_get_layer(tdm_exynos_output_data *output_data, int zpos) +_exynos_hwc_get_layer(tdm_exynos_hwc_data *hwc_data, int zpos) { + tdm_exynos_output_data *output_data = hwc_data->output_data; tdm_exynos_layer_data *l = NULL; + LIST_FOR_EACH_ENTRY(l, &output_data->layer_list, link) if (l->zpos == zpos) return l; @@ -111,10 +112,10 @@ _find_maped_hwc_window_to_layer(struct list_head *hwc_wnds, int layer_zpos) } static void -_update_layers_info(tdm_exynos_output_data *output_data) +_update_layers_info(tdm_exynos_hwc_data *hwc_data) { tdm_exynos_layer_data *layer = NULL; - tdm_exynos_hwc_data *hwc_data = output_data->hwc_data; + tdm_exynos_output_data *output_data = hwc_data->output_data; tdm_exynos_hwc_window_data *hwc_window_data; tdm_error ret; @@ -133,7 +134,7 @@ _update_layers_info(tdm_exynos_output_data *output_data) } static tdm_exynos_hwc_window_data * -_exynos_output_find_assigned_hwc_window(struct list_head *hwc_wnds, int layer_zpos) +_exynos_hwc_find_assigned_hwc_window(struct list_head *hwc_wnds, int layer_zpos) { tdm_exynos_hwc_window_data *hwc_window_data = NULL; @@ -150,23 +151,24 @@ _exynos_output_find_assigned_hwc_window(struct list_head *hwc_wnds, int layer_zp } static tdm_error -_exynos_output_hwc_prepare_commit(tdm_exynos_output_data *output_data) { +_exynos_hwc_prepare_commit(tdm_exynos_hwc_data *hwc_data) { tdm_exynos_layer_data *layer = NULL; tdm_exynos_hwc_window_data *hwc_window_data = NULL; + tdm_exynos_output_data *output_data = hwc_data->output_data; - _update_layers_info(output_data); + _update_layers_info(hwc_data); /* set target hwc window */ - if (output_data->need_target_window) { - layer = _exynos_output_get_layer(output_data, output_data->target_window_zpos); - _set_hwc_window_buffer_to_layer(layer, output_data->target_hwc_window); + if (hwc_data->need_target_window) { + layer = _exynos_hwc_get_layer(hwc_data, hwc_data->target_window_zpos); + _set_hwc_window_buffer_to_layer(layer, hwc_data->target_hwc_window); } LIST_FOR_EACH_ENTRY(layer, &output_data->layer_list, link) { - if (output_data->need_target_window && layer == output_data->primary_layer) + if (hwc_data->need_target_window && layer == output_data->primary_layer) continue; - hwc_window_data = _exynos_output_find_assigned_hwc_window(&output_data->hwc_window_list, layer->zpos); + hwc_window_data = _exynos_hwc_find_assigned_hwc_window(&hwc_data->hwc_window_list, layer->zpos); if (hwc_window_data) { _set_hwc_window_buffer_to_layer(layer, hwc_window_data); } else { @@ -178,7 +180,6 @@ _exynos_output_hwc_prepare_commit(tdm_exynos_output_data *output_data) { return TDM_ERROR_NONE; } -#endif static int _exynos_hwc_get_primary_layer_zpos(tdm_exynos_hwc_data *hwc_data) @@ -211,9 +212,15 @@ _exynos_hwc_adapt_policy(tdm_exynos_hwc_data *hwc_data , tdm_hwc_window **compos TDM_DBG("1. available_layers=%d, primary_layer_zpos=%d, num_visible_windows=%d", available_layers, _exynos_hwc_get_primary_layer_zpos(hwc_data), num_visible_windows); - /* initialize the zpos of the target_window */ - hwc_data->target_window_zpos = _exynos_hwc_get_primary_layer_zpos(hwc_data); - hwc_data->need_target_window = 0; + if (hwc_data->need_set_crtc) { + hwc_data->target_window_zpos = _exynos_hwc_get_primary_layer_zpos(hwc_data); + hwc_data->need_target_window = 1; + goto set_all_client_types; + } else { + /* initialize the zpos of the target_window */ + hwc_data->target_window_zpos = _exynos_hwc_get_primary_layer_zpos(hwc_data); + hwc_data->need_target_window = 0; + } /* need_target_window is true and return when there are no visible windows */ if (!num_visible_windows) { @@ -485,7 +492,7 @@ exynos_hwc_initailize_target_window(tdm_exynos_hwc_data *hwc_data, int width, in info.src_config.format = TBM_FORMAT_ARGB8888; target_hwc_window = _exynos_hwc_create_window(hwc_data, &info, &ret); - if (ret != TDM_ERROR_NONE) { + if (target_hwc_window == NULL) { TDM_ERR("create target hwc window failed (%d)", ret); return TDM_ERROR_OPERATION_FAILED; } @@ -597,12 +604,7 @@ exynos_hwc_validate(tdm_hwc *hwc, tdm_hwc_window **composited_wnds, uint32_t num RETURN_VAL_IF_FAIL(hwc_data != NULL, TDM_ERROR_INVALID_PARAMETER); RETURN_VAL_IF_FAIL(num_types != NULL, TDM_ERROR_INVALID_PARAMETER); - if (hwc_data->need_set_crtc) { - hwc_data->need_target_window = 1; - hwc_data->target_window_zpos = _exynos_hwc_get_primary_layer_zpos(hwc_data); - } else { - _exynos_hwc_adapt_policy(hwc_data, composited_wnds, num_wnds); - } + _exynos_hwc_adapt_policy(hwc_data, composited_wnds, num_wnds); TDM_DBG(" ==============Validate================================="); *num_types = _exynos_hwc_get_changed_number(hwc_data); @@ -672,73 +674,20 @@ exynos_hwc_accept_changes(tdm_hwc *hwc) tdm_error exynos_hwc_commit(tdm_hwc *hwc, int sync, void *user_data) { -// TODO: -#if 0 - tdm_exynos_output_data *output_data = output; - tdm_exynos_data *exynos_data; - tdm_exynos_layer_data *layer_data = NULL; + tdm_exynos_hwc_data *hwc_data = hwc; + tdm_exynos_output_data *output_data = NULL; tdm_error ret; - int do_waitvblank = 1; - - RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER); - exynos_data = output_data->exynos_data; - - if (output_data->hwc_enable) { - ret = _exynos_output_hwc_prepare_commit(output_data); - RETURN_VAL_IF_FAIL(ret == TDM_ERROR_NONE, ret); - } - - LIST_FOR_EACH_ENTRY(layer_data, &output_data->layer_list, link) { - if (layer_data == output_data->primary_layer) { - if (!layer_data->display_buffer || - (output_data->current_mode->hdisplay == layer_data->info.src_config.pos.w && - output_data->current_mode->vdisplay == layer_data->info.src_config.pos.h)) { - ret = _tdm_exynos_output_commit_primary_layer(layer_data, user_data, - &do_waitvblank); - output_data->need_set_crtc = 0; - } else - ret = _tdm_exynos_output_commit_layer(layer_data); - - if (ret != TDM_ERROR_NONE) - return ret; - } else { - ret = _tdm_exynos_output_commit_layer(layer_data); - if (ret != TDM_ERROR_NONE) - return ret; - } - } - - if (do_waitvblank == 1) { - tdm_exynos_event_data *event_data = calloc(1, sizeof(tdm_exynos_event_data)); - uint target_msc; - - if (!event_data) { - TDM_ERR("alloc failed"); - return TDM_ERROR_OUT_OF_MEMORY; - } + RETURN_VAL_IF_FAIL(hwc_data, TDM_ERROR_INVALID_PARAMETER); - ret = _tdm_exynos_output_get_cur_msc(exynos_data->drm_fd, output_data->pipe, - &target_msc); - if (ret != TDM_ERROR_NONE) { - free(event_data); - return ret; - } + output_data = hwc_data->output_data; - target_msc++; + ret = _exynos_hwc_prepare_commit(hwc_data); + RETURN_VAL_IF_FAIL(ret == TDM_ERROR_NONE, ret); - event_data->type = TDM_EXYNOS_EVENT_TYPE_COMMIT; - event_data->output_data = output_data; - event_data->user_data = user_data; + ret = exynos_output_commit(output_data, sync, user_data); + RETURN_VAL_IF_FAIL(ret == TDM_ERROR_NONE, ret); - ret = _tdm_exynos_output_wait_vblank(exynos_data->drm_fd, output_data->pipe, - &target_msc, event_data); - if (ret != TDM_ERROR_NONE) { - free(event_data); - return ret; - } - } -#endif return TDM_ERROR_NONE; } |