e_hwc_window: fix wrong transform of recover buffer 44/248344/1
authorChangyeon Lee <cyeon.lee@samsung.com>
Wed, 25 Nov 2020 11:31:16 +0000 (20:31 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Wed, 25 Nov 2020 12:02:48 +0000 (21:02 +0900)
if recover buffer is created by display buffer, recover buffer has
the transform normal
in case of window is rotated, recover buffer has wrong transform
so we add trnasform to window buffer and
set transform of display buffer to recover buffer.

Change-Id: I50bf4a12abfe50ec0b89d227ba441a7d9d179aeb

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

index 565f559ba31195f973a620e209b96e2caa4f7bc6..a485e70fec32f54206f151d3c93b56d367ce93a5 100644 (file)
@@ -273,7 +273,8 @@ _e_hwc_window_buffer_cb_queue_destroy(struct wl_listener *listener, void *data)
 EINTERN void
 e_hwc_window_buffer_set(E_Hwc_Window_Buffer *window_buffer,
                         tbm_surface_h tsurface,
-                        E_Hwc_Window_Queue *queue)
+                        E_Hwc_Window_Queue *queue,
+                        int transform)
 {
    EINA_SAFETY_ON_NULL_RETURN(window_buffer);
 
@@ -299,6 +300,7 @@ e_hwc_window_buffer_set(E_Hwc_Window_Buffer *window_buffer,
 
    window_buffer->queue = queue;
    window_buffer->tsurface = tsurface;
+   window_buffer->transform = transform;
 }
 
 static void
@@ -740,7 +742,7 @@ _e_hwc_window_commit_data_acquire_device(E_Hwc_Window *hwc_window)
    memcpy(&commit_data->info, &hwc_window->info, sizeof(tdm_hwc_window_info));
 
    e_hwc_window_buffer_set(&commit_data->buffer, hwc_window->buffer.tsurface,
-                           hwc_window->buffer.queue);
+                           hwc_window->buffer.queue, hwc_window->buffer.transform);
 
    tbm_surface_internal_ref(commit_data->buffer.tsurface);
 
@@ -1296,6 +1298,7 @@ e_hwc_window_buffer_fetch(E_Hwc_Window *hwc_window)
    tdm_error error = TDM_ERROR_NONE;
    E_Hwc_Window_Queue_Buffer *queue_buffer = NULL, *queue_buffer2 = NULL;
    E_Client *ec = NULL;
+   E_Comp_Wl_Buffer *comp_buffer = NULL;
    E_Hwc *hwc;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
@@ -1380,9 +1383,13 @@ e_hwc_window_buffer_fetch(E_Hwc_Window *hwc_window)
 
    /* exist tsurface for update hwc_window */
    if (tsurface)
-     e_hwc_window_buffer_set(&hwc_window->buffer, tsurface, hwc_window->queue);
+     {
+        comp_buffer = _e_hwc_window_comp_wl_buffer_get(hwc_window);
+        e_hwc_window_buffer_set(&hwc_window->buffer, tsurface, hwc_window->queue,
+                                comp_buffer ? comp_buffer->transform : 0);
+     }
    else
-     e_hwc_window_buffer_set(&hwc_window->buffer, NULL, NULL);
+     e_hwc_window_buffer_set(&hwc_window->buffer, NULL, NULL, 0);
 
    error = tdm_hwc_window_set_buffer(thwc_window, hwc_window->buffer.tsurface);
    EINA_SAFETY_ON_TRUE_RETURN_VAL(error != TDM_ERROR_NONE, EINA_FALSE);
@@ -1465,7 +1472,7 @@ e_hwc_window_commit_data_acquire(E_Hwc_Window *hwc_window)
         commit_data = E_NEW(E_Hwc_Window_Commit_Data, 1);
         EINA_SAFETY_ON_NULL_RETURN_VAL(commit_data, NULL);
 
-        e_hwc_window_buffer_set(&commit_data->buffer, NULL, NULL);
+        e_hwc_window_buffer_set(&commit_data->buffer, NULL, NULL, 0);
      }
 
    EHWTRACE("COM data:%p ts:%p ------- {%25s}, state:%s, zpos:%d",
@@ -1481,7 +1488,8 @@ e_hwc_window_commit_data_acquire(E_Hwc_Window *hwc_window)
    /* set latest commit_data */
    memcpy(&hwc_window->commit.info, &commit_data->info, sizeof(tdm_hwc_window_info));
    e_comp_wl_buffer_reference(&hwc_window->commit.buffer_ref, commit_data->buffer_ref.buffer);
-   e_hwc_window_buffer_set(&hwc_window->commit.buffer, commit_data->buffer.tsurface, commit_data->buffer.queue);
+   e_hwc_window_buffer_set(&hwc_window->commit.buffer, commit_data->buffer.tsurface,
+                           commit_data->buffer.queue, commit_data->buffer.transform);
 
    hwc_window->commit_data_list = eina_list_append(hwc_window->commit_data_list, commit_data);
 
@@ -1622,7 +1630,7 @@ e_hwc_window_commit_data_release(E_Hwc_Window *hwc_window, E_Hwc_Window_Commit_D
           }
 
         e_comp_wl_buffer_reference(&hwc_window->display.buffer_ref, NULL);
-        e_hwc_window_buffer_set(&hwc_window->display.buffer, NULL, NULL);
+        e_hwc_window_buffer_set(&hwc_window->display.buffer, NULL, NULL, 0);
 
         CLEAR(hwc_window->display.info);
      }
@@ -1648,7 +1656,7 @@ e_hwc_window_commit_data_release(E_Hwc_Window *hwc_window, E_Hwc_Window_Commit_D
           e_comp_wl_buffer_reference(&hwc_window->display.buffer_ref,
                                      commit_data->buffer_ref.buffer);
         /* update hwc_window display info */
-        e_hwc_window_buffer_set(&hwc_window->display.buffer, tsurface, queue);
+        e_hwc_window_buffer_set(&hwc_window->display.buffer, tsurface, queue, commit_data->buffer.transform);
 
         memcpy(&hwc_window->display.info, &commit_data->info, sizeof(tdm_hwc_window_info));
 
@@ -1656,7 +1664,7 @@ e_hwc_window_commit_data_release(E_Hwc_Window *hwc_window, E_Hwc_Window_Commit_D
      }
 
    e_comp_wl_buffer_reference(&commit_data->buffer_ref, NULL);
-   e_hwc_window_buffer_set(&commit_data->buffer, NULL, NULL);
+   e_hwc_window_buffer_set(&commit_data->buffer, NULL, NULL, 0);
 
    hwc_window->commit_data_list = eina_list_remove(hwc_window->commit_data_list, commit_data);
    free(commit_data);
@@ -2122,6 +2130,8 @@ _e_hwc_window_client_recover(E_Hwc_Window *hwc_window, Eina_Bool *clear_attach)
 
         recover_buffer = e_comp_wl_tbm_buffer_get(tsurface);
         EINA_SAFETY_ON_NULL_RETURN_VAL(recover_buffer, EINA_FALSE);
+
+        recover_buffer->transform = hwc_window->display.buffer.transform;
         new_buffer = EINA_TRUE;
      }
    else
index fedd026f1bf80f66cb705f943fac949629ce1b03..bded39288133df5668d209d88fc649fcdebf4add 100644 (file)
@@ -71,6 +71,7 @@ struct _E_Hwc_Window_Buffer
    E_Hwc_Window_Queue            *queue;
    struct wl_listener             queue_destroy_listener;
    Eina_Bool                      from_queue;
+   int                            transform;
 };
 
 struct _E_Hwc_Window
@@ -223,7 +224,7 @@ EINTERN const char*             e_hwc_window_restriction_string_get(E_Hwc_Window
 EINTERN Eina_Bool               e_hwc_window_constraints_update(E_Hwc_Window *hwc_window);
 EINTERN void                    e_hwc_window_constraints_reset(E_Hwc_Window *hwc_window);
 EINTERN Eina_Bool               e_hwc_window_rendered_window_update(E_Hwc_Window *hwc_window);
-EINTERN void                    e_hwc_window_buffer_set(E_Hwc_Window_Buffer *window_buffer, tbm_surface_h tsurface, E_Hwc_Window_Queue *queue);
+EINTERN void                    e_hwc_window_buffer_set(E_Hwc_Window_Buffer *window_buffer, tbm_surface_h tsurface, E_Hwc_Window_Queue *queue, int transform);
 EINTERN const char             *e_hwc_window_state_string_get(E_Hwc_Window_State hwc_window_state);
 EINTERN const char             *e_hwc_window_name_get(E_Hwc_Window *hwc_window);
 EINTERN void                    e_hwc_window_name_set(E_Hwc_Window *hwc_window);
index e41b9047803aa50374d8644050674bb86a4c951a..29b79f5e9043538e8eeb48837f05431a53cf045d 100644 (file)
@@ -526,7 +526,8 @@ _e_hwc_windows_target_window_buffer_skip(E_Hwc *hwc)
                e_hwc_window_queue_buffer_release(hwc_window->buffer.queue, queue_buffer);
           }
 
-        e_hwc_window_buffer_set(&hwc_window->buffer, hwc_window->display.buffer.tsurface, hwc_window->display.buffer.queue);
+        e_hwc_window_buffer_set(&hwc_window->buffer, hwc_window->display.buffer.tsurface,
+                                hwc_window->display.buffer.queue, hwc_window->display.buffer.transform);
         tdm_hwc_set_client_target_buffer(thwc, hwc_window->display.buffer.tsurface, fb_damage);
 
         _e_hwc_windows_target_window_force_render(target_hwc_window);
@@ -606,7 +607,7 @@ _e_hwc_windows_target_buffer_fetch(E_Hwc *hwc)
                e_hwc_window_queue_buffer_release(hwc_window->buffer.queue, queue_buffer);
           }
 
-        e_hwc_window_buffer_set(&hwc_window->buffer, tsurface, queue);
+        e_hwc_window_buffer_set(&hwc_window->buffer, tsurface, queue, 0);
         e_hwc_window_info_update(hwc_window);
 
         /* the damage isn't supported by hwc extension yet */
@@ -670,7 +671,7 @@ _e_hwc_windows_target_buffer_fetch(E_Hwc *hwc)
                }
           }
 
-        e_hwc_window_buffer_set(&hwc_window->buffer, NULL, NULL);
+        e_hwc_window_buffer_set(&hwc_window->buffer, NULL, NULL, 0);
         e_hwc_window_info_update(hwc_window);
 
         CLEAR(fb_damage);
@@ -1559,7 +1560,7 @@ done:
              hwc->tpp = NULL;
           }
 
-        e_hwc_window_buffer_set(&hwc->pp_buffer, NULL, NULL);
+        e_hwc_window_buffer_set(&hwc->pp_buffer, NULL, NULL, 0);
      }
 }
 
@@ -2741,7 +2742,7 @@ _e_hwc_windows_pp_buffer_update(E_Hwc *hwc)
         queue_buffer = e_hwc_window_queue_buffer_acquire(hwc_window->queue);
         if (!queue_buffer) return EINA_FALSE;
 
-        e_hwc_window_buffer_set(&hwc->pp_buffer, queue_buffer->tsurface, hwc_window->queue);
+        e_hwc_window_buffer_set(&hwc->pp_buffer, queue_buffer->tsurface, hwc_window->queue, 0);
      }
    else
      {
@@ -2749,7 +2750,7 @@ _e_hwc_windows_pp_buffer_update(E_Hwc *hwc)
           return EINA_FALSE;
 
         e_hwc_window_buffer_set(&hwc->pp_buffer,
-                                hwc_window->buffer.tsurface, hwc_window->buffer.queue);
+                                hwc_window->buffer.tsurface, hwc_window->buffer.queue, 0);
 
         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));
@@ -3493,7 +3494,7 @@ e_hwc_windows_zoom_unset(E_Hwc *hwc)
                   hwc->tpp = NULL;
                }
 
-             e_hwc_window_buffer_set(&hwc->pp_buffer, NULL, NULL);
+             e_hwc_window_buffer_set(&hwc->pp_buffer, NULL, NULL, 0);
           }
 
         _e_hwc_windows_target_window_pp_queue_set(hwc->target_hwc_window, NULL);