twe_wl_surf_source *surf_source = buf_info->surf_source;
tbm_surface_queue_error_e tsq_err;
- g_mutex_lock(&surf_source->free_queue_mutex);
-
tsq_err = tbm_surface_queue_release(surf_source->tbm_queue,
tbm_surface);
if (tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE)
tbm_bo_export(tbm_surface_internal_get_bo(tbm_surface, 0)));
tbm_surface_internal_unref(tbm_surface);
- g_cond_signal(&surf_source->free_queue_cond);
- g_mutex_unlock(&surf_source->free_queue_mutex);
-
return;
}
{
twe_wl_surf_source *surf_source = (twe_wl_surf_source *)data;
- if (surf_source && !g_source_is_destroyed(&surf_source->gsource)) {
- surf_source->swapchain_properties.width =
- tbm_surface_queue_get_width(tbm_queue);
- surf_source->swapchain_properties.height =
- tbm_surface_queue_get_height(tbm_queue);
- surf_source->swapchain_properties.buffer_count =
- tbm_surface_queue_get_size(tbm_queue);
- surf_source->format = tbm_surface_queue_get_format(tbm_queue);
+ if (!surf_source || g_source_is_destroyed(&surf_source->gsource)) {
+ TPL_ERR("Invalid parameter. surf_source(%p)", surf_source);
+ return;
}
+ surf_source->swapchain_properties.width =
+ tbm_surface_queue_get_width(tbm_queue);
+ surf_source->swapchain_properties.height =
+ tbm_surface_queue_get_height(tbm_queue);
+ surf_source->swapchain_properties.buffer_count =
+ tbm_surface_queue_get_size(tbm_queue);
+ surf_source->format = tbm_surface_queue_get_format(tbm_queue);
+
+ g_mutex_lock(&surf_source->free_queue_mutex);
+ g_cond_signal(&surf_source->free_queue_cond);
+ g_mutex_unlock(&surf_source->free_queue_mutex);
+
TPL_LOG_T(BACKEND, "tbm_queue(%p) has been reset!", tbm_queue);
}
}
}
+static void __cb_tbm_queue_dequeueable_callback(tbm_surface_queue_h tbm_queue,
+ void *data)
+{
+ twe_wl_surf_source *surf_source = (twe_wl_surf_source *)data;
+
+ if (!surf_source || g_source_is_destroyed(&surf_source->gsource)) {
+ TPL_ERR("Invalid parameter. surf_source(%p)", surf_source);
+ return;
+ }
+
+ g_mutex_lock(&surf_source->free_queue_mutex);
+
+ TPL_LOG_T(BACKEND, "[DEQUEUEABLE_CB] surf_source(%p) tbm_queue(%p)",
+ surf_source, surf_source->tbm_queue);
+
+ g_cond_signal(&surf_source->free_queue_cond);
+ g_mutex_unlock(&surf_source->free_queue_mutex);
+}
+
static void
_twe_thread_wl_vk_surface_commit(twe_wl_surf_source *surf_source,
tbm_surface_h tbm_surface);
if (tbm_surface_queue_add_reset_cb(tbm_queue,
__cb_tbm_queue_reset_callback,
- NULL) != TBM_SURFACE_QUEUE_ERROR_NONE) {
+ (void *)source) != TBM_SURFACE_QUEUE_ERROR_NONE) {
TPL_ERR("Failed to register reset callback to tbm_surface_queue(%p)",
tbm_queue);
tbm_surface_queue_destroy(tbm_queue);
return TPL_ERROR_INVALID_OPERATION;
}
+ if (tbm_surface_queue_add_dequeuable_cb(surf_source->tbm_queue,
+ __cb_tbm_queue_dequeueable_callback,
+ (void *)surf_source) != TBM_SURFACE_QUEUE_ERROR_NONE) {
+ TPL_ERR("Failed to register dequeueable callback to tbm_surface_queue(%p)",
+ surf_source->tbm_queue);
+ tbm_surface_queue_destroy(surf_source->tbm_queue);
+ return TPL_ERROR_INVALID_OPERATION;
+ }
+
if (present_mode == TPL_DISPLAY_PRESENT_MODE_FIFO
|| present_mode == TPL_DISPLAY_PRESENT_MODE_FIFO_RELAXED) {
surf_source->vblank_waiting_buffers = __tpl_list_alloc();