e_comp_wl_tbm: Add internal func e_comp_wl_tbm_import_gbm_bo 72/261972/7
authorChangyeon Lee <cyeon.lee@samsung.com>
Fri, 9 Apr 2021 03:37:21 +0000 (12:37 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Mon, 2 Aug 2021 03:56:52 +0000 (12:56 +0900)
this api for converting gbm_bo to tbm_surface

Change-Id: Ib6439fd4c64974aac95845ccac295ac9db486edf

src/bin/e_comp_wl_tbm.c [changed mode: 0644->0755]
src/bin/e_comp_wl_tbm.h

old mode 100644 (file)
new mode 100755 (executable)
index f87a5cc..d5b0d6d
@@ -2,9 +2,92 @@
 #include <wayland-tbm-server.h>
 #include <tbm_bufmgr.h>
 #include <tbm_surface_internal.h>
+#include <gbm.h>
 
 static E_Comp_Wl_Tbm_Funcs *_e_comp_wl_tbm_funcs = NULL;
 
+typedef struct {
+   unsigned int gbm_format;
+   tbm_format tbm_format;
+} gbm_format_data;
+
+static const gbm_format_data gbm_formats[] = {
+   {GBM_FORMAT_C8, TBM_FORMAT_C8},
+   {GBM_FORMAT_RGB332, TBM_FORMAT_RGB332},
+   {GBM_FORMAT_BGR233, TBM_FORMAT_BGR233},
+   {GBM_FORMAT_XRGB4444, TBM_FORMAT_XRGB4444},
+   {GBM_FORMAT_XBGR4444, TBM_FORMAT_XBGR4444},
+   {GBM_FORMAT_RGBX4444, TBM_FORMAT_RGBX4444},
+   {GBM_FORMAT_BGRX4444, TBM_FORMAT_BGRX4444},
+   {GBM_FORMAT_ARGB4444, TBM_FORMAT_ARGB4444},
+   {GBM_FORMAT_ABGR4444, TBM_FORMAT_ABGR4444},
+   {GBM_FORMAT_RGBA4444, TBM_FORMAT_RGBA4444},
+   {GBM_FORMAT_BGRA4444, TBM_FORMAT_BGRA4444},
+   {GBM_FORMAT_XRGB1555, TBM_FORMAT_XRGB1555},
+   {GBM_FORMAT_XBGR1555, TBM_FORMAT_XBGR1555},
+   {GBM_FORMAT_RGBX5551, TBM_FORMAT_RGBX5551},
+   {GBM_FORMAT_BGRX5551, TBM_FORMAT_BGRX5551},
+   {GBM_FORMAT_ARGB1555, TBM_FORMAT_ARGB1555},
+   {GBM_FORMAT_ABGR1555, TBM_FORMAT_ABGR1555},
+   {GBM_FORMAT_RGBA5551, TBM_FORMAT_RGBA5551},
+   {GBM_FORMAT_BGRA5551, TBM_FORMAT_BGRA5551},
+   {GBM_FORMAT_RGB565, TBM_FORMAT_RGB565},
+   {GBM_FORMAT_BGR565, TBM_FORMAT_BGR565},
+   {GBM_FORMAT_RGB888, TBM_FORMAT_RGB888},
+   {GBM_FORMAT_BGR888, TBM_FORMAT_BGR888},
+   {GBM_FORMAT_XRGB8888, TBM_FORMAT_XRGB8888},
+   {GBM_FORMAT_XBGR8888, TBM_FORMAT_XBGR8888},
+   {GBM_FORMAT_RGBX8888, TBM_FORMAT_RGBX8888},
+   {GBM_FORMAT_BGRX8888, TBM_FORMAT_BGRX8888},
+   {GBM_FORMAT_ARGB8888, TBM_FORMAT_ARGB8888},
+   {GBM_FORMAT_ABGR8888, TBM_FORMAT_ABGR8888},
+   {GBM_FORMAT_RGBA8888, TBM_FORMAT_RGBA8888},
+   {GBM_FORMAT_BGRA8888, TBM_FORMAT_BGRA8888},
+   {GBM_FORMAT_XRGB2101010, TBM_FORMAT_XRGB2101010},
+   {GBM_FORMAT_XBGR2101010, TBM_FORMAT_XBGR2101010},
+   {GBM_FORMAT_RGBX1010102, TBM_FORMAT_RGBX1010102},
+   {GBM_FORMAT_BGRX1010102, TBM_FORMAT_BGRX1010102},
+   {GBM_FORMAT_ARGB2101010, TBM_FORMAT_ARGB2101010},
+   {GBM_FORMAT_ABGR2101010, TBM_FORMAT_ABGR2101010},
+   {GBM_FORMAT_RGBA1010102, TBM_FORMAT_RGBA1010102},
+   {GBM_FORMAT_BGRA1010102, TBM_FORMAT_BGRA1010102},
+   {GBM_FORMAT_YUYV, TBM_FORMAT_YUYV},
+   {GBM_FORMAT_YVYU, TBM_FORMAT_YVYU},
+   {GBM_FORMAT_UYVY, TBM_FORMAT_UYVY},
+   {GBM_FORMAT_VYUY, TBM_FORMAT_VYUY},
+   {GBM_FORMAT_AYUV, TBM_FORMAT_AYUV},
+   {GBM_FORMAT_NV12, TBM_FORMAT_NV12},
+   {GBM_FORMAT_NV21, TBM_FORMAT_NV21},
+   {GBM_FORMAT_NV16, TBM_FORMAT_NV16},
+   {GBM_FORMAT_NV61, TBM_FORMAT_NV61},
+   {GBM_FORMAT_YUV410, TBM_FORMAT_YUV410},
+   {GBM_FORMAT_YVU410, TBM_FORMAT_YVU410},
+   {GBM_FORMAT_YUV411, TBM_FORMAT_YUV411},
+   {GBM_FORMAT_YVU411, TBM_FORMAT_YVU411},
+   {GBM_FORMAT_YUV420, TBM_FORMAT_YUV420},
+   {GBM_FORMAT_YVU420, TBM_FORMAT_YVU420},
+   {GBM_FORMAT_YUV422, TBM_FORMAT_YUV422},
+   {GBM_FORMAT_YVU422, TBM_FORMAT_YVU422},
+   {GBM_FORMAT_YUV444, TBM_FORMAT_YUV444},
+   {GBM_FORMAT_YVU444, TBM_FORMAT_YVU444},
+};
+
+#define NUM_GBM_FORMATS (sizeof(gbm_formats) / sizeof(gbm_formats[0]))
+
+int
+_convert_to_tbm_format_from_gbm_format (int gbm_format)
+{
+   int i;
+
+   for (i = 0; i < NUM_GBM_FORMATS; i++)
+     if (gbm_formats[i].gbm_format == gbm_format)
+       return gbm_formats[i].tbm_format;
+
+   ERR("fail to find tbm_format with gbm_format(%c%c%c%c)", FOURCC_STR(gbm_format));
+
+   return 0;
+}
+
 static int
 _e_comp_wl_tbm_bind_wl_display(struct wayland_tbm_server *tbm_server, struct wl_display *display)
 {
@@ -251,3 +334,43 @@ e_comp_wl_tbm_aligned_width_get(tbm_surface_h tsurface)
 
    return aligned_width;
 }
+
+EINTERN tbm_surface_h
+e_comp_wl_tbm_import_gbm_bo(void *gbo)
+{
+   tbm_surface_info_s info = {0, };
+   tbm_surface_h tsurface = NULL;
+   tbm_bo tbo = NULL;
+   int fd = -1;
+   int i;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp, NULL);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp->e_comp_screen, NULL);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp->e_comp_screen->bufmgr, NULL);
+
+   info.width = gbm_bo_get_width(gbo);
+   info.height = gbm_bo_get_height(gbo);
+   info.format = _convert_to_tbm_format_from_gbm_format(gbm_bo_get_format(gbo));
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(info.format == 0, NULL);
+
+   info.num_planes = tbm_surface_internal_get_num_planes(info.format);
+   for (i = 0; i < info.num_planes; i++)
+     {
+        info.planes[i].stride = gbm_bo_get_stride_for_plane(gbo, i);
+        info.planes[i].offset = gbm_bo_get_offset(gbo, i);
+     }
+
+   /* do not close fd, gbm backend doesn't return new fd */
+   fd = gbm_bo_get_fd(gbo);
+   EINA_SAFETY_ON_FALSE_GOTO(fd >= 0, end);
+
+   tbo = tbm_bo_import_fd(e_comp->e_comp_screen->bufmgr, fd);
+   EINA_SAFETY_ON_NULL_GOTO(tbo, end);
+
+   tsurface = tbm_surface_internal_create_with_bos(&info, &tbo, 1);
+   EINA_SAFETY_ON_NULL_GOTO(tsurface, end);
+
+end:
+   if (tbo) tbm_bo_unref(tbo);
+   return tsurface;
+}
index 39d6f2e..4ecabf4 100644 (file)
@@ -27,6 +27,7 @@ EINTERN struct wl_resource *e_comp_wl_tbm_remote_buffer_get(struct wl_resource *
 EINTERN struct wl_resource *e_comp_wl_tbm_remote_buffer_get_with_tbm(struct wl_resource *wl_tbm, tbm_surface_h tbm_surface);
 
 EINTERN unsigned int e_comp_wl_tbm_aligned_width_get(tbm_surface_h tsurface);
+EINTERN tbm_surface_h e_comp_wl_tbm_import_gbm_bo(void *gbo);
 
 E_API   Eina_Bool e_comp_wl_tbm_module_func_set(const char *module_name, E_Comp_Wl_Tbm_Funcs *fn);
 E_API   Eina_Bool e_comp_wl_tbm_module_func_unset(void);
@@ -34,5 +35,6 @@ E_API   Eina_Bool e_comp_wl_tbm_module_func_unset(void);
 /* reference count of returned tbm_surface should be decreased when not using it anymore */
 EINTERN tbm_surface_h e_comp_wl_tbm_capturable_buffer_get(tbm_surface_h tsurface);
 EINTERN tbm_surface_h e_comp_wl_tbm_egl_image_buffer_get(int width, int height, tbm_format format);
+
 # endif
 #endif