summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChangyeon Lee <cyeon.lee@samsung.com>2018-04-26 20:55:33 +0900
committerChangyeon Lee <cyeon.lee@samsung.com>2018-05-08 16:01:26 +0900
commitba9215ab3bc1829e9e3ff67e9df1c7d83b066b23 (patch)
treecf9098f6a406d9dfab6fb6b3a1195473513a8a1b
parenta8584002a969e6f47d1a3e0ad6ea574677389a56 (diff)
downloadlibtdm-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.c117
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;
}