struct _tpl_tbm_surface {
tbm_surface_queue_h tbm_queue;
+ tpl_bool_t need_reset;
};
static tpl_result_t
return (tbm_surface_h)pixmap;
}
+static void
+__cb_tbm_queue_reset_callback(tbm_surface_queue_h tbm_queue,
+ void *data)
+{
+ tpl_tbm_surface_t *tpl_tbm_surface = (tpl_tbm_surface_t *)data;
+
+ if (!tpl_tbm_surface) {
+ TPL_ERR("Invalid parameter. tpl_tbm_surface(%p)", tpl_tbm_surface);
+ return;
+ }
+
+ TPL_LOG_B("TBM", "tbm_queue(%p) has been reset!", tbm_queue);
+
+ tpl_tbm_surface->need_reset = TPL_TRUE;
+}
+
static tpl_result_t
__tpl_tbm_surface_init(tpl_surface_t *surface)
{
surface->backend.data = (void *)tpl_tbm_surface;
+ tpl_tbm_surface->need_reset = TPL_FALSE;
+
tpl_tbm_surface->tbm_queue = (tbm_surface_queue_h)surface->native_handle;
+ /* Set reset_callback to tbm_queue */
+ tbm_surface_queue_add_reset_cb(tpl_tbm_surface->tbm_queue,
+ __cb_tbm_queue_reset_callback,
+ (void *)tpl_tbm_surface);
+
TPL_LOG_B("TBM", "[INIT] tpl_surface(%p) tpl_tbm_surface_t(%p) tbm_surface_queue(%p)",
surface, tpl_tbm_surface, surface->native_handle);
static tpl_bool_t
__tpl_tbm_surface_validate(tpl_surface_t *surface)
{
- return TPL_TRUE;
+ tpl_tbm_surface_t *tpl_tbm_surface = (tpl_tbm_surface_t *)surface->backend.data;
+ tpl_bool_t ret = TPL_TRUE;
+
+ ret = !tpl_tbm_surface->need_reset;
+
+ return ret;
}
static tbm_surface_h
/* It will be dec when before tbm_surface_queue_enqueue called */
tbm_surface_internal_ref(tbm_surface);
+ tpl_tbm_surface->need_reset = TPL_FALSE;
+
TPL_LOG_B("TBM", "[DEQ] tpl_surface(%p) tbm_queue(%p) tbm_surface(%p) bo(%d)",
surface, tpl_tbm_surface->tbm_queue, tbm_surface,
tbm_bo_export(tbm_surface_internal_get_bo(tbm_surface, 0)));