From 156d0c7a81e7df0cc4b2b70a004ab4fd8fbf2dd7 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Fri, 22 Mar 2019 17:01:14 +0900 Subject: [PATCH] e_hwc_window: add e_hwc_window_pp_commit_data_acquire API for pp zoom e_hwc_window_buffer_fetch: do not execute tdm set. tdm set execute after pp done. e_hwc_window_pp_commit_data_acquire: if pp_hwc_mode set, it means there is only 1 visible hwc_window. in this case do not execute compositor, get commit data from this client type hwc_window. Change-Id: Icfdc0629a71c166614ddb9d05dda29ea96fe277e Signed-off-by: Junkyeong Kim --- src/bin/e_hwc_window.c | 106 ++++++++++++++++++++++++++++++++++++++++-------- src/bin/e_hwc_window.h | 3 +- src/bin/e_hwc_windows.c | 2 +- 3 files changed, 92 insertions(+), 19 deletions(-) diff --git a/src/bin/e_hwc_window.c b/src/bin/e_hwc_window.c index 9839d5f..b363ff2 100644 --- a/src/bin/e_hwc_window.c +++ b/src/bin/e_hwc_window.c @@ -573,6 +573,30 @@ done: E_FREE(hwc_window); } +static E_Hwc_Window_Commit_Data * +_e_hwc_window_commit_data_acquire_device(E_Hwc_Window *hwc_window) +{ + E_Hwc_Window_Commit_Data *commit_data = NULL; + EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, NULL); + + commit_data = E_NEW(E_Hwc_Window_Commit_Data, 1); + EINA_SAFETY_ON_NULL_RETURN_VAL(commit_data, NULL); + + _e_hwc_window_buffer_set(&commit_data->buffer, hwc_window->buffer.tsurface, + hwc_window->buffer.queue); + + tbm_surface_internal_ref(commit_data->buffer.tsurface); + + _e_hwc_window_update_fps(hwc_window); + + if (!e_hwc_window_is_target(hwc_window) && + !e_hwc_window_is_video(hwc_window)) + e_comp_wl_buffer_reference(&commit_data->buffer_ref, + _e_hwc_window_comp_wl_buffer_get(hwc_window)); + + return commit_data; +} + EINTERN Eina_Bool e_hwc_window_init(E_Hwc *hwc) { @@ -896,7 +920,7 @@ e_hwc_window_info_update(E_Hwc_Window *hwc_window) } EINTERN Eina_Bool -e_hwc_window_buffer_fetch(E_Hwc_Window *hwc_window) +e_hwc_window_buffer_fetch(E_Hwc_Window *hwc_window, Eina_Bool tdm_set) { tbm_surface_h tsurface = NULL; tdm_hwc_window *thwc_window = NULL; @@ -987,7 +1011,8 @@ e_hwc_window_buffer_fetch(E_Hwc_Window *hwc_window) else _e_hwc_window_buffer_set(&hwc_window->buffer, NULL, NULL); - error = tdm_hwc_window_set_buffer(thwc_window, hwc_window->buffer.tsurface); + if (tdm_set) + error = tdm_hwc_window_set_buffer(thwc_window, hwc_window->buffer.tsurface); EINA_SAFETY_ON_TRUE_RETURN_VAL(error != TDM_ERROR_NONE, EINA_FALSE); return EINA_TRUE; @@ -1033,20 +1058,8 @@ e_hwc_window_commit_data_acquire(E_Hwc_Window *hwc_window) (!memcmp(&hwc_window->info, &hwc_window->display.info, sizeof(tdm_hwc_window_info)))) return EINA_FALSE; - commit_data = E_NEW(E_Hwc_Window_Commit_Data, 1); + commit_data = _e_hwc_window_commit_data_acquire_device(hwc_window); EINA_SAFETY_ON_NULL_RETURN_VAL(commit_data, EINA_FALSE); - - _e_hwc_window_buffer_set(&commit_data->buffer, hwc_window->buffer.tsurface, - hwc_window->buffer.queue); - - tbm_surface_internal_ref(commit_data->buffer.tsurface); - - _e_hwc_window_update_fps(hwc_window); - - if (!e_hwc_window_is_target(hwc_window) && - !e_hwc_window_is_video(hwc_window)) - e_comp_wl_buffer_reference(&commit_data->buffer_ref, - _e_hwc_window_comp_wl_buffer_get(hwc_window)); } else { @@ -1567,7 +1580,7 @@ _e_hwc_window_client_recover(E_Hwc_Window *hwc_window) /* force update */ e_comp_wl_surface_attach(ec, recover_buffer); - e_hwc_window_buffer_fetch(hwc_window); + e_hwc_window_buffer_fetch(hwc_window, EINA_TRUE); } static Eina_Bool @@ -1940,4 +1953,63 @@ e_hwc_window_pp_rendered_window_update(E_Hwc_Window *hwc_window) e_pointer_hwc_set(pointer, EINA_TRUE); return EINA_TRUE; -} \ No newline at end of file +} + +EINTERN Eina_Bool +e_hwc_window_pp_commit_data_acquire(E_Hwc_Window *hwc_window, Eina_Bool pp_hwc_mode) +{ + E_Hwc_Window_Commit_Data *commit_data = NULL; + + /* if pp_hwc_mode, there is only 1 client state window */ + if (pp_hwc_mode) + { + if (!hwc_window->buffer.tsurface) return EINA_FALSE; + if ((hwc_window->buffer.tsurface == hwc_window->display.buffer.tsurface) && + (!memcmp(&hwc_window->info, &hwc_window->display.info, sizeof(tdm_hwc_window_info)))) + return EINA_FALSE; + if (hwc_window->state != E_HWC_WINDOW_STATE_CLIENT) + { + if (hwc_window->state != E_HWC_WINDOW_STATE_VIDEO) + return EINA_FALSE; + } + + commit_data = _e_hwc_window_commit_data_acquire_device(hwc_window); + EINA_SAFETY_ON_NULL_RETURN_VAL(commit_data, EINA_FALSE); + } + else + { + if (hwc_window->accepted_state == E_HWC_WINDOW_STATE_DEVICE ||/* composited buffer */ + hwc_window->accepted_state == E_HWC_WINDOW_STATE_VIDEO) + { + if (!hwc_window->buffer.tsurface) return EINA_FALSE; + if ((hwc_window->buffer.tsurface == hwc_window->display.buffer.tsurface) && + (!memcmp(&hwc_window->info, &hwc_window->display.info, sizeof(tdm_hwc_window_info)))) + return EINA_FALSE; + + commit_data = _e_hwc_window_commit_data_acquire_device(hwc_window); + EINA_SAFETY_ON_NULL_RETURN_VAL(commit_data, EINA_FALSE); + } + else + { + if (!hwc_window->display.buffer.tsurface) return EINA_FALSE; + + commit_data = E_NEW(E_Hwc_Window_Commit_Data, 1); + EINA_SAFETY_ON_NULL_RETURN_VAL(commit_data, EINA_FALSE); + + _e_hwc_window_buffer_set(&commit_data->buffer, NULL, NULL); + } + } + + EHWTRACE("COM ts:%10p ------- {%25s}, state:%s, zpos:%d, deleted:%s", + hwc_window->ec, hwc_window, + commit_data->buffer.tsurface, + e_hwc_window_name_get(hwc_window), + e_hwc_window_state_string_get(hwc_window->state), + hwc_window->zpos, (hwc_window->is_deleted ? "yes" : "no")); + + e_object_ref(E_OBJECT(hwc_window)); + + hwc_window->commit_data = commit_data; + + return EINA_TRUE; +} diff --git a/src/bin/e_hwc_window.h b/src/bin/e_hwc_window.h index 196da8b..489afaf 100644 --- a/src/bin/e_hwc_window.h +++ b/src/bin/e_hwc_window.h @@ -170,7 +170,7 @@ EINTERN Eina_Bool e_hwc_window_zpos_set(E_Hwc_Window *hwc_window, EINTERN int e_hwc_window_zpos_get(E_Hwc_Window *hwc_window); EINTERN Eina_Bool e_hwc_window_composition_update(E_Hwc_Window *hwc_window); EINTERN Eina_Bool e_hwc_window_info_update(E_Hwc_Window *hwc_window); -EINTERN Eina_Bool e_hwc_window_buffer_fetch(E_Hwc_Window *hwc_window); +EINTERN Eina_Bool e_hwc_window_buffer_fetch(E_Hwc_Window *hwc_window, Eina_Bool tdm_set); EINTERN Eina_Bool e_hwc_window_prop_update(E_Hwc_Window *hwc_window); EINTERN Eina_Bool e_hwc_window_is_target(E_Hwc_Window *hwc_window); EINTERN Eina_Bool e_hwc_window_is_video(E_Hwc_Window *hwc_window); @@ -211,6 +211,7 @@ EINTERN void e_hwc_window_commit_data_buffer_dump(E_Hwc_Windo EINTERN Eina_Bool e_hwc_window_fps_get(E_Hwc_Window *hwc_window, double *fps); EINTERN Eina_Bool e_hwc_window_pp_rendered_window_update(E_Hwc_Window *hwc_window); +EINTERN Eina_Bool e_hwc_window_pp_commit_data_acquire(E_Hwc_Window *hwc_window, Eina_Bool pp_hwc_mode); #endif // E_HWC_WINDOW_H #endif diff --git a/src/bin/e_hwc_windows.c b/src/bin/e_hwc_windows.c index 8ec7bfc..3182fcb 100644 --- a/src/bin/e_hwc_windows.c +++ b/src/bin/e_hwc_windows.c @@ -1925,7 +1925,7 @@ _e_hwc_windows_changes_update(E_Hwc *hwc) if (e_hwc_window_is_target(hwc_window)) continue; /* fetch the window buffer */ - if (e_hwc_window_buffer_fetch(hwc_window)) + if (e_hwc_window_buffer_fetch(hwc_window, EINA_TRUE)) update_changes = EINA_TRUE; else { -- 2.7.4