e_comp_wl: Create E_Comp_Wl_Buffer with gbm_bo 70/262470/4
authorChangyeon Lee <cyeon.lee@samsung.com>
Wed, 23 Jun 2021 07:29:11 +0000 (16:29 +0900)
committerchangyeon lee <cyeon.lee@samsung.com>
Mon, 6 Sep 2021 01:50:15 +0000 (01:50 +0000)
Convert wl_buffer to gbm_bo and gbm_bo to tbm_surface
E_Comp_Wl_Buffer is created with tbm_surface and set by tbm type

Change-Id: I93f06aeba0544f6981cae60228cb4add14904c74

src/bin/e_comp_screen.h
src/bin/e_comp_wl.c

index 98e66cd..8236d30 100644 (file)
@@ -20,6 +20,7 @@ struct _E_Comp_Screen
    int            num_outputs;
    tdm_display   *tdisplay;
    tbm_bufmgr     bufmgr;
+   void          *gdevice;
 
    /* for sw compositing */
    const Eina_List *devices;
index d36cea2..fc6c315 100644 (file)
@@ -3,6 +3,7 @@
 #include <tizen-extension-server-protocol.h>
 
 #include <wayland-tbm-server.h>
+#include <gbm.h>
 #include <Evas_GL.h>
 
 /* handle include for printing uint64_t */
@@ -2010,6 +2011,8 @@ _e_comp_wl_buffer_cb_destroy(struct wl_listener *listener, void *data EINA_UNUSE
    /* remove debug info */
    eina_stringshare_del(buffer->debug_info.owner_name);
 
+   if (buffer->tbm_surface) tbm_surface_internal_unref(buffer->tbm_surface);
+
    if (buffer->buffer_release)
      e_explicit_sync_buffer_release_destroy(buffer->buffer_release);
 
@@ -4526,6 +4529,92 @@ e_comp_wl_buffer_reference(E_Comp_Wl_Buffer_Ref *ref, E_Comp_Wl_Buffer *buffer)
    ref->destroy_listener.notify = _e_comp_wl_buffer_reference_cb_destroy;
 }
 
+static Eina_Bool
+_e_comp_wl_buffer_tbm_type_get(E_Comp_Wl_Buffer *buffer, struct wl_resource *resource,
+                               E_Client *ec)
+{
+   tbm_surface_h tsurface;
+   struct gbm_bo *gbo;
+
+   if (!buffer || !resource || !ec) return EINA_FALSE;
+
+   tsurface = wayland_tbm_server_get_surface(e_comp_wl->tbm.server, resource);
+   if (tsurface)
+     {
+        tbm_surface_internal_ref(tsurface);
+     }
+   else
+     {
+        if (!e_comp->e_comp_screen->gdevice) return EINA_FALSE;
+
+        gbo = gbm_bo_import(e_comp->e_comp_screen->gdevice, GBM_BO_IMPORT_WL_BUFFER,
+                            resource, GBM_BO_USE_RENDERING);
+        if (!gbo) return EINA_FALSE;
+
+        tsurface = e_comp_wl_tbm_import_gbm_bo(gbo);
+        if (!tsurface)
+          {
+             gbm_bo_destroy(gbo);
+             return EINA_FALSE;
+          }
+
+        gbm_bo_destroy(gbo);
+     }
+
+   if ((ec) && (ec->comp_data->video_client))
+     {
+        buffer->type = E_COMP_WL_BUFFER_TYPE_VIDEO;
+        buffer->w = buffer->h = 1;
+        buffer->format = 0;
+     }
+   else if ((ec) && (e_client_video_hw_composition_check(ec)))
+     {
+        buffer->type = E_COMP_WL_BUFFER_TYPE_VIDEO;
+        buffer->w = tbm_surface_get_width(tsurface);
+        buffer->h = tbm_surface_get_height(tsurface);
+        buffer->format = tbm_surface_get_format(tsurface);
+     }
+   else
+     {
+        buffer->type = E_COMP_WL_BUFFER_TYPE_TBM;
+        buffer->w = tbm_surface_get_width(tsurface);
+        buffer->h = tbm_surface_get_height(tsurface);
+        buffer->format = tbm_surface_get_format(tsurface);
+     }
+
+   buffer->tbm_surface = tsurface;
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_e_comp_wl_buffer_native_type_get(E_Comp_Wl_Buffer *buffer, struct wl_resource *resource,
+                                  E_Client *ec)
+{
+   Eina_Bool res;
+
+   if (!buffer || !resource || !ec) return EINA_FALSE;
+
+   buffer->type = E_COMP_WL_BUFFER_TYPE_NATIVE;
+   res = e_comp_wl->evas_gl->glapi->evasglQueryWaylandBuffer(e_comp_wl->evas_gl->gl,
+                                                             resource,
+                                                             EVAS_GL_WIDTH,
+                                                             &buffer->w);
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EINA_FALSE);
+   res = e_comp_wl->evas_gl->glapi->evasglQueryWaylandBuffer(e_comp_wl->evas_gl->gl,
+                                                             resource,
+                                                             EVAS_GL_HEIGHT,
+                                                             &buffer->h);
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EINA_FALSE);
+   res = e_comp_wl->evas_gl->glapi->evasglQueryWaylandBuffer(e_comp_wl->evas_gl->gl,
+                                                             resource,
+                                                             EVAS_GL_TEXTURE_FORMAT,
+                                                             &buffer->format);
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EINA_FALSE);
+
+   return EINA_TRUE;
+}
+
 /**
  * Get the buffer for a given resource.
  *
@@ -4543,7 +4632,6 @@ e_comp_wl_buffer_get(struct wl_resource *resource, E_Client *ec)
    struct wl_listener *listener;
    struct wl_shm_buffer *shmbuff;
    Eina_Bool res;
-   tbm_surface_h tbm_surf;
 
    listener =
      wl_resource_get_destroy_listener(resource, _e_comp_wl_buffer_cb_destroy);
@@ -4556,145 +4644,40 @@ e_comp_wl_buffer_get(struct wl_resource *resource, E_Client *ec)
    if (!(buffer = E_NEW(E_Comp_Wl_Buffer, 1))) return NULL;
 
    shmbuff = wl_shm_buffer_get(resource);
-
-   /* TODO: This option is temporarily. It will be removed later. */
-   /* prefer to use native buffer(wl_buffer) */
-   if (e_comp->use_native_type_buffer)
+   if (shmbuff)
      {
-        if (shmbuff)
-          {
-             buffer->type = E_COMP_WL_BUFFER_TYPE_SHM;
-
-             buffer->w = wl_shm_buffer_get_width(shmbuff);
-             buffer->h = wl_shm_buffer_get_height(shmbuff);
-             buffer->format = wl_shm_buffer_get_format(shmbuff);
-          }
-        else
+        buffer->type = E_COMP_WL_BUFFER_TYPE_SHM;
+        buffer->w = wl_shm_buffer_get_width(shmbuff);
+        buffer->h = wl_shm_buffer_get_height(shmbuff);
+        buffer->format = wl_shm_buffer_get_format(shmbuff);
+        buffer->shm_buffer = shmbuff;
+     }
+   else
+     {
+        /* TODO: This option is temporarily. It will be removed later. */
+        /* prefer to use native buffer(wl_buffer) */
+        if (e_comp->use_native_type_buffer)
           {
-             if ((ec) && (ec->comp_data->video_client))
-               {
-                  buffer->type = E_COMP_WL_BUFFER_TYPE_VIDEO;
-                  buffer->w = buffer->h = 1;
-                  buffer->format = 0;
-               }
-             else if ((ec) && (e_client_video_hw_composition_check(ec)))
-               {
-                  tbm_surf = wayland_tbm_server_get_surface(e_comp_wl->tbm.server, resource);
-                  if (!tbm_surf)
-                    goto err;
-
-                  buffer->type = E_COMP_WL_BUFFER_TYPE_VIDEO;
-                  buffer->w = tbm_surface_get_width(tbm_surf);
-                  buffer->h = tbm_surface_get_height(tbm_surf);
-                  buffer->format = tbm_surface_get_format(tbm_surf);
-                  buffer->tbm_surface = tbm_surf;
-               }
-             else if (e_comp->gl)
+             if (e_comp->gl)
                {
-                  buffer->type = E_COMP_WL_BUFFER_TYPE_NATIVE;
-
-                  res = e_comp_wl->evas_gl->glapi->evasglQueryWaylandBuffer(e_comp_wl->evas_gl->gl,
-                                                                            resource,
-                                                                            EVAS_GL_WIDTH,
-                                                                            &buffer->w);
-                  EINA_SAFETY_ON_FALSE_GOTO(res, err);
-
-                  res = e_comp_wl->evas_gl->glapi->evasglQueryWaylandBuffer(e_comp_wl->evas_gl->gl,
-                                                                            resource,
-                                                                            EVAS_GL_HEIGHT,
-                                                                            &buffer->h);
-                  EINA_SAFETY_ON_FALSE_GOTO(res, err);
-
-                  res = e_comp_wl->evas_gl->glapi->evasglQueryWaylandBuffer(e_comp_wl->evas_gl->gl,
-                                                                            resource,
-                                                                            EVAS_GL_TEXTURE_FORMAT,
-                                                                            &buffer->format);
+                  res = _e_comp_wl_buffer_native_type_get(buffer, resource, ec);
                   EINA_SAFETY_ON_FALSE_GOTO(res, err);
                }
              else
                {
-                  tbm_surf = wayland_tbm_server_get_surface(e_comp_wl->tbm.server, resource);
-                  if (!tbm_surf)
-                    goto err;
-
-                  buffer->type = E_COMP_WL_BUFFER_TYPE_NATIVE;
-                  buffer->w = tbm_surface_get_width(tbm_surf);
-                  buffer->h = tbm_surface_get_height(tbm_surf);
-                  buffer->format = tbm_surface_get_format(tbm_surf);
-                  buffer->tbm_surface = tbm_surf;
+                  res = _e_comp_wl_buffer_tbm_type_get(buffer, resource, ec);
+                  EINA_SAFETY_ON_FALSE_GOTO(res, err);
                }
           }
-          buffer->shm_buffer = shmbuff;
-       }
-     else
-       {
-          tbm_surf = wayland_tbm_server_get_surface(e_comp_wl->tbm.server, resource);
-
-          if (shmbuff)
-            {
-               buffer->type = E_COMP_WL_BUFFER_TYPE_SHM;
-
-               buffer->w = wl_shm_buffer_get_width(shmbuff);
-               buffer->h = wl_shm_buffer_get_height(shmbuff);
-               buffer->format = wl_shm_buffer_get_format(shmbuff);
-            }
-          else if (tbm_surf)
-            {
-               tbm_surf = wayland_tbm_server_get_surface(e_comp_wl->tbm.server, resource);
-               if (!tbm_surf)
-                 goto err;
-
-               if ((ec) && (ec->comp_data->video_client))
-                 {
-                    buffer->type = E_COMP_WL_BUFFER_TYPE_VIDEO;
-                    buffer->w = buffer->h = 1;
-                    buffer->format = 0;
-                 }
-               else if ((ec) && (e_client_video_hw_composition_check(ec)))
-                 {
-                    buffer->type = E_COMP_WL_BUFFER_TYPE_VIDEO;
-                    buffer->w = tbm_surface_get_width(tbm_surf);
-                    buffer->h = tbm_surface_get_height(tbm_surf);
-                    buffer->format = tbm_surface_get_format(tbm_surf);
-                 }
-               else
-                 {
-                    buffer->type = E_COMP_WL_BUFFER_TYPE_TBM;
-                    buffer->w = tbm_surface_get_width(tbm_surf);
-                    buffer->h = tbm_surface_get_height(tbm_surf);
-                    buffer->format = tbm_surface_get_format(tbm_surf);
-                 }
-            }
-          else if (e_comp->gl)
-            {
-                buffer->type = E_COMP_WL_BUFFER_TYPE_NATIVE;
-
-                res = e_comp_wl->evas_gl->glapi->evasglQueryWaylandBuffer(e_comp_wl->evas_gl->gl,
-                                                                          resource,
-                                                                          EVAS_GL_WIDTH,
-                                                                          &buffer->w);
-                EINA_SAFETY_ON_FALSE_GOTO(res, err);
-
-                res = e_comp_wl->evas_gl->glapi->evasglQueryWaylandBuffer(e_comp_wl->evas_gl->gl,
-                                                                          resource,
-                                                                          EVAS_GL_HEIGHT,
-                                                                          &buffer->h);
-                EINA_SAFETY_ON_FALSE_GOTO(res, err);
-
-                res = e_comp_wl->evas_gl->glapi->evasglQueryWaylandBuffer(e_comp_wl->evas_gl->gl,
-                                                                          resource,
-                                                                          EVAS_GL_TEXTURE_FORMAT,
-                                                                          &buffer->format);
-                EINA_SAFETY_ON_FALSE_GOTO(res, err);
-            }
-          else
-            {
-                goto err;
-            }
+        else
+          {
+             res = _e_comp_wl_buffer_tbm_type_get(buffer, resource, ec);
+             if (!res && e_comp->gl)
+               res = _e_comp_wl_buffer_native_type_get(buffer,resource, ec);
 
-          buffer->shm_buffer = shmbuff;
-          buffer->tbm_surface = tbm_surf;
-       }
+             EINA_SAFETY_ON_FALSE_GOTO(res, err);
+          }
+     }
 
    buffer->resource = resource;
    wl_signal_init(&buffer->destroy_signal);