e_hwc_window_buffer_set(&commit_data->buffer, NULL, NULL);
}
- EHWTRACE("COM ts:%10p ------- {%25s}, state:%s, zpos:%d, deleted:%s",
+ EHWTRACE("COM data:%p ts:%p ------- {%25s}, state:%s, zpos:%d",
hwc_window->ec, hwc_window->hwc, hwc_window,
- commit_data->buffer.tsurface,
+ commit_data, commit_data->buffer.tsurface,
e_hwc_window_name_get(hwc_window),
e_hwc_window_state_string_get(hwc_window->state),
- hwc_window->zpos, (hwc_window->is_deleted ? "yes" : "no"));
+ hwc_window->zpos);
commit_data->hwc_window = hwc_window;
e_object_ref(E_OBJECT(hwc_window));
tsurface = commit_data->buffer.tsurface;
queue = commit_data->buffer.queue;
- EHWTRACE("DON ts:%10p ------- {%25s}, state:%s, zpos:%d, deleted:%s (Window)",
+ EHWTRACE("DON data:%p ts:%p ------- {%25s}, state:%s, zpos:%d",
hwc_window->ec, hwc_window->hwc, hwc_window,
- tsurface, e_hwc_window_name_get(hwc_window),
+ commit_data, tsurface, e_hwc_window_name_get(hwc_window),
e_hwc_window_state_string_get(hwc_window->state),
- hwc_window->zpos, (hwc_window->is_deleted ? "yes" : "no"));
+ hwc_window->zpos);
if (e_hwc_window_is_cursor(hwc_window))
{
#define EHWS_BUFFER_COMP_INFO_KEY (unsigned long)(&ehws_comp_buffer_info_key)
static Eina_Bool _e_hwc_windows_target_window_queue_set(E_Hwc_Window_Target *target_hwc_window);
-static void _e_hwc_windows_wait_commit_set(E_Hwc *hwc, E_Hwc_Windows_Commit_Data *wins_commit_data, Eina_Bool set);
+static void _e_hwc_windows_wait_commit_set(E_Hwc *hwc, Eina_Bool set);
+static void _e_hwc_windows_commit_handler_timer_set(E_Hwc *hwc, E_Hwc_Windows_Commit_Data *wins_commit_data, Eina_Bool set);
static E_Comp_Wl_Buffer *
_e_hwc_windows_comp_wl_buffer_get(E_Hwc_Window *hwc_window)
e_hwc_window_presentation_time_feedback_present(hwc_window, sequence, tv_sec, tv_usec);
if (e_hwc_window_is_video(hwc_window) && hwc_window->ec)
- e_client_video_commit_data_release(hwc_window->ec, sequence, tv_sec, tv_usec);
+ {
+ if ((!wins_commit_data->use_vblank_handler) ||
+ (wins_commit_data->use_vblank_handler && !wins_commit_data->vblank_done))
+ e_client_video_commit_data_release(hwc_window->ec, sequence, tv_sec, tv_usec);
+ }
if (!e_hwc_window_commit_data_release(hwc_window, commit_data)) continue;
}
wins_commit_data->commit_data_list = eina_list_free(wins_commit_data->commit_data_list);
hwc->wins_commit_data_list = eina_list_remove(hwc->wins_commit_data_list, wins_commit_data);
+
+ _e_hwc_windows_commit_handler_timer_set(hwc, wins_commit_data, EINA_FALSE);
free(wins_commit_data);
}
+static void
+_e_hwc_windows_commit_handler(tdm_hwc *thwc, unsigned int sequence,
+ unsigned int tv_sec, unsigned int tv_usec,
+ void *user_data)
+{
+ E_Hwc_Windows_Commit_Data *wins_commit_data = (E_Hwc_Windows_Commit_Data *)user_data;
+ E_Hwc *hwc;
+
+ EINA_SAFETY_ON_NULL_RETURN(wins_commit_data);
+
+ hwc = wins_commit_data->hwc;
+ EINA_SAFETY_ON_NULL_RETURN(hwc);
+
+ EHWSTRACE("!!!!!!!! HWC Commit Handler !!!!!!!!", NULL, hwc);
+
+ /* 'wait_commit' is mechanism to make 'fetch and commit' no more than one time per a frame;
+ * a 'page flip' happened so it's time to allow to make 'fetch and commit' for the e_output */
+ if (!wins_commit_data->use_vblank_handler)
+ _e_hwc_windows_wait_commit_set(hwc, EINA_FALSE);
+
+ _e_hwc_windows_commit_data_release(hwc, wins_commit_data, sequence, tv_sec, tv_usec);
+}
+
+static Eina_Bool
+_e_hwc_windows_commit_handler_timeout(void *data)
+{
+ E_Hwc_Windows_Commit_Data *wins_commit_data = (E_Hwc_Windows_Commit_Data *)data;
+
+ if (!wins_commit_data) return ECORE_CALLBACK_CANCEL;
+
+ EHWSERR("Timeout wait commit", wins_commit_data->hwc);
+
+ wins_commit_data->commit_handler_timer = NULL;
+
+ _e_hwc_windows_commit_handler(wins_commit_data->hwc->thwc, 0, 0, 0, wins_commit_data);
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_e_hwc_windows_commit_handler_timer_set(E_Hwc *hwc, E_Hwc_Windows_Commit_Data *wins_commit_data, Eina_Bool set)
+{
+ if (!e_comp->commit_handler_timer.use) return;
+
+ if (wins_commit_data->commit_handler_timer)
+ {
+ ecore_timer_del(wins_commit_data->commit_handler_timer);
+ wins_commit_data->commit_handler_timer = NULL;
+ }
+
+ if (set)
+ wins_commit_data->commit_handler_timer = ecore_timer_add(e_comp->commit_handler_timer.interval,
+ _e_hwc_windows_commit_handler_timeout,
+ wins_commit_data);
+}
+
static E_Hwc_Windows_Commit_Data *
_e_hwc_windows_commit_data_acquire(E_Hwc *hwc)
{
}
static void
-_e_hwc_windows_commit_handler(tdm_hwc *thwc, unsigned int sequence,
- unsigned int tv_sec, unsigned int tv_usec,
- void *user_data)
-{
- E_Hwc_Windows_Commit_Data *wins_commit_data = (E_Hwc_Windows_Commit_Data *)user_data;
- E_Hwc *hwc;
-
- EINA_SAFETY_ON_NULL_RETURN(wins_commit_data);
-
- hwc = wins_commit_data->hwc;
- EINA_SAFETY_ON_NULL_RETURN(hwc);
-
- EHWSTRACE("!!!!!!!! HWC Commit Handler !!!!!!!!", NULL, hwc);
-
- /* 'wait_commit' is mechanism to make 'fetch and commit' no more than one time per a frame;
- * a 'page flip' happened so it's time to allow to make 'fetch and commit' for the e_output */
- _e_hwc_windows_wait_commit_set(hwc, wins_commit_data, EINA_FALSE);
-
- _e_hwc_windows_commit_data_release(hwc, wins_commit_data, sequence, tv_sec, tv_usec);
-}
-
-static void
_e_hwc_windows_offscreen_commit(E_Hwc *hwc)
{
E_Hwc_Window *hwc_window = NULL;
return EINA_TRUE;
}
-static Eina_Bool
-_e_hwc_windows_commit_handler_timeout(void *data)
+static void
+_e_hwc_windows_vblank_handler(tdm_output *output, unsigned int sequence,
+ unsigned int tv_sec, unsigned int tv_usec,
+ void *user_data)
{
- E_Hwc_Windows_Commit_Data *wins_commit_data = (E_Hwc_Windows_Commit_Data *)data;
+ E_Hwc *hwc = (E_Hwc *)user_data;
+ E_Hwc_Windows_Commit_Data *wins_commit_data = NULL;
+ E_Hwc_Window_Commit_Data *commit_data;
+ Eina_List *l;
- if (!wins_commit_data) return ECORE_CALLBACK_CANCEL;
+ EINA_SAFETY_ON_NULL_RETURN(hwc);
- EHWSERR("Timeout wait commit", wins_commit_data->hwc);
+ EHWSTRACE("!!!!!!!! HWC Vblank Handler!!!!!!!!", NULL, hwc);
- wins_commit_data->hwc->wait_commit = EINA_FALSE;
- wins_commit_data->hwc->commit_handler_timer = NULL;
+ _e_hwc_windows_wait_commit_set(hwc, EINA_FALSE);
- _e_hwc_windows_commit_handler(wins_commit_data->hwc->thwc, 0, 0, 0, wins_commit_data);
+ if (!eina_list_count(hwc->wins_commit_data_list)) return;
- return ECORE_CALLBACK_CANCEL;
-}
+ wins_commit_data = eina_list_last_data_get(hwc->wins_commit_data_list);
+ EINA_SAFETY_ON_NULL_RETURN(wins_commit_data);
-static void
-_e_hwc_windows_wait_commit_set(E_Hwc *hwc, E_Hwc_Windows_Commit_Data *wins_commit_data, Eina_Bool set)
-{
- if (hwc->wait_commit == set) return;
+ if (!wins_commit_data->use_vblank_handler) return;
- if (e_comp->commit_handler_timer.use)
+ EINA_LIST_FOREACH(wins_commit_data->commit_data_list, l, commit_data)
{
- if (hwc->commit_handler_timer)
- {
- ecore_timer_del(hwc->commit_handler_timer);
- hwc->commit_handler_timer = NULL;
- }
+ if (!commit_data) continue;
+ if (!commit_data->hwc_window) continue;
- if (set)
- hwc->commit_handler_timer = ecore_timer_add(e_comp->commit_handler_timer.interval,
- _e_hwc_windows_commit_handler_timeout,
- wins_commit_data);
+ if (e_hwc_window_is_video(commit_data->hwc_window) && commit_data->hwc_window->ec)
+ e_client_video_commit_data_release(commit_data->hwc_window->ec, sequence, tv_sec, tv_usec);
}
+ wins_commit_data->vblank_done = EINA_TRUE;
+}
+
+static void
+_e_hwc_windows_wait_commit_set(E_Hwc *hwc, Eina_Bool set)
+{
+ if (hwc->wait_commit == set) return;
+
hwc->wait_commit = set;
}
e_hwc_sync_callback_call(sync_callback);
}
+static tdm_hwc_commit_interval
+_e_hwc_windows_commit_interval_get(E_Hwc *hwc)
+{
+ tdm_error terror;
+ tdm_hwc_commit_interval interval = TDM_HWC_COMMIT_INTERVAL_NONE;
+
+ terror = tdm_hwc_get_commit_interval(hwc->thwc, &interval);
+ if (terror != TDM_ERROR_NONE)
+ return TDM_HWC_COMMIT_INTERVAL_NONE;
+
+ return interval;
+}
+
+static void
+_e_hwc_windows_commit_interval_update(E_Hwc *hwc, E_Hwc_Windows_Commit_Data *wins_commit_data)
+{
+ tdm_hwc_commit_interval interval = TDM_HWC_COMMIT_INTERVAL_NONE;
+ tdm_error terror = TDM_ERROR_NONE;
+
+ if (!hwc->wait_commit) return;
+
+ interval = _e_hwc_windows_commit_interval_get(hwc);
+ if (interval == TDM_HWC_COMMIT_INTERVAL_VBLANK)
+ {
+ terror = tdm_output_wait_vblank(hwc->output->toutput, 1, 0, _e_hwc_windows_vblank_handler,
+ (void *)hwc);
+ if (terror != TDM_ERROR_NONE)
+ {
+ EHWSERR("fail to tdm_output_wait_vblank", hwc);
+ return;
+ }
+
+ wins_commit_data->use_vblank_handler = EINA_TRUE;
+
+ EHWSTRACE("!!!!!!!! HWC Vblank !!!!!!!!", NULL, hwc);
+ }
+}
+
EINTERN Eina_Bool
e_hwc_windows_commit(E_Hwc *hwc, E_Output_Display_Mode display_mode)
{
EHWSTRACE("!!!!!!!! HWC Commit !!!!!!!!", NULL, hwc);
_e_hwc_windows_update_fps(hwc);
- _e_hwc_windows_wait_commit_set(hwc, wins_commit_data, EINA_TRUE);
+ _e_hwc_windows_wait_commit_set(hwc, EINA_TRUE);
+ _e_hwc_windows_commit_handler_timer_set(hwc, wins_commit_data, EINA_TRUE);
hwc->wins_commit_data_list = eina_list_append(hwc->wins_commit_data_list, wins_commit_data);
error = tdm_hwc_commit(hwc->thwc, 0, _e_hwc_windows_commit_handler, wins_commit_data);
goto fail;
}
+ _e_hwc_windows_commit_interval_update(hwc, wins_commit_data);
+
if (e_hwc_windows_fence_enabled_get(hwc))
{
error = tdm_hwc_get_commit_fence(hwc->thwc, &commit_fence_fd);
fail:
/* send tizen_hwc_commit feedback discarded */
e_comp_wl_tizen_hwc_discarded();
- _e_hwc_windows_wait_commit_set(hwc, wins_commit_data, EINA_FALSE);
+ _e_hwc_windows_wait_commit_set(hwc, EINA_FALSE);
return EINA_FALSE;
}