* @endcode
*/
extern int tdm_debug;
+extern int tdm_debug_buffer;
//#define TDM_CONFIG_DLOG
#ifdef TDM_CONFIG_DLOG
#define DEFAULT_MODULE "libtdm-default"SUFFIX_MODULE
int tdm_debug;
+int tdm_debug_buffer;
static tdm_private_display *g_private_display;
static pthread_mutex_t gLock = PTHREAD_MUTEX_INITIALIZER;
if (debug && (strstr(debug, "1")))
tdm_debug = 1;
+ debug = getenv("TDM_DEBUG_BUFFER");
+ if (debug && (strstr(debug, "1")))
+ tdm_debug_buffer = 1;
+
private_display = calloc(1, sizeof(tdm_private_display));
if (!private_display) {
ret = TDM_ERROR_OUT_OF_MEMORY;
free(private_display);
failed_alloc:
tdm_debug = 0;
+ tdm_debug_buffer = 0;
if (error)
*error = ret;
pthread_mutex_unlock(&gLock);
free(private_display);
g_private_display = NULL;
tdm_debug = 0;
+ tdm_debug_buffer = 0;
pthread_mutex_unlock(&gLock);
}
struct list_head release_funcs;
struct list_head destroy_funcs;
+
+ struct list_head link;
} tdm_buffer_info;
static void
free(func_info);
}
+ LIST_DEL(&buf_info->link);
+
free(buf_info);
}
LIST_INITHEAD(&buf_info->release_funcs);
LIST_INITHEAD(&buf_info->destroy_funcs);
+ LIST_INITHEAD(&buf_info->link);
tbm_bo_add_user_data(bo, TDM_BUFFER_KEY, _tdm_buffer_destroy_info);
tbm_bo_set_user_data(bo, TDM_BUFFER_KEY, buf_info);
return;
}
}
+
+INTERN void
+tdm_buffer_add_list(struct list_head *list, tbm_surface_h buffer)
+{
+ tdm_buffer_info *buf_info;
+
+ TDM_RETURN_IF_FAIL(list != NULL);
+ TDM_RETURN_IF_FAIL(buffer != NULL);
+
+ buf_info = _tdm_buffer_get_info(buffer);
+ TDM_RETURN_IF_FAIL(buf_info != NULL);
+
+ if (buf_info->link.prev != buf_info->link.next) {
+ TDM_ERR("%p already added other list\n", buffer);
+ return;
+ }
+
+ LIST_ADD(&buf_info->link, list);
+}
+
+INTERN void
+tdm_buffer_remove_list(struct list_head *list, tbm_surface_h buffer)
+{
+ tdm_buffer_info *buf_info, *b = NULL, *bb = NULL;
+
+ TDM_RETURN_IF_FAIL(list != NULL);
+
+ if (!buffer)
+ return;
+
+ buf_info = _tdm_buffer_get_info(buffer);
+ TDM_RETURN_IF_FAIL(buf_info != NULL);
+
+ LIST_FOR_EACH_ENTRY_SAFE(b, bb, list, link) {
+ if (b == buf_info) {
+ LIST_DEL(&buf_info->link);
+ return;
+ }
+ }
+}
+
+INTERN void
+tdm_buffer_dump_list(struct list_head *list, char *str, int len)
+{
+ tdm_buffer_info *buf_info = NULL;
+
+ TDM_RETURN_IF_FAIL(list != NULL);
+
+ LIST_FOR_EACH_ENTRY(buf_info, list, link) {
+ if (len > 0) {
+ int l = snprintf(str, len, " %p", buf_info->buffer);
+ str += l;
+ len -= l;
+ }
+ else
+ break;
+ }
+}
lock_after_cb_done = 1;
}
+ if (tdm_debug_buffer)
+ TDM_INFO("done: %p", buffer);
+
+ tdm_buffer_remove_list(&private_capture->buffer_list, buffer);
+
tdm_buffer_unref_backend(buffer);
if (lock_after_cb_done)
private_capture->private_layer = NULL;
private_capture->capture_backend = capture_backend;
+ LIST_INITHEAD(&private_capture->buffer_list);
+
if (error)
*error = TDM_ERROR_NONE;
private_capture->private_layer = private_layer;
private_capture->capture_backend = capture_backend;
+ LIST_INITHEAD(&private_capture->buffer_list);
+
if (error)
*error = TDM_ERROR_NONE;
func_capture = &private_capture->private_display->func_capture;
func_capture->capture_destroy(private_capture->capture_backend);
+ if (!LIST_IS_EMPTY(&private_capture->buffer_list)) {
+ char str[256] = {0,};
+ tdm_buffer_dump_list(&private_capture->buffer_list, str, 256);
+ if (strlen(str) > 0)
+ TDM_WRN("not finished: %s buffers", str);
+ }
+
free(private_capture);
}
tdm_buffer_ref_backend(buffer);
ret = func_capture->capture_attach(private_capture->capture_backend, buffer);
+ if (ret == TDM_ERROR_NONE)
+ tdm_buffer_add_list(&private_capture->buffer_list, buffer);
+
+ if (tdm_debug_buffer) {
+ char str[256] = {0,};
+ tdm_buffer_dump_list(&private_capture->buffer_list, str, 256);
+ TDM_INFO("attached: %s", str);
+ }
+
pthread_mutex_unlock(&private_display->lock);
return ret;
lock_after_cb_done = 1;
}
+ if (tdm_debug_buffer)
+ TDM_INFO("done: %p", src);
+
+ tdm_buffer_remove_list(&private_pp->buffer_list, src);
+
tdm_buffer_unref_backend(src);
tdm_buffer_unref_backend(dst);
private_pp->private_display = private_display;
private_pp->pp_backend = pp_backend;
+ LIST_INITHEAD(&private_pp->buffer_list);
+
if (error)
*error = TDM_ERROR_NONE;
func_pp->pp_destroy(private_pp->pp_backend);
+ if (!LIST_IS_EMPTY(&private_pp->buffer_list)) {
+ char str[256] = {0,};
+ tdm_buffer_dump_list(&private_pp->buffer_list, str, 256);
+ if (strlen(str) > 0)
+ TDM_WRN("not finished: %s buffers", str);
+ }
+
free(private_pp);
}
tdm_buffer_ref_backend(dst);
ret = func_pp->pp_attach(private_pp->pp_backend, src, dst);
+ if (ret == TDM_ERROR_NONE)
+ tdm_buffer_add_list(&private_pp->buffer_list, src);
+
+ if (tdm_debug_buffer) {
+ char str[256] = {0,};
+ tdm_buffer_dump_list(&private_pp->buffer_list, str, 256);
+ TDM_INFO("attached: %s", str);
+ }
+
pthread_mutex_unlock(&private_display->lock);
return ret;
tdm_private_display *private_display;
tdm_pp *pp_backend;
+
+ struct list_head buffer_list;
};
struct _tdm_private_capture {
tdm_private_layer *private_layer;
tdm_capture *capture_backend;
+
+ struct list_head buffer_list;
};
struct _tdm_private_vblank_handler {
void
tdm_capture_destroy_internal(tdm_private_capture *private_capture);
+void
+tdm_buffer_add_list(struct list_head *list, tbm_surface_h buffer);
+void
+tdm_buffer_remove_list(struct list_head *list, tbm_surface_h buffer);
+void
+tdm_buffer_dump_list(struct list_head *list, char *str, int len);
+
#ifdef __cplusplus
}
#endif