* Types for export buffer.
* @since 1.15
*/
-typedef enum _Ecore_Export_Type
+enum _Ecore_Export_Type
{
EXPORT_TYPE_INVALID,
EXPORT_TYPE_ID,
EXPORT_TYPE_FD
-} Ecore_Export_Type;
+};
+
+/**
+ * @typedef Ecore_Buffer_Plane
+ * Types for plane information.
+ * @since 1.15
+ */
+typedef struct _Ecore_Buffer_Plane Ecore_Buffer_Plane;
+
+/**
+ * @typedef Ecore_Buffer_Info
+ * Types for buffer information.
+ * @since 1.15
+ */
+typedef struct _Ecore_Buffer_Info Ecore_Buffer_Info;
+
+/**
+ * @brief Definition for the maximum number of Ecore_Buffer's plane.
+ * @since 1.15
+ */
+#define ECORE_BUFFER_PLANE_MAX 4
+
+/**
+ * @brief Definition for the Ecore_Buffer plane struct.
+ * @since 1.15
+ */
+struct _Ecore_Buffer_Plane
+{
+ int size;
+ int offset;
+ int stride;
+};
+
+/**
+ * @brief Definition for the Ecore_Buffer information struct.
+ * @since 1.15
+ */
+struct _Ecore_Buffer_Info
+{
+ int width;
+ int height;
+ int bpp;
+ int size;
+ Ecore_Buffer_Format format;
+
+ int num_planes;
+ Ecore_Buffer_Plane planes[ECORE_BUFFER_PLANE_MAX];
+ Ecore_Pixmap pixmap;
+};
/**
* @struct _Ecore_Buffer_Backend
int *ret_w, int *ret_h,
Ecore_Buffer_Format *ret_format,
unsigned int flags); /**< Create Ecore_Buffer from existed tbm_surface handle. */
+ Eina_Bool (*buffer_info_get)(Ecore_Buffer_Module_Data bmdata,
+ Ecore_Buffer_Data bdata,
+ Ecore_Buffer_Info *info);
void (*buffer_free)(Ecore_Buffer_Module_Data bmdata,
Ecore_Buffer_Data bdata); /**< Free allocated memory */
Ecore_Export_Type (*buffer_export)(Ecore_Buffer_Module_Data bmdata,
Ecore_Buffer_Data bdata, int *id); /**< Get the id or fd of Ecore_Buffer for exporting it */
Ecore_Buffer_Data (*buffer_import)(Ecore_Buffer_Module_Data bmdata,
- int w, int h,
- Ecore_Buffer_Format format,
+ Ecore_Buffer_Info *info,
Ecore_Export_Type type,
int export_id,
unsigned int flags); /**< Import and create Ecore_Buffer from id or fd */
static const struct wl_message bq_consumer_requests[] = {
{ "release_buffer", "o", types + 10 },
+ { "destroy", "2", types + 0 },
};
static const struct wl_message bq_consumer_events[] = {
};
WL_EXPORT const struct wl_interface bq_consumer_interface = {
- "bq_consumer", 1,
- 1, bq_consumer_requests,
+ "bq_consumer", 2,
+ 2, bq_consumer_requests,
7, bq_consumer_events,
};
{ "set_buffer_fd", "ohiiiiii", types + 50 },
{ "detach_buffer", "o", types + 58 },
{ "enqueue_buffer", "ou", types + 59 },
+ { "destroy", "2", types + 0 },
};
static const struct wl_message bq_provider_events[] = {
};
WL_EXPORT const struct wl_interface bq_provider_interface = {
- "bq_provider", 1,
- 5, bq_provider_requests,
+ "bq_provider", 2,
+ 6, bq_provider_requests,
3, bq_provider_events,
};
+static const struct wl_message bq_buffer_requests[] = {
+ { "destroy", "2", types + 0 },
+};
+
WL_EXPORT const struct wl_interface bq_buffer_interface = {
- "bq_buffer", 1,
- 0, NULL,
+ "bq_buffer", 2,
+ 1, bq_buffer_requests,
0, NULL,
};
struct wl_client;
struct wl_resource;
-struct bq_mgr;
+struct bq_buffer;
struct bq_consumer;
+struct bq_mgr;
struct bq_provider;
-struct bq_buffer;
extern const struct wl_interface bq_mgr_interface;
extern const struct wl_interface bq_consumer_interface;
#define BQ_MGR_CREATE_CONSUMER 0
#define BQ_MGR_CREATE_PROVIDER 1
+#define BQ_MGR_CREATE_CONSUMER_SINCE_VERSION 1
+#define BQ_MGR_CREATE_PROVIDER_SINCE_VERSION 1
+
static inline void
bq_mgr_set_user_data(struct bq_mgr *bq_mgr, void *user_data)
{
return wl_proxy_get_user_data((struct wl_proxy *) bq_mgr);
}
+static inline uint32_t
+bq_mgr_get_version(struct bq_mgr *bq_mgr)
+{
+ return wl_proxy_get_version((struct wl_proxy *) bq_mgr);
+}
+
static inline void
bq_mgr_destroy(struct bq_mgr *bq_mgr)
{
}
#define BQ_CONSUMER_RELEASE_BUFFER 0
+#define BQ_CONSUMER_DESTROY 1
+
+#define BQ_CONSUMER_RELEASE_BUFFER_SINCE_VERSION 1
+#define BQ_CONSUMER_DESTROY_SINCE_VERSION 2
static inline void
bq_consumer_set_user_data(struct bq_consumer *bq_consumer, void *user_data)
return wl_proxy_get_user_data((struct wl_proxy *) bq_consumer);
}
-static inline void
-bq_consumer_destroy(struct bq_consumer *bq_consumer)
+static inline uint32_t
+bq_consumer_get_version(struct bq_consumer *bq_consumer)
{
- wl_proxy_destroy((struct wl_proxy *) bq_consumer);
+ return wl_proxy_get_version((struct wl_proxy *) bq_consumer);
}
static inline void
BQ_CONSUMER_RELEASE_BUFFER, buffer);
}
+static inline void
+bq_consumer_destroy(struct bq_consumer *bq_consumer)
+{
+ wl_proxy_marshal((struct wl_proxy *) bq_consumer,
+ BQ_CONSUMER_DESTROY);
+
+ wl_proxy_destroy((struct wl_proxy *) bq_consumer);
+}
+
#ifndef BQ_PROVIDER_ERROR_ENUM
#define BQ_PROVIDER_ERROR_ENUM
enum bq_provider_error {
#define BQ_PROVIDER_SET_BUFFER_FD 2
#define BQ_PROVIDER_DETACH_BUFFER 3
#define BQ_PROVIDER_ENQUEUE_BUFFER 4
+#define BQ_PROVIDER_DESTROY 5
+
+#define BQ_PROVIDER_ATTACH_BUFFER_SINCE_VERSION 1
+#define BQ_PROVIDER_SET_BUFFER_ID_SINCE_VERSION 1
+#define BQ_PROVIDER_SET_BUFFER_FD_SINCE_VERSION 1
+#define BQ_PROVIDER_DETACH_BUFFER_SINCE_VERSION 1
+#define BQ_PROVIDER_ENQUEUE_BUFFER_SINCE_VERSION 1
+#define BQ_PROVIDER_DESTROY_SINCE_VERSION 2
static inline void
bq_provider_set_user_data(struct bq_provider *bq_provider, void *user_data)
return wl_proxy_get_user_data((struct wl_proxy *) bq_provider);
}
-static inline void
-bq_provider_destroy(struct bq_provider *bq_provider)
+static inline uint32_t
+bq_provider_get_version(struct bq_provider *bq_provider)
{
- wl_proxy_destroy((struct wl_proxy *) bq_provider);
+ return wl_proxy_get_version((struct wl_proxy *) bq_provider);
}
static inline struct bq_buffer *
BQ_PROVIDER_ENQUEUE_BUFFER, buffer, serial);
}
+static inline void
+bq_provider_destroy(struct bq_provider *bq_provider)
+{
+ wl_proxy_marshal((struct wl_proxy *) bq_provider,
+ BQ_PROVIDER_DESTROY);
+
+ wl_proxy_destroy((struct wl_proxy *) bq_provider);
+}
+
+#define BQ_BUFFER_DESTROY 0
+
+#define BQ_BUFFER_DESTROY_SINCE_VERSION 2
+
static inline void
bq_buffer_set_user_data(struct bq_buffer *bq_buffer, void *user_data)
{
return wl_proxy_get_user_data((struct wl_proxy *) bq_buffer);
}
+static inline uint32_t
+bq_buffer_get_version(struct bq_buffer *bq_buffer)
+{
+ return wl_proxy_get_version((struct wl_proxy *) bq_buffer);
+}
+
static inline void
bq_buffer_destroy(struct bq_buffer *bq_buffer)
{
+ wl_proxy_marshal((struct wl_proxy *) bq_buffer,
+ BQ_BUFFER_DESTROY);
+
wl_proxy_destroy((struct wl_proxy *) bq_buffer);
}
struct _Ecore_Buffer
{
- unsigned int width;
- unsigned int height;
- int format;
unsigned int flags;
+ Ecore_Buffer_Info info;
Ecore_Buffer_Data buffer_data;
Ecore_Buffer_Module *bm;
if ((!bm) || (!bm->be) || (!bm->be->init))
return NULL;
- bm->data = bm->be->init(NULL, NULL);
+ if (!bm->data)
+ bm->data = bm->be->init(NULL, NULL);
return bm;
}
return NULL;
}
+ if (bm->be->buffer_info_get)
+ bm->be->buffer_info_get(bm->data, bo_data, &bo->info);
+ else
+ {
+ bo->info.width = width;
+ bo->info.height = height;
+ bo->info.format = format;
+ }
+
bo->bm = bm;
- bo->width = width;
- bo->height = height;
- bo->format = format;
bo->flags = flags;
bo->buffer_data = bo_data;
return NULL;
}
+ if (bm->be->buffer_info_get)
+ bm->be->buffer_info_get(bm->data, bo_data, &bo->info);
+ else
+ {
+ bo->info.width = w;
+ bo->info.height = h;
+ bo->info.format = format;
+ }
+
bo->bm = bm;
bo->flags = flags;
bo->buffer_data = bo_data;
- bo->width = w;
- bo->height = h;
- bo->format = format;
return bo;
}
{
EINA_SAFETY_ON_NULL_RETURN_VAL(buf, EINA_FALSE);
- if (width) *width = buf->width;
- if (height) *height = buf->height;
+ if (width) *width = buf->info.width;
+ if (height) *height = buf->info.height;
return EINA_TRUE;
}
{
EINA_SAFETY_ON_NULL_RETURN_VAL(buf, 0);
- return buf->format;
+ return buf->info.format;
}
EAPI unsigned int
}
Ecore_Buffer *
-_ecore_buffer_import(const char *engine, int width, int height, Ecore_Buffer_Format format, Ecore_Export_Type type, int export_id, unsigned int flags)
+_ecore_buffer_import(const char *engine, Ecore_Buffer_Info *info, Ecore_Export_Type type, int export_id, unsigned int flags)
{
Ecore_Buffer_Module *bm;
Ecore_Buffer *bo;
if (!bo)
return NULL;
- bo_data = bm->be->buffer_import(bm->data, width, height, format, type, export_id, flags);
+ bo_data = bm->be->buffer_import(bm->data, info, type, export_id, flags);
if (!bo_data)
{
free(bo);
return NULL;
}
+ memcpy(&bo->info, info, sizeof(*info));
+
bo->bm = bm;
- bo->width = width;
- bo->height = height;
- bo->format = format;
bo->flags = flags;
bo->buffer_data = bo_data;
return bo;
}
+
+Eina_Bool
+_ecore_buffer_info_get(Ecore_Buffer *buf, Ecore_Buffer_Info *info)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(buf, EINA_FALSE);
+
+ if (info)
+ memcpy(info, &buf->info, sizeof(*info));
+
+ return EINA_TRUE;
+}
static void _ecore_buffer_consumer_cb_provider_disconnected(void *data, struct bq_consumer *bq_consumer);
static void _ecore_buffer_consumer_cb_buffer_attached(void *data, struct bq_consumer *bq_consumer, struct bq_buffer *id, const char *engine, int32_t width, int32_t height, int32_t format, uint32_t flags);
static void _ecore_buffer_consumer_cb_buffer_id_set(void *data, struct bq_consumer *bq_consumer, struct bq_buffer *buffer, int32_t id, int32_t offset0, int32_t stride0, int32_t offset1, int32_t stride1, int32_t offset2, int32_t stride2);
+static void _ecore_buffer_consumer_cb_buffer_pixmap_id_set(void *data, struct bq_consumer *bq_consumer, struct bq_buffer *buffer, int32_t id, int32_t offset0, int32_t stride0, int32_t offset1, int32_t stride1, int32_t offset2, int32_t stride2);
static void _ecore_buffer_consumer_cb_buffer_fd_set(void *data, struct bq_consumer *bq_consumer, struct bq_buffer *buffer, int32_t fd, int32_t offset0, int32_t stride0, int32_t offset1, int32_t stride1, int32_t offset2, int32_t stride2);
static void _ecore_buffer_consumer_cb_buffer_detached(void *data, struct bq_consumer *bq_consumer, struct bq_buffer *id);
static void _ecore_buffer_consumer_cb_add_buffer(void *data, struct bq_consumer *bq_consumer, struct bq_buffer *buffer, uint32_t serial);
static void _ecore_buffer_consumer_cb_buffer_free(Ecore_Buffer *buf, void *data);
-static Eina_Bool _ecore_buffer_consumer_buffer_import(Ecore_Buffer_Consumer *consumer, Shared_Buffer *sb, int32_t seed, Ecore_Export_Type export_type);
+static Eina_Bool _ecore_buffer_consumer_buffer_import(Ecore_Buffer_Consumer *consumer, Shared_Buffer *sb, int32_t seed, Ecore_Export_Type export_type, Ecore_Buffer_Info *info);
struct bq_consumer_listener _ecore_buffer_consumer_listener =
{
_ecore_buffer_con_init_wait();
- consumer = calloc(1, sizeof(Ecore_Buffer_Consumer));
+ consumer = calloc(sizeof(Ecore_Buffer_Consumer), 1);
if (!consumer)
return NULL;
return consumer;
}
+static void
+_consumer_shared_buffer_free(Ecore_Buffer_Consumer *consumer)
+{
+ Eina_List *clone, *shared_buffers, *l;
+ Shared_Buffer *sb;
+
+ if (!consumer->ebq)
+ return;
+
+ shared_buffers = _ecore_buffer_queue_shared_buffer_list_get(consumer->ebq);
+ clone = eina_list_clone(shared_buffers);
+
+ EINA_LIST_FOREACH(clone, l, sb)
+ ecore_buffer_free(_shared_buffer_buffer_get(sb));
+
+ eina_list_free(clone);
+}
+
EAPI void
ecore_buffer_consumer_free(Ecore_Buffer_Consumer *consumer)
{
DBG("Consumer Free");
+ _consumer_shared_buffer_free(consumer);
+
if (consumer->ebq)
_ecore_buffer_queue_free(consumer->ebq);
_ecore_buffer_consumer_cb_provider_disconnected(void *data, struct bq_consumer *bq_consumer EINA_UNUSED)
{
Ecore_Buffer_Consumer *consumer = data;
- Eina_List *clone, *shared_buffers, *l;
- Shared_Buffer *sb;
EINA_SAFETY_ON_NULL_RETURN(consumer);
CALLBACK_CALL(consumer, provider_del);
- shared_buffers = _ecore_buffer_queue_shared_buffer_list_get(consumer->ebq);
- clone = eina_list_clone(shared_buffers);
-
- EINA_LIST_FOREACH(clone, l, sb)
- ecore_buffer_free(_shared_buffer_buffer_get(sb));
-
- eina_list_free(clone);
+ _consumer_shared_buffer_free(consumer);
}
static void
_shared_buffer_free(sb);
}
+#define INFO_SET(I, PIX) \
+ I.planes[0].offset = offset0; \
+ I.planes[0].stride = stride0; \
+ I.planes[1].offset = offset1; \
+ I.planes[1].stride = stride1; \
+ I.planes[2].offset = offset2; \
+ I.planes[2].stride = stride2; \
+ I.pixmap = PIX
static void
-_ecore_buffer_consumer_cb_buffer_id_set(void *data, struct bq_consumer *bq_consumer EINA_UNUSED, struct bq_buffer *buffer, int32_t id, int32_t offset0 EINA_UNUSED, int32_t stride0 EINA_UNUSED, int32_t offset1 EINA_UNUSED, int32_t stride1 EINA_UNUSED, int32_t offset2 EINA_UNUSED, int32_t stride2 EINA_UNUSED)
+_ecore_buffer_consumer_cb_buffer_id_set(void *data, struct bq_consumer *bq_consumer EINA_UNUSED, struct bq_buffer *buffer, int32_t id, int32_t offset0, int32_t stride0, int32_t offset1, int32_t stride1, int32_t offset2, int32_t stride2)
{
Ecore_Buffer_Consumer *consumer = data;
Shared_Buffer *sb = bq_buffer_get_user_data(buffer);
+ Ecore_Buffer_Info info;
EINA_SAFETY_ON_NULL_RETURN(consumer);
EINA_SAFETY_ON_NULL_RETURN(sb);
- if (_ecore_buffer_consumer_buffer_import(consumer, sb, id, EXPORT_TYPE_ID))
+ INFO_SET(info, 0);
+
+ if (_ecore_buffer_consumer_buffer_import(consumer, sb, id, EXPORT_TYPE_ID, &info))
bq_buffer_set_user_data(buffer, sb);
else
ERR("Failed to import buffer - buffer resource %p", buffer);
}
static void
-_ecore_buffer_consumer_cb_buffer_fd_set(void *data, struct bq_consumer *bq_consumer EINA_UNUSED, struct bq_buffer *buffer, int32_t fd, int32_t offset0 EINA_UNUSED, int32_t stride0 EINA_UNUSED, int32_t offset1 EINA_UNUSED, int32_t stride1 EINA_UNUSED, int32_t offset2 EINA_UNUSED, int32_t stride2 EINA_UNUSED)
+_ecore_buffer_consumer_cb_buffer_fd_set(void *data, struct bq_consumer *bq_consumer EINA_UNUSED, struct bq_buffer *buffer, int32_t fd, int32_t offset0, int32_t stride0, int32_t offset1, int32_t stride1, int32_t offset2, int32_t stride2)
{
Ecore_Buffer_Consumer *consumer = data;
Shared_Buffer *sb = bq_buffer_get_user_data(buffer);
+ Ecore_Buffer_Info info;
EINA_SAFETY_ON_NULL_RETURN(consumer);
EINA_SAFETY_ON_NULL_RETURN(sb);
- if (_ecore_buffer_consumer_buffer_import(consumer, sb, fd, EXPORT_TYPE_FD))
+ INFO_SET(info, 0);
+
+ if (_ecore_buffer_consumer_buffer_import(consumer, sb, fd, EXPORT_TYPE_FD, &info))
bq_buffer_set_user_data(buffer, sb);
else
ERR("Failed to import buffer - buffer resource %p", buffer);
}
+#undef INFO_SET
static void
_ecore_buffer_consumer_cb_buffer_detached(void *data, struct bq_consumer *bq_consumer EINA_UNUSED, struct bq_buffer *id)
}
static Eina_Bool
-_ecore_buffer_consumer_buffer_import(Ecore_Buffer_Consumer *consumer, Shared_Buffer *sb, int32_t seed, Ecore_Export_Type export_type)
+_ecore_buffer_consumer_buffer_import(Ecore_Buffer_Consumer *consumer, Shared_Buffer *sb, int32_t seed, Ecore_Export_Type export_type, Ecore_Buffer_Info *info)
{
Ecore_Buffer *buffer;
const char *engine = NULL;
return EINA_FALSE;
}
- if (!(buffer = _ecore_buffer_import(engine, w, h, format, export_type, seed, flags)))
+ info->width = w;
+ info->height = h;
+ info->format = format;
+
+ if (!(buffer = _ecore_buffer_import(engine, info, export_type, seed, flags)))
{
ERR("Failed to Import Buffer - size (%dx%d), foramt %d, seed %d, export_type %d",
w, h, format, seed, export_type);
/* NOTE: if Ecore_Export_Type as a return value is EXPORT_TYPE_FD,
* then caller should close the fd after using it. */
Ecore_Export_Type _ecore_buffer_export(Ecore_Buffer *buf, int *id);
-Ecore_Buffer *_ecore_buffer_import(const char *engine, int width, int height, Ecore_Buffer_Format format, Ecore_Export_Type type, int export_id, unsigned int flags);
+Ecore_Buffer *_ecore_buffer_import(const char *engine, Ecore_Buffer_Info *info, Ecore_Export_Type type, int export_id, unsigned int flags);
+Eina_Bool _ecore_buffer_info_get(Ecore_Buffer *buf, Ecore_Buffer_Info *info);
#endif /* _ECORE_BUFFER_PRIVATE_H_ */
_ecore_buffer_provider_shared_buffer_new(Ecore_Buffer_Provider *provider, Ecore_Buffer *buffer)
{
Shared_Buffer *sb;
+ Ecore_Export_Type export_type;
+ Ecore_Buffer_Info info;
+ Eina_Bool res;
struct bq_buffer *buf_resource;
unsigned int w = 0, h = 0, format = 0;
- Ecore_Export_Type export_type;
int export_id;
const char *engine;
unsigned int flags;
+ int offset[3] = {0,}, stride[3] = {0,};
+ int i;
EINA_SAFETY_ON_NULL_RETURN_VAL(provider, NULL);
return NULL;
}
- ecore_buffer_size_get(buffer, &w, &h);
- format = ecore_buffer_format_get(buffer);
- export_type = _ecore_buffer_export(buffer, &export_id);
engine = _ecore_buffer_engine_name_get(buffer);
flags = ecore_buffer_flags_get(buffer);
+ res = _ecore_buffer_info_get(buffer, &info);
+ if (res)
+ {
+ int count;
+ w = info.width;
+ h = info.height;
+ format = info.format;
+ /* FIXME info.num_planes may be 4 */
+ count = info.num_planes < 4 ? info.num_planes : 3;
+ for (i = 0; i < count; i++)
+ {
+ offset[i] = info.planes[i].offset;
+ stride[i] = info.planes[i].stride;
+ }
+ }
+ else
+ {
+ ecore_buffer_size_get(buffer, &w, &h);
+ format = ecore_buffer_format_get(buffer);
+ }
+
buf_resource = bq_provider_attach_buffer(provider->resource, engine, w, h, format, flags);
if (!buf_resource)
{
return NULL;
}
+ export_type = _ecore_buffer_export(buffer, &export_id);
switch (export_type)
{
case EXPORT_TYPE_ID:
- bq_provider_set_buffer_id(provider->resource, buf_resource,
- export_id, 0, 0, 0, 0, 0, 0);
+ bq_provider_set_buffer_id(provider->resource,
+ buf_resource,
+ export_id,
+ offset[0], stride[0],
+ offset[1], stride[1],
+ offset[2], stride[2]);
break;
case EXPORT_TYPE_FD:
- bq_provider_set_buffer_fd(provider->resource, buf_resource,
- export_id, 0, 0, 0, 0, 0, 0);
+ bq_provider_set_buffer_fd(provider->resource,
+ buf_resource,
+ export_id,
+ offset[0], stride[0],
+ offset[1], stride[1],
+ offset[2], stride[2]);
close(export_id);
break;
default:
static void
_ecore_buffer_provider_shared_buffer_free(Ecore_Buffer_Provider *provider, Shared_Buffer *sb)
{
- struct bq_buffer *buf_resource;
+ struct bq_buffer *buf_resource = _shared_buffer_resource_get(sb);
EINA_SAFETY_ON_NULL_RETURN(provider);
EINA_SAFETY_ON_NULL_RETURN(sb);
+ if (!provider->ebq)
+ return;
+
buf_resource = _shared_buffer_resource_get(sb);
if (!buf_resource)
return;
return buf;
}
+static Eina_Bool
+_ecore_buffer_tbm_buffer_info_get(Ecore_Buffer_Module_Data bmdata EINA_UNUSED, Ecore_Buffer_Data bdata, Ecore_Buffer_Info *info)
+{
+ Ecore_Buffer_Tbm_Data *buf = bdata;
+ tbm_surface_info_s tinfo;
+ int i, res;
+
+ if (!buf->tbm_surface)
+ return EINA_FALSE;
+
+ res = tbm_surface_get_info(buf->tbm_surface, &tinfo);
+ if (res != TBM_SURFACE_ERROR_NONE)
+ return EINA_FALSE;
+
+ if (info)
+ {
+ info->width = tinfo.width;
+ info->height = tinfo.height;
+ info->format = tinfo.format;
+ info->bpp = tinfo.bpp;
+ info->size = tinfo.size;
+ info->num_planes = tinfo.num_planes;
+ info->pixmap = 0;
+
+ for (i = 0; i < (int)tinfo.num_planes; i++)
+ {
+ info->planes[i].size = tinfo.planes[i].size;
+ info->planes[i].offset = tinfo.planes[i].offset;
+ info->planes[i].stride = tinfo.planes[i].stride;
+ }
+ }
+
+ return EINA_TRUE;
+}
+
static void
_ecore_buffer_tbm_buffer_free(Ecore_Buffer_Module_Data bmdata EINA_UNUSED, Ecore_Buffer_Data bdata)
{
if (!buf) return EXPORT_TYPE_INVALID;
- if (_buf_get_num_planes(buf->format) != 1)
+ if (tbm_surface_internal_get_num_bos(buf->tbm_surface) != 1)
return EXPORT_TYPE_INVALID;
bo = tbm_surface_internal_get_bo(buf->tbm_surface, 0);
}
static Ecore_Buffer_Data
-_ecore_buffer_tbm_buffer_import(Ecore_Buffer_Module_Data bmdata, int w, int h, Ecore_Buffer_Format format, Ecore_Export_Type type, int export_id, unsigned int flags)
+_ecore_buffer_tbm_buffer_import(Ecore_Buffer_Module_Data bmdata, Ecore_Buffer_Info *einfo, Ecore_Export_Type type, int export_id, unsigned int flags)
{
Ecore_Buffer_Module_Tbm_Data *bm = bmdata;
Ecore_Buffer_Tbm_Data *buf;
tbm_bo bo;
- tbm_surface_info_s info;
- int i, num_plane;
+ tbm_surface_info_s tinfo;
+ int i;
if (type != EXPORT_TYPE_FD) return NULL;
if (export_id < 1) return NULL;
if (!buf)
return NULL;
- buf->w = w;
- buf->h = h;
- buf->format = format;
+ buf->w = einfo->width;
+ buf->h = einfo->height;
+ buf->stride = einfo->planes[0].stride;
+ buf->format = einfo->format;
buf->flags = flags;
buf->is_imported = EINA_TRUE;
return NULL;
}
- num_plane = _buf_get_num_planes(format);
- info.width = w;
- info.height = h;
- info.format = format;
- info.bpp = _buf_get_bpp(format);
- info.size = w * h * info.bpp;
- info.num_planes = num_plane;
- for ( i = 0 ; i < num_plane ; i++)
+ tinfo.width = einfo->width;
+ tinfo.height = einfo->height;
+ tinfo.format = einfo->format;
+ tinfo.bpp = _buf_get_bpp(einfo->format);
+ tinfo.size = einfo->height * einfo->planes[0].stride;
+ tinfo.num_planes = (uint32_t)_buf_get_num_planes(einfo->format);
+ for ( i = 0 ; i < (int)tinfo.num_planes ; i++)
{
- info.planes[i].size = w * h * info.bpp;
- info.planes[i].stride = w * info.bpp;
- info.planes[i].offset = 0;
+ tinfo.planes[i].size = einfo->height * einfo->planes[i].stride;
+ tinfo.planes[i].stride = einfo->planes[i].stride;
+ tinfo.planes[i].offset = einfo->planes[i].offset;
}
- buf->tbm_surface = tbm_surface_internal_create_with_bos(&info, &bo, 1);
+ buf->tbm_surface = tbm_surface_internal_create_with_bos(&tinfo, &bo, 1);
if (!buf->tbm_surface)
{
tbm_bo_unref(bo);
&_ecore_buffer_tbm_shutdown,
&_ecore_buffer_tbm_buffer_alloc,
&_ecore_buffer_tbm_buffer_alloc_with_tbm_surface,
+ &_ecore_buffer_tbm_buffer_info_get,
&_ecore_buffer_tbm_buffer_free,
&_ecore_buffer_tbm_buffer_export,
&_ecore_buffer_tbm_buffer_import,
Ecore_X_Window root;
int eb, ee;
int major, minor;
- char *driver_name;
- char *device_name;
+ char *driver_name = NULL;
+ char *device_name = NULL;
int fd = 0;
drm_magic_t magic;
Ecore_Buffer_Module_X11_Dri2_Data *mdata = NULL;
goto on_error;
if (drmGetMagic(fd, &magic) < 0)
- goto on_error;
+ goto on_fd_error;
if (!(DRI2Authenticate(xdpy, root, magic)))
- goto on_error;
+ goto on_fd_error;
mdata->tbm_mgr = tbm_bufmgr_init(fd);
if (!mdata->tbm_mgr)
- goto on_error;
+ goto on_fd_error;
free(driver_name);
free(device_name);
return mdata;
+on_fd_error:
+ close(fd);
+
on_error:
- if (fd > 0) close(fd);
if (driver_name) free(driver_name);
if (device_name) free(device_name);
if (mdata) free(mdata);
info.height = height;
info.format = format;
info.bpp = bpp;
- info.size = width * bufs->pitch;
+ info.size = height * bufs->pitch;
info.num_planes = num_plane;
for ( i = 0 ; i < num_plane ; i++)
{
- info.planes[i].size = width * bufs->pitch;
+ info.planes[i].size = height * bufs->pitch;
info.planes[i].stride = bufs->pitch;
info.planes[i].offset = 0;
}
{
Ecore_Buffer_X11_Dri2_Data *buf;
- if (!tbm_surface)
- return NULL;
+ EINA_SAFETY_ON_NULL_RETURN_VAL(tbm_surface, NULL);
buf = calloc(1, sizeof(Ecore_Buffer_X11_Dri2_Data));
if (!buf)
buf->w = tbm_surface_get_width(tbm_surface);
buf->h = tbm_surface_get_height(tbm_surface);
buf->format = tbm_surface_get_format(tbm_surface);
+ buf->pixmap = 0;
buf->tbm.surface = tbm_surface;
buf->tbm.owned = EINA_FALSE;
buf->is_imported = EINA_FALSE;
return buf;
}
+static Eina_Bool
+_ecore_buffer_x11_dri2_buffer_info_get(Ecore_Buffer_Module_Data bmdata EINA_UNUSED, Ecore_Buffer_Data bdata, Ecore_Buffer_Info *info)
+{
+ Ecore_Buffer_X11_Dri2_Data *buf = bdata;
+ tbm_surface_info_s tinfo;
+ int i, res;
+
+ if (!buf->tbm.surface)
+ return EINA_FALSE;
+
+ res = tbm_surface_get_info(buf->tbm.surface, &tinfo);
+ if (res != TBM_SURFACE_ERROR_NONE)
+ return EINA_FALSE;
+
+ if (info)
+ {
+ info->width = tinfo.width;
+ info->height = tinfo.height;
+ info->format = tinfo.format;
+ info->bpp = tinfo.bpp;
+ info->size = tinfo.size;
+ info->num_planes = tinfo.num_planes;
+ info->pixmap = buf->pixmap;
+
+ for (i = 0; i < tinfo.num_planes; i++)
+ {
+ info->planes[i].size = tinfo.planes[i].size;
+ info->planes[i].offset = tinfo.planes[i].offset;
+ info->planes[i].stride = tinfo.planes[i].stride;
+ }
+ }
+
+ return EINA_TRUE;
+}
+
static void
_ecore_buffer_x11_dri2_buffer_free(Ecore_Buffer_Module_Data bmdata EINA_UNUSED, Ecore_Buffer_Data bdata)
{
_ecore_buffer_x11_dri2_buffer_export(Ecore_Buffer_Module_Data bmdata EINA_UNUSED, Ecore_Buffer_Data bdata, int *id)
{
Ecore_Buffer_X11_Dri2_Data *buf = bdata;
+ tbm_bo bo;
- if (id) *id = buf->pixmap;
+ if (id)
+ {
+ if (buf->pixmap)
+ *id = buf->pixmap;
+ else
+ {
+ tbm_bo bo;
+ /* NOTE: constraints - cannot support more than two bos */
+ bo = tbm_surface_internal_get_bo(buf->tbm.surface, 0);
+ *id = (int)(tbm_bo_export(bo));
+ }
+ }
return EXPORT_TYPE_ID;
}
-static void *
-_ecore_buffer_x11_dri2_buffer_import(Ecore_Buffer_Module_Data bmdata EINA_UNUSED, int w, int h, Ecore_Buffer_Format format, Ecore_Export_Type type, int export_id, unsigned int flags EINA_UNUSED)
+static tbm_bo
+_x11_dri2_bo_get_from_pixmap(tbm_bufmgr tbm_mgr, Ecore_Pixmap pixmap, int width, int height)
{
- Ecore_Buffer_Module_X11_Dri2_Data *bm = bmdata;
Ecore_X_Display *xdpy;
- Ecore_X_Pixmap pixmap = (Ecore_X_Pixmap)export_id;
- Ecore_Buffer_X11_Dri2_Data *buf;
- int rw, rh, rx, ry;
DRI2Buffer *bufs = NULL;
tbm_bo bo = NULL;
+ int rw, rh, rx, ry;
int rcount;
unsigned int attachment = DRI2BufferFrontLeft;
- tbm_surface_info_s info;
- int num_plane,i;
- if (type != EXPORT_TYPE_ID)
+ // Check valid pixmap
+ ecore_x_pixmap_geometry_get(pixmap, &rx, &ry, &rw, &rh);
+ if ((rw != width) || (rh != height))
return NULL;
xdpy = ecore_x_display_get();
+ DRI2CreateDrawable(xdpy, pixmap);
+ bufs = DRI2GetBuffers(xdpy, pixmap, &rw, &rh, &attachment, 1, &rcount);
+ if ((!bufs) || (width != rw) || (height != rh))
+ goto err;
- //Check valid pixmap
- ecore_x_pixmap_geometry_get(pixmap, &rx, &ry, &rw, &rh);
- if ((rw != w) || (rh != h))
- return NULL;
+ bo = tbm_bo_import(tbm_mgr, bufs->name);
+ free(bufs);
+ if (!bo)
+ goto err;
- buf = calloc(1, sizeof(Ecore_Buffer_X11_Dri2_Data));
- if (!buf)
- return NULL;
+ return bo;
+err:
+ DRI2DestroyDrawable(xdpy, pixmap);
+ return NULL;
+}
- buf->w = w;
- buf->h = h;
- buf->format = format;
- buf->pixmap = pixmap;
- buf->is_imported = EINA_TRUE;
+static void *
+_ecore_buffer_x11_dri2_buffer_import(Ecore_Buffer_Module_Data bmdata, Ecore_Buffer_Info *einfo, Ecore_Export_Type type, int export_id, unsigned int flags EINA_UNUSED)
+{
+ Ecore_Buffer_Module_X11_Dri2_Data *bm = bmdata;
+ Ecore_Buffer_X11_Dri2_Data *buf;
+ tbm_bo bo = NULL;
+ tbm_surface_h surface;
+ tbm_surface_info_s tinfo;
+ int i;
- //Get DRI2Buffer
- DRI2CreateDrawable(xdpy, buf->pixmap);
- bufs = DRI2GetBuffers(xdpy, buf->pixmap, &rw, &rh, &attachment, 1, &rcount);
- if ((!bufs) || (buf->w != rw) || (buf->h != rh))
- goto on_error;
+ if (type != EXPORT_TYPE_ID)
+ return NULL;
- buf->stride = bufs->pitch;
+ if (!einfo)
+ return NULL;
+
+ if (einfo->pixmap)
+ bo = _x11_dri2_bo_get_from_pixmap(bm->tbm_mgr, einfo->pixmap, einfo->width, einfo->height);
+ else
+ bo = tbm_bo_import(bm->tbm_mgr, export_id);
- //Import tbm_surface
- bo = tbm_bo_import(bm->tbm_mgr, bufs->name);
if (!bo)
- goto on_error;
+ goto err;
+
+ tinfo.width = einfo->width;
+ tinfo.height = einfo->height;
+ tinfo.format = einfo->format;
+ tinfo.bpp = _buf_get_bpp(einfo->format);
+ tinfo.size = einfo->height * einfo->planes[0].stride;
+ tinfo.num_planes = _buf_get_num_planes(einfo->format);
+ for (i = 0; i < tinfo.num_planes; i++)
+ {
+ tinfo.planes[i].size = einfo->height * einfo->planes[i].stride;
+ tinfo.planes[i].stride = einfo->planes[i].stride;
+ tinfo.planes[i].offset = einfo->planes[i].offset;
+ }
- num_plane = _buf_get_num_planes(format);
- info.width = w;
- info.height = h;
- info.format = format;
- info.bpp = _buf_get_bpp(format);
- info.size = w * bufs->pitch;
- info.num_planes = num_plane;
- for ( i = 0 ; i < num_plane ; i++)
- {
- info.planes[i].size = w * bufs->pitch;
- info.planes[i].stride = bufs->pitch;
- info.planes[i].offset = 0;
- }
+ surface = tbm_surface_internal_create_with_bos(&tinfo, &bo, 1);
+ tbm_bo_unref(bo);
+ if (!surface)
+ goto err;
- buf->tbm.surface = tbm_surface_internal_create_with_bos(&info, &bo, 1);
- if (!buf->tbm.surface)
- goto on_error;
+ buf = calloc(1, sizeof(Ecore_Buffer_X11_Dri2_Data));
+ if (!buf)
+ goto err_alloc;
+ buf->w = einfo->width;
+ buf->h = einfo->height;
+ buf->format = einfo->format;
+ buf->pixmap = einfo->pixmap;
+ buf->stride = einfo->planes[0].stride;
+ buf->is_imported = EINA_TRUE;
+ buf->tbm.surface = surface;
buf->tbm.owned = EINA_TRUE;
- tbm_bo_unref(bo);
- free(bufs);
return buf;
-on_error:
- if (bo) tbm_bo_unref(bo);
- if (bufs) free(bufs);
- DRI2DestroyDrawable(xdpy, buf->pixmap);
+err_alloc:
+ tbm_surface_internal_unref(surface);
+err:
+ if ((bo) && (einfo->pixmap))
+ DRI2DestroyDrawable(ecore_x_display_get(), einfo->pixmap);
+
free(buf);
return NULL;
&_ecore_buffer_x11_dri2_shutdown,
&_ecore_buffer_x11_dri2_buffer_alloc,
&_ecore_buffer_x11_dri2_buffer_alloc_with_tbm_surface,
+ &_ecore_buffer_x11_dri2_buffer_info_get,
&_ecore_buffer_x11_dri2_buffer_free,
&_ecore_buffer_x11_dri2_buffer_export,
&_ecore_buffer_x11_dri2_buffer_import,
Eina_Bool is_imported;
};
+static Ecore_Pixmap _ecore_buffer_x11_dri3_pixmap_get(Ecore_Buffer_Module_Data bmdata, Ecore_Buffer_Data bdata);
+
static int
_buf_get_num_planes(Ecore_Buffer_Format format)
{
static Ecore_X_Pixmap
_dri3_pixmap_from_fd(Ecore_X_Display *dpy, Ecore_X_Drawable draw, int width, int height, int depth, int fd, int bpp, int stride, int size)
{
- xcb_connection_t *c = XGetXCBConnection(dpy);
- Ecore_X_Pixmap pixmap = xcb_generate_id(c);
+ xcb_connection_t *c;
+ Ecore_X_Pixmap pixmap;
if (!dpy)
return 0;
{
Ecore_Buffer_X11_Dri3_Data *buf;
+ EINA_SAFETY_ON_NULL_RETURN_VAL(tbm_surface, NULL);
+
buf = calloc(1, sizeof(Ecore_Buffer_X11_Dri3_Data));
if (!buf)
return NULL;
return buf;
}
+static Eina_Bool
+_ecore_buffer_x11_dri3_buffer_info_get(Ecore_Buffer_Module_Data bmdata, Ecore_Buffer_Data bdata, Ecore_Buffer_Info *info)
+{
+ Ecore_Buffer_X11_Dri3_Data *buf = bdata;
+ tbm_surface_info_s tinfo;
+ int i, res;
+
+ if (!buf->tbm_surface)
+ return EINA_FALSE;
+
+ res = tbm_surface_get_info(buf->tbm_surface, &tinfo);
+ if (res != TBM_SURFACE_ERROR_NONE)
+ return EINA_FALSE;
+
+ if (info)
+ {
+ info->width = tinfo.width;
+ info->height = tinfo.height;
+ info->format = tinfo.format;
+ info->bpp = tinfo.bpp;
+ info->size = tinfo.size;
+ info->num_planes = tinfo.num_planes;
+ info->pixmap = _ecore_buffer_x11_dri3_pixmap_get(bmdata, bdata);
+
+ for (i = 0; i < tinfo.num_planes; i++)
+ {
+ info->planes[i].size = tinfo.planes[i].size;
+ info->planes[i].offset = tinfo.planes[i].offset;
+ info->planes[i].stride = tinfo.planes[i].stride;
+ }
+ }
+
+ return EINA_TRUE;
+}
+
static void
_ecore_buffer_x11_dri3_buffer_free(Ecore_Buffer_Module_Data bmdata EINA_UNUSED, Ecore_Buffer_Data bdata)
{
}
static Ecore_Buffer_Data
-_ecore_buffer_x11_dri3_buffer_import(Ecore_Buffer_Module_Data bmdata, int w, int h, Ecore_Buffer_Format format, Ecore_Export_Type type, int export_id, unsigned int flags)
+_ecore_buffer_x11_dri3_buffer_import(Ecore_Buffer_Module_Data bmdata, Ecore_Buffer_Info *einfo, Ecore_Export_Type type, int export_id, unsigned int flags)
{
Ecore_Buffer_Module_X11_Dri3_Data *bm = bmdata;
Ecore_Buffer_X11_Dri3_Data *buf;
tbm_bo bo;
- tbm_surface_info_s info;
- int i, num_plane;
+ tbm_surface_info_s tinfo;
+ int i;
if (!bm)
return NULL;
if (!buf)
return NULL;
- buf->w = w;
- buf->h = h;
- buf->format = format;
+ buf->w = einfo->width;
+ buf->h = einfo->height;
+ buf->format = einfo->format;
buf->flags = flags;
buf->is_imported = EINA_TRUE;
return NULL;
}
- num_plane = _buf_get_num_planes(format);
- info.width = w;
- info.height = h;
- info.format = format;
- info.bpp = _buf_get_bpp(format);
- info.size = w * h * info.bpp;
- info.num_planes = num_plane;
- for ( i = 0 ; i < num_plane ; i++)
+ tinfo.width = buf->w = einfo->width;
+ tinfo.height = buf->h = einfo->height;
+ tinfo.format = buf->format = einfo->format;
+ tinfo.bpp = _buf_get_bpp(einfo->format);
+ tinfo.size = einfo->height * einfo->planes[0].stride;
+ tinfo.num_planes = _buf_get_num_planes(einfo->format);
+ for (i = 0; i < tinfo.num_planes; i++)
{
- info.planes[i].size = w * h * info.bpp;
- info.planes[i].stride = w * info.bpp;
- info.planes[i].offset = 0;
+ tinfo.planes[i].size = einfo->height * einfo->planes[i].stride;
+ tinfo.planes[i].stride = einfo->planes[i].stride;
+ tinfo.planes[i].offset = einfo->planes[i].offset;
}
- buf->tbm_surface = tbm_surface_internal_create_with_bos(&info, &bo, 1);
+ buf->tbm_surface = tbm_surface_internal_create_with_bos(&tinfo, &bo, 1);
if (!buf->tbm_surface)
{
tbm_bo_unref(bo);
&_ecore_buffer_x11_dri3_shutdown,
&_ecore_buffer_x11_dri3_buffer_alloc,
&_ecore_buffer_x11_dri3_buffer_alloc_with_tbm_surface,
+ &_ecore_buffer_x11_dri3_buffer_info_get,
&_ecore_buffer_x11_dri3_buffer_free,
&_ecore_buffer_x11_dri3_buffer_export,
&_ecore_buffer_x11_dri3_buffer_import,