e_single_pixel_buffer: add first implementation of single_pixel_buffer protocol 62/295562/1
authorChangyeon Lee <cyeon.lee@samsung.com>
Fri, 30 Jun 2023 09:04:20 +0000 (18:04 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Tue, 11 Jul 2023 02:52:34 +0000 (11:52 +0900)
Change-Id: I1104968068d1d60ecbd6c699a0d8f0e7c9282290

configure.ac
packaging/enlightenment.spec
src/bin/Makefile.mk
src/bin/e_comp_wl.c
src/bin/e_comp_wl.h
src/bin/e_hwc_window.c
src/bin/e_includes.h
src/bin/e_pixmap.c
src/bin/e_single_pixel_buffer.c [new file with mode: 0644]
src/bin/e_single_pixel_buffer.h [new file with mode: 0644]

index ede3828..4cf30ed 100755 (executable)
@@ -372,7 +372,12 @@ AC_MSG_RESULT([${have_shm_open}])
 AC_SUBST(SHM_OPEN_LIBS)
 
 if test "x${e_cv_want_wayland_only}" != "xno" || test "x${e_cv_want_wayland_clients}" != "xno";then
-  PKG_CHECK_MODULES([WAYLAND], [wayland-server >= 1.8.0 xkbcommon uuid xdg-shell-unstable-v5-server xdg-shell-unstable-v6-server tizen-remote-surface-server scaler-server screenshooter-server tizen-extension-server tizen-launch-server tizen-surface-server tizen-dpms-server eom-server presentation-time-server tizen-hwc-server linux-explicit-synchronization-unstable-v1-server wtz-foreign-server wtz-screen-server wtz-shell-server relative-pointer-unstable-v1-server pointer-constraints-unstable-v1-server],
+  PKG_CHECK_MODULES([WAYLAND], [wayland-server >= 1.8.0 xkbcommon uuid xdg-shell-unstable-v5-server xdg-shell-unstable-v6-server
+                                tizen-remote-surface-server scaler-server screenshooter-server tizen-extension-server
+                                tizen-launch-server tizen-surface-server tizen-dpms-server eom-server presentation-time-server
+                                tizen-hwc-server linux-explicit-synchronization-unstable-v1-server wtz-foreign-server
+                                wtz-screen-server wtz-shell-server relative-pointer-unstable-v1-server pointer-constraints-unstable-v1-server
+                                single-pixel-buffer-v1-server],
     [
       have_wayland=yes
       AC_DEFINE_UNQUOTED([HAVE_WAYLAND],[1],[enable wayland support])
index ea4a875..9c39a97 100644 (file)
@@ -67,6 +67,7 @@ BuildRequires:  pkgconfig(pointer-constraints-unstable-v1-server)
 BuildRequires:  pkgconfig(relative-pointer-unstable-v1-server)
 BuildRequires:  pkgconfig(glib-2.0)
 BuildRequires:  pkgconfig(gobject-2.0)
+BuildRequires:  pkgconfig(single-pixel-buffer-v1-server)
 Requires:       libwayland-extension-server
 
 # for gtest/gmock
index 7352089..2d1fa77 100644 (file)
@@ -141,7 +141,8 @@ src/bin/e_foreign_private.h \
 src/bin/e_map.h \
 src/bin/e_wtz_shell.h \
 src/bin/e_device.h \
-src/bin/e_input_event.h
+src/bin/e_input_event.h \
+src/bin/e_single_pixel_buffer.h
 
 enlightenment_src = \
 src/bin/e_actions.c \
@@ -272,7 +273,8 @@ src/bin/e_foreign_shell.c \
 src/bin/e_map.c \
 src/bin/e_wtz_shell.c \
 src/bin/e_device.c \
-src/bin/e_input_event.c
+src/bin/e_input_event.c \
+src/bin/e_single_pixel_buffer.c
 
 src_bin_enlightenment_CPPFLAGS = $(E_CPPFLAGS) -DEFL_BETA_API_SUPPORT -DEFL_EO_API_SUPPORT -DE_LOGGING=2 @WAYLAND_CFLAGS@ $(TTRACE_CFLAGS) $(DLOG_CFLAGS) $(PIXMAN_CFLAGS) $(POLICY_CFLAGS) $(EGL_CFLAGS)
 if HAVE_LIBGOMP
index 93e2e11..5102ebe 100644 (file)
@@ -4656,6 +4656,7 @@ e_comp_wl_init(void)
    e_comp_wl_renderer_init();
    _e_comp_wl_move_resize_init();
    e_presentation_time_init();
+   e_single_pixel_buffer_manager_init();
 
    if (!e_foreign_global_init(e_comp_wl->wl.disp))
      ELOGF("COMP", "Failed to initialize the e_foreign global", NULL);
@@ -4707,6 +4708,7 @@ e_comp_wl_shutdown(void)
    E_FREE_LIST(hooks, e_client_hook_del);
    _e_comp_wl_gl_shutdown();
 
+   e_single_pixel_buffer_manager_shutdown();
    e_presentation_time_shutdown();
    e_comp_wl_renderer_shutdown();
    e_comp_wl_capture_shutdown();
@@ -5033,6 +5035,7 @@ e_comp_wl_buffer_get(struct wl_resource *resource, E_Client *ec)
    E_Comp_Wl_Buffer *buffer = NULL;
    struct wl_listener *listener;
    struct wl_shm_buffer *shmbuff;
+   E_Single_Pixel_Buffer *single_pixel_buffer;
    Eina_Bool res;
 
    listener =
@@ -5054,7 +5057,21 @@ e_comp_wl_buffer_get(struct wl_resource *resource, E_Client *ec)
         buffer->format = wl_shm_buffer_get_format(shmbuff);
         buffer->shm_buffer = shmbuff;
      }
-   else
+
+   if (!buffer->type)
+     {
+        single_pixel_buffer = e_single_pixel_buffer_manager_buffer_get(resource);
+        if (single_pixel_buffer)
+          {
+             buffer->type = E_COMP_WL_BUFFER_TYPE_SINGLE_PIXEL;
+             buffer->w = 1;
+             buffer->h = 1;
+             buffer->format = WL_SHM_FORMAT_ARGB8888;
+             buffer->single_pixel_buffer = single_pixel_buffer;
+          }
+     }
+
+   if (!buffer->type)
      {
         /* TODO: This option is temporarily. It will be removed later. */
         /* prefer to use native buffer(wl_buffer) */
index a9eb45f..2f0531b 100644 (file)
@@ -54,6 +54,7 @@ typedef enum _E_Comp_Wl_Buffer_Type
    E_COMP_WL_BUFFER_TYPE_NATIVE = 2,
    E_COMP_WL_BUFFER_TYPE_VIDEO = 3,
    E_COMP_WL_BUFFER_TYPE_TBM = 4,
+   E_COMP_WL_BUFFER_TYPE_SINGLE_PIXEL = 5,
 } E_Comp_Wl_Buffer_Type;
 
 typedef enum _E_Comp_Wl_Hook_Point
@@ -128,6 +129,7 @@ struct _E_Comp_Wl_Buffer
    uint32_t busy;
 
    E_Explicit_Sync_Buffer_Release *buffer_release;
+   E_Single_Pixel_Buffer *single_pixel_buffer;
 };
 
 struct _E_Comp_Wl_Buffer_Ref
index 3a21e19..c90e395 100644 (file)
@@ -322,6 +322,7 @@ _e_hwc_window_client_surface_acquire(E_Hwc_Window *hwc_window)
    switch (buffer->type)
      {
        case E_COMP_WL_BUFFER_TYPE_SHM:
+       case E_COMP_WL_BUFFER_TYPE_SINGLE_PIXEL:
          break;
        case E_COMP_WL_BUFFER_TYPE_NATIVE:
        case E_COMP_WL_BUFFER_TYPE_VIDEO:
index 2641c14..a8ea192 100644 (file)
@@ -87,3 +87,4 @@
 #include "e_comp_wl_tizen_hwc.h"
 #include "e_comp_wl_renderer.h"
 #include "e_map.h"
+#include "e_single_pixel_buffer.h"
index a4a70e1..0f6472b 100644 (file)
@@ -48,6 +48,8 @@ struct _E_Pixmap
    Eina_Bool usable : 1;
    Eina_Bool dirty : 1;
    Eina_Bool image_argb : 1;
+
+   uint32_t single_pixel;
 };
 
 static int _e_pixmap_hooks_delete = 0;
@@ -807,6 +809,15 @@ e_pixmap_image_refresh(E_Pixmap *cp)
         cp->data = NULL;
         cp->shm_buffer = NULL;
      }
+   else if (buffer->type == E_COMP_WL_BUFFER_TYPE_SINGLE_PIXEL)
+     {
+        cp->w = 1;
+        cp->h = 1;
+        cp->image_argb = EINA_TRUE;
+        cp->single_pixel = buffer->single_pixel_buffer->data;
+        cp->data = &cp->single_pixel;
+        cp->shm_buffer = NULL;
+     }
    else
      {
         ERR("Invalid resource:%u", wl_resource_get_id(buffer->resource));
diff --git a/src/bin/e_single_pixel_buffer.c b/src/bin/e_single_pixel_buffer.c
new file mode 100644 (file)
index 0000000..cd88302
--- /dev/null
@@ -0,0 +1,152 @@
+#include "e.h"
+#include <single-pixel-buffer-v1-server-protocol.h>
+
+static E_Single_Pixel_Buffer_Manager *_single_pixel_buffer_mgr = NULL;
+
+static void
+_single_pixel_buffer_manager_destroy(struct wl_client *client, struct wl_resource *resource)
+{
+   wl_resource_destroy(resource);
+}
+
+static void
+_single_pixel_buffer_cb_resource_destroy(struct wl_resource *resource)
+{
+   E_Single_Pixel_Buffer *single_pixel_buffer;
+
+   single_pixel_buffer = wl_resource_get_user_data(resource);
+   if (!single_pixel_buffer) return;
+
+   free(single_pixel_buffer);
+}
+
+static void
+_single_pixel_buffer_destroy(struct wl_client *client, struct wl_resource *resource)
+{
+   wl_resource_destroy(resource);
+}
+
+static const struct wl_buffer_interface single_pixel_buffer_implementation = {
+   _single_pixel_buffer_destroy,
+};
+
+static void
+_single_pixel_buffer_manager_create_u32_rgba_buffer(struct wl_client *client,
+                                                    struct wl_resource *resource,
+                                                    uint32_t id,
+                                                    uint32_t r,
+                                                    uint32_t g,
+                                                    uint32_t b,
+                                                    uint32_t a)
+{
+   E_Single_Pixel_Buffer *single_pixel_buffer;
+
+   single_pixel_buffer = E_NEW(E_Single_Pixel_Buffer, 1);
+   if (!single_pixel_buffer)
+     {
+        wl_client_post_no_memory(client);
+        return;
+     }
+
+   single_pixel_buffer->buffer = wl_resource_create(client, &wl_buffer_interface, 1, id);
+   if (!single_pixel_buffer->buffer)
+     {
+        free(single_pixel_buffer);
+        wl_client_post_no_memory(client);
+        return;
+     }
+
+   wl_resource_set_implementation(single_pixel_buffer->buffer, &single_pixel_buffer_implementation,
+                                  single_pixel_buffer, _single_pixel_buffer_cb_resource_destroy);
+
+   single_pixel_buffer->r = r;
+   single_pixel_buffer->g = g;
+   single_pixel_buffer->b = b;
+   single_pixel_buffer->a = a;
+
+   single_pixel_buffer->data = (((uint32_t)((a / (double)0xffffffff) * 255)) << 24) |
+                               (((uint32_t)((r / (double)0xffffffff) * 255)) << 16) |
+                               (((uint32_t)((g / (double)0xffffffff) * 255)) << 8) |
+                               ((uint32_t)((b / (double)0xffffffff) * 255));
+
+   ELOGF("SPBUF", "Create Single Pixel Buffer:%p r(%x) g(%x) b(%x) a(%x) data(%x)",
+         NULL, single_pixel_buffer, r, g, b, a, single_pixel_buffer->data);
+}
+
+static const struct wp_single_pixel_buffer_manager_v1_interface single_pixel_buffer_manager_implementation = {
+   _single_pixel_buffer_manager_destroy,
+   _single_pixel_buffer_manager_create_u32_rgba_buffer
+};
+
+static void
+_single_pixel_buffer_manager_cb_bind(struct wl_client *client, void *data, uint32_t version, uint32_t id)
+{
+   struct wl_resource *resource;
+
+   resource = wl_resource_create(client, &wp_single_pixel_buffer_manager_v1_interface, version, id);
+   if (!resource)
+     {
+        wl_client_post_no_memory(client);
+        return;
+     }
+
+   wl_resource_set_implementation(resource, &single_pixel_buffer_manager_implementation,
+                                  NULL, NULL);
+}
+
+EINTERN Eina_Bool
+e_single_pixel_buffer_manager_init(void)
+{
+   E_Single_Pixel_Buffer_Manager *single_pixel_buffer_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 (_single_pixel_buffer_mgr) return EINA_TRUE;
+
+   single_pixel_buffer_mgr = E_NEW(E_Single_Pixel_Buffer_Manager, 1);
+   EINA_SAFETY_ON_NULL_GOTO(single_pixel_buffer_mgr, fail);
+
+   single_pixel_buffer_mgr->global = wl_global_create(e_comp_wl->wl.disp,
+                                                      &wp_single_pixel_buffer_manager_v1_interface,
+                                                      1,
+                                                      NULL,
+                                                      _single_pixel_buffer_manager_cb_bind);
+   EINA_SAFETY_ON_NULL_GOTO(single_pixel_buffer_mgr->global, fail);
+
+   _single_pixel_buffer_mgr = single_pixel_buffer_mgr;
+
+   return EINA_TRUE;
+
+fail:
+   if (single_pixel_buffer_mgr)
+     free(single_pixel_buffer_mgr);
+
+   return EINA_FALSE;
+}
+
+EINTERN void
+e_single_pixel_buffer_manager_shutdown(void)
+{
+   E_Single_Pixel_Buffer_Manager *single_pixel_buffer_mgr;
+
+   single_pixel_buffer_mgr = _single_pixel_buffer_mgr;
+   if (!single_pixel_buffer_mgr) return;
+
+   wl_global_destroy(single_pixel_buffer_mgr->global);
+   free(single_pixel_buffer_mgr);
+
+   _single_pixel_buffer_mgr = NULL;
+}
+
+EINTERN E_Single_Pixel_Buffer *
+e_single_pixel_buffer_manager_buffer_get(struct wl_resource *resource)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(resource, NULL);
+
+       if (wl_resource_instance_of(resource, &wl_buffer_interface,
+                                   &single_pixel_buffer_implementation))
+               return wl_resource_get_user_data(resource);
+       else
+               return NULL;
+}
diff --git a/src/bin/e_single_pixel_buffer.h b/src/bin/e_single_pixel_buffer.h
new file mode 100644 (file)
index 0000000..c204672
--- /dev/null
@@ -0,0 +1,33 @@
+#ifdef E_TYPEDEFS
+
+typedef struct _E_Single_Pixel_Buffer_Manager E_Single_Pixel_Buffer_Manager;
+typedef struct _E_Single_Pixel_Buffer E_Single_Pixel_Buffer;
+
+#else
+#ifndef E_SINGLE_PIXEL_BUFFER_H
+#define E_SINGLE_PIXEL_BUFFER_H
+
+struct _E_Single_Pixel_Buffer_Manager
+{
+   struct wl_global *global;
+};
+
+struct _E_Single_Pixel_Buffer
+{
+   struct wl_resource *buffer;
+
+   uint32_t r;
+   uint32_t g;
+   uint32_t b;
+   uint32_t a;
+
+   uint32_t data;
+};
+
+EINTERN Eina_Bool e_single_pixel_buffer_manager_init(void);
+EINTERN void      e_single_pixel_buffer_manager_shutdown(void);
+
+EINTERN E_Single_Pixel_Buffer *e_single_pixel_buffer_manager_buffer_get(struct wl_resource *resource);
+
+#endif // E_SINGLE_PIXEL_BUFFER_H
+#endif