#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)
{
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;
+}