From 5f3be55ba277afec0355a99951669ad8fb3b08a7 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Fri, 31 May 2024 08:59:37 +0900 Subject: [PATCH] e_tizen_serface_shm: add tizen_surface_shm implementation This implements the tizen_surface_shm implemenation. This replace the tizen_surface_shm implementation in e_pixmap.c file. Change-Id: I4252503820ad1ce5995a2e43b29cf640e423e2ee --- src/bin/Makefile.mk | 1 + src/bin/server/e_server.c | 3 + src/bin/server/e_tizen_surface_shm.c | 200 ++++++++++++++++++++++++++++ src/bin/server/e_tizen_surface_shm_intern.h | 18 +++ 4 files changed, 222 insertions(+) create mode 100644 src/bin/server/e_tizen_surface_shm.c create mode 100644 src/bin/server/e_tizen_surface_shm_intern.h diff --git a/src/bin/Makefile.mk b/src/bin/Makefile.mk index d0abd24..9316b2a 100644 --- a/src/bin/Makefile.mk +++ b/src/bin/Makefile.mk @@ -174,6 +174,7 @@ src/bin/server/e_presentation_time.c \ src/bin/server/e_screen_rotation.c \ src/bin/server/e_server.c \ src/bin/server/e_tbm_gbm_server.c \ +src/bin/server/e_tizen_surface_shm.c \ src/bin/server/services/e_service_gesture.c \ src/bin/server/services/e_service_lockscreen.c \ src/bin/server/services/e_service_quickpanel.c \ diff --git a/src/bin/server/e_server.c b/src/bin/server/e_server.c index 5e1c1e6..e45c0cd 100644 --- a/src/bin/server/e_server.c +++ b/src/bin/server/e_server.c @@ -228,6 +228,9 @@ e_server_feature_register(E_SERVER_FEATURE feature, void *handle) case E_SERVER_FEATURE_TIZEN_HWC: g_server->handles.tizen_hwc_handle = handle; break; + case E_SERVER_FEATURE_TIZEN_SURFACE_SHM: + g_server->handles.tizen_surface_shm =(E_Tizen_Surface_Shm *)handle; + break; default: ERR("Unknown feature(%d) and handle(%p)", feature, handle); break; diff --git a/src/bin/server/e_tizen_surface_shm.c b/src/bin/server/e_tizen_surface_shm.c new file mode 100644 index 0000000..9225755 --- /dev/null +++ b/src/bin/server/e_tizen_surface_shm.c @@ -0,0 +1,200 @@ +#include "e_tizen_surface_shm_intern.h" + +#include + +struct _E_Tizen_Surface_Shm { + struct wl_global *global; + + struct + { + struct wl_signal new_flusher; + } events; + + Eina_List *surface_shm_flushers; +}; + +struct _E_Tizen_Surface_Shm_Flusher { + E_Tizen_Surface_Shm *surface_shm; + E_Client *ec; + struct wl_resource *resource; +}; + +static void +_e_tizen_surface_shm_flusher_cb_destroy(struct wl_client *client EINA_UNUSED, struct wl_resource *resource) +{ + wl_resource_destroy(resource); +} + +static const struct tizen_surface_shm_flusher_interface _tzsurf_shm_flusher_iface = +{ + _e_tizen_surface_shm_flusher_cb_destroy, +}; + +static void +_e_tizen_surface_shm_flusher_cb_res_destroy(struct wl_resource *resource) +{ + E_Tizen_Surface_Shm_Flusher *surface_shm_flusher; + E_Tizen_Surface_Shm *surface_shm; + + surface_shm_flusher = wl_resource_get_user_data(resource); + + surface_shm = surface_shm_flusher->surface_shm; + + surface_shm->surface_shm_flushers = eina_list_remove(surface_shm->surface_shm_flushers, surface_shm_flusher); + + E_FREE(surface_shm_flusher); +} + +static void +_e_tizen_surface_shm_cb_flusher_get(struct wl_client *client, struct wl_resource *resource, uint32_t id, struct wl_resource *surface) +{ + E_Tizen_Surface_Shm_Flusher *surface_shm_flusher; + E_Tizen_Surface_Shm *surface_shm; + E_Client *ec; + struct wl_resource *res; + + surface_shm_flusher = E_NEW(E_Tizen_Surface_Shm_Flusher,1); + EINA_SAFETY_ON_NULL_RETURN(surface_shm_flusher); + + surface_shm = wl_resource_get_user_data(resource); + + surface_shm_flusher->surface_shm = surface_shm; + + ec = e_client_from_surface_resource(surface); + surface_shm_flusher->ec = ec; + + res = wl_resource_create(client, &tizen_surface_shm_flusher_interface, + wl_resource_get_version(resource), id); + if (!res) + { + wl_resource_post_no_memory(resource); + return; + } + + surface_shm_flusher->resource = res; + + wl_resource_set_implementation(res, &_tzsurf_shm_flusher_iface, surface_shm_flusher, + _e_tizen_surface_shm_flusher_cb_res_destroy); + + + surface_shm->surface_shm_flushers = eina_list_append(surface_shm->surface_shm_flushers, surface_shm_flusher); + + //emit the new_flusher signal of surface_shm + wl_signal_emit(&surface_shm->events.new_flusher, surface_shm_flusher); +} + +static void +_e_tizen_surface_shm_cb_destroy(struct wl_client *client, struct wl_resource *resource) +{ + wl_resource_destroy(resource); +} + +static const struct tizen_surface_shm_interface _tzsurf_shm_iface = +{ + _e_tizen_surface_shm_cb_flusher_get, + _e_tizen_surface_shm_cb_destroy, +}; + +static void +_e_tizen_surface_shm_cb_resource_destroy(struct wl_resource *surface_shm_resource) +{ +} + +static void +_e_tizen_surface_shm_cb_bind(struct wl_client *client, void *data, uint32_t ver, uint32_t id) +{ + E_Tizen_Surface_Shm *surface_shm; + struct wl_resource *res; + + surface_shm = (E_Tizen_Surface_Shm *)data; + + res = wl_resource_create(client, &tizen_surface_shm_interface, ver, id); + if (!res) + { + wl_client_post_no_memory(client); + return; + } + + wl_resource_set_implementation(res, &_tzsurf_shm_iface, surface_shm, + _e_tizen_surface_shm_cb_resource_destroy); +} + +EINTERN E_Tizen_Surface_Shm * +e_tizen_surface_shm_init(void) +{ + E_Tizen_Surface_Shm *surface_shm; + + surface_shm = E_NEW(E_Tizen_Surface_Shm, 1); + EINA_SAFETY_ON_NULL_RETURN_VAL(surface_shm, NULL); + + surface_shm->global = wl_global_create(e_comp_wl->wl.disp, &tizen_surface_shm_interface, + 2, surface_shm, _e_tizen_surface_shm_cb_bind); + if (!surface_shm->global) + { + E_FREE(surface_shm); + return NULL; + } + + wl_signal_init(&surface_shm->events.new_flusher); + + return surface_shm; +} + +EINTERN void +e_tizen_surface_shm_shutdown(E_Tizen_Surface_Shm *surface_shm) +{ + EINA_SAFETY_ON_NULL_RETURN(surface_shm); + + wl_global_destroy(surface_shm->global); + + E_FREE(surface_shm); +} + +EINTERN E_Tizen_Surface_Shm_Flusher * +e_tizen_surface_shm_flusher_get(E_Tizen_Surface_Shm *surface_shm, E_Client *ec) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(surface_shm, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(ec, NULL); + + E_Tizen_Surface_Shm_Flusher *surface_shm_flusher; + Eina_List *l; + + EINA_LIST_FOREACH(surface_shm->surface_shm_flushers, l, surface_shm_flusher) + { + if (surface_shm_flusher->ec == ec) + return surface_shm_flusher; + } + + return NULL; +} + +EINTERN Eina_Bool +e_tizen_surface_shm_flusher_free_flush_supported(E_Tizen_Surface_Shm_Flusher *surface_shm_flusher) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(surface_shm_flusher, EINA_FALSE); + + if (wl_resource_get_version(surface_shm_flusher->resource) < TIZEN_SURFACE_SHM_FLUSHER_FREE_FLUSH_SINCE_VERSION) + return EINA_FALSE; + + return EINA_TRUE; +} + +EINTERN void +e_tizen_surface_shm_flusher_free_flush_send(E_Tizen_Surface_Shm_Flusher *surface_shm_flusher) +{ + EINA_SAFETY_ON_NULL_RETURN(surface_shm_flusher); + + if (wl_resource_get_version(surface_shm_flusher->resource) < TIZEN_SURFACE_SHM_FLUSHER_FREE_FLUSH_SINCE_VERSION) + return; + + tizen_surface_shm_flusher_send_free_flush(surface_shm_flusher->resource); +} + +EINTERN void +e_tizen_surface_shm_flusher_flush_send(E_Tizen_Surface_Shm_Flusher *surface_shm_flusher) +{ + EINA_SAFETY_ON_NULL_RETURN(surface_shm_flusher); + + tizen_surface_shm_flusher_send_flush(surface_shm_flusher->resource); +} + diff --git a/src/bin/server/e_tizen_surface_shm_intern.h b/src/bin/server/e_tizen_surface_shm_intern.h new file mode 100644 index 0000000..c341365 --- /dev/null +++ b/src/bin/server/e_tizen_surface_shm_intern.h @@ -0,0 +1,18 @@ +#ifndef E_TIZEN_SURFACE_SHM_INTERN_H +#define E_TIZEN_SURFACE_SHM_INTERN_H + +#include "e_intern.h" + +typedef struct _E_Tizen_Surface_Shm E_Tizen_Surface_Shm; +typedef struct _E_Tizen_Surface_Shm_Flusher E_Tizen_Surface_Shm_Flusher; + +EINTERN E_Tizen_Surface_Shm *e_tizen_surface_shm_init(void); +EINTERN void e_tizen_surface_shm_shutdown(E_Tizen_Surface_Shm *surface_shm); + +EINTERN E_Tizen_Surface_Shm_Flusher *e_tizen_surface_shm_flusher_get(E_Tizen_Surface_Shm *surface_shm, E_Client *ec); + +EINTERN Eina_Bool e_tizen_surface_shm_flusher_free_flush_supported(E_Tizen_Surface_Shm_Flusher *surface_shm_flusher); +EINTERN void e_tizen_surface_shm_flusher_free_flush_send(E_Tizen_Surface_Shm_Flusher *surface_shm_flusher); +EINTERN void e_tizen_surface_shm_flusher_flush_send(E_Tizen_Surface_Shm_Flusher *surface_shm_flusher); + +#endif -- 2.7.4