EINA_SAFETY_ON_NULL_RETURN_VAL(eout, EINA_FALSE);
EINA_SAFETY_ON_NULL_RETURN_VAL(eout->planes, EINA_FALSE);
- EINA_LIST_FOREACH(eout->planes, l, ep)
- {
- if (!e_comp->hwc_use_multi_plane &&
- !e_plane_is_cursor(ep) &&
- !e_plane_is_fb_target(ep))
- continue;
-
- if (ep->ec) e_client_redirected_set(ep->ec, 1);
- }
-
ep_l = e_output_planes_get(eout);
EINA_LIST_REVERSE_FOREACH(ep_l, l , ep)
{
if (set)
{
ELOGF("HWC", "is set on fb_target( %d)", ep->prepare_ec->pixmap, ep->prepare_ec, ep->zpos);
- e_client_redirected_set(ep->prepare_ec, 0);
mode = E_HWC_MODE_FULL;
// fb target is occupied by a client surface, means compositor disabled
if (set)
{
ELOGF("HWC", "is set on %d", ep->prepare_ec->pixmap, ep->prepare_ec, ep->zpos);
- e_client_redirected_set(ep->prepare_ec, 0);
mode |= E_HWC_MODE_HYBRID;
}
else
continue;
}
- if (ep->ec) e_client_redirected_set(ep->ec, 1);
e_plane_ec_prepare_set(ep, NULL);
e_plane_ec_set(ep, NULL);
}
if (e_plane_is_reserved(ep))
e_plane_reserved_set(ep, 0);
- if (ep->ec) e_client_redirected_set(ep->ec, 1);
e_plane_ec_prepare_set(ep, NULL);
e_plane_ec_set(ep, NULL);
e_plane_reserved_set(ep, 0);
}
- if (ep->ec) e_client_redirected_set(ep->ec, 1);
e_plane_ec_prepare_set(ep, NULL);
if (e_plane_ec_set(ep, new_ec))
ELOGF("HWC", "new_ec(%s) is set on %d",
new_ec->pixmap, new_ec,
e_client_util_name_get(new_ec) ? new_ec->icccm.name : "no name", ep->zpos);
-
- e_client_redirected_set(new_ec, 0);
}
else
{
{
if (plane->ec == ec) return EINA_TRUE;
+ if (plane->ec_redirected)
+ {
+ if (plane->ec) e_client_redirected_set(plane->ec, EINA_TRUE);
+ plane->ec_redirected = EINA_FALSE;
+ }
+
if (plane->reserved_memory)
e_plane_reserved_set(plane, EINA_TRUE);
if (!plane->is_fb) _e_plane_unset_reset(plane);
e_comp_object_hwc_update_set(ec->frame, EINA_TRUE);
+
+ if (ec->redirected) plane->ec_redirected = EINA_TRUE;
+ e_client_redirected_set(ec, EINA_FALSE);
}
else
{
e_plane_role_set(plane, E_PLANE_ROLE_NONE);
}
}
+
+ if (plane->ec_redirected)
+ {
+ if (plane->ec) e_client_redirected_set(plane->ec, EINA_TRUE);
+ plane->ec_redirected = EINA_FALSE;
+ }
}
plane->ec = ec;
E_Client *ec;
E_Client *prepare_ec;
+ Eina_Bool ec_redirected;
Eina_Bool reserved_memory;
static void
_e_plane_renderer_recover_ec(E_Plane_Renderer *renderer)
{
+ E_Plane *plane = renderer->plane;
E_Client *ec = renderer->ec;
E_Comp_Wl_Client_Data *cdata = NULL;
E_Comp_Wl_Buffer *buffer = NULL;
e_pixmap_resource_set(ec->pixmap, buffer);
e_pixmap_dirty(ec->pixmap);
e_pixmap_refresh(ec->pixmap);
- e_pixmap_image_refresh(ec->pixmap);
- e_comp_object_damage(ec->frame, 0, 0, ec->w, ec->h);
- e_comp_object_dirty(ec->frame);
- e_comp_object_render(ec->frame);
+ if (plane->ec_redirected)
+ {
+ e_pixmap_image_refresh(ec->pixmap);
+ e_comp_object_damage(ec->frame, 0, 0, ec->w, ec->h);
+ e_comp_object_dirty(ec->frame);
+ e_comp_object_render(ec->frame);
+ }
return;
}
E_Client *ec = NULL;
E_Plane_Renderer_Client *renderer_client = NULL;
tbm_surface_queue_error_e tsq_err = TBM_SURFACE_QUEUE_ERROR_NONE;
+ E_Plane *plane = NULL;
EINA_SAFETY_ON_NULL_RETURN_VAL(renderer, EINA_FALSE);
+ plane = renderer->plane;
+ EINA_SAFETY_ON_NULL_RETURN_VAL(plane, EINA_FALSE);
+
ec = renderer->ec;
if (!ec) return EINA_TRUE;
if (!_e_plane_renderer_client_backup_buffer_set(renderer_client))
ERR("fail to _e_comp_hwc_set_backup_buffer");
- /* force update */
- e_pixmap_image_refresh(ec->pixmap);
- e_comp_object_damage(ec->frame, 0, 0, ec->w, ec->h);
- e_comp_object_dirty(ec->frame);
- e_comp_object_render(ec->frame);
-
+ if (plane->ec_redirected)
+ {
+ /* force update */
+ e_pixmap_image_refresh(ec->pixmap);
+ e_comp_object_damage(ec->frame, 0, 0, ec->w, ec->h);
+ e_comp_object_dirty(ec->frame);
+ e_comp_object_render(ec->frame);
+ }
done:
if (e_comp->hwc_sync_mode_change)
{