tpl_gmutex_unlock(&wl_egl_surface->presentation_sync.mutex);
-
- {
- tbm_surface_queue_error_e tsq_err = TBM_SURFACE_QUEUE_ERROR_NONE;
- tpl_wl_egl_buffer_t *wl_egl_buffer = NULL;
- int idx = 0;
- tpl_bool_t need_to_release = TPL_FALSE;
- tpl_bool_t need_to_cancel = TPL_FALSE;
-
- while (wl_egl_surface->buffer_cnt) {
- tpl_gmutex_lock(&wl_egl_surface->buffers_mutex);
- wl_egl_buffer = wl_egl_surface->buffers[idx];
- if (wl_egl_buffer) {
- TPL_DEBUG("[idx:%d] wl_egl_buffer(%p) tbm_surface(%p) status(%s)",
- idx, wl_egl_buffer,
- wl_egl_buffer->tbm_surface,
- status_to_string[wl_egl_buffer->status]);
-
- wl_egl_surface->buffers[idx] = NULL;
- wl_egl_surface->buffer_cnt--;
- } else {
- tpl_gmutex_unlock(&wl_egl_surface->buffers_mutex);
- idx++;
- continue;
- }
- tpl_gmutex_unlock(&wl_egl_surface->buffers_mutex);
-
- tpl_gmutex_lock(&wl_egl_buffer->mutex);
-
- need_to_release = (wl_egl_buffer->status == ACQUIRED ||
- wl_egl_buffer->status == WAITING_SIGNALED ||
- wl_egl_buffer->status == WAITING_VBLANK ||
- wl_egl_buffer->status == COMMITTED);
-
- need_to_cancel = wl_egl_buffer->status == DEQUEUED;
-
- if (wl_egl_buffer->status == WAITING_SIGNALED) {
- tpl_result_t wait_result = TPL_ERROR_NONE;
- wait_result = tpl_cond_timed_wait(&wl_egl_buffer->cond,
- &wl_egl_buffer->mutex,
- 16);
- if (wait_result == TPL_ERROR_TIME_OUT)
- TPL_WARN("timeout occured waiting signaled. wl_egl_buffer(%p)",
- wl_egl_buffer);
- }
-
- if (need_to_release) {
- tsq_err = tbm_surface_queue_release(wl_egl_surface->tbm_queue,
- wl_egl_buffer->tbm_surface);
- if (tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE)
- TPL_ERR("Failed to release. tbm_surface(%p) tsq_err(%d)",
- wl_egl_buffer->tbm_surface, tsq_err);
- }
-
- if (need_to_cancel) {
- tsq_err = tbm_surface_queue_cancel_dequeue(wl_egl_surface->tbm_queue,
- wl_egl_buffer->tbm_surface);
- if (tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE)
- TPL_ERR("Failed to release tbm_surface(%p) tsq_err(%d)",
- wl_egl_buffer->tbm_surface, tsq_err);
- }
-
- tpl_gmutex_unlock(&wl_egl_buffer->mutex);
-
- if (need_to_release || need_to_cancel)
- tbm_surface_internal_unref(wl_egl_buffer->tbm_surface);
-
- idx++;
- }
- }
-
if (wl_egl_surface->surface_sync) {
TPL_INFO("[SURFACE_SYNC_DESTROY]",
"wl_egl_surface(%p) surface_sync(%p)",
}
static void
+_tpl_wl_egl_surface_buffer_clear(tpl_wl_egl_surface_t *wl_egl_surface)
+{
+ tbm_surface_queue_error_e tsq_err = TBM_SURFACE_QUEUE_ERROR_NONE;
+ tpl_wl_egl_display_t *wl_egl_display = wl_egl_surface->wl_egl_display;
+ tpl_wl_egl_buffer_t *wl_egl_buffer = NULL;
+ tpl_bool_t need_to_release = TPL_FALSE;
+ tpl_bool_t need_to_cancel = TPL_FALSE;
+ int idx = 0;
+
+ while (wl_egl_surface->buffer_cnt) {
+ tpl_gmutex_lock(&wl_egl_display->wl_event_mutex);
+ tpl_gmutex_lock(&wl_egl_surface->buffers_mutex);
+ wl_egl_buffer = wl_egl_surface->buffers[idx];
+
+ if (wl_egl_buffer) {
+ TPL_DEBUG("[idx:%d] wl_egl_buffer(%p) tbm_surface(%p) status(%s)",
+ idx, wl_egl_buffer,
+ wl_egl_buffer->tbm_surface,
+ status_to_string[wl_egl_buffer->status]);
+ wl_egl_surface->buffers[idx] = NULL;
+ wl_egl_surface->buffer_cnt--;
+ } else {
+ tpl_gmutex_unlock(&wl_egl_surface->buffers_mutex);
+ tpl_gmutex_unlock(&wl_egl_display->wl_event_mutex);
+ idx++;
+ continue;
+ }
+
+ tpl_gmutex_unlock(&wl_egl_surface->buffers_mutex);
+
+ tpl_gmutex_lock(&wl_egl_buffer->mutex);
+
+ /* ACQUIRED, WAITING_SIGNALED, WAITING_VBLANK, COMMITTED */
+ /* It has been acquired but has not yet been released, so this
+ * buffer must be released. */
+ need_to_release = (wl_egl_buffer->status == ACQUIRED ||
+ wl_egl_buffer->status == WAITING_SIGNALED ||
+ wl_egl_buffer->status == WAITING_VBLANK ||
+ wl_egl_buffer->status == COMMITTED);
+ /* After dequeue, it has not been enqueued yet
+ * so cancel_dequeue must be performed. */
+ need_to_cancel = wl_egl_buffer->status == DEQUEUED;
+
+ if (wl_egl_buffer->status == WAITING_SIGNALED) {
+ tpl_result_t wait_result = TPL_ERROR_NONE;
+ tpl_gmutex_unlock(&wl_egl_display->wl_event_mutex);
+ wait_result = tpl_cond_timed_wait(&wl_egl_buffer->cond,
+ &wl_egl_buffer->mutex,
+ 16); /* 16ms */
+ tpl_gmutex_lock(&wl_egl_display->wl_event_mutex);
+ if (wait_result == TPL_ERROR_TIME_OUT)
+ TPL_WARN("timeout occured waiting signaled. wl_egl_buffer(%p)",
+ wl_egl_buffer);
+ }
+
+ if (need_to_release) {
+ tsq_err = tbm_surface_queue_release(wl_egl_surface->tbm_queue,
+ wl_egl_buffer->tbm_surface);
+ if (tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE)
+ TPL_ERR("Failed to release. tbm_surface(%p) tsq_err(%d)",
+ wl_egl_buffer->tbm_surface, tsq_err);
+ }
+
+ if (need_to_cancel) {
+ tsq_err = tbm_surface_queue_cancel_dequeue(wl_egl_surface->tbm_queue,
+ wl_egl_buffer->tbm_surface);
+ if (tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE)
+ TPL_ERR("Failed to release tbm_surface(%p) tsq_err(%d)",
+ wl_egl_buffer->tbm_surface, tsq_err);
+ }
+
+ tpl_gmutex_unlock(&wl_egl_buffer->mutex);
+
+ if (need_to_release || need_to_cancel)
+ tbm_surface_internal_unref(wl_egl_buffer->tbm_surface);
+
+ tpl_gmutex_unlock(&wl_egl_display->wl_event_mutex);
+
+ idx++;
+ }
+}
+
+static void
__tpl_wl_egl_surface_fini(tpl_surface_t *surface)
{
tpl_wl_egl_surface_t *wl_egl_surface = NULL;
wl_egl_surface,
wl_egl_surface->wl_surface, wl_egl_surface->tbm_queue);
+ _tpl_wl_egl_surface_buffer_clear(wl_egl_surface);
+
if (wl_egl_surface->surf_source)
tpl_gsource_destroy(wl_egl_surface->surf_source, TPL_TRUE);
wl_egl_surface->surf_source = NULL;