return EINA_TRUE;
}
+static void
+_e_plane_pp_pending_data_remove(E_Plane *plane)
+{
+ E_Plane_Commit_Data *data = NULL;
+ Eina_List *l = NULL, *ll = NULL;
+
+ if (eina_list_count(plane->pending_pp_commit_data_list) != 0)
+ {
+ EINA_LIST_FOREACH_SAFE(plane->pending_pp_commit_data_list, l, ll, data)
+ {
+ if (!data) continue;
+ plane->pending_pp_commit_data_list = eina_list_remove_list(plane->pending_pp_commit_data_list, l);
+ tbm_surface_queue_release(plane->pp_tqueue, data->tsurface);
+ tbm_surface_internal_unref(data->tsurface);
+ E_FREE(data);
+ }
+ }
+ eina_list_free(plane->pending_pp_commit_data_list);
+ plane->pending_pp_commit_data_list = NULL;
+
+ if (eina_list_count(plane->pending_pp_data_list) != 0)
+ {
+ EINA_LIST_FOREACH_SAFE(plane->pending_pp_data_list, l, ll, data)
+ {
+ if (!data) continue;
+ plane->pending_pp_data_list = eina_list_remove_list(plane->pending_pp_data_list, l);
+ if (data->ec) e_pixmap_image_clear(data->ec->pixmap, 1);
+ e_plane_commit_data_release(data);
+ }
+ }
+ eina_list_free(plane->pending_pp_data_list);
+ plane->pending_pp_data_list = NULL;
+}
+
static void
_e_plane_pp_layer_commit_handler(tdm_layer *layer, unsigned int sequence,
unsigned int tv_sec, unsigned int tv_usec,
void *user_data)
{
E_Plane_Commit_Data *data = (E_Plane_Commit_Data *)user_data;
+ E_Output *output = NULL;
E_Plane *plane = NULL;
EINA_SAFETY_ON_NULL_RETURN(data);
if (!plane->pp_set)
{
tbm_surface_internal_unref(data->tsurface);
- free(data);
+ E_FREE(data);
return;
}
/* set the new pp surface to the plane */
plane->pp_tsurface = data->tsurface;
- free(data);
+ E_FREE(data);
if (plane_trace_debug)
ELOGF("E_PLANE", "PP Layer Commit Handler Plane(%p)", NULL, NULL, plane);
+ output = plane->output;
+ if (e_output_dpms_get(output))
+ {
+ _e_plane_pp_pending_data_remove(plane);
+ return;
+ }
+
/* deal with the pending layer commit */
if (eina_list_count(plane->pending_pp_commit_data_list) != 0)
{
static Eina_Bool
_e_plane_pp_layer_data_commit(E_Plane *plane, E_Plane_Commit_Data *data)
{
+ E_Output *output = NULL;
tbm_surface_info_s surf_info;
unsigned int aligned_width;
int dst_w, dst_h;
EINA_SAFETY_ON_NULL_RETURN_VAL(data, EINA_FALSE);
+ output = plane->output;
+ if (e_output_dpms_get(output))
+ {
+ _e_plane_pp_pending_data_remove(plane);
+ goto fail;
+ }
+
aligned_width = _e_plane_aligned_width_get(data->tsurface);
if (aligned_width == 0)
{
fail:
tbm_surface_internal_unref(data->tsurface);
tbm_surface_queue_release(plane->pp_tqueue, data->tsurface);
- free(data);
+ E_FREE(data);
return EINA_FALSE;
}
static void
_e_plane_pp_commit_handler(tdm_pp *pp, tbm_surface_h tsurface_src, tbm_surface_h tsurface_dst, void *user_data)
{
+ E_Output *output = NULL;
E_Plane *plane = NULL;
E_Plane_Commit_Data *data = NULL;
goto done;
}
+ output = plane->output;
+ if (e_output_dpms_get(output))
+ {
+ _e_plane_pp_pending_data_remove(plane);
+ tbm_surface_queue_release(plane->pp_tqueue, tsurface_dst);
+
+ goto done;
+ }
+
if (!_e_plane_pp_layer_commit(plane, tsurface_dst))
ERR("fail to _e_plane_pp_layer_commit");
static Eina_Bool
_e_plane_pp_commit(E_Plane *plane, E_Plane_Commit_Data *data)
{
+ E_Output *output = NULL;
tbm_surface_h pp_tsurface = NULL;
tbm_error_e tbm_err = TBM_ERROR_NONE;
tdm_error tdm_err = TDM_ERROR_NONE;
NULL, NULL, plane, plane->zpos, data->tsurface, plane->pp_tqueue,
data->buffer_ref.buffer ? data->buffer_ref.buffer->resource : NULL, data);
+ output = plane->output;
+ if (e_output_dpms_get(output))
+ {
+ _e_plane_pp_pending_data_remove(plane);
+ return EINA_FALSE;
+ }
+
tbm_err = tbm_surface_queue_dequeue(plane->pp_tqueue, &pp_tsurface);
if (tbm_err != TBM_ERROR_NONE)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(plane, EINA_FALSE);
+ if ((plane->pp_set) && e_plane_is_fb_target(plane))
+ _e_plane_pp_pending_data_remove(plane);
+
if (plane->unset_commit) return EINA_TRUE;
data = e_plane_commit_data_aquire(plane);
EINTERN void
e_plane_zoom_unset(E_Plane *plane)
{
- E_Plane_Commit_Data *data = NULL;
- Eina_List *l, *ll;
-
EINA_SAFETY_ON_NULL_RETURN(plane);
plane->pp_set_info = EINA_FALSE;
plane->pp_rect.w = 0;
plane->pp_rect.h = 0;
- EINA_LIST_FOREACH_SAFE(plane->pending_pp_commit_data_list, l, ll, data)
- {
- if (!data) continue;
- plane->pending_pp_commit_data_list = eina_list_remove_list(plane->pending_pp_commit_data_list, l);
- tbm_surface_queue_release(plane->pp_tqueue, data->tsurface);
- tbm_surface_internal_unref(data->tsurface);
- free(data);
- }
-
- EINA_LIST_FOREACH_SAFE(plane->pending_pp_data_list, l, ll, data)
- {
- if (!data) continue;
- plane->pending_pp_data_list = eina_list_remove_list(plane->pending_pp_data_list, l);
- if (data->ec) e_pixmap_image_clear(data->ec->pixmap, 1);
- e_plane_commit_data_release(data);
- }
+ _e_plane_pp_pending_data_remove(plane);
if (plane->pp_tsurface)
{