tbm_surface_h tbm_surface = NULL;
tbm_surface_queue_error_e tsq_err = TBM_SURFACE_QUEUE_ERROR_NONE;
- if (!tbm_surface_queue_can_acquire(surf_source->tbm_queue, 0)) {
- TPL_ERR("Received acquirable event, but nothing to commit.");
- return;
- }
+ /* One or more tbm_surfaces that are not consumed can be in tbm_surface_queue
+ * because event_fd has two writes but read may be processed only once.
+ */
+ while (tbm_surface_queue_can_acquire(surf_source->tbm_queue, 0)) {
+ tsq_err = tbm_surface_queue_acquire(surf_source->tbm_queue, &tbm_surface);
+ if (!tbm_surface || tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE) {
+ TPL_ERR("Failed to acquire from tbm_queue(%p)",
+ surf_source->tbm_queue);
+ return;
+ }
- tsq_err = tbm_surface_queue_acquire(surf_source->tbm_queue, &tbm_surface);
- if (!tbm_surface || tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE) {
- TPL_ERR("Failed to acquire from tbm_queue(%p)",
- surf_source->tbm_queue);
- return;
- }
+ tbm_surface_internal_ref(tbm_surface);
- tbm_surface_internal_ref(tbm_surface);
+ TPL_LOG_T("WL_EGL", "[ACQ] tbm_surface(%p) bo(%d)",
+ tbm_surface,
+ tbm_bo_export(tbm_surface_internal_get_bo(tbm_surface, 0)));
- TPL_LOG_T("WL_EGL", "[ACQ] tbm_surface(%p) bo(%d)",
- tbm_surface,
- tbm_bo_export(tbm_surface_internal_get_bo(tbm_surface, 0)));
+ while (!surf_source->vblank_done) {
+ tdm_error tdm_err = TDM_ERROR_NONE;
- while (!surf_source->vblank_done) {
- tdm_error tdm_err = TDM_ERROR_NONE;
-
- tdm_err = tdm_client_handle_events(_twe_ctx->tdm_client);
- if (tdm_err != TDM_ERROR_NONE) {
- TPL_ERR("Failed to tdm_client_handle_events.");
- break;
+ tdm_err = tdm_client_handle_events(_twe_ctx->tdm_client);
+ if (tdm_err != TDM_ERROR_NONE) {
+ TPL_ERR("Failed to tdm_client_handle_events.");
+ break;
+ }
}
- }
- _twe_thread_wl_surface_commit(surf_source, tbm_surface);
+ _twe_thread_wl_surface_commit(surf_source, tbm_surface);
+ }
}
static gboolean