if (hwc_window->transition_failures > target_hwc_window->max_transition_failures)
continue;
- if ((((E_Hwc_Window *)target_hwc_window)->display.buffer.tsurface) ==
- (((E_Hwc_Window *)target_hwc_window)->buffer.tsurface))
- return EINA_TRUE;
+ /* if norender except video is pushed, buffer of target_window can't be updated */
+ if (e_hwc_norender_get_except_video(hwc) <= 0)
+ {
+ if ((((E_Hwc_Window *)target_hwc_window)->display.buffer.tsurface) ==
+ (((E_Hwc_Window *)target_hwc_window)->buffer.tsurface))
+ return EINA_TRUE;
+ }
/* DEVICE -> CLIENT */
if ((hwc_window->accepted_state == E_HWC_WINDOW_STATE_DEVICE) &&
return EINA_TRUE;
}
+static Eina_Bool
+_e_hwc_windows_visible_video_windows_update(E_Hwc *hwc)
+{
+ E_Hwc_Window *hwc_window;
+ Eina_List *l, *ll;
+ Eina_List *visible_windows;
+ Eina_Bool update_changes = EINA_FALSE;
+ int zpos = 0;
+ int add_num = 0, remove_num = 0;
+
+ /* get the visible windows */
+ visible_windows = _e_hwc_windows_visible_windows_list_get(hwc);
+ if (!visible_windows && !hwc->visible_windows)
+ return EINA_FALSE;
+
+ /* remove hide video windows */
+ EINA_LIST_FOREACH_SAFE(hwc->visible_windows, l, ll, hwc_window)
+ {
+ if (!e_hwc_window_is_video(hwc_window)) continue;
+ if (eina_list_data_find(visible_windows, hwc_window)) continue;
+
+ hwc->visible_windows = eina_list_remove(hwc->visible_windows, hwc_window);
+ e_object_unref(E_OBJECT(hwc_window));
+
+ e_hwc_window_state_set(hwc_window, E_HWC_WINDOW_STATE_NONE, EINA_TRUE);
+ remove_num++;
+ update_changes = EINA_TRUE;
+ }
+
+ /* add show video windows */
+ EINA_LIST_FOREACH_SAFE(visible_windows, l, ll, hwc_window)
+ {
+ if (!e_hwc_window_is_video(hwc_window)) continue;
+ if (eina_list_data_find(hwc->visible_windows, hwc_window)) continue;
+
+ hwc->visible_windows = eina_list_append(hwc->visible_windows, hwc_window);
+ e_object_ref(E_OBJECT(hwc_window));
+
+ e_hwc_window_state_set(hwc_window, E_HWC_WINDOW_STATE_VIDEO, EINA_TRUE);
+ add_num++;
+ update_changes = EINA_TRUE;
+ }
+
+ if (!update_changes)
+ {
+ eina_list_free(visible_windows);
+ return EINA_FALSE;
+ }
+
+ hwc->num_visible_windows += add_num;
+ hwc->num_visible_windows -= remove_num;
+
+ /* use the reverse iteration for assgining the zpos */
+ EINA_LIST_REVERSE_FOREACH(hwc->visible_windows, l, hwc_window)
+ e_hwc_window_zpos_set(hwc_window, zpos++);
+
+ eina_list_free(visible_windows);
+
+ return EINA_TRUE;
+}
+
static Eina_Bool
_e_hwc_windows_device_state_available_update(E_Hwc *hwc)
{
return update_changes;
}
+static Eina_Bool
+_e_hwc_windows_video_changes_update(E_Hwc *hwc)
+{
+ E_Hwc_Window *hwc_window = NULL;
+ Eina_Bool update_changes = EINA_FALSE;
+ const Eina_List *l;
+ Eina_Bool ret = EINA_FALSE;
+
+ if (_e_hwc_windows_visible_video_windows_update(hwc))
+ update_changes = EINA_TRUE;
+
+ EINA_LIST_FOREACH(hwc->hwc_windows, l, hwc_window)
+ {
+ if (!e_hwc_window_is_video(hwc_window)) continue;
+
+ /* fetch the window buffer */
+ ret = e_hwc_window_buffer_fetch(hwc_window);
+ if (ret)
+ update_changes = EINA_TRUE;
+ else
+ {
+ /* sometimes client add frame cb without buffer attach */
+ if ((hwc_window->ec) &&
+ (hwc_window->accepted_state == E_HWC_WINDOW_STATE_DEVICE))
+ {
+ if ((hwc_window->ec->pixmap) &&
+ (e_pixmap_type_get(hwc_window->ec->pixmap) == E_PIXMAP_TYPE_WL))
+ e_pixmap_image_clear(hwc_window->ec->pixmap, 1);
+ }
+ }
+
+ /* update the window's info */
+ if (e_hwc_window_info_update(hwc_window))
+ update_changes = EINA_TRUE;
+
+ /* update the window's props */
+ if (e_hwc_window_prop_update(hwc_window))
+ update_changes = EINA_TRUE;
+
+ if (e_hwc_window_device_state_available_update(hwc_window))
+ update_changes = EINA_TRUE;
+ }
+
+ return update_changes;
+}
+
static void
_e_hwc_windows_target_state_set(E_Hwc_Window_Target *target_hwc_window, E_Hwc_Window_State state)
{
goto re_evaluate;
}
- if (e_hwc_norender_get(hwc) > 0)
- {
- EHWSTRACE(" Not accpet validation NoRender get.", NULL, hwc);
- goto re_evaluate;
- }
-
if (hwc_mode == E_HWC_MODE_FULL)
{
if (((E_Hwc_Window *)hwc->target_hwc_window)->buffer.tsurface)
return EINA_TRUE;
}
+ if (e_hwc_norender_get_except_video(hwc) > 0)
+ {
+ EHWSTRACE("NoRender Except Video get. Do not ecore_evas_manual_render.", NULL, hwc);
+ return EINA_TRUE;
+ }
+
if (e_hwc_window_queue_buffer_can_dequeue(target_window->queue))
{
TRACE_DS_BEGIN(MANUAL RENDER);
if (hwc->wait_commit) return EINA_TRUE;
+ if (e_hwc_norender_get(hwc) > 0)
+ {
+ EHWSTRACE("No Render get.", NULL, hwc);
+ return EINA_TRUE;
+ }
+
if (hwc->primary_output)
{
- if (!_e_hwc_windows_changes_update(hwc))
- goto update_done;
+ if (e_hwc_norender_get_except_video(hwc) > 0)
+ {
+ EHWSTRACE("No Render Except Video get", NULL, hwc);
+ if (!_e_hwc_windows_video_changes_update(hwc))
+ goto update_done;
+ }
+ else
+ {
+ if (!_e_hwc_windows_changes_update(hwc))
+ goto update_done;
+ }
}
else
{