tbm_surface_queue_h tbm_queue;
tpl_bool_t is_activated;
tpl_bool_t reset; /* TRUE if queue reseted by external */
+ tpl_bool_t need_to_enqueue;
};
static tpl_result_t
wayland_egl_surface->twe_surface = twe_surface;
wayland_egl_surface->tbm_queue = tbm_queue;
wayland_egl_surface->is_activated = TPL_FALSE;
+ wayland_egl_surface->need_to_enqueue = TPL_TRUE;
surface->width = tbm_surface_queue_get_width(tbm_queue);
surface->height = tbm_surface_queue_get_height(tbm_queue);
* commit if surface->frontbuffer that is already set and the tbm_surface
* client want to enqueue are the same.
*/
- if (surface->is_frontbuffer_mode && surface->frontbuffer == tbm_surface) {
- TPL_LOG_T("WL_EGL",
- "[ENQ_SKIP][F] Client already uses frontbuffer(%p)",
- surface->frontbuffer);
-
+ if (surface->is_frontbuffer_mode) {
/* The first buffer to be activated in frontbuffer mode must be
* committed. Subsequence frames do not need to be committed because
* the buffer is already displayed.
*/
- if (!twe_surface_check_commit_needed(wayland_egl_surface->twe_surface,
- surface->frontbuffer)) {
+
+ if (!wayland_egl_surface->need_to_enqueue ||
+ (surface->frontbuffer == tbm_surface &&
+ !twe_surface_check_commit_needed(wayland_egl_surface->twe_surface,
+ surface->frontbuffer))) {
+ TPL_LOG_T("WL_EGL",
+ "[ENQ_SKIP][F] Client already uses frontbuffer(%p)",
+ surface->frontbuffer);
TRACE_ASYNC_END((int)tbm_surface, "[DEQ]~[ENQ] BO_NAME:%d", bo_name);
TPL_OBJECT_UNLOCK(wayland_egl_surface);
return TPL_ERROR_NONE;
}
+
+ if (surface->frontbuffer == tbm_surface)
+ wayland_egl_surface->need_to_enqueue = TPL_FALSE;
}
if (sync_fence != -1) {
if (lock_ret == TPL_ERROR_NONE)
twe_display_unlock(wayland_egl_display->twe_display);
return surface->frontbuffer;
- } else
+ } else {
surface->frontbuffer = NULL;
+ wayland_egl_surface->need_to_enqueue = TPL_TRUE;
+ }
} else {
surface->frontbuffer = NULL;
}