e_hwc_windows: make e_hwc_windows_canvas_set
authorSooChan Lim <sc1.lim@samsung.com>
Mon, 9 Dec 2024 08:42:07 +0000 (17:42 +0900)
committerJunseok Kim <juns.kim@samsung.com>
Fri, 13 Dec 2024 05:15:52 +0000 (14:15 +0900)
Change-Id: I3e7eec9a9e9abbbadbd2c37ee93f745606f920fb

src/bin/compmgr/e_comp_canvas.c
src/bin/core/e_canvas.c
src/bin/core/e_canvas_intern.h
src/bin/displaymgr/e_hwc_window_intern.h
src/bin/displaymgr/e_hwc_windows.c
src/bin/displaymgr/e_hwc_windows_intern.h
tests/evas_wrapper_intern.h

index bcc8bc10c79b34ff99575b10f2ccbbfca21b624d..610b8916600f43783df297644df198c165a88452 100644 (file)
@@ -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);
index 1a0fcf1bdc738dc2b923604975a6874688817ba8..eb4f1b116e369f6263b06c00b963bc6e452b3ac4 100644 (file)
@@ -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)
 {
index 8e8d15a73a4cc1fdf346d0ca10a0b235640be3e7..e9c18e778ebafe1205ce76f450413f216fcff9c7 100644 (file)
@@ -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.
  */
index eec7c157356fb9d81f20abb60b8e92c3f3ee0a69..ced3a4e8f44224d31d3bee26dcf68efd63bab5a9 100644 (file)
@@ -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 {
index 7559a8c545497ca735873a8f5d53644d3f62f945..e4dcdbb8665fa2c11004f961d76aa6bc0c77aef1 100644 (file)
@@ -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 <Evas_Engine_GL_Tbm.h>
 # include <Evas_Engine_Software_Tbm.h>
@@ -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;
 }
index cdff181e6d8fcbb02e82169c36838e9616e3733f..ef26a66c35e544aeefc306250dece1aa3ce561f3 100644 (file)
@@ -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);
index 0b650b353a368530dff1e2bee0ca4f118b2dee27..3902f76f1acd812db1553b6c5b4e9f9ba74c1421 100755 (executable)
@@ -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;