e_hwc_window_queue: do not unset user of queue if acquired queue_buffer is exist accepted/tizen/6.5/unified/20211117.210511 submit/tizen_6.5/20211116.041508
authorChangyeon Lee <cyeon.lee@samsung.com>
Mon, 15 Nov 2021 08:16:53 +0000 (17:16 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Tue, 16 Nov 2021 04:07:25 +0000 (13:07 +0900)
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

index b36f88db6c5be8ea13e3d889333640a30d71e3d9..88b97759e9b9452af066b76d51c8dc1ed496c058 100644 (file)
@@ -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;