e_tizen_serface_shm: add tizen_surface_shm implementation 69/312169/1
authorSooChan Lim <sc1.lim@samsung.com>
Thu, 30 May 2024 23:59:37 +0000 (08:59 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Wed, 5 Jun 2024 01:27:19 +0000 (10:27 +0900)
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
src/bin/server/e_server.c
src/bin/server/e_tizen_surface_shm.c [new file with mode: 0644]
src/bin/server/e_tizen_surface_shm_intern.h [new file with mode: 0644]

index d0abd24..9316b2a 100644 (file)
@@ -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 \
index 5e1c1e6..e45c0cd 100644 (file)
@@ -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 (file)
index 0000000..9225755
--- /dev/null
@@ -0,0 +1,200 @@
+#include "e_tizen_surface_shm_intern.h"
+
+#include <tizen-surface-server-protocol.h>
+
+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 (file)
index 0000000..c341365
--- /dev/null
@@ -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