e_hwc_windows: reference the queue buffer of source which is committed to pp 93/272993/1
authorChangyeon Lee <cyeon.lee@samsung.com>
Mon, 28 Mar 2022 08:51:15 +0000 (17:51 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Tue, 29 Mar 2022 10:22:18 +0000 (19:22 +0900)
this patch is for preventing the queue buffer of source is released
to queue while pp of hwc is done.

Change-Id: I2f79fe7b83cd69f8c02dc3431df42626924e55f2

src/bin/e_hwc.c
src/bin/e_hwc.h
src/bin/e_hwc_window.c
src/bin/e_hwc_windows.c

index 4ab68a4..267dc57 100644 (file)
@@ -616,7 +616,8 @@ e_hwc_del(E_Hwc *hwc)
           }
      }
 
-   e_comp_wl_buffer_reference(&hwc->pp_buffer_ref, NULL);
+   e_hwc_window_queue_buffer_reference(&hwc->pp_update.queue_buffer_ref, NULL);
+   e_comp_wl_buffer_reference(&hwc->pp_update.buffer_ref, NULL);
 
    EINA_LIST_FREE(hwc->sync_callback_list, sync_callback)
      sync_callback->hwc = NULL;
index 300ce07..ceeec24 100644 (file)
@@ -166,12 +166,11 @@ struct _E_Hwc
    Eina_Bool             pp_commit;
    Eina_Rectangle        pp_src_rect, pp_dst_rect;
    Eina_Rectangle        pp_set_src_rect, pp_set_dst_rect;
-   E_Hwc_Window         *pp_hwc_window;
-   E_Hwc_Window_Buffer   pp_buffer;
-   E_Comp_Wl_Buffer_Ref  pp_buffer_ref;
    int                   pp_minw, pp_minh, pp_maxw, pp_maxh;
    int                   pp_align;
    int                   pp_align_vertical;
+   E_Hwc_Window         *pp_hwc_window;
+   E_Hwc_Window_Update_Data pp_update;
 
    /* external output */
    Eina_Rectangle       mirror_rect;
index ee476a3..3ffa61d 100644 (file)
@@ -1476,7 +1476,7 @@ e_hwc_window_display_or_commit_buffer_check(E_Hwc_Window *hwc_window, tbm_surfac
           return EINA_TRUE;
      }
 
-   if (hwc->pp_buffer.tsurface == tsurface)
+   if (hwc->pp_update.buffer.tsurface == tsurface)
      return EINA_TRUE;
 
    return EINA_FALSE;
index de4982b..e006c7a 100644 (file)
@@ -828,7 +828,7 @@ _e_hwc_windows_target_buffer_fetch(E_Hwc *hwc)
         if (tsurface == hwc_window->current.buffer.tsurface) return EINA_FALSE;
 
         e_hwc_window_queue_buffer_reference(&hwc_window->current.queue_buffer_ref, queue_buffer);
-        e_hwc_window_buffer_set(&hwc_window->current.buffer, tsurface, NULL, 0);
+        e_hwc_window_buffer_set(&hwc_window->current.buffer, tsurface, queue_buffer->queue, 0);
         e_hwc_window_info_update(hwc_window);
 
         /* the damage isn't supported by hwc extension yet */
@@ -1857,27 +1857,17 @@ _e_hwc_windows_pp_commit_handler(tdm_pp *pp, tbm_surface_h tsurface_src, tbm_sur
    EINA_SAFETY_ON_FALSE_RETURN(hwc_window);
 
    queue_buffer = e_hwc_window_queue_buffer_find(hwc->pp_queue, tsurface_dst);
-   if (!queue_buffer)
-     {
-        ERR("fail to e_hwc_window_queue_buffer_find");
-        goto done;
-     }
-
-   if (!e_hwc_window_queue_buffer_enqueue(hwc->pp_queue, queue_buffer))
-     ERR("fail to e_hwc_window_queue_buffer_enqueue");
-
-   /* source tsurface buffer queue */
-   if (hwc->pp_buffer.queue)
+   if (queue_buffer)
      {
-        queue_buffer = e_hwc_window_queue_buffer_find(hwc->pp_buffer.queue,
-                                                      hwc->pp_buffer.tsurface);
-        if (queue_buffer)
-          e_hwc_window_queue_buffer_release(hwc->pp_buffer.queue, queue_buffer);
+        if (!e_hwc_window_queue_buffer_enqueue(hwc->pp_queue, queue_buffer))
+          ERR("fail to e_hwc_window_queue_buffer_enqueue");
      }
+   else
+     ERR("fail to e_hwc_window_queue_buffer_find");
 
-   e_comp_wl_buffer_reference(&hwc->pp_buffer_ref, NULL);
+   e_hwc_window_queue_buffer_reference(&hwc->pp_update.queue_buffer_ref, NULL);
+   e_comp_wl_buffer_reference(&hwc->pp_update.buffer_ref, NULL);
 
-done:
    tbm_surface_internal_unref(tsurface_src);
    tbm_surface_internal_unref(tsurface_dst);
 
@@ -1891,7 +1881,7 @@ done:
              hwc->tpp = NULL;
           }
 
-        e_hwc_window_buffer_set(&hwc->pp_buffer, NULL, NULL, 0);
+        e_hwc_window_buffer_set(&hwc->pp_update.buffer, NULL, NULL, 0);
      }
 }
 
@@ -3041,7 +3031,7 @@ _e_hwc_windows_pp_rect_set(E_Hwc *hwc, Eina_Rectangle *src_rect, Eina_Rectangle
 }
 
 static Eina_Bool
-_e_hwc_windows_pp_buffer_update(E_Hwc *hwc)
+_e_hwc_windows_pp_update(E_Hwc *hwc)
 {
    E_Hwc_Window *hwc_window;
 
@@ -3054,14 +3044,17 @@ _e_hwc_windows_pp_buffer_update(E_Hwc *hwc)
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
 
-   if (hwc_window->current.buffer.tsurface == hwc->pp_buffer.tsurface)
+   if (hwc_window->current.buffer.tsurface == hwc->pp_update.buffer.tsurface)
      return EINA_FALSE;
 
-   e_hwc_window_buffer_set(&hwc->pp_buffer,
-                           hwc_window->current.buffer.tsurface, hwc_window->current.buffer.queue, 0);
+   if (e_hwc_window_is_target(hwc_window))
+     e_hwc_window_queue_buffer_reference(&hwc->pp_update.queue_buffer_ref,
+                                         hwc_window->current.queue_buffer_ref.buffer);
+   else
+     e_comp_wl_buffer_reference(&hwc->pp_update.buffer_ref, _e_hwc_windows_comp_wl_buffer_get(hwc_window));
 
-   if (!e_hwc_window_is_target(hwc_window))
-     e_comp_wl_buffer_reference(&hwc->pp_buffer_ref, _e_hwc_windows_comp_wl_buffer_get(hwc_window));
+   e_hwc_window_buffer_set(&hwc->pp_update.buffer,
+                           hwc_window->current.buffer.tsurface, hwc_window->current.buffer.queue, 0);
 
    return EINA_TRUE;
 }
@@ -3260,7 +3253,7 @@ _e_hwc_windows_pp_commit(E_Hwc *hwc)
 
    if (!e_hwc_window_queue_buffer_can_dequeue(hwc->pp_queue)) return EINA_TRUE;
 
-   if (!_e_hwc_windows_pp_buffer_update(hwc)) return EINA_TRUE;
+   if (!_e_hwc_windows_pp_update(hwc)) return EINA_TRUE;
 
    queue_buffer = e_hwc_window_queue_buffer_dequeue(hwc->pp_queue);
    if (!queue_buffer)
@@ -3269,7 +3262,6 @@ _e_hwc_windows_pp_commit(E_Hwc *hwc)
         return EINA_FALSE;
      }
 
-
    if ((hwc->pp_dst_rect.x != 0) ||
        (hwc->pp_dst_rect.y != 0) ||
        (hwc->pp_dst_rect.w != tbm_surface_get_width(queue_buffer->tsurface)) ||
@@ -3278,7 +3270,7 @@ _e_hwc_windows_pp_commit(E_Hwc *hwc)
 
    if (hwc->tpp)
      {
-        if (!_e_hwc_windows_pp_info_set(hwc, hwc->pp_buffer.tsurface, queue_buffer->tsurface,
+        if (!_e_hwc_windows_pp_info_set(hwc, hwc->pp_update.buffer.tsurface, queue_buffer->tsurface,
                                         &hwc->pp_src_rect, &hwc->pp_dst_rect))
           {
              EHWSERR("fail _e_hwc_windows_pp_info_set", hwc);
@@ -3286,13 +3278,13 @@ _e_hwc_windows_pp_commit(E_Hwc *hwc)
           }
 
         tbm_surface_internal_ref(queue_buffer->tsurface);
-        tbm_surface_internal_ref(hwc->pp_buffer.tsurface);
-        terror = tdm_pp_attach(hwc->tpp, hwc->pp_buffer.tsurface, queue_buffer->tsurface);
+        tbm_surface_internal_ref(hwc->pp_update.buffer.tsurface);
+        terror = tdm_pp_attach(hwc->tpp, hwc->pp_update.buffer.tsurface, queue_buffer->tsurface);
         EINA_SAFETY_ON_FALSE_GOTO(terror == TDM_ERROR_NONE, attach_fail);
 
         EHWSTRACE("!!!!!!!! HWC PP Commit !!!!!!!!", NULL, hwc);
-        EHWSTRACE("PP COM tsurface:%p tqueue:%p pp_hwc_window:%p", NULL, hwc,
-                  hwc->pp_buffer.tsurface, hwc->pp_tqueue, hwc->pp_hwc_window);
+        EHWSTRACE("PP COM src_tsurface:%p dst_tsurface:%p tqueue:%p pp_hwc_window:%p", NULL, hwc,
+                  hwc->pp_update.buffer.tsurface, queue_buffer->tsurface, hwc->pp_tqueue, hwc->pp_hwc_window);
 
         terror = tdm_pp_commit(hwc->tpp);
         EINA_SAFETY_ON_FALSE_GOTO(terror == TDM_ERROR_NONE, commit_fail);
@@ -3302,8 +3294,12 @@ _e_hwc_windows_pp_commit(E_Hwc *hwc)
    else
      {
         /* sw copy */
-        _e_hwc_windows_pixman_copy(hwc, hwc->pp_buffer.tsurface, queue_buffer->tsurface,
+        _e_hwc_windows_pixman_copy(hwc, hwc->pp_update.buffer.tsurface, queue_buffer->tsurface,
                                    &hwc->pp_src_rect, &hwc->pp_dst_rect);
+
+        EHWSTRACE("PP Pixman src_tsurface:%p dst_tsurface:%p tqueue:%p pp_hwc_window:%p", NULL, hwc,
+                  hwc->pp_update.buffer.tsurface, queue_buffer->tsurface, hwc->pp_tqueue, hwc->pp_hwc_window);
+
         /* enqueue buffer */
         e_hwc_window_queue_buffer_enqueue(hwc->pp_queue, queue_buffer);
      }
@@ -3326,7 +3322,7 @@ _e_hwc_windows_pp_commit(E_Hwc *hwc)
                }
              else
                {
-                  comp_info = _e_hwc_windows_comp_info_get(hwc->pp_buffer.tsurface);
+                  comp_info = _e_hwc_windows_comp_info_get(hwc->pp_update.buffer.tsurface);
                   if (comp_info)
                     e_presentation_time_container_feedback_merge(&pp_comp_info->presentation_container,
                                                                  &comp_info->presentation_container);
@@ -3342,18 +3338,11 @@ _e_hwc_windows_pp_commit(E_Hwc *hwc)
 commit_fail:
 attach_fail:
    tbm_surface_internal_unref(queue_buffer->tsurface);
-   tbm_surface_internal_unref(hwc->pp_buffer.tsurface);
+   tbm_surface_internal_unref(hwc->pp_update.buffer.tsurface);
 pp_fail:
    if (queue_buffer)
      e_hwc_window_queue_buffer_release(hwc->pp_queue, queue_buffer);
 
-   if ((hwc->pp_buffer.tsurface) && (hwc->pp_buffer.queue))
-     {
-        queue_buffer = e_hwc_window_queue_buffer_find(hwc->pp_buffer.queue, hwc->pp_buffer.tsurface);
-        if (queue_buffer)
-          e_hwc_window_queue_buffer_release(hwc->pp_buffer.queue, queue_buffer);
-     }
-
    EHWSERR("failed _e_hwc_windows_pp_data_commit", hwc);
 
    hwc->pp_commit = EINA_FALSE;
@@ -3778,7 +3767,9 @@ e_hwc_windows_pp_unset(E_Hwc *hwc)
              hwc->tpp = NULL;
           }
 
-        e_hwc_window_buffer_set(&hwc->pp_buffer, NULL, NULL, 0);
+        e_hwc_window_queue_buffer_reference(&hwc->pp_update.queue_buffer_ref, NULL);
+        e_comp_wl_buffer_reference(&hwc->pp_update.buffer_ref, NULL);
+        e_hwc_window_buffer_set(&hwc->pp_update.buffer, NULL, NULL, 0);
      }
 
    _e_hwc_windows_target_window_pp_queue_set(hwc->target_hwc_window, NULL);