From 5aa645cd582d766cc9b7c2823d1da500548b1659 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Mon, 15 Nov 2021 17:16:53 +0900 Subject: [PATCH] e_hwc_window_queue: do not unset user of queue if acquired queue_buffer is exist unset user of queue when all queue_buffers are released, if queue isn't target. because even if exported queue buffers are destroyed, queue buffer can be displayed in case of client is destroyed. Change-Id: I3d36140e550f41b170e95f68d93196f4c597be3e --- src/bin/e_hwc_window_queue.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/bin/e_hwc_window_queue.c b/src/bin/e_hwc_window_queue.c index b36f88d..88b9775 100644 --- a/src/bin/e_hwc_window_queue.c +++ b/src/bin/e_hwc_window_queue.c @@ -426,9 +426,6 @@ _e_hwc_window_queue_exported_buffer_destroy_cb(struct wl_listener *listener, voi if (wl_buffer != queue_buffer->exported_wl_buffer) return; queue = queue_buffer->queue; - queue_buffer->exported = EINA_FALSE; - queue_buffer->exported_wl_buffer = NULL; - wl_list_remove(&queue_buffer->exported_destroy_listener.link); if ((queue->state == E_HWC_WINDOW_QUEUE_STATE_SET) || (queue->state == E_HWC_WINDOW_QUEUE_STATE_SET_WAITING_BUFFER)) @@ -438,6 +435,9 @@ _e_hwc_window_queue_exported_buffer_destroy_cb(struct wl_listener *listener, voi e_hwc_window_queue_buffer_release(queue, queue_buffer); queue_buffer->usable = EINA_FALSE; + queue_buffer->exported = EINA_FALSE; + queue_buffer->exported_wl_buffer = NULL; + wl_list_remove(&queue_buffer->exported_destroy_listener.link); hwc_window = queue->user; EHWQINF("DES ts:%p tq:%p wl_buffer:%p", @@ -665,6 +665,9 @@ _e_hwc_window_queue_buffers_retrieve_done(E_Hwc_Window_Queue *queue) { if (queue_buffer->exported) return EINA_FALSE; + + if ((!queue->is_target) && (queue_buffer->acquired)) + return EINA_FALSE; } return EINA_TRUE; @@ -1746,10 +1749,21 @@ e_hwc_window_queue_buffer_release(E_Hwc_Window_Queue *queue, E_Hwc_Window_Queue_ (user ? user->ec : NULL), queue->hwc, queue, queue_buffer->tsurface, queue->tqueue); if (!queue->tqueue) return EINA_FALSE; - if (queue_buffer->reseted) return EINA_TRUE; - tsq_err = tbm_surface_queue_release(queue->tqueue, queue_buffer->tsurface); - EINA_SAFETY_ON_FALSE_RETURN_VAL(tsq_err == TBM_SURFACE_QUEUE_ERROR_NONE, EINA_FALSE); + if (!queue_buffer->reseted) + { + tsq_err = tbm_surface_queue_release(queue->tqueue, queue_buffer->tsurface); + if (tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE) + EHWQERR("fail to tbm_surface_queue_release queue_buffer:%p tsurface:%p", + NULL, NULL, queue, queue_buffer, queue_buffer->tsurface); + } + + if ((!queue->is_target) && + (queue->state == E_HWC_WINDOW_QUEUE_STATE_UNSET_WAITING)) + { + if (_e_hwc_window_queue_buffers_retrieve_done(queue)) + _e_hwc_window_queue_unset(queue); + } } return EINA_TRUE; -- 2.7.4