e_comp_wl_buffer: Split out from e_comp_wl 80/295980/1
authorSeunghun Lee <shiin.lee@samsung.com>
Wed, 5 Jul 2023 00:45:26 +0000 (09:45 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Tue, 18 Jul 2023 04:40:27 +0000 (13:40 +0900)
Change-Id: Ibcc25759449243c7d820fd03f48a773912cc3868

src/bin/Makefile.mk
src/bin/e_comp_wl.c
src/bin/e_comp_wl_buffer.c [new file with mode: 0644]
src/bin/e_comp_wl_buffer.h [new file with mode: 0644]
src/bin/e_comp_wl_private.h [new file with mode: 0644]

index 2d1fa77..8e1194b 100644 (file)
@@ -274,7 +274,8 @@ 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_single_pixel_buffer.c
+src/bin/e_single_pixel_buffer.c \
+src/bin/e_comp_wl_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 9d17003..d44ffc1 100644 (file)
@@ -1,14 +1,13 @@
 #include "e.h"
 #include "e_foreign.h"
 #include "e_wtz_shell.h"
+#include "e_comp_wl_private.h"
 #include <tizen-extension-server-protocol.h>
 
 #include <relative-pointer-unstable-v1-server-protocol.h>
 #include <pointer-constraints-unstable-v1-server-protocol.h>
 
 #include <wayland-tbm-server.h>
-#include <gbm.h>
-#include <Evas_GL.h>
 #include <glib.h>
 
 /* handle include for printing uint64_t */
@@ -39,15 +38,6 @@ typedef struct _E_Comp_Wl_Key_Data
    Ecore_Device *dev;
 } E_Comp_Wl_Key_Data;
 
-struct _E_Comp_Wl_Evas_Gl
-{
-   Evas_GL *gl;
-   Evas_GL_Config *glcfg;
-   Evas_GL_Context *glctx;
-   Evas_GL_Surface *glsfc;
-   Evas_GL_API *glapi;
-};
-
 static Eina_List *handlers = NULL;
 static E_Client *cursor_timer_ec = NULL;
 static Eina_Bool need_send_released = EINA_FALSE;
@@ -2278,46 +2268,6 @@ _e_comp_wl_evas_cb_color_set(void *data, Evas_Object *obj, void *event EINA_UNUS
 }
 
 static void
-_e_comp_wl_buffer_reference_cb_destroy(struct wl_listener *listener, void *data)
-{
-   E_Comp_Wl_Buffer_Ref *ref;
-
-   ref = container_of(listener, E_Comp_Wl_Buffer_Ref, destroy_listener);
-   if ((E_Comp_Wl_Buffer *)data != ref->buffer) return;
-   ref->buffer = NULL;
-   ref->destroy_listener_usable = EINA_FALSE;
-}
-
-static void
-_e_comp_wl_buffer_cb_destroy(struct wl_listener *listener, void *data EINA_UNUSED)
-{
-   E_Comp_Wl_Buffer *buffer;
-
-   buffer = container_of(listener, E_Comp_Wl_Buffer, destroy_listener);
-
-   DBG("Wl Buffer Destroy: b %p owner '%s'(%p)",
-       buffer, buffer->debug_info.owner_name, buffer->debug_info.owner_ptr);
-
-   /* 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);
-
-   wl_signal_emit(&buffer->destroy_signal, buffer);
-
-   if (buffer->destroy_listener.notify)
-     {
-        wl_list_remove(&buffer->destroy_listener.link);
-        buffer->destroy_listener.notify = NULL;
-     }
-
-   free(buffer);
-}
-
-static void
 _e_comp_wl_buffer_damage_set(E_Comp_Wl_Buffer *buffer, Eina_List *buffer_damages)
 {
    Eina_Rectangle *damage_rect = NULL;
@@ -4879,268 +4829,6 @@ e_comp_wl_surface_commit(E_Client *ec)
    return EINA_TRUE;
 }
 
-static void
-_e_comp_wl_buffer_ref(E_Comp_Wl_Buffer *buffer)
-{
-   buffer->busy++;
-}
-
-static void
-_e_comp_wl_buffer_unref(E_Comp_Wl_Buffer *buffer)
-{
-   buffer->busy--;
-   if (buffer->busy != 0)
-     return;
-
-   if (buffer->buffer_release)
-     {
-        e_explicit_sync_buffer_release_destroy(buffer->buffer_release);
-        buffer->buffer_release = NULL;
-     }
-
-   if (buffer->resource)
-     {
-        if (!wl_resource_get_client(buffer->resource)) return;
-
-        wl_buffer_send_release(buffer->resource);
-#ifdef HAVE_WAYLAND_TBM
-        wayland_tbm_server_increase_buffer_sync_timeline(e_comp_wl->tbm.server,
-                                                         buffer->resource, 1);
-#endif
-     }
-   else
-     {
-        if (buffer->type == E_COMP_WL_BUFFER_TYPE_TBM)
-          e_comp_wl_tbm_buffer_destroy(buffer);
-     }
-}
-
-E_API void
-e_comp_wl_buffer_reference(E_Comp_Wl_Buffer_Ref *ref, E_Comp_Wl_Buffer *buffer)
-{
-   if (ref->buffer == buffer)
-     return;
-
-   if (ref->buffer)
-     {
-        _e_comp_wl_buffer_unref(ref->buffer);
-
-        if (ref->destroy_listener_usable)
-          {
-             wl_list_remove(&ref->destroy_listener.link);
-             ref->destroy_listener_usable = EINA_FALSE;
-          }
-     }
-
-   if (buffer)
-     {
-        _e_comp_wl_buffer_ref(buffer);
-
-        ref->destroy_listener.notify = _e_comp_wl_buffer_reference_cb_destroy;
-        wl_signal_add(&buffer->destroy_signal, &ref->destroy_listener);
-
-        ref->destroy_listener_usable = EINA_TRUE;
-     }
-
-   ref->buffer = buffer;
-}
-
-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;
-          }
-
-        if (!e_comp_wl_tbm_gbm_bo_user_data_set(tsurface, gbo))
-          {
-             tbm_surface_destroy(tsurface);
-             gbm_bo_destroy(gbo);
-             return EINA_FALSE;
-          }
-     }
-
-   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.
- *
- * Retrieves the Wayland SHM buffer for the resource and
- * uses it to create a new E_Comp_Wl_Buffer object. This
- * buffer will be freed when the resource is destroyed.
- *
- * @param resource that owns the desired buffer
- * @returns a new E_Comp_Wl_Buffer object
- */
-EINTERN E_Comp_Wl_Buffer *
-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 =
-     wl_resource_get_destroy_listener(resource, _e_comp_wl_buffer_cb_destroy);
-   if (listener)
-     {
-        buffer = container_of(listener, E_Comp_Wl_Buffer, destroy_listener);
-        goto update;
-     }
-
-   if (!(buffer = E_NEW(E_Comp_Wl_Buffer, 1))) return NULL;
-
-   shmbuff = wl_shm_buffer_get(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);
-        buffer->shm_buffer = shmbuff;
-     }
-
-   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) */
-        if (e_comp->use_native_type_buffer)
-          {
-             if (e_comp->gl)
-               {
-                  res = _e_comp_wl_buffer_native_type_get(buffer, resource, ec);
-                  EINA_SAFETY_ON_FALSE_GOTO(res, err);
-               }
-             else
-               {
-                  res = _e_comp_wl_buffer_tbm_type_get(buffer, resource, ec);
-                  EINA_SAFETY_ON_FALSE_GOTO(res, 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);
-
-             EINA_SAFETY_ON_FALSE_GOTO(res, err);
-          }
-     }
-
-   buffer->resource = resource;
-   wl_signal_init(&buffer->destroy_signal);
-   buffer->destroy_listener.notify = _e_comp_wl_buffer_cb_destroy;
-   wl_resource_add_destroy_listener(resource, &buffer->destroy_listener);
-
-   if (ec)
-     {
-        buffer->debug_info.owner_ptr = (void *)ec;
-        buffer->debug_info.owner_name = eina_stringshare_add(ec->icccm.name?:"");
-     }
-
-   DBG("Wl Buffer Create: b %p owner '%s'(%p)",
-       buffer, buffer->debug_info.owner_name, buffer->debug_info.owner_ptr);
-
-update:
-   if (buffer->tbm_surface)
-     buffer->transform = wayland_tbm_server_buffer_get_buffer_transform(NULL, resource);
-
-   return buffer;
-
-err:
-   ERR("Invalid resource:%u", wl_resource_get_id(resource));
-   E_FREE(buffer);
-   return NULL;
-}
-
 static E_Comp_Wl_Output *
 _e_comp_wl_output_get(Eina_List *outputs, const char *id)
 {
@@ -6984,4 +6672,4 @@ EINTERN void e_comp_wl_client_surface_set(E_Client *ec, struct wl_resource *surf
    g_mutex_lock(&ec->comp_data->surface_mutex);
    ec->comp_data->surface = surface;
    g_mutex_unlock(&ec->comp_data->surface_mutex);
-}
\ No newline at end of file
+}
diff --git a/src/bin/e_comp_wl_buffer.c b/src/bin/e_comp_wl_buffer.c
new file mode 100644 (file)
index 0000000..da89341
--- /dev/null
@@ -0,0 +1,311 @@
+#include "e_comp_wl_private.h"
+
+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 void _e_comp_wl_buffer_cb_destroy(struct wl_listener *listener, void *data);
+static Eina_Bool _e_comp_wl_buffer_native_type_get(E_Comp_Wl_Buffer *buffer, struct wl_resource *resource, E_Client *ec);
+static Eina_Bool _e_comp_wl_buffer_tbm_type_get(E_Comp_Wl_Buffer *buffer, struct wl_resource *resource, E_Client *ec);
+
+E_API void
+e_comp_wl_buffer_reference(E_Comp_Wl_Buffer_Ref *ref, E_Comp_Wl_Buffer *buffer)
+{
+   if (ref->buffer == buffer)
+     return;
+
+   if (ref->buffer)
+     {
+        _e_comp_wl_buffer_unref(ref->buffer);
+
+        if (ref->destroy_listener_usable)
+          {
+             wl_list_remove(&ref->destroy_listener.link);
+             ref->destroy_listener_usable = EINA_FALSE;
+          }
+     }
+
+   if (buffer)
+     {
+        _e_comp_wl_buffer_ref(buffer);
+
+        ref->destroy_listener.notify = _e_comp_wl_buffer_reference_cb_destroy;
+        wl_signal_add(&buffer->destroy_signal, &ref->destroy_listener);
+
+        ref->destroy_listener_usable = EINA_TRUE;
+     }
+
+   ref->buffer = buffer;
+}
+
+/**
+ * Get the buffer for a given resource.
+ *
+ * Retrieves the Wayland SHM buffer for the resource and
+ * uses it to create a new E_Comp_Wl_Buffer object. This
+ * buffer will be freed when the resource is destroyed.
+ *
+ * @param resource that owns the desired buffer
+ * @returns a new E_Comp_Wl_Buffer object
+ */
+EINTERN E_Comp_Wl_Buffer *
+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 =
+     wl_resource_get_destroy_listener(resource, _e_comp_wl_buffer_cb_destroy);
+   if (listener)
+     {
+        buffer = container_of(listener, E_Comp_Wl_Buffer, destroy_listener);
+        goto update;
+     }
+
+   if (!(buffer = E_NEW(E_Comp_Wl_Buffer, 1))) return NULL;
+
+   shmbuff = wl_shm_buffer_get(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);
+        buffer->shm_buffer = shmbuff;
+     }
+
+   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) */
+        if (e_comp->use_native_type_buffer)
+          {
+             if (e_comp->gl)
+               {
+                  res = _e_comp_wl_buffer_native_type_get(buffer, resource, ec);
+                  EINA_SAFETY_ON_FALSE_GOTO(res, err);
+               }
+             else
+               {
+                  res = _e_comp_wl_buffer_tbm_type_get(buffer, resource, ec);
+                  EINA_SAFETY_ON_FALSE_GOTO(res, 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);
+
+             EINA_SAFETY_ON_FALSE_GOTO(res, err);
+          }
+     }
+
+   buffer->resource = resource;
+   wl_signal_init(&buffer->destroy_signal);
+   buffer->destroy_listener.notify = _e_comp_wl_buffer_cb_destroy;
+   wl_resource_add_destroy_listener(resource, &buffer->destroy_listener);
+
+   if (ec)
+     {
+        buffer->debug_info.owner_ptr = (void *)ec;
+        buffer->debug_info.owner_name = eina_stringshare_add(ec->icccm.name?:"");
+     }
+
+   DBG("Wl Buffer Create: b %p owner '%s'(%p)",
+       buffer, buffer->debug_info.owner_name, buffer->debug_info.owner_ptr);
+
+update:
+   if (buffer->tbm_surface)
+     buffer->transform = wayland_tbm_server_buffer_get_buffer_transform(NULL, resource);
+
+   return buffer;
+
+err:
+   ERR("Invalid resource:%u", wl_resource_get_id(resource));
+   E_FREE(buffer);
+   return NULL;
+}
+
+static void
+_e_comp_wl_buffer_ref(E_Comp_Wl_Buffer *buffer)
+{
+   buffer->busy++;
+}
+
+static void
+_e_comp_wl_buffer_unref(E_Comp_Wl_Buffer *buffer)
+{
+   buffer->busy--;
+   if (buffer->busy != 0)
+     return;
+
+   if (buffer->buffer_release)
+     {
+        e_explicit_sync_buffer_release_destroy(buffer->buffer_release);
+        buffer->buffer_release = NULL;
+     }
+
+   if (buffer->resource)
+     {
+        if (!wl_resource_get_client(buffer->resource)) return;
+
+        wl_buffer_send_release(buffer->resource);
+#ifdef HAVE_WAYLAND_TBM
+        wayland_tbm_server_increase_buffer_sync_timeline(e_comp_wl->tbm.server,
+                                                         buffer->resource, 1);
+#endif
+     }
+   else
+     {
+        if (buffer->type == E_COMP_WL_BUFFER_TYPE_TBM)
+          e_comp_wl_tbm_buffer_destroy(buffer);
+     }
+}
+
+static void
+_e_comp_wl_buffer_reference_cb_destroy(struct wl_listener *listener, void *data)
+{
+   E_Comp_Wl_Buffer_Ref *ref;
+
+   ref = container_of(listener, E_Comp_Wl_Buffer_Ref, destroy_listener);
+   if ((E_Comp_Wl_Buffer *)data != ref->buffer) return;
+   ref->buffer = NULL;
+   ref->destroy_listener_usable = EINA_FALSE;
+}
+
+static void
+_e_comp_wl_buffer_cb_destroy(struct wl_listener *listener, void *data EINA_UNUSED)
+{
+   E_Comp_Wl_Buffer *buffer;
+
+   buffer = container_of(listener, E_Comp_Wl_Buffer, destroy_listener);
+
+   DBG("Wl Buffer Destroy: b %p owner '%s'(%p)",
+       buffer, buffer->debug_info.owner_name, buffer->debug_info.owner_ptr);
+
+   /* 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);
+
+   wl_signal_emit(&buffer->destroy_signal, buffer);
+
+   if (buffer->destroy_listener.notify)
+     {
+        wl_list_remove(&buffer->destroy_listener.link);
+        buffer->destroy_listener.notify = NULL;
+     }
+
+   free(buffer);
+}
+
+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;
+}
+
+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;
+          }
+
+        if (!e_comp_wl_tbm_gbm_bo_user_data_set(tsurface, gbo))
+          {
+             tbm_surface_destroy(tsurface);
+             gbm_bo_destroy(gbo);
+             return EINA_FALSE;
+          }
+     }
+
+   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;
+}
+
diff --git a/src/bin/e_comp_wl_buffer.h b/src/bin/e_comp_wl_buffer.h
new file mode 100644 (file)
index 0000000..2b5724f
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef E_COMP_WL_BUFFER_H
+#define E_COMP_WL_BUFFER_H
+
+EINTERN E_Comp_Wl_Buffer *e_comp_wl_buffer_get(struct wl_resource *resource, E_Client *ec);
+
+#endif
diff --git a/src/bin/e_comp_wl_private.h b/src/bin/e_comp_wl_private.h
new file mode 100644 (file)
index 0000000..f2bdf58
--- /dev/null
@@ -0,0 +1,19 @@
+#ifndef E_COMP_WL_PRIVATE_H
+#define E_COMP_WL_PRIVATE_H
+
+#include <gbm.h>
+#include <Evas_GL.h>
+
+#include "e.h"
+#include "e_comp_wl_buffer.h"
+
+struct _E_Comp_Wl_Evas_Gl
+{
+   Evas_GL *gl;
+   Evas_GL_Config *glcfg;
+   Evas_GL_Context *glctx;
+   Evas_GL_Surface *glsfc;
+   Evas_GL_API *glapi;
+};
+
+#endif