}
}
+ EINA_LIST_FOREACH(output->planes, l, plane)
+ {
+ if (e_plane_is_fetch_retry(plane))
+ {
+ if (!e_plane_fetch(plane)) continue;
+ if (e_plane_is_fb_target(plane))
+ {
+ fb_commit = EINA_TRUE;
+ _e_output_update_fps();
+ }
+ }
+ }
+
/* zoom commit only primary */
if (!fb_commit) return EINA_TRUE;
e_plane_unset_try_set(plane, EINA_FALSE);
}
+ EINA_LIST_FOREACH(output->planes, l, plane)
+ {
+ if (e_plane_is_fetch_retry(plane))
+ {
+ if (!e_plane_fetch(plane)) continue;
+ if (e_plane_is_fb_target(plane))
+ {
+ fb_commit = EINA_TRUE;
+ _e_output_update_fps();
+ }
+ }
+ }
+
EINA_LIST_FOREACH(output->planes, l, plane)
{
if (e_plane_is_unset_try(plane)) continue;
return tbm_queue;
}
+static Eina_Bool
+_e_plane_surface_can_set(E_Plane *plane, tbm_surface_h tsurface)
+{
+ E_Output *output = NULL;
+ E_Plane *tmp_plane = NULL;
+ Eina_List *l;
+
+ output = plane->output;
+ EINA_SAFETY_ON_NULL_RETURN_VAL(output, EINA_FALSE);
+
+ EINA_LIST_FOREACH(output->planes, l, tmp_plane)
+ {
+ if (tmp_plane->tsurface == tsurface)
+ {
+ if (plane_trace_debug)
+ ELOGF("E_PLANE", "Used Plane(%p) zpos(%d) tsurface(%p)",
+ NULL, NULL, tmp_plane, tmp_plane->zpos, tsurface);
+
+ return EINA_FALSE;
+ }
+ }
+
+ return EINA_TRUE;
+}
+
static void
_e_plane_renderer_unset(E_Plane *plane)
{
return EINA_TRUE;
}
+static void
+_e_plane_surface_cancel_acquire(E_Plane *plane, tbm_surface_h tsurface)
+{
+ E_Client *ec = plane->ec;
+ E_Plane_Renderer *renderer = plane->renderer;
+
+ if ((plane->is_fb && !plane->ec) ||
+ (plane->ec && plane->role == E_PLANE_ROLE_OVERLAY && plane->is_reserved))
+ {
+ if (!e_plane_renderer_surface_queue_cancel_acquire(renderer, tsurface))
+ ERR("fail to e_plane_renderer_surface_queue_cancel_acquire");
+ }
+
+ if (ec) e_comp_object_hwc_update_set(ec->frame, EINA_TRUE);
+
+ return;
+}
+
static tbm_surface_h
_e_plane_surface_from_client_acquire_reserved(E_Plane *plane)
{
return EINA_TRUE;
}
+EINTERN Eina_Bool
+e_plane_is_fetch_retry(E_Plane *plane)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(plane, EINA_FALSE);
+
+ return plane->fetch_retry;
+}
+
EINTERN Eina_Bool
e_plane_fetch(E_Plane *plane)
{
/* exist tsurface for update plane */
if (tsurface)
{
+ if (!_e_plane_surface_can_set(plane, tsurface))
+ {
+ _e_plane_surface_cancel_acquire(plane, tsurface);
+ plane->fetch_retry = EINA_TRUE;
+
+ return EINA_FALSE;
+ }
+
+ if (plane->fetch_retry) plane->fetch_retry = EINA_FALSE;
+
plane->tsurface = tsurface;
/* set plane info and set tsurface to the plane */
Eina_Bool is_video;
Eina_Bool reserved_video;
+ Eina_Bool fetch_retry;
+
E_Plane *fb_change;
int fb_change_counter;
EINTERN Eina_Bool e_plane_is_unset_try(E_Plane *plane);
EINTERN void e_plane_unset_try_set(E_Plane *plane, Eina_Bool set);
EINTERN Eina_Bool e_plane_unset_commit_check(E_Plane *plane, Eina_Bool fb_commit);
+EINTERN Eina_Bool e_plane_is_fetch_retry(E_Plane *plane);
EINTERN Eina_Bool e_plane_fb_target_set(E_Plane *plane, Eina_Bool set);
EINTERN Eina_List *e_plane_available_tbm_formats_get(E_Plane *plane);
EINTERN Eina_Bool e_plane_pp_commit(E_Plane *plane);
return EINA_TRUE;
}
+EINTERN Eina_Bool
+e_plane_renderer_surface_queue_cancel_acquire(E_Plane_Renderer *renderer, tbm_surface_h tsurface)
+{
+ tbm_surface_queue_h tqueue = NULL;
+ tbm_surface_queue_error_e tsq_err = TBM_SURFACE_QUEUE_ERROR_NONE;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(renderer, EINA_FALSE);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(tsurface, EINA_FALSE);
+
+ tqueue = renderer->tqueue;
+ EINA_SAFETY_ON_NULL_RETURN_VAL(tqueue, EINA_FALSE);
+
+ /* debug */
+ if (renderer_trace_debug)
+ {
+ E_Client *ec = renderer->ec;
+ ELOGF("E_PLANE_RENDERER", "Cancel Acquire Renderer(%p) tsurface(%p) tqueue(%p) wl_buffer(%p) ",
+ ec->pixmap, ec, renderer, tsurface, renderer->tqueue, _get_wl_buffer(ec));
+ }
+
+ tsq_err = tbm_surface_queue_cancel_acquire(tqueue, tsurface);
+ if (tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE)
+ {
+ ERR("tbm_surface_queue_cancel_acquire failed. tbm_surface_queue(%p) tbm_surface(%p)", tqueue, tsurface);
+ return EINA_FALSE;
+ }
+
+ return EINA_TRUE;
+}
+
EINTERN Eina_Bool
e_plane_renderer_surface_queue_can_dequeue(E_Plane_Renderer *renderer)
{
EINTERN Eina_Bool e_plane_renderer_surface_queue_set(E_Plane_Renderer *renderer, tbm_surface_queue_h tqueue);
EINTERN void e_plane_renderer_surface_queue_destroy(E_Plane_Renderer *renderer);
EINTERN tbm_surface_h e_plane_renderer_surface_queue_acquire(E_Plane_Renderer *renderer);
+EINTERN Eina_Bool e_plane_renderer_surface_queue_cancel_acquire(E_Plane_Renderer *renderer, tbm_surface_h tsurface);
EINTERN void e_plane_renderer_surface_queue_release(E_Plane_Renderer *renderer, tbm_surface_h tsurface);
EINTERN Eina_Bool e_plane_renderer_surface_queue_enqueue(E_Plane_Renderer *renderer, tbm_surface_h tsurface);
EINTERN Eina_Bool e_plane_renderer_surface_queue_can_dequeue(E_Plane_Renderer *renderer);