e_hwc_windows: support BGR format in pp which use pixman 99/272999/1
authorChangyeon Lee <cyeon.lee@samsung.com>
Fri, 25 Mar 2022 07:33:58 +0000 (16:33 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Tue, 29 Mar 2022 10:22:30 +0000 (19:22 +0900)
the target window queue can use BGR format

Change-Id: I58987e2b0dcc410aa7f248c5afe31b57df09bcaf

src/bin/e_hwc_windows.c

index 089d385..4000122 100644 (file)
@@ -2722,6 +2722,21 @@ _e_hwc_windows_target_state_set(E_Hwc_Window_Target *target_hwc_window, E_Hwc_Wi
    e_hwc_window_accepted_state_set(target_window, state);
 }
 
+static pixman_format_code_t
+_e_hwc_windows_pixman_format_convert(tbm_format format)
+{
+   switch(format)
+     {
+      case TBM_FORMAT_ARGB8888: return PIXMAN_a8r8g8b8;
+      case TBM_FORMAT_XRGB8888: return PIXMAN_x8r8g8b8;
+      case TBM_FORMAT_ABGR8888: return PIXMAN_a8b8g8r8;
+      case TBM_FORMAT_XBGR8888: return PIXMAN_x8b8g8r8;
+      default:                  return 0;
+     }
+
+   return 0;
+}
+
 static void
 _e_hwc_windows_center_rect_get(int src_w, int src_h, int dst_w, int dst_h, Eina_Rectangle *fit)
 {
@@ -2804,8 +2819,10 @@ _e_hwc_windows_pixman_copy(E_Hwc *hwc, tbm_surface_h src_tsurface, tbm_surface_h
         goto src_unmap;
      }
 
-   src_format = PIXMAN_a8r8g8b8;
-   dst_format = PIXMAN_a8r8g8b8;
+   src_format = _e_hwc_windows_pixman_format_convert(tbm_surface_get_format(src_tsurface));
+   EINA_SAFETY_ON_FALSE_RETURN(src_format);
+   dst_format = _e_hwc_windows_pixman_format_convert(tbm_surface_get_format(dst_tsurface));
+   EINA_SAFETY_ON_FALSE_RETURN(dst_format);
 
    src_img = pixman_image_create_bits(src_format, src_tinfo.width, src_tinfo.height,
                                       (uint32_t*)src_tinfo.planes[0].ptr,
@@ -3662,6 +3679,8 @@ _e_hwc_windows_pp_aligned_value_get(E_Hwc *hwc, int *aligned_width, int *aligned
 EINTERN Eina_Bool
 e_hwc_windows_pp_set(E_Hwc *hwc, Eina_Rectangle *src_rect, Eina_Rectangle *dst_rect)
 {
+   E_Hwc_Window_Target *root_target_hwc_window;
+   E_Hwc_Window *hwc_window;
    E_Comp_Screen *e_comp_screen = NULL;
    tdm_error ret = TDM_ERROR_NONE;
    int w, h;
@@ -3701,13 +3720,17 @@ e_hwc_windows_pp_set(E_Hwc *hwc, Eina_Rectangle *src_rect, Eina_Rectangle *dst_r
 
    if (!hwc->pp_tqueue)
      {
+        root_target_hwc_window = _e_hwc_windows_root_target_hwc_window_get(hwc);
+        EINA_SAFETY_ON_NULL_RETURN_VAL(root_target_hwc_window, EINA_FALSE);
+        hwc_window = (E_Hwc_Window *)root_target_hwc_window;
+
         e_output_size_get(hwc->output, &w, &h);
 
         if (e_comp_screen_pp_support())
           _e_hwc_windows_pp_aligned_value_get(hwc, &w, &h);
 
         //TODO: Does e20 get the buffer flags from the tdm backend?
-        hwc->pp_tqueue = tbm_surface_queue_create(3, w, h, TBM_FORMAT_ARGB8888, TBM_BO_SCANOUT);
+        hwc->pp_tqueue = tbm_surface_queue_create(3, w, h, hwc_window->queue->format, TBM_BO_SCANOUT);
         EINA_SAFETY_ON_NULL_GOTO(hwc->pp_tqueue, fail);
 
         hwc->pp_queue = e_hwc_window_queue_get(hwc->pp_tqueue);