add e_comp_wl_renderer for supporting tizen_renderer protocol 48/238548/1
authorChangyeon Lee <cyeon.lee@samsung.com>
Thu, 9 Jul 2020 05:41:59 +0000 (14:41 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Wed, 15 Jul 2020 02:20:45 +0000 (11:20 +0900)
Change-Id: I8e978ec3100a1933867507b19061ce279e9a4c52

src/bin/Makefile.mk
src/bin/e_comp_wl.c
src/bin/e_comp_wl_renderer.c [new file with mode: 0644]
src/bin/e_comp_wl_renderer.h [new file with mode: 0644]
src/bin/e_includes.h

index 5c7e09c..94533e9 100644 (file)
@@ -107,6 +107,7 @@ src/bin/e_comp_wl_tbm.h
 endif
 
 ENLIGHTENMENTHEADERS += \
+src/bin/e_comp_wl_renderer.h \
 src/bin/e_comp_wl_tizen_hwc.h \
 src/bin/e_presentation_time.h \
 src/bin/e_comp_wl_rsm.h \
@@ -232,6 +233,7 @@ src/bin/e_comp_wl_tbm.c
 endif
 
 enlightenment_src += \
+src/bin/e_comp_wl_renderer.c \
 src/bin/e_comp_wl_tizen_hwc.c \
 src/bin/e_presentation_time.c \
 src/bin/e_comp_wl_rsm.c \
index 41c0a7e..d271929 100644 (file)
@@ -4194,6 +4194,7 @@ e_comp_wl_init(void)
    e_comp_wl_video_init();
    e_comp_wl_viewport_init();
    e_comp_wl_capture_init();
+   e_comp_wl_renderer_init();
    _e_comp_wl_move_resize_init();
    e_presentation_time_init();
 
@@ -4250,6 +4251,7 @@ e_comp_wl_shutdown(void)
    _e_comp_wl_gl_shutdown();
 
    e_presentation_time_shutdown();
+   e_comp_wl_renderer_shutdown();
    e_comp_wl_capture_shutdown();
    e_comp_wl_viewport_shutdown();
    e_comp_wl_video_shutdown();
diff --git a/src/bin/e_comp_wl_renderer.c b/src/bin/e_comp_wl_renderer.c
new file mode 100644 (file)
index 0000000..ed6dbd2
--- /dev/null
@@ -0,0 +1,206 @@
+#include "e.h"
+#include <tizen-extension-server-protocol.h>
+
+typedef struct _E_Comp_Wl_Renderer_Manager         E_Comp_Wl_Renderer_Manager;
+typedef struct _E_Comp_Wl_Renderer                 E_Comp_Wl_Renderer;
+typedef struct _E_Comp_Wl_Renderer_Surface         E_Comp_Wl_Renderer_Surface;
+
+struct _E_Comp_Wl_Renderer_Manager
+{
+   struct wl_global *global;
+   Eina_List *renderers;
+};
+
+struct _E_Comp_Wl_Renderer
+{
+   struct wl_resource *resource;
+   Eina_List *renderer_surfaces;
+};
+
+struct _E_Comp_Wl_Renderer_Surface
+{
+   struct wl_resource *resource;
+   E_Client *ec;
+};
+
+static E_Comp_Wl_Renderer_Manager *_renderer_mgr;
+
+static E_Comp_Wl_Renderer_Surface *
+_renderer_surface_find(E_Client *ec)
+{
+   E_Comp_Wl_Renderer_Manager *renderer_mgr;
+   E_Comp_Wl_Renderer *renderer;
+   E_Comp_Wl_Renderer_Surface *renderer_surface;
+   Eina_List *l, *l2;
+
+   renderer_mgr = _renderer_mgr;
+   if (!renderer_mgr) return NULL;
+
+   EINA_LIST_FOREACH(renderer_mgr->renderers, l, renderer)
+     {
+        EINA_LIST_FOREACH(renderer->renderer_surfaces, l2, renderer_surface)
+          {
+             if (renderer_surface->ec == ec)
+               return renderer_surface;
+          }
+     }
+
+   return NULL;
+}
+
+static void
+_renderer_cb_get_renderer_surface(struct wl_client *client, struct wl_resource *resource,
+                                  uint32_t id, struct wl_resource *surface_resource)
+{
+   E_Comp_Wl_Renderer *renderer;
+   E_Comp_Wl_Renderer_Surface *renderer_surface;
+   E_Client *ec;
+
+   ec = wl_resource_get_user_data(surface_resource);
+   if (!ec) return;
+   if (e_object_is_del(E_OBJECT(ec))) return;
+
+   renderer = wl_resource_get_user_data(resource);
+   if (!renderer) return;
+
+   renderer_surface = E_NEW(E_Comp_Wl_Renderer_Surface, 1);
+   if (!renderer_surface)
+     {
+        wl_client_post_no_memory(client);
+        return;
+     }
+
+   renderer_surface->resource = wl_resource_create(client, &tizen_renderer_surface_interface, 1, id);
+   if (!renderer_surface->resource)
+     {
+        wl_client_post_no_memory(client);
+        E_FREE(renderer_surface);
+        return;
+     }
+
+   renderer_surface->ec = ec;
+   renderer->renderer_surfaces = eina_list_append(renderer->renderer_surfaces, renderer_surface);
+}
+
+static void
+_renderer_cb_destroy(struct wl_client *client, struct wl_resource *resource)
+{
+   wl_resource_destroy(resource);
+}
+
+
+static const struct tizen_renderer_interface renderer_implementation = {
+   _renderer_cb_get_renderer_surface,
+   _renderer_cb_destroy,
+};
+
+static void
+_renderer_cb_resource_destroy(struct wl_resource *renderer_resource)
+{
+   E_Comp_Wl_Renderer_Manager *renderer_mgr;
+   E_Comp_Wl_Renderer *renderer;
+
+   renderer = wl_resource_get_user_data(renderer_resource);
+   if (!renderer) return;
+
+   renderer_mgr = _renderer_mgr;
+   if (renderer_mgr)
+     renderer_mgr->renderers = eina_list_remove(renderer_mgr->renderers, renderer);
+
+   E_FREE(renderer);
+}
+
+static void
+_renderer_cb_bind(struct wl_client *client, void *data, uint32_t version, uint32_t id)
+{
+   struct wl_resource *resource;
+   E_Comp_Wl_Renderer_Manager *renderer_mgr;
+   E_Comp_Wl_Renderer *renderer;
+
+   renderer_mgr = _renderer_mgr;
+
+   renderer = E_NEW(E_Comp_Wl_Renderer, 1);
+   if (!renderer)
+     {
+        wl_client_post_no_memory(client);
+        return;
+     }
+
+   resource = wl_resource_create(client, &tizen_renderer_interface, version, id);
+   if (!resource)
+     {
+        wl_client_post_no_memory(client);
+        E_FREE(renderer);
+        return;
+     }
+
+   wl_resource_set_implementation(resource, &renderer_implementation,
+                                  renderer, _renderer_cb_resource_destroy);
+
+   renderer->resource = resource;
+   renderer_mgr->renderers = eina_list_append(renderer_mgr->renderers, renderer);
+}
+
+EINTERN Eina_Bool
+e_comp_wl_renderer_init(void)
+{
+   E_Comp_Wl_Renderer_Manager *renderer_mgr;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp_wl, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp_wl->wl.disp, EINA_FALSE);
+
+   if (_renderer_mgr) return EINA_TRUE;
+
+   renderer_mgr = E_NEW(E_Comp_Wl_Renderer_Manager, 1);
+   EINA_SAFETY_ON_NULL_GOTO(renderer_mgr, fail);
+
+   renderer_mgr->global = wl_global_create(e_comp_wl->wl.disp,
+                                           &tizen_renderer_interface,
+                                           1,
+                                           NULL,
+                                           _renderer_cb_bind);
+   EINA_SAFETY_ON_NULL_GOTO(renderer_mgr->global, fail);
+
+   _renderer_mgr = renderer_mgr;
+
+   return EINA_TRUE;
+
+fail:
+   if (renderer_mgr)
+     {
+        if (renderer_mgr->global)
+          wl_global_destroy(renderer_mgr->global);
+
+        E_FREE(renderer_mgr);
+     }
+
+   return EINA_FALSE;
+}
+
+EINTERN void
+e_comp_wl_renderer_shutdown(void)
+{
+   E_Comp_Wl_Renderer_Manager *renderer_mgr;
+
+   renderer_mgr = _renderer_mgr;
+   if (!renderer_mgr) return;
+
+   wl_global_destroy(renderer_mgr->global);
+   eina_list_free(renderer_mgr->renderers);
+   E_FREE(renderer_mgr);
+
+   _renderer_mgr = NULL;
+}
+
+EINTERN Eina_Bool
+e_comp_wl_renderer_client_redraw_request_send(E_Client *ec)
+{
+   E_Comp_Wl_Renderer_Surface *renderer_surface;
+
+   renderer_surface = _renderer_surface_find(ec);
+   if (!renderer_surface) return EINA_FALSE;
+
+   tizen_renderer_surface_send_redraw_request(renderer_surface->resource);
+
+   return EINA_TRUE;
+}
diff --git a/src/bin/e_comp_wl_renderer.h b/src/bin/e_comp_wl_renderer.h
new file mode 100644 (file)
index 0000000..4fcbafa
--- /dev/null
@@ -0,0 +1,13 @@
+#ifdef E_TYPEDEFS
+
+#else
+#ifndef E_COMP_WL_RENDERER_H
+#define E_COMP_WL_RENDERER_H
+
+
+EINTERN Eina_Bool e_comp_wl_renderer_init(void);
+EINTERN void      e_comp_wl_renderer_shutdown(void);
+EINTERN Eina_Bool e_comp_wl_renderer_client_redraw_request_send(E_Client *ec);
+
+#endif // E_COMP_WL_RENDERER_H
+#endif
index 0aa4d3f..d3f68cd 100644 (file)
@@ -97,3 +97,4 @@
 #include "e_desk_group.h"
 #include "e_comp_wl_capture.h"
 #include "e_comp_wl_tizen_hwc.h"
+#include "e_comp_wl_renderer.h"