From: SooChan Lim Date: Mon, 9 Dec 2024 08:42:07 +0000 (+0900) Subject: e_hwc_windows: make e_hwc_windows_canvas_set X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=595381877671fa28ac1a4b381b2d3e58e2972f54;p=platform%2Fupstream%2Fenlightenment.git e_hwc_windows: make e_hwc_windows_canvas_set Change-Id: I3e7eec9a9e9abbbadbd2c37ee93f745606f920fb --- diff --git a/src/bin/compmgr/e_comp_canvas.c b/src/bin/compmgr/e_comp_canvas.c index bcc8bc10c7..610b891660 100644 --- a/src/bin/compmgr/e_comp_canvas.c +++ b/src/bin/compmgr/e_comp_canvas.c @@ -251,6 +251,12 @@ _e_hwc_ecore_evas_init(E_Comp_Screen *e_comp_screen, int w, int y) return EINA_FALSE; } + ecore_evas_name_class_set(ee, "E", "Comp_EE"); + + // has to be set manual_render + ecore_evas_manual_render_set(ee, 1); + ecore_evas_show(ee); + return ee; } @@ -298,16 +304,23 @@ e_comp_canvas_init(E_Comp_Screen *e_comp_screen) screen_rotation, w, h); } - if (!e_hwc_windows_ecore_evas_set(primary_output->hwc, ee)) + comp->canvas = e_canvas_create(comp->evas); + EINA_SAFETY_ON_NULL_RETURN_VAL(comp->canvas, EINA_FALSE); + comp->w = w; + comp->h = h; + + // assign ee to the canvas + e_canvas_ecore_evas_set(comp->canvas, ee); + + if (!e_hwc_windows_canvas_set(primary_output->hwc, comp->canvas)) { - ERR("fail to e_hwc_windows_ecore_evas_set"); + ERR("fail to e_hwc_windows_canvas_set"); + e_canvas_destroy(comp->canvas); _e_hwc_ecore_evas_deinit(ee); return EINA_FALSE; } - comp->canvas = e_canvas_create(comp->evas); - comp->w = w; - comp->h = h; + e_canvas_render(comp->canvas); color[0] = e_config->comp_canvas_bg.r; color[1] = e_config->comp_canvas_bg.g; @@ -328,9 +341,6 @@ e_comp_canvas_init(E_Comp_Screen *e_comp_screen) e_view_name_set(view, "comp->bg_blank_view"); e_view_show(view); - ecore_evas_name_class_set(comp->ee, "E", "Comp_EE"); - ecore_evas_show(comp->ee); - evas_event_callback_add(comp->evas, EVAS_CALLBACK_RENDER_POST, _e_comp_canvas_render_post, NULL); comp->ee_win = ecore_evas_window_get(comp->ee); diff --git a/src/bin/core/e_canvas.c b/src/bin/core/e_canvas.c index 1a0fcf1bdc..eb4f1b116e 100644 --- a/src/bin/core/e_canvas.c +++ b/src/bin/core/e_canvas.c @@ -60,6 +60,33 @@ e_canvas_destroy(E_Canvas *canvas) free(canvas); } +EINTERN void +e_canvas_ecore_evas_set(E_Canvas *canvas, Ecore_Evas *ee) +{ + canvas->ee = ee; +} + +EINTERN void +e_canvas_damage_add(E_Canvas *canvas) +{ + int w, h; + + ecore_evas_geometry_get(canvas->ee, 0, 0, &w, &h); + evas_damage_rectangle_add(canvas->evas, 0, 0, w, h); +} + +EINTERN void +e_canvas_render(E_Canvas *canvas) +{ + ecore_evas_manual_render(canvas->ee); +} + +EINTERN void +e_canvas_norender(E_Canvas *canvas) +{ + evas_norender(canvas->evas); +} + EINTERN void e_canvas_destroy_listener_add(E_Canvas *canvas, struct wl_listener *listener) { diff --git a/src/bin/core/e_canvas_intern.h b/src/bin/core/e_canvas_intern.h index 8e8d15a73a..e9c18e778e 100644 --- a/src/bin/core/e_canvas_intern.h +++ b/src/bin/core/e_canvas_intern.h @@ -22,6 +22,7 @@ struct _E_Canvas E_View_Tree tree; E_Canvas_Layer_Tree layers[E_CANVAS_LAYER_MAX + 1]; + Ecore_Evas *ee; Evas *evas; struct @@ -44,13 +45,36 @@ E_Canvas *e_canvas_create(Evas *evas); */ void e_canvas_destroy(E_Canvas *canvas); +/** + * Set Ecore_Evas + */ +void e_canvas_ecore_evas_set(E_Canvas *canvas, Ecore_Evas *ee); + /** * Get Evas */ Evas *e_canvas_evas_get(E_Canvas *canvas); +/** + * Get Canvas + */ E_Canvas *e_canvas_get(E_View *view); +/** + * Add damage + */ +void e_canvas_damage_add(E_Canvas *canvas); + +/** + * Render + */ +void e_canvas_render(E_Canvas *canvas); + +/** + * No Render + */ +void e_canvas_norender(E_Canvas *canvas); + /** * Register a listener for the destroy of canvas. */ diff --git a/src/bin/displaymgr/e_hwc_window_intern.h b/src/bin/displaymgr/e_hwc_window_intern.h index eec7c15735..ced3a4e8f4 100644 --- a/src/bin/displaymgr/e_hwc_window_intern.h +++ b/src/bin/displaymgr/e_hwc_window_intern.h @@ -196,8 +196,7 @@ struct _E_Hwc_Window_Target E_Hwc_Window hwc_window; /* don't move this field */ E_Hwc *hwc; - Ecore_Evas *ee; - Evas *evas; + E_Canvas *canvas; int event_fd; Ecore_Fd_Handler *event_hdlr; @@ -214,6 +213,10 @@ struct _E_Hwc_Window_Target Eina_List *present_sync_windows; Eina_List *pending_presentation_cb_wins; + + struct wl_listener canvas_render_pre_listener; + struct wl_listener canvas_render_post_listener; + struct wl_listener canvas_render_flush_pre_listener; }; struct _E_Hwc_Window_Commit_Data { diff --git a/src/bin/displaymgr/e_hwc_windows.c b/src/bin/displaymgr/e_hwc_windows.c index 7559a8c545..e4dcdbb866 100644 --- a/src/bin/displaymgr/e_hwc_windows.c +++ b/src/bin/displaymgr/e_hwc_windows.c @@ -19,6 +19,7 @@ #include "e_display_intern.h" #include "e_view_intern.h" #include "e_view_client_intern.h" +#include "e_canvas_intern.h" # include # include @@ -615,7 +616,6 @@ e_hwc_windows_target_window_force_render(E_Hwc_Window_Target *target_hwc_window) { E_Hwc_Window_Target *root_target_hwc_window; E_Hwc *hwc; - int w, h; hwc = target_hwc_window->hwc; EINA_SAFETY_ON_NULL_RETURN(hwc); @@ -623,11 +623,9 @@ e_hwc_windows_target_window_force_render(E_Hwc_Window_Target *target_hwc_window) root_target_hwc_window = _e_hwc_windows_root_target_hwc_window_get(hwc); EINA_SAFETY_ON_NULL_RETURN(root_target_hwc_window); - if (!root_target_hwc_window->ee) return; - if (!root_target_hwc_window->evas) return; + if (!root_target_hwc_window->canvas) return; - ecore_evas_geometry_get(root_target_hwc_window->ee, 0, 0, &w, &h); - evas_damage_rectangle_add(root_target_hwc_window->evas, 0, 0, w, h); + e_canvas_damage_add(root_target_hwc_window->canvas); } static void @@ -1396,7 +1394,7 @@ _e_hwc_windows_presentation_callback_comp_take_over(E_Hwc_Window_Target *root_ta } static void -_e_hwc_windows_target_window_render_pre_cb(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED) +_e_hwc_windows_canvas_cb_render_pre(struct wl_listener *listener, void *data) { E_Hwc_Window_Target *target_hwc_window = (E_Hwc_Window_Target *)data; E_Hwc_Window *hwc_window, *target_window; @@ -1408,6 +1406,8 @@ _e_hwc_windows_target_window_render_pre_cb(void *data, Evas *e EINA_UNUSED, void tbm_surface_h tsurface; tbm_surface_queue_error_e tsq_err; + target_hwc_window = wl_container_of(listener, target_hwc_window, canvas_render_pre_listener); + hwc = target_hwc_window->hwc; if (!e_hwc_windows_fence_enabled_get(hwc)) return; @@ -1449,29 +1449,9 @@ _e_hwc_windows_target_window_render_pre_cb(void *data, Evas *e EINA_UNUSED, void } static void -_e_hwc_windows_target_window_render_flush_pre_cb(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED) -{ - E_Hwc_Window_Target *target_hwc_window = (E_Hwc_Window_Target *)data; - E_Hwc *hwc; - - hwc = target_hwc_window->hwc; - if (!e_hwc_windows_fence_enabled_get(hwc)) return; - - if (target_hwc_window->end_render_sync) - { - e_egl_sync_destroy(target_hwc_window->end_render_sync); - target_hwc_window->end_render_sync = NULL; - } - - target_hwc_window->end_render_sync = e_egl_sync_fence_create(); - if (!target_hwc_window->end_render_sync) - EHWSERR("Failed to create E_Egl_Sync", hwc); -} - -static void -_e_hwc_windows_target_window_render_flush_post_cb(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED) +_e_hwc_windows_canvas_cb_render_post(struct wl_listener *listener, void *data) { - E_Hwc_Window_Target *target_hwc_window = (E_Hwc_Window_Target *)data; + E_Hwc_Window_Target *target_hwc_window; E_Hwc_Window *hwc_window; E_Comp_Wl_Buffer_Ref *buffer_ref; E_Comp_Wl_Buffer *buffer; @@ -1483,6 +1463,8 @@ _e_hwc_windows_target_window_render_flush_post_cb(void *data, Evas *e EINA_UNUSE E_Client *ec; E_Comp_Wl_Client_Data *cdata; + target_hwc_window = wl_container_of(listener, target_hwc_window, canvas_render_post_listener); + EHWSTRACE("{%s} gets render_flush_post noti", NULL, target_hwc_window->hwc, e_hwc_window_name_get((E_Hwc_Window *)target_hwc_window)); if (!target_hwc_window->dequeued_tsurface) @@ -1605,25 +1587,39 @@ _e_hwc_windows_target_window_render_flush_post_cb(void *data, Evas *e EINA_UNUSE target_hwc_window->dequeued_tsurface = NULL; } +static void +_e_hwc_windows_canvas_cb_flush_pre(struct wl_listener *listener, void *data) +{ + E_Hwc_Window_Target *target_hwc_window; + E_Hwc *hwc; + + target_hwc_window = wl_container_of(listener, target_hwc_window, canvas_render_flush_pre_listener); + + hwc = target_hwc_window->hwc; + if (!e_hwc_windows_fence_enabled_get(hwc)) return; + + if (target_hwc_window->end_render_sync) + { + e_egl_sync_destroy(target_hwc_window->end_render_sync); + target_hwc_window->end_render_sync = NULL; + } + + target_hwc_window->end_render_sync = e_egl_sync_fence_create(); + if (!target_hwc_window->end_render_sync) + EHWSERR("Failed to create E_Egl_Sync", hwc); +} + static void _e_hwc_windows_target_window_free(E_Hwc_Window_Target *target_hwc_window) { E_Hwc_Window *hwc_window = (E_Hwc_Window *)target_hwc_window; E_Hwc_Window *present_sync_window, *presentation_cb_window; - if (target_hwc_window->evas) + if (target_hwc_window->canvas) { - evas_event_callback_del(target_hwc_window->evas, - EVAS_CALLBACK_RENDER_FLUSH_POST, - _e_hwc_windows_target_window_render_flush_post_cb); - - evas_event_callback_del(target_hwc_window->evas, - EVAS_CALLBACK_RENDER_FLUSH_PRE, - _e_hwc_windows_target_window_render_flush_pre_cb); - - evas_event_callback_del(target_hwc_window->evas, - EVAS_CALLBACK_RENDER_PRE, - _e_hwc_windows_target_window_render_pre_cb); + wl_list_remove(&target_hwc_window->canvas_render_flush_pre_listener.link); + wl_list_remove(&target_hwc_window->canvas_render_post_listener.link); + wl_list_remove(&target_hwc_window->canvas_render_pre_listener.link); } if (target_hwc_window->event_hdlr) @@ -2853,7 +2849,7 @@ e_hwc_windows_render(E_Hwc *hwc) and it is also needed for processing input event of evas because input event is sent in manual_render */ if (!hwc->wait_commit) - evas_norender(target_hwc_window->evas); + e_canvas_norender(target_hwc_window->canvas); return EINA_TRUE; } @@ -2868,7 +2864,7 @@ e_hwc_windows_render(E_Hwc *hwc) { TRACE_DS_BEGIN(MANUAL RENDER); target_hwc_window->is_rendering = EINA_TRUE; - ecore_evas_manual_render(target_hwc_window->ee); + e_canvas_render(target_hwc_window->canvas); if (e_comp_gl_get()) { egl_error = eglGetError(); @@ -3233,63 +3229,36 @@ fail: } EINTERN Eina_Bool -e_hwc_windows_ecore_evas_set(E_Hwc *hwc, Ecore_Evas *ee) +e_hwc_windows_canvas_set(E_Hwc *hwc, E_Canvas *canvas) { E_Hwc_Window_Target *target_hwc_window; - Evas *evas; - const char *name; EINA_SAFETY_ON_NULL_RETURN_VAL(hwc, EINA_FALSE); target_hwc_window = hwc->root_target_hwc_window; EINA_SAFETY_ON_NULL_RETURN_VAL(target_hwc_window, EINA_FALSE); - name = ecore_evas_engine_name_get(ee); - EINA_SAFETY_ON_NULL_RETURN_VAL(name, EINA_FALSE); - - evas = ecore_evas_get(ee); - EINA_SAFETY_ON_NULL_RETURN_VAL(evas, EINA_FALSE); - if (!_e_hwc_windows_target_window_queue_set(target_hwc_window)) { EHWSERR("fail to _e_hwc_windows_target_window_queue_set", NULL); return EINA_FALSE; } - if(!strcmp("gl_drm_tbm", name) || - !strcmp("drm_tbm", name) || - !strcmp("gl_tbm", name) || - !strcmp("software_tbm", name) || - !strcmp("gl_tbm_ES", name)) - { - ecore_evas_manual_render_set(ee, 1); - ecore_evas_show(ee); - } - - target_hwc_window->ee = ee; - target_hwc_window->evas = evas; + target_hwc_window->canvas = canvas; target_hwc_window->event_fd = eventfd(0, EFD_NONBLOCK); target_hwc_window->event_hdlr = ecore_main_fd_handler_add(target_hwc_window->event_fd, ECORE_FD_READ, _e_hwc_windows_target_window_render_finished_cb, (void *)target_hwc_window, NULL, NULL); - evas_event_callback_add(evas, - EVAS_CALLBACK_RENDER_FLUSH_POST, - _e_hwc_windows_target_window_render_flush_post_cb, - target_hwc_window); - - evas_event_callback_add(evas, - EVAS_CALLBACK_RENDER_FLUSH_PRE, - _e_hwc_windows_target_window_render_flush_pre_cb, - target_hwc_window); + target_hwc_window->canvas_render_pre_listener.notify = _e_hwc_windows_canvas_cb_render_pre; + e_canvas_render_pre_listener_add(canvas, &target_hwc_window->canvas_render_pre_listener); - evas_event_callback_add(evas, - EVAS_CALLBACK_RENDER_PRE, - _e_hwc_windows_target_window_render_pre_cb, - target_hwc_window); + target_hwc_window->canvas_render_post_listener.notify = _e_hwc_windows_canvas_cb_render_post; + e_canvas_render_post_listener_add(canvas, &target_hwc_window->canvas_render_post_listener); - ecore_evas_manual_render(target_hwc_window->ee); + target_hwc_window->canvas_render_flush_pre_listener.notify = _e_hwc_windows_canvas_cb_flush_pre; + e_canvas_render_flush_pre_listener_add(canvas, &target_hwc_window->canvas_render_flush_pre_listener); return EINA_TRUE; } diff --git a/src/bin/displaymgr/e_hwc_windows_intern.h b/src/bin/displaymgr/e_hwc_windows_intern.h index cdff181e6d..ef26a66c35 100644 --- a/src/bin/displaymgr/e_hwc_windows_intern.h +++ b/src/bin/displaymgr/e_hwc_windows_intern.h @@ -49,7 +49,7 @@ EINTERN Eina_Bool e_hwc_windows_init(void); EINTERN void e_hwc_windows_deinit(void); EINTERN Eina_Bool e_hwc_windows_render(E_Hwc *hwc); EINTERN Eina_Bool e_hwc_windows_commit(E_Hwc *hwc, E_Output_Display_Mode display_mode); -EINTERN Eina_Bool e_hwc_windows_ecore_evas_set(E_Hwc *hwc, Ecore_Evas *ee); +EINTERN Eina_Bool e_hwc_windows_canvas_set(E_Hwc *hwc, E_Canvas *canvas); EINTERN void e_hwc_windows_rendered_window_add(E_Hwc_Window *hwc_window); EINTERN Eina_Bool e_hwc_windows_get_available_properties(E_Hwc *hwc, const tdm_prop **props, int *count); EINTERN Eina_Bool e_hwc_windows_get_video_available_properties(E_Hwc *hwc, const tdm_prop **props, int *count); diff --git a/tests/evas_wrapper_intern.h b/tests/evas_wrapper_intern.h index 0b650b353a..3902f76f1a 100755 --- a/tests/evas_wrapper_intern.h +++ b/tests/evas_wrapper_intern.h @@ -18,6 +18,7 @@ extern "C" { #define DATA32 unsigned int #endif +typedef int Ecore_Evas; typedef int Evas; typedef int Evas_Object; typedef int Evas_Map;