e_comp_wl_buffer: Refactoring for better code organization 84/303184/2
authorSeunghun Lee <shiin.lee@samsung.com>
Tue, 7 Nov 2023 07:11:53 +0000 (16:11 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Thu, 21 Dec 2023 04:59:50 +0000 (04:59 +0000)
* Extracted common functionality into separate functions for readability
* Removed an unnecessary call to wl_buffer_send_release()[1]
* Made other minor changes for readability

[1]: Since `E_Comp_Wl_Buffer` has been created with ds_buffer, using
wl_buffer_send_release to send a release message is no longer necessary.
The backend implementation of ds_buffer will handle this automatically.

Change-Id: Ica32684c2a74be6d6e7aa1046ba446d8b1f29d56

src/bin/e_comp_wl_buffer.c

index 06983e4..9788345 100644 (file)
@@ -17,7 +17,9 @@ static void _e_comp_wl_buffer_reference_cb_destroy(struct wl_listener *listener,
 
 static E_Buffer *_e_buffer_create(struct ds_buffer *ds_buffer, E_Client *ec);
 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_cb_resource_destroy(struct wl_listener *listener, void *data);
+static void _e_buffer_transform_update(E_Buffer *buffer);
 
 E_API void
 e_comp_wl_buffer_reference(E_Comp_Wl_Buffer_Ref *ref, E_Comp_Wl_Buffer *buffer)
@@ -56,16 +58,10 @@ EINTERN E_Comp_Wl_Buffer *
 e_comp_wl_buffer_get(struct ds_buffer *ds_buffer, E_Client *ec)
 {
    E_Buffer *buffer;
-   struct wl_listener *listener;
-   struct wl_resource *buffer_resource;
 
-   buffer_resource = ds_buffer_get_resource(ds_buffer);
-   listener = wl_resource_get_destroy_listener(buffer_resource, _e_buffer_cb_resource_destroy);
-   if (listener)
-     {
-        buffer = wl_container_of(listener, buffer, base.destroy_listener);
-        goto done;
-     }
+   buffer = _e_buffer_from_buffer(ds_buffer);
+   if (buffer)
+     goto done;
 
    buffer = _e_buffer_create(ds_buffer, ec);
    if (!buffer)
@@ -75,8 +71,7 @@ e_comp_wl_buffer_get(struct ds_buffer *ds_buffer, E_Client *ec)
      }
 
 done:
-   if (buffer->base.tbm_surface)
-     buffer->base.transform = wayland_tbm_server_buffer_get_buffer_transform(NULL, buffer->base.resource);
+   _e_buffer_transform_update(buffer);
 
    return &buffer->base;
 }
@@ -123,55 +118,48 @@ _e_comp_wl_buffer_ref(E_Comp_Wl_Buffer *base)
 }
 
 static void
-_e_comp_wl_buffer_unref(E_Comp_Wl_Buffer *base)
+_e_comp_wl_buffer_release(E_Comp_Wl_Buffer *base)
 {
    E_Buffer *buffer;
 
-   base->busy--;
-   if (base->busy != 0)
-     return;
-
    if (base->buffer_release)
      {
         e_explicit_sync_buffer_release_destroy(base->buffer_release);
         base->buffer_release = NULL;
      }
 
-   if (base->resource)
+   buffer = _e_buffer_from_base(base);
+   if (buffer)
      {
-        buffer = _e_buffer_from_base(base);
-        if (buffer)
-          ds_buffer_unlock(buffer->ds_buffer);
-        else
-          wl_buffer_send_release(base->resource);
+        ds_buffer_unlock(buffer->ds_buffer);
 
 #ifdef HAVE_WAYLAND_TBM
         wayland_tbm_server_increase_buffer_sync_timeline(e_comp_wl->tbm.server,
                                                          base->resource, 1);
 #endif
      }
-   else
+   else if (base->type == E_COMP_WL_BUFFER_TYPE_TBM)
      {
-        if (base->type == E_COMP_WL_BUFFER_TYPE_TBM)
-          e_comp_wl_tbm_buffer_destroy(base);
+        e_comp_wl_tbm_buffer_destroy(base);
      }
 }
 
 static void
+_e_comp_wl_buffer_unref(E_Comp_Wl_Buffer *base)
+{
+   base->busy--;
+   if (base->busy != 0)
+     return;
+
+   _e_comp_wl_buffer_release(base);
+}
+
+static void
 _e_comp_wl_buffer_reference_cb_destroy(struct wl_listener *listener, void *data)
 {
    E_Comp_Wl_Buffer_Ref *ref;
-   E_Buffer *buffer;
 
    ref = container_of(listener, E_Comp_Wl_Buffer_Ref, destroy_listener);
-
-   if (--ref->buffer->busy == 0)
-     {
-        buffer = _e_buffer_from_base(ref->buffer);
-        if (buffer)
-          ds_buffer_unlock(buffer->ds_buffer);
-     }
-
    wl_list_remove(&ref->destroy_listener.link);
    ref->buffer = NULL;
 }
@@ -314,13 +302,15 @@ _e_comp_wl_buffer_finish(E_Comp_Wl_Buffer *base)
    DBG("Wl Buffer Destroy: b %p owner '%s'(%p)",
        base, base->debug_info.owner_name, base->debug_info.owner_ptr);
 
+   wl_signal_emit(&base->destroy_signal, base);
+
    /* remove debug info */
    eina_stringshare_del(base->debug_info.owner_name);
 
    if (base->buffer_release)
      e_explicit_sync_buffer_release_destroy(base->buffer_release);
 
-   wl_signal_emit(&base->destroy_signal, base);
+   wl_list_remove(&base->destroy_listener.link);
 }
 
 static E_Buffer *
@@ -360,7 +350,29 @@ _e_buffer_cb_resource_destroy(struct wl_listener *listener, void *data)
 
    buffer = wl_container_of(listener, buffer, base.destroy_listener);
 
+   if (buffer->base.busy > 0)
+     ds_buffer_unlock(buffer->ds_buffer);
    _e_comp_wl_buffer_finish(&buffer->base);
-   wl_list_remove(&buffer->base.destroy_listener.link);
    free(buffer);
 }
+
+static E_Buffer *
+_e_buffer_from_buffer(struct ds_buffer *ds_buffer)
+{
+   E_Buffer *buffer;
+   struct wl_resource *resource;
+   struct wl_listener *listener;
+
+   resource = ds_buffer_get_resource(ds_buffer);
+   listener = wl_resource_get_destroy_listener(resource, _e_buffer_cb_resource_destroy);
+   if (listener)
+     return wl_container_of(listener, buffer, base.destroy_listener);
+   return NULL;
+}
+
+static void
+_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);
+}