e_comp_screen: consider the output-transform only if necessary 66/156966/5
authorBoram Park <boram1288.park@samsung.com>
Mon, 23 Oct 2017 02:56:53 +0000 (11:56 +0900)
committerBoram Park <boram1288.park@samsung.com>
Wed, 25 Oct 2017 05:31:52 +0000 (14:31 +0900)
Change-Id: Id8362667b3646784107b2f5b5ef04a35ce578572

src/bin/e_comp.c
src/bin/e_comp_screen.c
src/bin/e_comp_screen.h
src/bin/e_plane_renderer.c
src/bin/e_plane_renderer.h

index fcd0c44..317d88d 100644 (file)
@@ -253,7 +253,7 @@ _hwc_available_get(E_Client *ec)
 {
    E_Comp_Wl_Client_Data *cdata = (E_Comp_Wl_Client_Data*)ec->comp_data;
    E_Output *eout;
-   int transform = 0, minw = 0, minh = 0;
+   int minw = 0, minh = 0;
 
    if ((!cdata) ||
        (!cdata->buffer_ref.buffer) ||
@@ -284,9 +284,6 @@ _hwc_available_get(E_Client *ec)
    if (e_comp_wl_tbm_buffer_sync_timeline_used(cdata->buffer_ref.buffer))
      return EINA_FALSE;
 
-   /* if the buffer transform of surface is not same with output's transform, we
-    * can't show it to HW overlay directly.
-    */
    eout = e_output_find(ec->zone->output_id);
    EINA_SAFETY_ON_NULL_RETURN_VAL(eout, EINA_FALSE);
 
@@ -297,9 +294,19 @@ _hwc_available_get(E_Client *ec)
    if ((minh > 0) && (minh > cdata->buffer_ref.buffer->h))
      return EINA_FALSE;
 
-   transform = e_comp_wl_output_buffer_transform_get(ec);
-   if ((eout->config.rotation / 90) != transform)
-     return EINA_FALSE;
+   /* If a client doesn't watch the ignore_output_transform events, we can't show
+    * a client buffer to HW overlay directly when the buffer transform is not same
+    * with output transform. If a client watch the ignore_output_transform events,
+    * we can control client's buffer transform. In this case, we don't need to
+    * check client's buffer transform here.
+    */
+   if (!e_comp_screen_rotation_ignore_output_transform_watch(ec))
+     {
+        int transform = e_comp_wl_output_buffer_transform_get(ec);
+
+        if ((eout->config.rotation / 90) != transform)
+          return EINA_FALSE;
+     }
 
    return EINA_TRUE;
 }
index 90cd39a..325f46e 100644 (file)
@@ -81,9 +81,14 @@ _tz_screen_rotation_get_ignore_output_transform(struct wl_client *client, struct
    tzsr->resource = resource;
    tzsr->ec = ec;
 
-   ELOGF("COMP", "|tzsr(%p)", NULL, ec, tzsr);
+   ELOGF("TRANSFORM", "|tzsr(%p) client_ignore(%d)", NULL, ec, tzsr, e_config->screen_rotation_client_ignore);
 
    tzsr_list = eina_list_append(tzsr_list, tzsr);
+
+   /* make all clients ignore the output tramsform
+    * we will decide later when hwc prepared.
+    */
+   e_comp_screen_rotation_ignore_output_transform_send(ec, EINA_TRUE);
 }
 
 static void
@@ -1200,6 +1205,12 @@ e_comp_screen_rotation_ignore_output_transform_send(E_Client *ec, Eina_Bool igno
              ELOGF("TRANSFORM", "|tzsr(%p) ignore_output_transform: client_ignore", NULL, ec, tzsr);
              return;
           }
+
+        if (e_policy_client_is_quickpanel(ec))
+           {
+              ELOGF("TRANSFORM", "|tzsr(%p) ignore_output_transform: quickpanel", NULL, ec, tzsr);
+              return;
+           }
      }
 
    ELOGF("TRANSFORM", "|tzsr(%p) ignore_output_transform(%d)", NULL, ec, tzsr, ignore);
@@ -1207,6 +1218,12 @@ e_comp_screen_rotation_ignore_output_transform_send(E_Client *ec, Eina_Bool igno
    tizen_screen_rotation_send_ignore_output_transform(tzsr->resource, ec->comp_data->surface, ignore);
 }
 
+EINTERN Eina_Bool
+e_comp_screen_rotation_ignore_output_transform_watch(E_Client *ec)
+{
+   return (_tz_surface_rotation_find(ec)) ? EINA_TRUE : EINA_FALSE;
+}
+
 EINTERN E_Output *
 e_comp_screen_primary_output_get(E_Comp_Screen *e_comp_screen)
 {
index f21a4a3..15f4fa2 100644 (file)
@@ -57,6 +57,7 @@ EINTERN const Eina_List * e_comp_screen_e_screens_get(E_Comp_Screen *e_comp_scre
 E_API   Eina_Bool         e_comp_screen_rotation_setting_set(E_Comp_Screen *e_comp_screen, int rotation);
 
 E_API   void              e_comp_screen_rotation_ignore_output_transform_send(E_Client *ec, Eina_Bool ignore);
+EINTERN Eina_Bool         e_comp_screen_rotation_ignore_output_transform_watch(E_Client *ec);
 EINTERN E_Output        * e_comp_screen_primary_output_get(E_Comp_Screen *e_comp_screen);
 
 EINTERN Eina_Bool         e_comp_screen_pp_support(void);
index 9c78dee..81d7ddc 100644 (file)
@@ -1022,6 +1022,8 @@ e_plane_renderer_new(E_Plane *plane)
           ERR("fail to e_plane_renderer_queue_set");
      }
 
+   renderer->need_change_buffer_transform = EINA_TRUE;
+
    return renderer;
 }
 
@@ -1450,6 +1452,7 @@ e_plane_renderer_activate(E_Plane_Renderer *renderer, E_Client *ec)
    struct wayland_tbm_client_queue * cqueue = NULL;
    E_Plane_Renderer_Client *renderer_client = NULL;
    E_Plane *plane = NULL;
+   int transform;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(renderer, EINA_FALSE);
    EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
@@ -1467,6 +1470,23 @@ e_plane_renderer_activate(E_Plane_Renderer *renderer, E_Client *ec)
    if ((renderer->state == E_PLANE_RENDERER_STATE_ACTIVATE) && (renderer->ec != ec))
      e_plane_renderer_deactivate(renderer);
 
+   if (renderer->ec != ec)
+     renderer->need_change_buffer_transform = EINA_TRUE;
+
+   transform = e_comp_wl_output_buffer_transform_get(ec);
+   if ((plane->output->config.rotation / 90) != transform)
+     {
+        if (!e_config->screen_rotation_client_ignore && renderer->need_change_buffer_transform)
+          {
+             e_comp_screen_rotation_ignore_output_transform_send(ec, EINA_FALSE);
+             renderer->need_change_buffer_transform = EINA_FALSE;
+             INF("ec:%p tansform:%d screen_roatation:%d", ec, transform, plane->output->config.rotation);
+          }
+        return EINA_FALSE;
+     }
+   else
+     renderer->need_change_buffer_transform = EINA_TRUE;
+
    wayland_tbm_server_client_queue_activate(cqueue, 0, 0, 0);
 
    if (renderer_trace_debug)
@@ -1487,9 +1507,14 @@ e_plane_renderer_deactivate(E_Plane_Renderer *renderer)
    struct wayland_tbm_client_queue * cqueue = NULL;
    E_Client *ec = NULL;
    E_Plane_Renderer_Client *renderer_client = NULL;
+   E_Plane *plane = NULL;
+   int transform;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(renderer, EINA_FALSE);
 
+   plane = renderer->plane;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(plane, EINA_FALSE);
+
    ec = renderer->ec;
    if (!ec) return EINA_TRUE;
 
@@ -1504,6 +1529,10 @@ e_plane_renderer_deactivate(E_Plane_Renderer *renderer)
    if (cqueue)
      wayland_tbm_server_client_queue_deactivate(cqueue);
 
+   transform = e_comp_wl_output_buffer_transform_get(ec);
+   if (plane->output->config.rotation != 0 && (plane->output->config.rotation / 90) == transform)
+     e_comp_screen_rotation_ignore_output_transform_send(ec, EINA_TRUE);
+
    _e_plane_renderer_recover_ec(renderer);
 
    renderer->state = E_PLANE_RENDERER_STATE_NONE;
@@ -1523,6 +1552,7 @@ e_plane_renderer_reserved_activate(E_Plane_Renderer *renderer, E_Client *ec)
    E_Plane_Renderer_Client *renderer_client = NULL;
    tbm_surface_queue_error_e tsq_err = TBM_SURFACE_QUEUE_ERROR_NONE;
    E_Plane *plane = NULL;
+   int transform;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(renderer, EINA_FALSE);
    EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
@@ -1602,6 +1632,21 @@ e_plane_renderer_reserved_activate(E_Plane_Renderer *renderer, E_Client *ec)
         /* export */
         e_plane_renderer_surface_send(renderer, ec, tsurface);
 
+        if (renderer->ec != ec)
+          renderer->need_change_buffer_transform = EINA_TRUE;
+
+        transform = e_comp_wl_output_buffer_transform_get(ec);
+        if ((plane->output->config.rotation / 90) != transform)
+          {
+             if (!e_config->screen_rotation_client_ignore && renderer->need_change_buffer_transform)
+               {
+                  e_comp_screen_rotation_ignore_output_transform_send(ec, EINA_FALSE);
+                  renderer->need_change_buffer_transform = EINA_FALSE;
+               }
+          }
+        else
+          renderer->need_change_buffer_transform = EINA_TRUE;
+
         wayland_tbm_server_client_queue_activate(cqueue, 0, renderer->tqueue_size, 1);
 
         if (e_comp->hwc_sync_mode_change && !e_comp->hwc_use_detach)
@@ -1633,6 +1678,13 @@ e_plane_renderer_reserved_activate(E_Plane_Renderer *renderer, E_Client *ec)
           }
      }
 
+   transform = e_comp_wl_output_buffer_transform_get(ec);
+   if ((plane->output->config.rotation / 90) != transform)
+     {
+        INF("ec:%p tansform:%d screen_roatation:%d", ec, transform, plane->output->config.rotation);
+        return EINA_FALSE;
+     }
+
    if (renderer_trace_debug)
      ELOGF("E_PLANE_RENDERER", "Activate Renderer(%p)", ec->pixmap, ec, renderer);
 
@@ -1653,6 +1705,7 @@ e_plane_renderer_reserved_deactivate(E_Plane_Renderer *renderer)
    E_Plane_Renderer_Client *renderer_client = NULL;
    tbm_surface_queue_error_e tsq_err = TBM_SURFACE_QUEUE_ERROR_NONE;
    E_Plane *plane = NULL;
+   int transform;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(renderer, EINA_FALSE);
 
@@ -1679,6 +1732,10 @@ e_plane_renderer_reserved_deactivate(E_Plane_Renderer *renderer)
           goto done;
      }
 
+   transform = e_comp_wl_output_buffer_transform_get(ec);
+   if (plane->output->config.rotation != 0 && (plane->output->config.rotation / 90) == transform)
+     e_comp_screen_rotation_ignore_output_transform_send(ec, EINA_TRUE);
+
    if (renderer_trace_debug)
      ELOGF("E_PLANE_RENDERER", "Set    backup buffer   wl_buffer(%p)::Deactivate",
            ec->pixmap, ec, _get_wl_buffer(ec));
index 3b8e06d..c0258df 100644 (file)
@@ -52,6 +52,8 @@ struct _E_Plane_Renderer {
    Eina_Bool           pending_deactivate;
 
    Eina_Bool           rendered;
+
+   Eina_Bool           need_change_buffer_transform;
 };
 
 EINTERN Eina_Bool                  e_plane_renderer_init(void);