if window is hided, window is not exist in rendered windows list.
but presentation callback should be called when window is hidding(show->hide)
this patch makes presentation callback is taken to comp_info if
window is hidden.
Change-Id: Ibe22490df8ef0301ad38899281e69abaf8b08850
EINTERN Eina_Bool
e_hwc_window_presentation_callback_pending_set(E_Hwc_Window *hwc_window, E_Hwc_Presentation_Callback *callback)
{
+ E_Hwc_Window_Target *target_hwc_window;
E_Hwc *hwc;
EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
hwc = hwc_window->hwc;
EINA_SAFETY_ON_NULL_RETURN_VAL(hwc, EINA_FALSE);
+ target_hwc_window = hwc->target_hwc_window;
+ EINA_SAFETY_ON_NULL_RETURN_VAL(target_hwc_window, EINA_FALSE);
+
if ((hwc_window->accepted_state == E_HWC_WINDOW_STATE_NONE) ||
(hwc_window->accepted_state == E_HWC_WINDOW_STATE_CLIENT))
e_hwc_windows_target_window_force_render(hwc->target_hwc_window);
return EINA_FALSE;
}
+ if (!eina_list_data_find(target_hwc_window->pending_presentation_cb_wins, hwc_window))
+ {
+ target_hwc_window->pending_presentation_cb_wins =
+ eina_list_append(target_hwc_window->pending_presentation_cb_wins, hwc_window);
+
+ e_hwc_window_ref(hwc_window);
+ }
+
+ return EINA_TRUE;
+}
+
+EINTERN Eina_Bool
+e_hwc_window_presentation_callback_pending_take_over(E_Hwc_Window *hwc_window,
+ E_Hwc_Presentation_Callback_List *dst_list)
+{
+ E_Hwc_Window_Target *target_hwc_window;
+ E_Hwc *hwc;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(dst_list, EINA_FALSE);
+
+ hwc = hwc_window->hwc;
+ EINA_SAFETY_ON_NULL_RETURN_VAL(hwc, EINA_FALSE);
+
+ target_hwc_window = hwc->target_hwc_window;
+ EINA_SAFETY_ON_NULL_RETURN_VAL(target_hwc_window, EINA_FALSE);
+
+ if (eina_list_data_find(target_hwc_window->pending_presentation_cb_wins, hwc_window))
+ {
+ target_hwc_window->pending_presentation_cb_wins =
+ eina_list_remove(target_hwc_window->pending_presentation_cb_wins, hwc_window);
+
+ e_hwc_window_unref(hwc_window);
+ }
+
+ e_hwc_presentation_callback_list_merge(dst_list,
+ &hwc_window->pending_presentation_callbacks);
+
return EINA_TRUE;
}
EINTERN Eina_Bool
e_hwc_window_presentation_callback_take(E_Hwc_Window *hwc_window,
- E_Hwc_Presentation_Callback_List *list)
+ E_Hwc_Presentation_Callback_List *src_list)
{
+ E_Hwc_Window_Target *target_hwc_window;
+ E_Hwc *hwc;
+
EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
- EINA_SAFETY_ON_NULL_RETURN_VAL(list, EINA_FALSE);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(src_list, EINA_FALSE);
+
+ hwc = hwc_window->hwc;
+ EINA_SAFETY_ON_NULL_RETURN_VAL(hwc, EINA_FALSE);
+
+ target_hwc_window = hwc->target_hwc_window;
+ EINA_SAFETY_ON_NULL_RETURN_VAL(target_hwc_window, EINA_FALSE);
+
+ if (&hwc_window->presentation_callbacks == src_list)
+ {
+ if (eina_list_data_find(target_hwc_window->pending_presentation_cb_wins, hwc_window))
+ {
+ target_hwc_window->pending_presentation_cb_wins =
+ eina_list_remove(target_hwc_window->pending_presentation_cb_wins, hwc_window);
+
+ e_hwc_window_unref(hwc_window);
+ }
+ }
e_hwc_presentation_callback_list_merge(&hwc_window->presentation_callbacks,
- list);
+ src_list);
return EINA_TRUE;
}
E_Egl_Sync *end_render_sync;
Eina_List *present_sync_windows;
+ Eina_List *pending_presentation_cb_wins;
};
struct _E_Hwc_Window_Commit_Data {
EINTERN Eina_Bool e_hwc_window_pending_update_data_has(E_Hwc_Window *hwc_window);
EINTERN Eina_Bool e_hwc_window_presentation_callback_pending_set(E_Hwc_Window *hwc_window, E_Hwc_Presentation_Callback *callback);
-EINTERN Eina_Bool e_hwc_window_presentation_callback_take(E_Hwc_Window *hwc_window, E_Hwc_Presentation_Callback_List *list);
+EINTERN Eina_Bool e_hwc_window_presentation_callback_pending_take_over(E_Hwc_Window *hwc_window, E_Hwc_Presentation_Callback_List *dst_list);
+EINTERN Eina_Bool e_hwc_window_presentation_callback_take(E_Hwc_Window *hwc_window, E_Hwc_Presentation_Callback_List *src_list);
EINTERN Eina_Bool e_hwc_window_presentation_callback_call(E_Hwc_Window *hwc_window);
#endif // E_HWC_WINDOW_H
return EINA_FALSE;
}
+static Eina_Bool
+_e_hwc_windows_presentation_callback_comp_take_over(E_Hwc_Window_Target *root_target_hwc_window,
+ E_Hwc_Windows_Comp_Info *comp_info)
+{
+ E_Hwc_Window_Target *target_hwc_window;
+ E_Hwc_Window *hwc_window;
+ E_Output *output;
+ Eina_List *l, *l2, *ll2;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(root_target_hwc_window, EINA_FALSE);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(comp_info, EINA_FALSE);
+
+ EINA_LIST_FOREACH(e_comp->e_comp_screen->outputs, l, output)
+ {
+ if (!output->hwc) continue;
+
+ target_hwc_window = output->hwc->target_hwc_window;
+ if (!target_hwc_window) continue;
+
+ EINA_LIST_FOREACH_SAFE(target_hwc_window->pending_presentation_cb_wins, l2, ll2, hwc_window)
+ {
+ if (!hwc_window->render_target) continue;
+
+ e_hwc_window_presentation_callback_pending_take_over(hwc_window,
+ &comp_info->presentation_callbacks);
+ }
+ }
+
+ return EINA_TRUE;
+}
+
static void
_e_hwc_windows_target_window_render_pre_cb(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
{
}
_e_hwc_windows_pending_update_data_dequeue(target_hwc_window, comp_info);
+ _e_hwc_windows_presentation_callback_comp_take_over(target_hwc_window, comp_info);
visible_windows = _e_hwc_windows_visible_windows_list_get(NULL);
EINA_LIST_FREE(visible_windows, hwc_window)
hwc_window->on_rendered_target = EINA_FALSE;
- e_hwc_presentation_callback_list_merge(&comp_info->presentation_callbacks,
- &hwc_window->pending_presentation_callbacks);
-
ec = hwc_window->ec;
if (!ec) continue;
_e_hwc_windows_target_window_free(E_Hwc_Window_Target *target_hwc_window)
{
E_Hwc_Window *hwc_window = (E_Hwc_Window *)target_hwc_window;
- E_Hwc_Window *present_sync_window;
+ E_Hwc_Window *present_sync_window, *presentation_cb_window;
if (target_hwc_window->evas)
{
EINA_LIST_FREE(target_hwc_window->present_sync_windows, present_sync_window)
e_hwc_window_unref(present_sync_window);
+ EINA_LIST_FREE(target_hwc_window->pending_presentation_cb_wins, presentation_cb_window)
+ e_hwc_window_unref(presentation_cb_window);
+
if (hwc_window->queue && hwc_window->queue->tqueue)
tbm_surface_queue_destroy(hwc_window->queue->tqueue);