From: Changyeon Lee Date: Thu, 9 Jul 2020 05:41:59 +0000 (+0900) Subject: add e_comp_wl_renderer for supporting tizen_renderer protocol X-Git-Tag: submit/tizen/20200715.044126~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1040770b43827af17f21f078e92a502640eaab91;p=platform%2Fupstream%2Fenlightenment.git add e_comp_wl_renderer for supporting tizen_renderer protocol Change-Id: I8e978ec3100a1933867507b19061ce279e9a4c52 --- diff --git a/src/bin/Makefile.mk b/src/bin/Makefile.mk index 5c7e09cff7..94533e91a7 100644 --- a/src/bin/Makefile.mk +++ b/src/bin/Makefile.mk @@ -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 \ diff --git a/src/bin/e_comp_wl.c b/src/bin/e_comp_wl.c index 41c0a7e8eb..d271929c95 100644 --- a/src/bin/e_comp_wl.c +++ b/src/bin/e_comp_wl.c @@ -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 index 0000000000..ed6dbd2b82 --- /dev/null +++ b/src/bin/e_comp_wl_renderer.c @@ -0,0 +1,206 @@ +#include "e.h" +#include + +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 index 0000000000..4fcbafae0a --- /dev/null +++ b/src/bin/e_comp_wl_renderer.h @@ -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 diff --git a/src/bin/e_includes.h b/src/bin/e_includes.h index 0aa4d3fa4f..d3f68cdfa5 100644 --- a/src/bin/e_includes.h +++ b/src/bin/e_includes.h @@ -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"