Integrate E_Comp_Wl_Buffer code into e_comp_wl_buffer 26/304026/1
authorSeunghun Lee <shiin.lee@samsung.com>
Tue, 26 Dec 2023 01:11:13 +0000 (10:11 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Tue, 9 Jan 2024 06:53:04 +0000 (15:53 +0900)
Previously, the code related to E_Comp_Wl_Buffer was spread across
multiple files.
This patch integrates all relevant code into a single file,
e_comp_wl_buffer.c, for better organization and maintainability.

Change-Id: I67f7803808c81bd967160b0a428b6af23a4b9420

src/bin/e_comp_wl_buffer.c
src/bin/e_comp_wl_buffer.h
src/bin/e_comp_wl_tbm.c
src/bin/e_comp_wl_tbm.h
src/bin/e_hwc_window.c
src/bin/e_hwc_window_queue.c
src/bin/e_plane_renderer.c

index a5f52aa..8fb2710 100644 (file)
@@ -9,17 +9,23 @@ struct _E_Buffer
 {
    E_Comp_Wl_Buffer base;
    struct ds_buffer *ds_buffer;
+
+   void (*lock)(E_Buffer *buffer);
+   void (*release)(E_Buffer *buffer);
 };
 
 static void _e_comp_wl_buffer_ref(E_Comp_Wl_Buffer *buffer);
 static void _e_comp_wl_buffer_unref(E_Comp_Wl_Buffer *buffer);
 static void _e_comp_wl_buffer_reference_cb_destroy(struct wl_listener *listener, void *data);
 
-static E_Buffer *_e_buffer_create(struct ds_buffer *ds_buffer);
+static E_Buffer *_e_buffer_create_with_ds_buffer(struct ds_buffer *ds_buffer);
+static E_Buffer *_e_buffer_create_with_tbm_surface(tbm_surface_h tbm_surface);
 static E_Buffer *_e_buffer_from_base(E_Comp_Wl_Buffer *base);
 static E_Buffer *_e_buffer_from_buffer(struct ds_buffer *ds_buffer);
+static void _e_buffer_destroy(E_Buffer *buffer);
 static void _e_buffer_cb_resource_destroy(struct wl_listener *listener, void *data);
 static void _e_buffer_transform_update(E_Buffer *buffer);
+static void _e_buffer_tbm_surface_destroy(E_Buffer *buffer);
 
 E_API void
 e_comp_wl_buffer_reference(E_Comp_Wl_Buffer_Ref *ref, E_Comp_Wl_Buffer *buffer)
@@ -53,7 +59,7 @@ e_comp_wl_buffer_get(struct ds_buffer *ds_buffer)
    if (buffer)
      goto done;
 
-   buffer = _e_buffer_create(ds_buffer);
+   buffer = _e_buffer_create_with_ds_buffer(ds_buffer);
    if (!buffer)
      {
         ERR("Failed to create E_Comp_Wl_Buffer");
@@ -66,6 +72,41 @@ done:
    return &buffer->base;
 }
 
+EINTERN E_Comp_Wl_Buffer *
+e_comp_wl_buffer_create_with_tbm_surface(tbm_surface_h tbm_surface)
+{
+   E_Buffer *buffer;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(tbm_surface, NULL);
+
+   buffer = _e_buffer_create_with_tbm_surface(tbm_surface);
+   if (!buffer)
+     return NULL;
+
+   DBG("Create Buffer(%p) with tbm_surface(%p)", buffer, tbm_surface);
+
+   return &buffer->base;
+}
+
+EINTERN void
+e_comp_wl_buffer_destroy(E_Comp_Wl_Buffer *comp_buffer)
+{
+   E_Buffer *buffer;
+
+   EINA_SAFETY_ON_NULL_RETURN(comp_buffer);
+
+   buffer = _e_buffer_from_base(comp_buffer);
+   EINA_SAFETY_ON_NULL_RETURN(buffer);
+
+   if (buffer->ds_buffer)
+     {
+        ERR("Cannot destroy the buffer(%p) associated with ds_buffer", buffer);
+        return;
+     }
+
+   _e_buffer_tbm_surface_destroy(buffer);
+}
+
 EINTERN void *
 e_comp_wl_buffer_single_pixel_buffer_data_get(E_Comp_Wl_Buffer *comp_buffer)
 {
@@ -102,8 +143,8 @@ _e_comp_wl_buffer_ref(E_Comp_Wl_Buffer *base)
    if (base->busy == 1)
      {
         buffer = _e_buffer_from_base(base);
-        if (buffer)
-          ds_buffer_lock(buffer->ds_buffer);
+        if (buffer && buffer->lock)
+          buffer->lock(buffer);
      }
 }
 
@@ -120,9 +161,7 @@ _e_comp_wl_buffer_release(E_Comp_Wl_Buffer *base)
 
    buffer = _e_buffer_from_base(base);
    if (buffer)
-     ds_buffer_unlock(buffer->ds_buffer);
-   else if (base->type == E_COMP_WL_BUFFER_TYPE_TBM)
-     e_comp_wl_tbm_buffer_destroy(base);
+     buffer->release(buffer);
 }
 
 static void
@@ -161,11 +200,24 @@ _e_comp_wl_buffer_tbm_type_get(E_Comp_Wl_Buffer *base, struct ds_buffer *ds_buff
    return EINA_TRUE;
 }
 
+static void
+_e_comp_wl_buffer_init(E_Comp_Wl_Buffer *base, int32_t width, int32_t height)
+{
+   base->w = width;
+   base->h = height;
+   wl_signal_init(&base->destroy_signal);
+   wl_list_init(&base->destroy_listener.link);
+}
+
 static Eina_Bool
-_e_comp_wl_buffer_init(E_Comp_Wl_Buffer *base, struct ds_buffer *ds_buffer)
+_e_comp_wl_buffer_init_with_ds_buffer(E_Comp_Wl_Buffer *base, struct ds_buffer *ds_buffer)
 {
    struct wl_shm_buffer *shmbuff;
    struct wl_resource *resource;
+   int32_t width, height;
+
+   ds_buffer_get_size(ds_buffer, &width, &height);
+   _e_comp_wl_buffer_init(base, width, height);
 
    resource = ds_buffer_get_resource(ds_buffer);
    if (!resource)
@@ -189,24 +241,17 @@ _e_comp_wl_buffer_init(E_Comp_Wl_Buffer *base, struct ds_buffer *ds_buffer)
         return EINA_FALSE;
      }
 
-   ds_buffer_get_size(ds_buffer, &base->w, &base->h);
    base->resource = resource;
 
    base->destroy_listener.notify = _e_buffer_cb_resource_destroy;
    wl_resource_add_destroy_listener(resource, &base->destroy_listener);
 
-   wl_signal_init(&base->destroy_signal);
-
-   DBG("E_Comp_Wl_Buffer Create: b %p", base);
-
    return EINA_TRUE;
 }
 
 static void
 _e_comp_wl_buffer_finish(E_Comp_Wl_Buffer *base)
 {
-   DBG("Wl Buffer(%p) Destroy", base);
-
    wl_signal_emit(&base->destroy_signal, base);
 
    if (base->buffer_release)
@@ -215,8 +260,20 @@ _e_comp_wl_buffer_finish(E_Comp_Wl_Buffer *base)
    wl_list_remove(&base->destroy_listener.link);
 }
 
+static void
+_e_buffer_ds_buffer_lock(E_Buffer *buffer)
+{
+   ds_buffer_lock(buffer->ds_buffer);
+}
+
+static void
+_e_buffer_ds_buffer_unlock(E_Buffer *buffer)
+{
+   ds_buffer_unlock(buffer->ds_buffer);
+}
+
 static E_Buffer *
-_e_buffer_create(struct ds_buffer *ds_buffer)
+_e_buffer_create_with_ds_buffer(struct ds_buffer *ds_buffer)
 {
    E_Buffer *buffer;
 
@@ -225,16 +282,29 @@ _e_buffer_create(struct ds_buffer *ds_buffer)
      return NULL;
 
    buffer->ds_buffer = ds_buffer;
+   buffer->lock = _e_buffer_ds_buffer_lock;
+   buffer->release = _e_buffer_ds_buffer_unlock;
 
-   if (!_e_comp_wl_buffer_init(&buffer->base, ds_buffer))
+   if (!_e_comp_wl_buffer_init_with_ds_buffer(&buffer->base, ds_buffer))
      {
         free(buffer);
         return NULL;
      }
 
+   DBG("Create Buffer(%p) with ds_buffer(%p)", buffer, ds_buffer);
+
    return buffer;
 }
 
+static void
+_e_buffer_destroy(E_Buffer *buffer)
+{
+   DBG("Destroy Buffer(%p)", buffer);
+
+   _e_comp_wl_buffer_finish(&buffer->base);
+   free(buffer);
+}
+
 static E_Buffer *
 _e_buffer_from_base(E_Comp_Wl_Buffer *base)
 {
@@ -254,8 +324,8 @@ _e_buffer_cb_resource_destroy(struct wl_listener *listener, void *data)
 
    if (buffer->base.busy > 0)
      ds_buffer_unlock(buffer->ds_buffer);
-   _e_comp_wl_buffer_finish(&buffer->base);
-   free(buffer);
+
+   _e_buffer_destroy(buffer);
 }
 
 static E_Buffer *
@@ -281,3 +351,42 @@ _e_buffer_transform_update(E_Buffer *buffer)
    if (buffer->base.tbm_surface)
      buffer->base.transform = wayland_tbm_server_buffer_get_buffer_transform(NULL, buffer->base.resource);
 }
+
+static void
+_e_buffer_tbm_surface_destroy(E_Buffer *buffer)
+{
+   tbm_surface_internal_unref(buffer->base.tbm_surface);
+   _e_buffer_destroy(buffer);
+}
+
+static void
+_e_comp_wl_buffer_init_with_tbm_surface(E_Comp_Wl_Buffer *base, tbm_surface_h tbm_surface)
+{
+   _e_comp_wl_buffer_init(base,
+                          tbm_surface_get_width(tbm_surface),
+                          tbm_surface_get_height(tbm_surface));
+
+   base->type = E_COMP_WL_BUFFER_TYPE_TBM;
+   base->tbm_surface = tbm_surface;
+   tbm_surface_internal_ref(tbm_surface);
+
+   // This is NOT to add a destroy listener, but to idendify the E_Buffer from
+   // E_Comp_Wl_Buffer.
+   base->destroy_listener.notify = _e_buffer_cb_resource_destroy;
+}
+
+static E_Buffer *
+_e_buffer_create_with_tbm_surface(tbm_surface_h tbm_surface)
+{
+   E_Buffer *buffer;
+
+   buffer = E_NEW(E_Buffer, 1);
+   if (!buffer)
+     return NULL;
+
+   buffer->release = _e_buffer_tbm_surface_destroy;
+
+   _e_comp_wl_buffer_init_with_tbm_surface(&buffer->base, tbm_surface);
+
+   return buffer;
+}
index 30ee74e..8e3bcda 100644 (file)
@@ -2,9 +2,12 @@
 #define E_COMP_WL_BUFFER_H
 
 #include <libds/types/ds_buffer.h>
+#include <tbm_surface.h>
 #include "e_comp_wl.h"
 
 EINTERN E_Comp_Wl_Buffer *e_comp_wl_buffer_get(struct ds_buffer *ds_buffer);
+EINTERN E_Comp_Wl_Buffer *e_comp_wl_buffer_create_with_tbm_surface(tbm_surface_h tbm_surface);
+EINTERN void e_comp_wl_buffer_destroy(E_Comp_Wl_Buffer *comp_buffer);
 EINTERN void *e_comp_wl_buffer_single_pixel_buffer_data_get(E_Comp_Wl_Buffer *buffer);
 
 #endif
index c5a986a..0bbdfe1 100644 (file)
@@ -187,44 +187,6 @@ e_comp_wl_tbm_init(void)
    return EINA_TRUE;
 }
 
-EINTERN void
-e_comp_wl_tbm_buffer_destroy(E_Comp_Wl_Buffer *buffer)
-{
-   if (!buffer) return;
-
-   if (buffer->tbm_surface)
-     {
-        tbm_surface_internal_unref(buffer->tbm_surface);
-        buffer->tbm_surface = NULL;
-     }
-
-   wl_signal_emit(&buffer->destroy_signal, buffer);
-   free(buffer);
-}
-
-EINTERN E_Comp_Wl_Buffer *
-e_comp_wl_tbm_buffer_get(tbm_surface_h tsurface)
-{
-   E_Comp_Wl_Buffer *buffer = NULL;
-
-   if (!tsurface) return NULL;
-
-   if (!(buffer = E_NEW(E_Comp_Wl_Buffer, 1)))
-      return NULL;
-
-   buffer->type = E_COMP_WL_BUFFER_TYPE_TBM;
-   buffer->w = tbm_surface_get_width(tsurface);
-   buffer->h = tbm_surface_get_height(tsurface);
-   buffer->tbm_surface = tsurface;
-   buffer->resource = NULL;
-   buffer->shm_buffer = NULL;
-   wl_signal_init(&buffer->destroy_signal);
-
-   tbm_surface_internal_ref(tsurface);
-
-   return buffer;
-}
-
 EINTERN struct wl_resource *
 e_comp_wl_tbm_remote_buffer_get(struct wl_resource *wl_tbm, struct wl_resource *wl_buffer)
 {
index 13c2733..8859bb2 100644 (file)
@@ -21,9 +21,6 @@ struct _E_Comp_Wl_Tbm_Funcs
 
 EINTERN Eina_Bool e_comp_wl_tbm_init(void);
 
-EINTERN E_Comp_Wl_Buffer *e_comp_wl_tbm_buffer_get(tbm_surface_h tsurface);
-EINTERN void e_comp_wl_tbm_buffer_destroy(E_Comp_Wl_Buffer *buffer);
-
 EINTERN struct wl_resource *e_comp_wl_tbm_remote_buffer_get(struct wl_resource *wl_tbm, struct wl_resource *wl_buffer);
 EINTERN struct wl_resource *e_comp_wl_tbm_remote_buffer_get_with_tbm(struct wl_resource *wl_tbm, tbm_surface_h tbm_surface);
 
index 2479950..a0a1c17 100644 (file)
@@ -1,4 +1,5 @@
 #include "e.h"
+#include "e_comp_wl_buffer.h"
 
 # include <pixman.h>
 # include <wayland-tbm-server.h>
@@ -2412,7 +2413,7 @@ _e_hwc_window_client_recover(E_Hwc_Window *hwc_window, Eina_Bool *clear_attach)
         tsurface = e_hwc_window_displaying_surface_get(hwc_window);
         if (!tsurface) return EINA_FALSE;
 
-        recover_buffer = e_comp_wl_tbm_buffer_get(tsurface);
+        recover_buffer = e_comp_wl_buffer_create_with_tbm_surface(tsurface);
         EINA_SAFETY_ON_NULL_RETURN_VAL(recover_buffer, EINA_FALSE);
 
         recover_buffer->transform = hwc_window->display.buffer.transform;
@@ -2432,7 +2433,7 @@ _e_hwc_window_client_recover(E_Hwc_Window *hwc_window, Eina_Bool *clear_attach)
      {
         /* to avoid resource leak */
         if (new_buffer)
-          e_comp_wl_tbm_buffer_destroy(recover_buffer);
+          e_comp_wl_buffer_destroy(recover_buffer);
      }
 
    e_hwc_window_buffer_fetch(hwc_window);
index d28ab21..1580cd4 100644 (file)
@@ -1,4 +1,5 @@
 #include "e.h"
+#include "e_comp_wl_buffer.h"
 
 # include <gbm.h>
 # include <wayland-tbm-server.h>
@@ -1350,7 +1351,7 @@ _e_hwc_window_queue_copy_thread_run_end_cb(void *data, Ecore_Thread *thread)
         if (comp_buffer->tbm_surface != copy_thread_data->src_tsurface) goto end;
      }
 
-   copy_comp_buffer = e_comp_wl_tbm_buffer_get(copy_thread_data->dst_tsurface);
+   copy_comp_buffer = e_comp_wl_buffer_create_with_tbm_surface(copy_thread_data->dst_tsurface);
    EINA_SAFETY_ON_NULL_GOTO(copy_comp_buffer, end);
 
    copy_comp_buffer->transform = copy_thread_data->src_transform;
index 8a0f030..460e518 100644 (file)
@@ -1,4 +1,5 @@
 #include "e.h"
+#include "e_comp_wl_buffer.h"
 
 # include <tdm.h>
 # include <tdm_helper.h>
@@ -394,7 +395,7 @@ _e_plane_renderer_client_backup_buffer_set(E_Plane_Renderer_Client *renderer_cli
    copied_tsurface = _e_plane_renderer_client_copied_surface_create(renderer_client, 1);
    EINA_SAFETY_ON_NULL_RETURN_VAL(copied_tsurface, EINA_FALSE);
 
-   backup_buffer = e_comp_wl_tbm_buffer_get(copied_tsurface);
+   backup_buffer = e_comp_wl_buffer_create_with_tbm_surface(copied_tsurface);
    EINA_SAFETY_ON_NULL_GOTO(backup_buffer, fail);
 
    buffer = _get_comp_wl_buffer(ec);
@@ -1013,7 +1014,7 @@ _e_plane_renderer_recover_ec(E_Plane_Renderer *renderer)
         tsurface = plane->tsurface;
         if (!tsurface) return;
 
-        buffer = e_comp_wl_tbm_buffer_get(tsurface);
+        buffer = e_comp_wl_buffer_create_with_tbm_surface(tsurface);
         if (!buffer) return;
      }