E_Comp_Wl_Tizen_Hwc *tizen_hwc;
uint32_t serial;
Ecore_Timer *timer;
+
+ Eina_Bool dequeued;
+ E_Comp_Wl_Tizen_Hwc_Feedback_List *dequeued_list;
};
static void
ELOGF("TIZEN-HWC", "Destory Tizen HWC Commit Feedback.", hwc_commit_feedback->ec);
+ if ((hwc_commit_feedback->dequeued_list) && (hwc_commit_feedback->dequeued_list->feedbacks))
+ hwc_commit_feedback->dequeued_list->feedbacks = eina_list_remove(hwc_commit_feedback->dequeued_list->feedbacks,
+ hwc_commit_feedback);
+
+ if (hwc_commit_feedback->ec)
+ e_object_unref(E_OBJECT(hwc_commit_feedback->ec));
+
if (hwc_commit_feedback->timer)
ecore_timer_del(hwc_commit_feedback->timer);
}
hwc_commit_feedback->ec = ec;
+ e_object_ref(E_OBJECT(ec));
hwc_commit_feedback->tizen_hwc = tizen_hwc;
hwc_commit_feedback->serial = serial;
hwc_commit_feedback->timer = ecore_timer_add(E_COMP_WL_TIZEN_HWC_TIMEOUT,
{
EINA_LIST_FOREACH_SAFE(tizen_hwc->hwc_commit_feeback_list, ll, lll, hwc_commit_feedback)
{
+ if ((hwc_commit_feedback->ec->hwc_window) &&
+ (hwc_commit_feedback->ec->hwc_window->present_sync)) continue;
+ if (hwc_commit_feedback->dequeued) continue;
+
ELOGF("TIZEN-HWC", "[Send] Commit FeedBack Committed.(%p, %p)", hwc_commit_feedback->ec, hwc_commit_feedback, hwc_commit_feedback->resource);
tizen_hwc_commit_feedback_send_committed(hwc_commit_feedback->resource,
hwc_commit_feedback->serial);
{
EINA_LIST_FOREACH_SAFE(tizen_hwc->hwc_commit_feeback_list, ll, lll, hwc_commit_feedback)
{
+ if ((hwc_commit_feedback->ec->hwc_window) &&
+ (hwc_commit_feedback->ec->hwc_window->present_sync)) continue;
+ if (hwc_commit_feedback->dequeued) continue;
+
ELOGF("TIZEN-HWC", "[Send] Commit FeedBack Discarded.(%p, %p)", hwc_commit_feedback->ec, hwc_commit_feedback, hwc_commit_feedback->resource);
tizen_hwc_commit_feedback_send_discarded(hwc_commit_feedback->resource,
hwc_commit_feedback->serial);
}
}
}
+
+EINTERN Eina_Bool
+e_comp_wl_tizen_hwc_feedback_list_init(E_Comp_Wl_Tizen_Hwc_Feedback_List *feedback_list)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(feedback_list, EINA_FALSE);
+
+ return EINA_TRUE;
+}
+
+EINTERN void
+e_comp_wl_tizen_hwc_feedback_list_finish(E_Comp_Wl_Tizen_Hwc_Feedback_List *feedback_list)
+{
+ if (!feedback_list) return;
+
+ e_comp_wl_tizen_hwc_feedback_list_enqueue(feedback_list);
+}
+
+EINTERN Eina_Bool
+e_comp_wl_tizen_hwc_feedback_list_dequeue(E_Client *ec, E_Comp_Wl_Tizen_Hwc_Feedback_List *feedback_list)
+{
+ const Eina_List *l, *ll, *lll;
+ E_Comp_Wl_Tizen_Hwc *tizen_hwc;
+ E_Comp_Wl_Tizen_Hwc_Commit_Feedback* hwc_commit_feedback;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(feedback_list, EINA_FALSE);
+
+ EINA_LIST_FOREACH(_e_comp_wl_tizen_hwc_list, l, tizen_hwc)
+ {
+ EINA_LIST_FOREACH_SAFE(tizen_hwc->hwc_commit_feeback_list, ll, lll, hwc_commit_feedback)
+ {
+ if (hwc_commit_feedback->ec != ec) continue;
+ if (hwc_commit_feedback->dequeued) continue;
+
+ hwc_commit_feedback->dequeued = EINA_TRUE;
+ hwc_commit_feedback->dequeued_list = feedback_list;
+ feedback_list->feedbacks = eina_list_append(feedback_list->feedbacks,
+ hwc_commit_feedback);
+ }
+ }
+
+ return EINA_TRUE;
+}
+
+EINTERN Eina_Bool
+e_comp_wl_tizen_hwc_feedback_list_enqueue(E_Comp_Wl_Tizen_Hwc_Feedback_List *feedback_list)
+{
+ Eina_List *l, *ll;
+ E_Comp_Wl_Tizen_Hwc_Commit_Feedback* hwc_commit_feedback;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(feedback_list, EINA_FALSE);
+
+ EINA_LIST_FOREACH_SAFE(feedback_list->feedbacks, l, ll, hwc_commit_feedback)
+ {
+ hwc_commit_feedback->dequeued = EINA_FALSE;
+ hwc_commit_feedback->dequeued_list = NULL;
+ feedback_list->feedbacks = eina_list_remove_list(feedback_list->feedbacks, l);
+ }
+
+ return EINA_TRUE;
+}
E_Egl_Sync *release_fence;
Eina_List *pending_update_list;
+ E_Comp_Wl_Tizen_Hwc_Feedback_List feedback_list;
+
Eina_List *rendered_windows;
Eina_List *rendered_buffers;
};
e_presentation_time_container_finish(&comp_info->presentation_container);
e_hwc_presentation_callback_list_finish(&comp_info->presentation_callbacks);
+ e_comp_wl_tizen_hwc_feedback_list_finish(&comp_info->feedback_list);
E_FREE(comp_info);
}
e_presentation_time_container_init(&comp_info->presentation_container);
e_hwc_presentation_callback_list_init(&comp_info->presentation_callbacks);
+ e_comp_wl_tizen_hwc_feedback_list_init(&comp_info->feedback_list);
tbm_surface_internal_add_user_data(tbm_surface, EHWS_BUFFER_COMP_INFO_KEY,
_e_hwc_windows_comp_info_cb_tbm_surface_destroy);
comp_info->pending_update_list = NULL;
+ e_comp_wl_tizen_hwc_feedback_list_enqueue(&comp_info->feedback_list);
+
return EINA_TRUE;
}
EINA_SAFETY_ON_NULL_RETURN_VAL(target_hwc_window, EINA_FALSE);
EINA_SAFETY_ON_NULL_RETURN_VAL(comp_info, EINA_FALSE);
+ EINA_LIST_FREE(comp_info->pending_update_list, update)
+ e_hwc_window_pending_update_data_enqueue(update->hwc_window, update);
+
+ e_comp_wl_tizen_hwc_feedback_list_enqueue(&comp_info->feedback_list);
+
EINA_LIST_FREE(target_hwc_window->present_sync_windows, hwc_window)
{
hwc_window->present_sync = EINA_FALSE;
e_client_video_commit_data_release(hwc_window->ec, 0, 0, 0);
}
+ if (hwc_window->ec)
+ e_comp_wl_tizen_hwc_feedback_list_dequeue(hwc_window->ec, &comp_info->feedback_list);
+
e_object_unref(E_OBJECT(hwc_window));
}
- EINA_LIST_FREE(comp_info->pending_update_list, update)
- e_hwc_window_pending_update_data_enqueue(update->hwc_window, update);
-
comp_info->pending_update_list = pending_update_list;
return EINA_TRUE;
EINA_LIST_FREE(comp_info->pending_update_list, update)
e_hwc_window_pending_update_data_dequeue_cancel(update->hwc_window, update);
+
+ e_comp_wl_tizen_hwc_feedback_list_enqueue(&comp_info->feedback_list);
}
return EINA_TRUE;