From d0becaf13bab13305d6c6a186ed630a4d7804c9e Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Wed, 25 Nov 2020 20:31:16 +0900 Subject: [PATCH] e_hwc_window: fix wrong transform of recover buffer if recover buffer is created by display buffer, recover buffer has the transform normal in case of window is rotated, recover buffer has wrong transform so we add trnasform to window buffer and set transform of display buffer to recover buffer. Change-Id: I50bf4a12abfe50ec0b89d227ba441a7d9d179aeb --- src/bin/e_hwc_window.c | 28 +++++++++++++++++++--------- src/bin/e_hwc_window.h | 3 ++- src/bin/e_hwc_windows.c | 15 ++++++++------- 3 files changed, 29 insertions(+), 17 deletions(-) diff --git a/src/bin/e_hwc_window.c b/src/bin/e_hwc_window.c index 565f559ba3..a485e70fec 100644 --- a/src/bin/e_hwc_window.c +++ b/src/bin/e_hwc_window.c @@ -273,7 +273,8 @@ _e_hwc_window_buffer_cb_queue_destroy(struct wl_listener *listener, void *data) EINTERN void e_hwc_window_buffer_set(E_Hwc_Window_Buffer *window_buffer, tbm_surface_h tsurface, - E_Hwc_Window_Queue *queue) + E_Hwc_Window_Queue *queue, + int transform) { EINA_SAFETY_ON_NULL_RETURN(window_buffer); @@ -299,6 +300,7 @@ e_hwc_window_buffer_set(E_Hwc_Window_Buffer *window_buffer, window_buffer->queue = queue; window_buffer->tsurface = tsurface; + window_buffer->transform = transform; } static void @@ -740,7 +742,7 @@ _e_hwc_window_commit_data_acquire_device(E_Hwc_Window *hwc_window) memcpy(&commit_data->info, &hwc_window->info, sizeof(tdm_hwc_window_info)); e_hwc_window_buffer_set(&commit_data->buffer, hwc_window->buffer.tsurface, - hwc_window->buffer.queue); + hwc_window->buffer.queue, hwc_window->buffer.transform); tbm_surface_internal_ref(commit_data->buffer.tsurface); @@ -1296,6 +1298,7 @@ e_hwc_window_buffer_fetch(E_Hwc_Window *hwc_window) tdm_error error = TDM_ERROR_NONE; E_Hwc_Window_Queue_Buffer *queue_buffer = NULL, *queue_buffer2 = NULL; E_Client *ec = NULL; + E_Comp_Wl_Buffer *comp_buffer = NULL; E_Hwc *hwc; EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE); @@ -1380,9 +1383,13 @@ e_hwc_window_buffer_fetch(E_Hwc_Window *hwc_window) /* exist tsurface for update hwc_window */ if (tsurface) - e_hwc_window_buffer_set(&hwc_window->buffer, tsurface, hwc_window->queue); + { + comp_buffer = _e_hwc_window_comp_wl_buffer_get(hwc_window); + e_hwc_window_buffer_set(&hwc_window->buffer, tsurface, hwc_window->queue, + comp_buffer ? comp_buffer->transform : 0); + } else - e_hwc_window_buffer_set(&hwc_window->buffer, NULL, NULL); + e_hwc_window_buffer_set(&hwc_window->buffer, NULL, NULL, 0); error = tdm_hwc_window_set_buffer(thwc_window, hwc_window->buffer.tsurface); EINA_SAFETY_ON_TRUE_RETURN_VAL(error != TDM_ERROR_NONE, EINA_FALSE); @@ -1465,7 +1472,7 @@ e_hwc_window_commit_data_acquire(E_Hwc_Window *hwc_window) 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, NULL, NULL); + e_hwc_window_buffer_set(&commit_data->buffer, NULL, NULL, 0); } EHWTRACE("COM data:%p ts:%p ------- {%25s}, state:%s, zpos:%d", @@ -1481,7 +1488,8 @@ e_hwc_window_commit_data_acquire(E_Hwc_Window *hwc_window) /* set latest commit_data */ memcpy(&hwc_window->commit.info, &commit_data->info, sizeof(tdm_hwc_window_info)); e_comp_wl_buffer_reference(&hwc_window->commit.buffer_ref, commit_data->buffer_ref.buffer); - e_hwc_window_buffer_set(&hwc_window->commit.buffer, commit_data->buffer.tsurface, commit_data->buffer.queue); + e_hwc_window_buffer_set(&hwc_window->commit.buffer, commit_data->buffer.tsurface, + commit_data->buffer.queue, commit_data->buffer.transform); hwc_window->commit_data_list = eina_list_append(hwc_window->commit_data_list, commit_data); @@ -1622,7 +1630,7 @@ e_hwc_window_commit_data_release(E_Hwc_Window *hwc_window, E_Hwc_Window_Commit_D } e_comp_wl_buffer_reference(&hwc_window->display.buffer_ref, NULL); - e_hwc_window_buffer_set(&hwc_window->display.buffer, NULL, NULL); + e_hwc_window_buffer_set(&hwc_window->display.buffer, NULL, NULL, 0); CLEAR(hwc_window->display.info); } @@ -1648,7 +1656,7 @@ e_hwc_window_commit_data_release(E_Hwc_Window *hwc_window, E_Hwc_Window_Commit_D e_comp_wl_buffer_reference(&hwc_window->display.buffer_ref, commit_data->buffer_ref.buffer); /* update hwc_window display info */ - e_hwc_window_buffer_set(&hwc_window->display.buffer, tsurface, queue); + e_hwc_window_buffer_set(&hwc_window->display.buffer, tsurface, queue, commit_data->buffer.transform); memcpy(&hwc_window->display.info, &commit_data->info, sizeof(tdm_hwc_window_info)); @@ -1656,7 +1664,7 @@ e_hwc_window_commit_data_release(E_Hwc_Window *hwc_window, E_Hwc_Window_Commit_D } e_comp_wl_buffer_reference(&commit_data->buffer_ref, NULL); - e_hwc_window_buffer_set(&commit_data->buffer, NULL, NULL); + e_hwc_window_buffer_set(&commit_data->buffer, NULL, NULL, 0); hwc_window->commit_data_list = eina_list_remove(hwc_window->commit_data_list, commit_data); free(commit_data); @@ -2122,6 +2130,8 @@ _e_hwc_window_client_recover(E_Hwc_Window *hwc_window, Eina_Bool *clear_attach) recover_buffer = e_comp_wl_tbm_buffer_get(tsurface); EINA_SAFETY_ON_NULL_RETURN_VAL(recover_buffer, EINA_FALSE); + + recover_buffer->transform = hwc_window->display.buffer.transform; new_buffer = EINA_TRUE; } else diff --git a/src/bin/e_hwc_window.h b/src/bin/e_hwc_window.h index fedd026f1b..bded392881 100644 --- a/src/bin/e_hwc_window.h +++ b/src/bin/e_hwc_window.h @@ -71,6 +71,7 @@ struct _E_Hwc_Window_Buffer E_Hwc_Window_Queue *queue; struct wl_listener queue_destroy_listener; Eina_Bool from_queue; + int transform; }; struct _E_Hwc_Window @@ -223,7 +224,7 @@ EINTERN const char* e_hwc_window_restriction_string_get(E_Hwc_Window EINTERN Eina_Bool e_hwc_window_constraints_update(E_Hwc_Window *hwc_window); EINTERN void e_hwc_window_constraints_reset(E_Hwc_Window *hwc_window); EINTERN Eina_Bool e_hwc_window_rendered_window_update(E_Hwc_Window *hwc_window); -EINTERN void e_hwc_window_buffer_set(E_Hwc_Window_Buffer *window_buffer, tbm_surface_h tsurface, E_Hwc_Window_Queue *queue); +EINTERN void e_hwc_window_buffer_set(E_Hwc_Window_Buffer *window_buffer, tbm_surface_h tsurface, E_Hwc_Window_Queue *queue, int transform); EINTERN const char *e_hwc_window_state_string_get(E_Hwc_Window_State hwc_window_state); EINTERN const char *e_hwc_window_name_get(E_Hwc_Window *hwc_window); EINTERN void e_hwc_window_name_set(E_Hwc_Window *hwc_window); diff --git a/src/bin/e_hwc_windows.c b/src/bin/e_hwc_windows.c index e41b904780..29b79f5e90 100644 --- a/src/bin/e_hwc_windows.c +++ b/src/bin/e_hwc_windows.c @@ -526,7 +526,8 @@ _e_hwc_windows_target_window_buffer_skip(E_Hwc *hwc) e_hwc_window_queue_buffer_release(hwc_window->buffer.queue, queue_buffer); } - e_hwc_window_buffer_set(&hwc_window->buffer, hwc_window->display.buffer.tsurface, hwc_window->display.buffer.queue); + e_hwc_window_buffer_set(&hwc_window->buffer, hwc_window->display.buffer.tsurface, + hwc_window->display.buffer.queue, hwc_window->display.buffer.transform); tdm_hwc_set_client_target_buffer(thwc, hwc_window->display.buffer.tsurface, fb_damage); _e_hwc_windows_target_window_force_render(target_hwc_window); @@ -606,7 +607,7 @@ _e_hwc_windows_target_buffer_fetch(E_Hwc *hwc) e_hwc_window_queue_buffer_release(hwc_window->buffer.queue, queue_buffer); } - e_hwc_window_buffer_set(&hwc_window->buffer, tsurface, queue); + e_hwc_window_buffer_set(&hwc_window->buffer, tsurface, queue, 0); e_hwc_window_info_update(hwc_window); /* the damage isn't supported by hwc extension yet */ @@ -670,7 +671,7 @@ _e_hwc_windows_target_buffer_fetch(E_Hwc *hwc) } } - e_hwc_window_buffer_set(&hwc_window->buffer, NULL, NULL); + e_hwc_window_buffer_set(&hwc_window->buffer, NULL, NULL, 0); e_hwc_window_info_update(hwc_window); CLEAR(fb_damage); @@ -1559,7 +1560,7 @@ done: hwc->tpp = NULL; } - e_hwc_window_buffer_set(&hwc->pp_buffer, NULL, NULL); + e_hwc_window_buffer_set(&hwc->pp_buffer, NULL, NULL, 0); } } @@ -2741,7 +2742,7 @@ _e_hwc_windows_pp_buffer_update(E_Hwc *hwc) queue_buffer = e_hwc_window_queue_buffer_acquire(hwc_window->queue); if (!queue_buffer) return EINA_FALSE; - e_hwc_window_buffer_set(&hwc->pp_buffer, queue_buffer->tsurface, hwc_window->queue); + e_hwc_window_buffer_set(&hwc->pp_buffer, queue_buffer->tsurface, hwc_window->queue, 0); } else { @@ -2749,7 +2750,7 @@ _e_hwc_windows_pp_buffer_update(E_Hwc *hwc) return EINA_FALSE; e_hwc_window_buffer_set(&hwc->pp_buffer, - hwc_window->buffer.tsurface, hwc_window->buffer.queue); + hwc_window->buffer.tsurface, hwc_window->buffer.queue, 0); if (!e_hwc_window_is_target(hwc_window)) e_comp_wl_buffer_reference(&hwc->pp_buffer_ref, _e_hwc_windows_comp_wl_buffer_get(hwc_window)); @@ -3493,7 +3494,7 @@ e_hwc_windows_zoom_unset(E_Hwc *hwc) hwc->tpp = NULL; } - e_hwc_window_buffer_set(&hwc->pp_buffer, NULL, NULL); + e_hwc_window_buffer_set(&hwc->pp_buffer, NULL, NULL, 0); } _e_hwc_windows_target_window_pp_queue_set(hwc->target_hwc_window, NULL); -- 2.34.1