decide the setting buffer and zpos of the video window
authorSooChan Lim <sc1.lim@samsung.com>
Thu, 11 Jan 2018 11:54:14 +0000 (20:54 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Fri, 12 Jan 2018 01:45:44 +0000 (10:45 +0900)
at the e_hwc_window.c , not at e_comp_wl_video.c

Change-Id: I324af12357c136baf8fac898bf61bcf9da4a4e01

src/bin/e_comp_wl_video.c
src/bin/e_comp_wl_video.h
src/bin/e_hwc_window.c
src/bin/e_output_hwc_windows.c

index d614b9c814842f59fa19185f8ffd329ab5b063b3..d6843af3fb3c5e9cf57590135650632e1942d895 100644 (file)
@@ -397,9 +397,6 @@ _e_video_avaiable_video_layer_get(E_Video *video)
         if (video->ec->hwc_window)
            e_hwc_window_free(video->ec->hwc_window);
 
-        /* video window is under the 24depth hwc_window for ui */
-        e_hwc_window_zpos_set(hwc_window, -1);
-
         /* set new hwc_window to the e_client */
         video->ec->hwc_window = hwc_window;
      }
@@ -523,33 +520,14 @@ _e_video_layer_get_info(E_Video_Layer *layer, E_Video_Info_Layer *vinfo)
 static tdm_error
 _e_video_layer_set_info(E_Video_Layer *layer, E_Video_Info_Layer *vinfo)
 {
-   tdm_error ret;
+   tdm_error ret = TDM_ERROR_NONE;
    tdm_info_layer info_layer = {0};
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(layer, TDM_ERROR_INVALID_PARAMETER);
    EINA_SAFETY_ON_NULL_RETURN_VAL(vinfo, TDM_ERROR_INVALID_PARAMETER);
 
    if (_is_video_hwc_windows(layer->video))
-     {
-        tdm_hwc_window_info hwc_win_info = {0};
-        E_Hwc_Window *hwc_window;
-
-        hwc_window = layer->e_client->hwc_window;
-        EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, TDM_ERROR_OPERATION_FAILED);
-        EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window->thwc_window, TDM_ERROR_OPERATION_FAILED);
-
-        memcpy(&hwc_win_info.src_config, &vinfo->src_config, sizeof(tdm_info_config));
-        memcpy(&hwc_win_info.dst_pos, &vinfo->dst_pos, sizeof(tdm_pos));
-        hwc_win_info.transform = vinfo->transform;
-
-        ret = tdm_hwc_window_set_info(hwc_window->thwc_window, &hwc_win_info);
-        EINA_SAFETY_ON_TRUE_RETURN_VAL(ret != TDM_ERROR_NONE, ret);
-
-        /* to re-evaluate the window policy */
-        e_comp_render_queue();
-
-        memcpy(&layer->info, vinfo, sizeof(E_Video_Info_Layer));
-     }
+     memcpy(&layer->info, vinfo, sizeof(E_Video_Info_Layer));
    else
      {
 
@@ -566,7 +544,7 @@ _e_video_layer_set_info(E_Video_Layer *layer, E_Video_Info_Layer *vinfo)
 static tdm_error
 _e_video_layer_set_buffer(E_Video_Layer * layer, tbm_surface_h buff)
 {
-   tdm_error ret;
+   tdm_error ret = TDM_ERROR_NONE;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(layer, TDM_ERROR_BAD_REQUEST);
    EINA_SAFETY_ON_NULL_RETURN_VAL(buff, TDM_ERROR_BAD_REQUEST);
@@ -1711,6 +1689,43 @@ e_comp_wl_video_hwc_widow_surface_get(E_Hwc_Window *hwc_window)
    return video_layer->cur_tsurface;
 }
 
+EINTERN Eina_Bool
+e_comp_wl_video_hwc_window_info_get(E_Hwc_Window *hwc_window, tdm_hwc_window_info *hwc_win_info)
+{
+   E_Client *ec = NULL;
+   Eina_List *l = NULL;
+   E_Video *video = NULL;
+   E_Video_Layer *video_layer;
+   E_Video_Info_Layer *vinfo;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
+
+   if (!e_hwc_window_is_video(hwc_window))
+     {
+       ERR("ehw:%p is NOT Video HWC window.", hwc_window);
+       return EINA_FALSE;
+     }
+
+   ec = hwc_window->ec;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
+
+   EINA_LIST_FOREACH(video_list, l, video)
+     if (video->ec == ec) break;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(video,EINA_FALSE);
+
+   video_layer = video->layer;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(video_layer, EINA_FALSE);
+
+   vinfo = &video_layer->info;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(vinfo, EINA_FALSE);
+
+   memcpy(&hwc_win_info->src_config, &vinfo->src_config, sizeof(tdm_info_config));
+   memcpy(&hwc_win_info->dst_pos, &vinfo->dst_pos, sizeof(tdm_pos));
+   hwc_win_info->transform = vinfo->transform;
+
+   return EINA_TRUE;
+}
+
 static void
 _e_video_vblank_handler(tdm_output *output, unsigned int sequence,
                         unsigned int tv_sec, unsigned int tv_usec,
index ed4ce112a5ac14539799f359c4b1b2aca5dc3fce..e9d5881494b2b537d09811d6f23751baba4b7859 100644 (file)
@@ -17,6 +17,7 @@ EINTERN tdm_layer* e_comp_wl_video_layer_get(tdm_output *output);
 
 EINTERN void          e_comp_wl_video_hwc_window_commit_data_release(E_Hwc_Window *hwc_window, unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec);
 EINTERN tbm_surface_h e_comp_wl_video_hwc_widow_surface_get(E_Hwc_Window *hwc_window);
+EINTERN Eina_Bool     e_comp_wl_video_hwc_window_info_get(E_Hwc_Window *hwc_window, tdm_hwc_window_info *hwc_win_info);
 
 #define C(b,m)              (((b) >> (m)) & 0xFF)
 #define FOURCC_STR(id)      C(id,0), C(id,8), C(id,16), C(id,24)
index 707c423c4d9a32d1c6e13cac4bae52689540fabc..e2f12e3444c3c7d61ae2d98b730ec952e0fc68d6 100644 (file)
@@ -820,6 +820,22 @@ _e_hwc_window_info_set(E_Hwc_Window *hwc_window, tbm_surface_h tsurface)
    int size_w, size_h, src_x, src_y, src_w, src_h;
    int dst_x, dst_y, dst_w, dst_h;
    tbm_format format;
+   tdm_hwc_window_info hwc_win_info = {0};
+   tdm_error error;
+
+   if (e_hwc_window_is_video(hwc_window))
+     {
+        if (!e_comp_wl_video_hwc_window_info_get(hwc_window, &hwc_win_info))
+          {
+             ERR("Video window does not get the hwc_win_info.");
+             return EINA_FALSE;
+          }
+
+        error = tdm_hwc_window_set_info(hwc_window->thwc_window, &hwc_win_info);
+        EINA_SAFETY_ON_TRUE_RETURN_VAL(error != TDM_ERROR_NONE, EINA_FALSE);
+
+        return EINA_TRUE;
+     }
 
    /* set hwc_window when the layer infomation is different from the previous one */
    tbm_surface_get_info(tsurface, &surf_info);
@@ -913,8 +929,8 @@ _e_hwc_window_correct_transformation_check(E_Hwc_Window *hwc_window)
    E_Output_Hwc *output_hwc = hwc_window->output_hwc;
    E_Output *output = output_hwc->output;
 
-   EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window->ec, EINA_FALSE);
+   /* do not check the transformation of the video window */
+   if (e_hwc_window_is_video(hwc_window)) return EINA_TRUE;
 
    ec = hwc_window->ec;
 
@@ -1148,9 +1164,21 @@ e_hwc_window_free(E_Hwc_Window *hwc_window)
 EINTERN Eina_Bool
 e_hwc_window_zpos_set(E_Hwc_Window *hwc_window, int zpos)
 {
+   tdm_error error;
+   tdm_hwc_window *thwc_window;
+
    EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
 
-   hwc_window->zpos = zpos;
+   if (hwc_window->zpos != zpos) hwc_window->zpos = zpos;
+
+   /* video dose not set the zpos...... need to be fixed. */
+   if (e_hwc_window_is_video(hwc_window)) return EINA_TRUE;
+
+   thwc_window = hwc_window->thwc_window;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(thwc_window, EINA_FALSE);
+
+   error = tdm_hwc_window_set_zpos(thwc_window, hwc_window->zpos);
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(error != TDM_ERROR_NONE, EINA_FALSE);
 
    return EINA_TRUE;
 }
@@ -1168,9 +1196,7 @@ e_hwc_window_zpos_get(E_Hwc_Window *hwc_window)
 EINTERN Eina_Bool
 e_hwc_window_update(E_Hwc_Window *hwc_window)
 {
-   tdm_hwc_window *thwc_window;
    E_Client *ec;
-   tdm_error error;
    Eina_Bool result;
    E_Comp_Wl_Buffer *buffer = NULL;
    E_Comp_Wl_Data *wl_comp_data = (E_Comp_Wl_Data *)e_comp->wl_comp_data;
@@ -1182,41 +1208,47 @@ e_hwc_window_update(E_Hwc_Window *hwc_window)
    ec = hwc_window->ec;
    EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
 
-   thwc_window = hwc_window->thwc_window;
-   EINA_SAFETY_ON_NULL_RETURN_VAL(thwc_window, EINA_FALSE);
-
-   error = tdm_hwc_window_set_zpos(thwc_window, hwc_window->zpos);
-   EINA_SAFETY_ON_TRUE_RETURN_VAL(error != TDM_ERROR_NONE, EINA_FALSE);
-
    /* hwc_window manager could ask to prevent some e_clients being shown by hw directly;
     * if hwc_window's ec has no correct transformation we can't allow such ec to claim on
     * hw overlay, 'cause currently hw doesn't support transformation; */
-   if (hwc_window->hwc_acceptable &&
-       _e_hwc_window_correct_transformation_check(hwc_window))
+   if (hwc_window->hwc_acceptable)
      {
-        if (e_hwc_window_is_cursor(hwc_window))
+        if (e_hwc_window_is_video(hwc_window))
           {
-             tsurface = hwc_window->cursor_tsurface;
-             state = E_HWC_WINDOW_STATE_CURSOR;
-          }
-        else
-          {
-             buffer = _get_comp_wl_buffer(ec);
+             tsurface = e_comp_wl_video_hwc_widow_surface_get(hwc_window);
+             state = E_HWC_WINDOW_STATE_VIDEO;
 
-             if (buffer)
-               tsurface = wayland_tbm_server_get_surface(wl_comp_data->tbm.server, buffer->resource);
-
-             state = E_HWC_WINDOW_STATE_DEVICE;
+             if (tsurface)
+               {
+                  result = _e_hwc_window_info_set(hwc_window, tsurface);
+                  EINA_SAFETY_ON_TRUE_RETURN_VAL(result != EINA_TRUE, EINA_FALSE);
+               }
           }
-
-        if (tsurface)
+        else
           {
-             result = _e_hwc_window_info_set(hwc_window, tsurface);
-             EINA_SAFETY_ON_TRUE_RETURN_VAL(result != EINA_TRUE, EINA_FALSE);
+            if (_e_hwc_window_correct_transformation_check(hwc_window))
+             {
+                if (e_hwc_window_is_cursor(hwc_window))
+                  {
+                     tsurface = hwc_window->cursor_tsurface;
+                     state = E_HWC_WINDOW_STATE_CURSOR;
+                  }
+                else
+                  {
+                     buffer = _get_comp_wl_buffer(ec);
+                     if (buffer) tsurface = wayland_tbm_server_get_surface(wl_comp_data->tbm.server, buffer->resource);
+                     state = E_HWC_WINDOW_STATE_DEVICE;
+                  }
+
+                if (tsurface)
+                  {
+                     result = _e_hwc_window_info_set(hwc_window, tsurface);
+                     EINA_SAFETY_ON_TRUE_RETURN_VAL(result != EINA_TRUE, EINA_FALSE);
+                  }
+             }
+           else
+             state = E_HWC_WINDOW_STATE_CLIENT;
           }
-        else
-          state = E_HWC_WINDOW_STATE_CLIENT;
-
      }
    else
      state = E_HWC_WINDOW_STATE_CLIENT;
index fb6e46dfb61a261b51bbb6c8cb831a0f9cf6ef93..4c68252d72305cca36d140174f0c6f43137e91a8 100644 (file)
@@ -1,7 +1,7 @@
 #include "e.h"
 #include "services/e_service_quickpanel.h"
 
-#define DBG_EVALUATE 0
+#define DBG_EVALUATE 1
 
 static Eina_Bool _e_output_hwc_windows_pp_output_data_commit(E_Output_Hwc *output_hwc, E_Hwc_Window_Commit_Data *data);
 static Eina_Bool _e_output_hwc_windows_pp_window_commit(E_Output_Hwc *output_hwc, E_Hwc_Window *hwc_window);
@@ -129,7 +129,7 @@ _e_output_hwc_windows_all_windows_init(E_Output_Hwc *output_hwc)
    hwc_windows = e_output_hwc_windows_get(output_hwc);
    EINA_LIST_FOREACH(hwc_windows, l, hwc_window)
      {
-        if (e_hwc_window_is_video(hwc_window)) continue;
+//        if (e_hwc_window_is_video(hwc_window)) continue;
 
         if (!e_hwc_window_state_set(hwc_window, E_HWC_WINDOW_STATE_NONE))
           {
@@ -847,36 +847,40 @@ _e_output_hwc_windows_update(E_Output_Hwc *output_hwc, Eina_List *cl_list)
    const Eina_List *l;
    E_Hwc_Window *hwc_window;
    E_Client *ec;
-   Eina_Bool result;
-   int zpos = 0;
+   int graphic_zpos = 0;
+   int video_zpos = -1;
 
    /* clients are sorted in reverse order */
    EINA_LIST_REVERSE_FOREACH(cl_list, l, ec)
      {
         hwc_window = ec->hwc_window;
-        if (!hwc_window)
+        if (!hwc_window) continue;
+
+        if (e_hwc_window_is_video(hwc_window))
           {
-             ERR("hwc-opt: cannot find the hwc_window by ec(%p)", ec);
-             continue;
+             if (!e_hwc_window_zpos_set(hwc_window, video_zpos))
+               {
+                  ERR("hwc-opt: cannot set video_zpos for E_Hwc_Window(%p)", hwc_window);
+                  continue;
+               }
+            /* video window is under the 24depth hwc_window for ui */
+             video_zpos--;
           }
-
-        /* e20 deal with video window at the e_comp_wl_video */
-        if (e_hwc_window_is_video(hwc_window)) continue;
-
-        result = e_hwc_window_zpos_set(hwc_window, zpos);
-        if (result != EINA_TRUE)
+        else
           {
-             ERR("hwc-opt: cannot set zpos for E_Hwc_Window(%p)", hwc_window);
-             continue;
+             if (!e_hwc_window_zpos_set(hwc_window, graphic_zpos))
+               {
+                  ERR("hwc-opt: cannot set graphic_zpos for E_Hwc_Window(%p)", hwc_window);
+                  continue;
+               }
+             graphic_zpos++;
           }
 
-        result = e_hwc_window_update(hwc_window);
-        if (result != EINA_TRUE)
+        if (!e_hwc_window_update(hwc_window))
           {
              ERR("hwc-opt: cannot update E_Hwc_Window(%p)", hwc_window);
              continue;
           }
-        zpos++;
      }
 #if DBG_EVALUATE
    ELOGF("HWC-WINS", " Request HWC Validation to TDM HWC:", NULL, NULL);
@@ -1150,6 +1154,10 @@ full_gl_composite:
    EINA_LIST_FOREACH(vis_cl_list, l, ec)
      {
         hwc_window = ec->hwc_window;
+
+        /* The video window is not composited by gl compositor */
+        if (e_hwc_window_is_video(hwc_window)) continue;
+
         hwc_window->hwc_acceptable = EINA_FALSE;
         ELOGF("HWC-WINS", "   ehw:%p -- {%25s} is NOT hwc_acceptable.",
               ec->pixmap, ec, hwc_window, ec->icccm.title);
@@ -1176,6 +1184,9 @@ _e_output_hwc_windows_hwc_acceptable_check(Eina_List *vis_cl_list)
         hwc_window = ec->hwc_window;
         hwc_window->hwc_acceptable = EINA_TRUE;
 
+        /* The video window is not composited by gl compositor */
+        if (e_hwc_window_is_video(hwc_window)) continue;
+
         // check clients not able to use hwc
         // if ec has invalid buffer or scaled( transformed ) or forced composite(never_hwc)
         if (!_e_output_hwc_windows_ec_check(ec))