e_hwc_windows: don't release buffer to queue if hwc_window is committing buffer 65/236765/2 accepted/tizen/unified/20200623.080525 submit/tizen/20200623.022629
authorChangyeon Lee <cyeon.lee@samsung.com>
Fri, 19 Jun 2020 04:46:15 +0000 (13:46 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Mon, 22 Jun 2020 08:29:10 +0000 (08:29 +0000)
if committing buffer is released to queue, compositor can render on displaying buffer

Change-Id: Ia300a9a2c021ca9b0b9d886b2ae861ffc448aaf4

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

index bf18d12ba54d30cc1732e64eadb677d6fbcc39aa..0925f8ade818853a416bfa9a6bed5fd297d2fc87 100644 (file)
@@ -1254,6 +1254,20 @@ e_hwc_window_info_update(E_Hwc_Window *hwc_window)
    return EINA_FALSE;
 }
 
+EINTERN Eina_Bool
+e_hwc_window_display_or_commit_buffer_check(E_Hwc_Window *hwc_window, tbm_surface_h tsurface)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(tsurface, EINA_FALSE);
+
+   if (hwc_window->display.buffer.tsurface == tsurface) return EINA_TRUE;
+
+   if (!hwc_window->commit_data) return EINA_FALSE;
+   if (hwc_window->commit_data->buffer.tsurface == tsurface) return EINA_TRUE;
+
+   return EINA_FALSE;
+}
+
 EINTERN Eina_Bool
 e_hwc_window_buffer_fetch(E_Hwc_Window *hwc_window)
 {
@@ -1303,8 +1317,8 @@ e_hwc_window_buffer_fetch(E_Hwc_Window *hwc_window)
         if (tsurface == hwc_window->buffer.tsurface) return EINA_FALSE;
      }
 
-   if (hwc_window->buffer.tsurface && hwc_window->buffer.queue &&
-       hwc_window->buffer.tsurface != hwc_window->display.buffer.tsurface)
+   if ((hwc_window->buffer.tsurface) && (hwc_window->buffer.queue) &&
+       (!e_hwc_window_display_or_commit_buffer_check(hwc_window, hwc_window->buffer.tsurface)))
      {
         queue_buffer = e_hwc_window_queue_buffer_find(hwc_window->buffer.queue, hwc_window->buffer.tsurface);
         if (queue_buffer)
index d53f04f0a2f4fb5bca949cd199057dc3da261219..31388395c6828fb4f1b122479f4bb87f5fd09265 100644 (file)
@@ -218,6 +218,7 @@ EINTERN void                    e_hwc_window_name_set(E_Hwc_Window *hwc_window);
 EINTERN Eina_Bool               e_hwc_window_set_property(E_Hwc_Window *hwc_window, unsigned int id, const char *name, tdm_value value, Eina_Bool force);
 EINTERN Eina_Bool               e_hwc_window_get_property(E_Hwc_Window *hwc_window, unsigned int id, tdm_value *value);
 EINTERN void                    e_hwc_window_client_type_override(E_Hwc_Window *hwc_window);
+EINTERN Eina_Bool               e_hwc_window_display_or_commit_buffer_check(E_Hwc_Window *hwc_window, tbm_surface_h tsurface);
 
 EINTERN E_Hwc_Window_Hook      *e_hwc_window_hook_add(E_Hwc_Window_Hook_Point hookpoint, E_Hwc_Window_Hook_Cb func, const void *data);
 EINTERN void                    e_hwc_window_hook_del(E_Hwc_Window_Hook *ch);
index a8062eb322a0206fb86373bcc1d5095531ec244c..bb955b142b5e31ec1613da08f6b549f6582164b7 100644 (file)
@@ -565,8 +565,8 @@ _e_hwc_windows_target_buffer_fetch(E_Hwc *hwc, Eina_Bool tdm_set)
              return EINA_FALSE;
           }
 
-        if (hwc_window->buffer.tsurface &&
-            hwc_window->buffer.tsurface != hwc_window->display.buffer.tsurface)
+        if ((hwc_window->buffer.tsurface) &&
+            (!e_hwc_window_display_or_commit_buffer_check(hwc_window, hwc_window->buffer.tsurface)))
           {
              queue_buffer = e_hwc_window_queue_buffer_find(hwc_window->buffer.queue, hwc_window->buffer.tsurface);
              if (queue_buffer)
@@ -614,7 +614,7 @@ _e_hwc_windows_target_buffer_fetch(E_Hwc *hwc, Eina_Bool tdm_set)
 
         if (!hwc_window->buffer.tsurface) return EINA_FALSE;
 
-        if (hwc_window->buffer.tsurface != hwc_window->display.buffer.tsurface)
+        if (!e_hwc_window_display_or_commit_buffer_check(hwc_window, hwc_window->buffer.tsurface))
           {
              queue_buffer = e_hwc_window_queue_buffer_find(hwc_window->buffer.queue, hwc_window->buffer.tsurface);
              if (queue_buffer)