tdm_error tdm_layer_get_property(tdm_layer *layer, unsigned int id, tdm_value *value);
tdm_error tdm_layer_set_info(tdm_layer *layer, tdm_info_layer *info);
tdm_error tdm_layer_get_info(tdm_layer *layer, tdm_info_layer *info);
-tdm_error tdm_layer_set_buffer(tdm_layer *layer, tdm_buffer *buffer); // layer has only one buffer
+tdm_error tdm_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer); // layer has only one buffer
tdm_error tdm_layer_unset_buffer(tdm_layer *layer);
tdm_error tdm_layer_is_usable(tdm_layer *layer, unsigned int *usable);
tdm_error tdm_layer_set_video_pos(tdm_layer *layer, int zpos);
void tdm_pp_destroy(tdm_pp *pp);
tdm_error tdm_pp_set_info(tdm_pp *pp, tdm_info_pp *info);
-tdm_error tdm_pp_attach(tdm_pp *pp, tdm_buffer *src, tdm_buffer *dst);
+tdm_error tdm_pp_attach(tdm_pp *pp, tbm_surface_h src, tbm_surface_h dst);
tdm_error tdm_pp_commit(tdm_pp *pp);
///////////////////////////////////////////////////////////////////////////////
void tdm_capture_destroy(tdm_capture *capture);
tdm_error tdm_capture_set_info(tdm_capture *capture, tdm_info_capture *info);
-tdm_error tdm_capture_attach(tdm_capture *capture, tdm_buffer *buffer);
+tdm_error tdm_capture_attach(tdm_capture *capture, tbm_surface_h buffer);
tdm_error tdm_capture_commit(tdm_capture *capture);
///////////////////////////////////////////////////////////////////////////////
-typedef void (*tdm_buffer_release_handler)(tdm_buffer *buffer, void *user_data);
+typedef void (*tdm_buffer_release_handler)(tbm_surface_h buffer, void *user_data);
/* not pthread safe */
-tdm_buffer *tdm_buffer_create(tbm_surface_h buffer, tdm_error *error);
-tdm_buffer *tdm_buffer_ref(tdm_buffer *buffer, tdm_error *error);
-void tdm_buffer_unref(tdm_buffer *buffer);
-tdm_error tdm_buffer_add_release_handler(tdm_buffer *buffer, tdm_buffer_release_handler func, void *user_data);
-void tdm_buffer_remove_release_handler(tdm_buffer *buffer, tdm_buffer_release_handler func, void *user_data);
+tdm_error tdm_buffer_add_release_handler(tbm_surface_h buffer, tdm_buffer_release_handler func, void *user_data);
+void tdm_buffer_remove_release_handler(tbm_surface_h buffer, tdm_buffer_release_handler func, void *user_data);
#ifdef __cplusplus
}
tdm_error (*layer_get_property)(tdm_layer *layer, unsigned int id, tdm_value *value);
tdm_error (*layer_set_info)(tdm_layer *layer, tdm_info_layer *info);
tdm_error (*layer_get_info)(tdm_layer *layer, tdm_info_layer *info);
- tdm_error (*layer_set_buffer)(tdm_layer *layer, tdm_buffer *buffer);
+ tdm_error (*layer_set_buffer)(tdm_layer *layer, tbm_surface_h buffer);
tdm_error (*layer_unset_buffer)(tdm_layer *layer);
tdm_error (*layer_set_video_pos)(tdm_layer *layer, int zpos);
tdm_capture *(*layer_create_capture)(tdm_layer *layer, tdm_error *error);
tdm_error (*pp_set_done_handler)(tdm_pp *pp, tdm_pp_done_handler func, void *user_data);
} tdm_func_pp;
-typedef void (*tdm_capture_done_handler)(tdm_capture *capture, tdm_buffer *buffer, void *user_data);
+typedef void (*tdm_capture_done_handler)(tdm_capture *capture, tbm_surface_h buffer, void *user_data);
typedef struct _tdm_func_capture
{
void (*capture_destroy)(tdm_capture *capture); /* init */
tdm_error (*capture_set_info)(tdm_capture *capture, tdm_info_capture *info);
- tdm_error (*capture_attach)(tdm_capture *capture, tdm_buffer *buffer);
+ tdm_error (*capture_attach)(tdm_capture *capture, tbm_surface_h buffer);
tdm_error (*capture_commit)(tdm_capture *capture); /* init */
tdm_error (*capture_set_done_handler)(tdm_capture *capture, tdm_capture_done_handler func, void *user_data);
} tdm_func_capture;
tdm_error tdm_backend_register_func_pp(tdm_display *dpy, tdm_func_pp *func_pp);
tdm_error tdm_backend_register_func_capture(tdm_display *dpy, tdm_func_capture *func_capture);
-typedef void (*tdm_buffer_destroy_handler)(tdm_buffer *buffer, void *user_data);
+typedef void (*tdm_buffer_destroy_handler)(tbm_surface_h buffer, void *user_data);
-tdm_buffer* tdm_buffer_ref_backend(tdm_buffer *buffer);
-void tdm_buffer_unref_backend(tdm_buffer *buffer);
-tbm_surface_h tdm_buffer_get_surface(tdm_buffer *buffer);
-tdm_buffer* tdm_buffer_get(tbm_surface_h buffer);
-tdm_error tdm_buffer_add_destroy_handler(tdm_buffer *buffer, tdm_buffer_destroy_handler func, void *user_data);
-void tdm_buffer_remove_destroy_handler(tdm_buffer *buffer, tdm_buffer_destroy_handler func, void *user_data);
+tbm_surface_h tdm_buffer_ref_backend(tbm_surface_h buffer);
+void tdm_buffer_unref_backend(tbm_surface_h buffer);
+tdm_error tdm_buffer_add_destroy_handler(tbm_surface_h buffer, tdm_buffer_destroy_handler func, void *user_data);
+void tdm_buffer_remove_destroy_handler(tbm_surface_h buffer, tdm_buffer_destroy_handler func, void *user_data);
#ifdef __cplusplus
#include "tdm_private.h"
#include "tdm_list.h"
+static int tdm_buffer_key;
+#define TDM_BUFFER_KEY ((unsigned long)&tdm_buffer_key)
+
typedef struct _tdm_buffer_func_info
{
tdm_buffer_release_handler release_func;
{
tbm_surface_h buffer;
- /* ref_count for frontend */
- int ref_count;
-
/* ref_count for backend */
int backend_ref_count;
struct list_head release_funcs;
struct list_head destroy_funcs;
- struct list_head link;
} tdm_buffer_info;
-static int buffer_list_init;
-static struct list_head buffer_list;
-
static void
-_tdm_buffer_destroy(tdm_buffer_info *buf_info)
+_tdm_buffer_destroy_info(void *user_data)
{
+ tdm_buffer_info *buf_info = (tdm_buffer_info*)user_data;
tdm_buffer_func_info *func_info = NULL, *next = NULL;
- TDM_WARNING_IF_FAIL(buf_info->ref_count == 0);
- TDM_WARNING_IF_FAIL(buf_info->backend_ref_count == 0);
+ if (buf_info->backend_ref_count > 0)
+ TDM_NEVER_GET_HERE();
LIST_FOR_EACH_ENTRY_SAFE(func_info, next, &buf_info->release_funcs, link)
{
}
LIST_FOR_EACH_ENTRY_SAFE(func_info, next, &buf_info->destroy_funcs, link)
- func_info->destroy_func(buf_info, func_info->user_data);
+ func_info->destroy_func(buf_info->buffer, func_info->user_data);
LIST_FOR_EACH_ENTRY_SAFE(func_info, next, &buf_info->destroy_funcs, link)
{
free(func_info);
}
- LIST_DEL(&buf_info->link);
-
- tbm_surface_internal_unref(buf_info->buffer);
free(buf_info);
}
-EXTERN tdm_buffer*
-tdm_buffer_create(tbm_surface_h buffer, tdm_error *error)
+static tdm_buffer_info*
+_tdm_buffer_get_info(tbm_surface_h buffer)
{
- tdm_buffer_info *buf_info;
-
- if (!buffer_list_init)
- {
- LIST_INITHEAD(&buffer_list);
- buffer_list_init = 1;
- }
+ tdm_buffer_info *buf_info = NULL;
+ tbm_bo bo;
- if (!buffer)
- {
- if (error)
- *error = TDM_ERROR_INVALID_PARAMETER;
+ bo = tbm_surface_internal_get_bo(buffer, 0);
+ TDM_RETURN_VAL_IF_FAIL(bo != NULL, NULL);
- TDM_ERR("'buffer != NULL' failed");
+ tbm_bo_get_user_data(bo, TDM_BUFFER_KEY, (void**)&buf_info);
- return NULL;
- }
-
- buf_info = calloc(1, sizeof(tdm_buffer_info));
if (!buf_info)
{
- if (error)
- *error = TDM_ERROR_OUT_OF_MEMORY;
-
- TDM_ERR("'buf_info != NULL' failed");
-
- return NULL;
- }
-
- buf_info->ref_count = 1;
-
- tbm_surface_internal_ref(buffer);
- buf_info->buffer = buffer;
+ buf_info = calloc(1, sizeof(tdm_buffer_info));
+ TDM_RETURN_VAL_IF_FAIL(buffer != NULL, NULL);
- LIST_INITHEAD(&buf_info->release_funcs);
- LIST_INITHEAD(&buf_info->destroy_funcs);
- LIST_ADDTAIL(&buf_info->link, &buffer_list);
+ buf_info->buffer = buffer;
- if (error)
- *error = TDM_ERROR_NONE;
+ LIST_INITHEAD(&buf_info->release_funcs);
+ LIST_INITHEAD(&buf_info->destroy_funcs);
- return (tdm_buffer*)buf_info;
-}
-
-EXTERN tdm_buffer*
-tdm_buffer_ref(tdm_buffer *buffer, tdm_error *error)
-{
- tdm_buffer_info *buf_info;
-
- if (!buffer)
- {
- if (error)
- *error = TDM_ERROR_INVALID_PARAMETER;
-
- TDM_ERR("'buffer != NULL' failed");
-
- return NULL;
+ tbm_bo_add_user_data(bo, TDM_BUFFER_KEY, _tdm_buffer_destroy_info);
+ tbm_bo_set_user_data(bo, TDM_BUFFER_KEY, buf_info);
}
- buf_info = buffer;
- buf_info->ref_count++;
-
- if (error)
- *error = TDM_ERROR_NONE;
-
- return buffer;
-}
-
-EXTERN void
-tdm_buffer_unref(tdm_buffer *buffer)
-{
- tdm_buffer_info *buf_info;
-
- if (!buffer)
- return;
-
- buf_info = buffer;
- TDM_RETURN_IF_FAIL (buf_info->ref_count > 0);
-
- buf_info->ref_count--;
-
- /* destroy tdm_buffer when both ref_count and backend_ref_count are 0. */
- if (buf_info->ref_count > 0 || buf_info->backend_ref_count > 0)
- return;
-
- _tdm_buffer_destroy(buf_info);
+ return buf_info;
}
EXTERN tdm_error
-tdm_buffer_add_release_handler(tdm_buffer *buffer,
+tdm_buffer_add_release_handler(tbm_surface_h buffer,
tdm_buffer_release_handler func, void *user_data)
{
tdm_buffer_info *buf_info;
TDM_RETURN_VAL_IF_FAIL(buffer != NULL, TDM_ERROR_INVALID_PARAMETER);
TDM_RETURN_VAL_IF_FAIL(func != NULL, TDM_ERROR_INVALID_PARAMETER);
+ buf_info = _tdm_buffer_get_info(buffer);
+ TDM_RETURN_VAL_IF_FAIL(buf_info != NULL, TDM_ERROR_OUT_OF_MEMORY);
+
func_info = calloc(1, sizeof(tdm_buffer_func_info));
TDM_RETURN_VAL_IF_FAIL(func_info != NULL, TDM_ERROR_OUT_OF_MEMORY);
func_info->release_func = func;
func_info->user_data = user_data;
- buf_info = buffer;
LIST_ADD(&func_info->link, &buf_info->release_funcs);
return TDM_ERROR_NONE;
}
EXTERN void
-tdm_buffer_remove_release_handler(tdm_buffer *buffer, tdm_buffer_release_handler func, void *user_data)
+tdm_buffer_remove_release_handler(tbm_surface_h buffer, tdm_buffer_release_handler func, void *user_data)
{
tdm_buffer_info *buf_info;
tdm_buffer_func_info *func_info = NULL, *next = NULL;
TDM_RETURN_IF_FAIL(buffer != NULL);
TDM_RETURN_IF_FAIL(func != NULL);
- buf_info = buffer;
+ buf_info = _tdm_buffer_get_info(buffer);
+ TDM_RETURN_IF_FAIL(buf_info != NULL);
+
LIST_FOR_EACH_ENTRY_SAFE(func_info, next, &buf_info->release_funcs, link)
{
if (func_info->release_func != func || func_info->user_data != user_data)
}
-EXTERN tdm_buffer*
-tdm_buffer_ref_backend(tdm_buffer *buffer)
+EXTERN tbm_surface_h
+tdm_buffer_ref_backend(tbm_surface_h buffer)
{
tdm_buffer_info *buf_info;
TDM_RETURN_VAL_IF_FAIL(buffer != NULL, NULL);
- buf_info = buffer;
+ buf_info = _tdm_buffer_get_info(buffer);
+ TDM_RETURN_VAL_IF_FAIL(buf_info != NULL, NULL);
+
buf_info->backend_ref_count++;
return buffer;
}
EXTERN void
-tdm_buffer_unref_backend(tdm_buffer *buffer)
+tdm_buffer_unref_backend(tbm_surface_h buffer)
{
tdm_buffer_info *buf_info;
tdm_buffer_func_info *func_info = NULL, *next = NULL;
- int old_ref_count;
TDM_RETURN_IF_FAIL(buffer != NULL);
- buf_info = buffer;
+ buf_info = _tdm_buffer_get_info(buffer);
+ TDM_RETURN_IF_FAIL(buf_info != NULL);
+
buf_info->backend_ref_count--;
if (buf_info->backend_ref_count > 0)
return;
- /* ref_count can become 0 in user release function. In that case, buf_info
- * will be destroyed in tbm_buffer_unref. So we destroy buf_info in this
- * function only in case that old_ref_count is 0.
- */
- old_ref_count = buf_info->ref_count;
-
LIST_FOR_EACH_ENTRY_SAFE(func_info, next, &buf_info->release_funcs, link)
- func_info->release_func(buffer, func_info->user_data);
-
- /* finally, both ref_count and backend_ref_count are 0. destroy tdm_buffer */
- if (old_ref_count == 0 && buf_info->ref_count == 0)
- _tdm_buffer_destroy(buf_info);
-}
-
-EXTERN tbm_surface_h
-tdm_buffer_get_surface(tdm_buffer *buffer)
-{
- tdm_buffer_info *buf_info = buffer;
-
- TDM_RETURN_VAL_IF_FAIL(buf_info != NULL, NULL);
-
- return buf_info->buffer;
-}
-
-EXTERN tdm_buffer*
-tdm_buffer_get(tbm_surface_h buffer)
-{
- tdm_buffer_info *found;
-
- TDM_RETURN_VAL_IF_FAIL(buffer != NULL, NULL);
-
- if (!buffer_list_init)
- {
- LIST_INITHEAD(&buffer_list);
- buffer_list_init = 1;
- }
-
- LIST_FOR_EACH_ENTRY(found, &buffer_list, link)
{
- if (found->buffer == buffer)
- return found;
+ tbm_surface_internal_ref(buffer);
+ func_info->release_func(buffer, func_info->user_data);
+ tbm_surface_internal_unref(buffer);
}
-
- return NULL;
}
EXTERN tdm_error
-tdm_buffer_add_destroy_handler(tdm_buffer *buffer, tdm_buffer_destroy_handler func, void *user_data)
+tdm_buffer_add_destroy_handler(tbm_surface_h buffer, tdm_buffer_destroy_handler func, void *user_data)
{
tdm_buffer_info *buf_info;
tdm_buffer_func_info *func_info;
TDM_RETURN_VAL_IF_FAIL(buffer != NULL, TDM_ERROR_INVALID_PARAMETER);
TDM_RETURN_VAL_IF_FAIL(func != NULL, TDM_ERROR_INVALID_PARAMETER);
+ buf_info = _tdm_buffer_get_info(buffer);
+ TDM_RETURN_VAL_IF_FAIL(buf_info != NULL, TDM_ERROR_OUT_OF_MEMORY);
+
func_info = calloc(1, sizeof(tdm_buffer_func_info));
TDM_RETURN_VAL_IF_FAIL(func_info != NULL, TDM_ERROR_OUT_OF_MEMORY);
func_info->destroy_func = func;
func_info->user_data = user_data;
- buf_info = buffer;
LIST_ADD(&func_info->link, &buf_info->destroy_funcs);
return TDM_ERROR_NONE;
}
EXTERN void
-tdm_buffer_remove_destroy_handler(tdm_buffer *buffer, tdm_buffer_destroy_handler func, void *user_data)
+tdm_buffer_remove_destroy_handler(tbm_surface_h buffer, tdm_buffer_destroy_handler func, void *user_data)
{
tdm_buffer_info *buf_info;
tdm_buffer_func_info *func_info = NULL, *next = NULL;
TDM_RETURN_IF_FAIL(buffer != NULL);
TDM_RETURN_IF_FAIL(func != NULL);
- buf_info = buffer;
+ buf_info = _tdm_buffer_get_info(buffer);
+ TDM_RETURN_IF_FAIL(buf_info != NULL);
+
LIST_FOR_EACH_ENTRY_SAFE(func_info, next, &buf_info->destroy_funcs, link)
{
if (func_info->destroy_func != func || func_info->user_data != user_data)