From 80b3d380169c9133fac97d7dfee81b45677d74be Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Fri, 21 Jun 2019 15:40:38 +0900 Subject: [PATCH] e_hwc_window: set client type when e_comp_client_override_add Change-Id: I23da16a414bb00aa3731ae20df67eff0c95b4e39 --- src/bin/e_comp.c | 21 ++++++++++++++++++--- src/bin/e_hwc_window.c | 14 ++++++++++++++ src/bin/e_hwc_window.h | 1 + src/bin/e_hwc_window_queue.c | 3 ++- 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/bin/e_comp.c b/src/bin/e_comp.c index 4caff60..cad8475 100644 --- a/src/bin/e_comp.c +++ b/src/bin/e_comp.c @@ -1383,8 +1383,10 @@ e_comp_hwc_end(const char *location) EINTERN void e_comp_hwc_client_end(E_Client *ec, const char *location) { - E_Zone *zone; - E_Output *output; + E_Zone *zone = NULL; + E_Output *output = NULL; + E_Hwc *hwc = NULL; + E_Hwc_Window *hwc_window = NULL; EINA_SAFETY_ON_NULL_RETURN(ec); @@ -1394,5 +1396,18 @@ e_comp_hwc_client_end(E_Client *ec, const char *location) output = e_output_find(zone->output_id); EINA_SAFETY_ON_NULL_RETURN(output); - e_hwc_planes_client_end(output->hwc, ec, location); + hwc = output->hwc; + EINA_SAFETY_ON_NULL_RETURN(hwc); + + if (hwc->hwc_policy == E_HWC_POLICY_PLANES) + { + e_hwc_planes_client_end(output->hwc, ec, location); + } + else if (hwc->hwc_policy == E_HWC_POLICY_WINDOWS) + { + hwc_window = ec->hwc_window; + EINA_SAFETY_ON_NULL_RETURN(hwc_window); + + e_hwc_window_client_type_override(hwc_window); + } } diff --git a/src/bin/e_hwc_window.c b/src/bin/e_hwc_window.c index a77c3f1..7af38b0 100644 --- a/src/bin/e_hwc_window.c +++ b/src/bin/e_hwc_window.c @@ -1731,6 +1731,20 @@ e_hwc_window_buffer_set(E_Hwc_Window *hwc_window, tbm_surface_h tsurface, E_Hwc_ _e_hwc_window_buffer_set(&hwc_window->buffer, tsurface,queue); } +EINTERN void +e_hwc_window_client_type_override(E_Hwc_Window *hwc_window) +{ + EINA_SAFETY_ON_NULL_RETURN(hwc_window); + + if (hwc_window->state == E_HWC_WINDOW_STATE_CLIENT) return; + + e_hwc_window_device_state_available_update(hwc_window); + e_hwc_window_state_set(hwc_window, E_HWC_WINDOW_STATE_CLIENT, EINA_TRUE); + e_hwc_window_rendered_window_update(hwc_window); + + EHWTRACE("set client override", hwc_window->ec, hwc_window); +} + EINTERN const char* e_hwc_window_state_string_get(E_Hwc_Window_State hwc_window_state) { diff --git a/src/bin/e_hwc_window.h b/src/bin/e_hwc_window.h index 489afaf..6652da2 100644 --- a/src/bin/e_hwc_window.h +++ b/src/bin/e_hwc_window.h @@ -202,6 +202,7 @@ 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); EINTERN Eina_Bool e_hwc_window_set_property(E_Hwc_Window *hwc_window, unsigned int id, const char *name, tdm_value value, Eina_Bool force); EINTERN Eina_Bool e_hwc_window_get_property(E_Hwc_Window *hwc_window, unsigned int id, tdm_value *value); +EINTERN void e_hwc_window_client_type_override(E_Hwc_Window *hwc_window); EINTERN E_Hwc_Window_Hook *e_hwc_window_hook_add(E_Hwc_Window_Hook_Point hookpoint, E_Hwc_Window_Hook_Cb func, const void *data); EINTERN void e_hwc_window_hook_del(E_Hwc_Window_Hook *ch); diff --git a/src/bin/e_hwc_window_queue.c b/src/bin/e_hwc_window_queue.c index 5fa16c4..2e9e2d0 100644 --- a/src/bin/e_hwc_window_queue.c +++ b/src/bin/e_hwc_window_queue.c @@ -763,7 +763,8 @@ _e_hwc_window_queue_cb_buffer_change(void *data, E_Client *ec) hwc_window = ec->hwc_window; if (!hwc_window) return; - if (hwc_window->queue) return; + if ((hwc_window->queue) && (e_hwc_window_device_state_available_get(hwc_window))) + return; comp_buffer = _comp_wl_buffer_get(ec); if (!comp_buffer) return; -- 2.7.4