From aee9e193baafa5b6d8d861bfc4e92fd153e582c2 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Mon, 23 Oct 2017 11:56:53 +0900 Subject: [PATCH] e_comp_screen: consider the output-transform only if necessary Change-Id: Id8362667b3646784107b2f5b5ef04a35ce578572 --- src/bin/e_comp.c | 21 +++++++++++------ src/bin/e_comp_screen.c | 19 +++++++++++++++- src/bin/e_comp_screen.h | 1 + src/bin/e_plane_renderer.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++ src/bin/e_plane_renderer.h | 2 ++ 5 files changed, 92 insertions(+), 8 deletions(-) diff --git a/src/bin/e_comp.c b/src/bin/e_comp.c index fcd0c44..317d88d 100644 --- a/src/bin/e_comp.c +++ b/src/bin/e_comp.c @@ -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; } diff --git a/src/bin/e_comp_screen.c b/src/bin/e_comp_screen.c index 90cd39a..325f46e 100644 --- a/src/bin/e_comp_screen.c +++ b/src/bin/e_comp_screen.c @@ -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) { diff --git a/src/bin/e_comp_screen.h b/src/bin/e_comp_screen.h index f21a4a3..15f4fa2 100644 --- a/src/bin/e_comp_screen.h +++ b/src/bin/e_comp_screen.h @@ -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); diff --git a/src/bin/e_plane_renderer.c b/src/bin/e_plane_renderer.c index 9c78dee..81d7ddc 100644 --- a/src/bin/e_plane_renderer.c +++ b/src/bin/e_plane_renderer.c @@ -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)); diff --git a/src/bin/e_plane_renderer.h b/src/bin/e_plane_renderer.h index 3b8e06d..c0258df 100644 --- a/src/bin/e_plane_renderer.h +++ b/src/bin/e_plane_renderer.h @@ -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); -- 2.7.4