return EINA_TRUE;
}
-static void
-_e_plane_renderer_unset(E_Plane *plane)
+EINTERN void
+e_plane_renderer_clean(E_Plane *plane)
{
Eina_List *data_l;
E_Plane_Commit_Data *data = NULL;
+ EINA_SAFETY_ON_NULL_RETURN(plane);
+
plane->display_info.renderer = NULL;
EINA_LIST_FOREACH(plane->commit_data_list, data_l, data)
data->renderer = NULL;
+}
- if (plane->renderer)
- e_plane_renderer_del(plane->renderer);
+EINTERN void
+e_plane_renderer_unset(E_Plane *plane)
+{
+ EINA_SAFETY_ON_NULL_RETURN(plane);
+
+ if (!plane->renderer) return;
+
+ if (plane->reserved_memory)
+ e_plane_renderer_reserved_deactivate(plane->renderer);
+ else
+ e_plane_renderer_deactivate(plane->renderer);
+
+ if (plane->renderer->exported_wl_buffer_count > 0) return;
+ e_plane_renderer_clean(plane);
+ e_plane_renderer_del(plane->renderer);
plane->renderer = NULL;
}
}
if (plane->name) eina_stringshare_del(plane->name);
- if (plane->renderer) _e_plane_renderer_unset(plane);
+ if (plane->renderer) e_plane_renderer_unset(plane);
if (plane->ec) e_plane_ec_set(plane, NULL);
free(plane);
renderer = fb_target->renderer;
if (plane->renderer)
- _e_plane_renderer_unset(plane);
+ e_plane_renderer_unset(plane);
renderer->plane = plane;
plane->renderer = renderer;
{
if (!plane->ec)
{
- _e_plane_renderer_unset(plane);
+ e_plane_renderer_unset(plane);
e_plane_role_set(plane, E_PLANE_ROLE_NONE);
}
}
}
if ((plane->renderer) && (plane->role != E_PLANE_ROLE_OVERLAY))
- _e_plane_renderer_unset(plane);
+ e_plane_renderer_unset(plane);
if (!plane->renderer)
plane->renderer = e_plane_renderer_new(plane);
if (plane->renderer)
{
_e_plane_set_counter_reset(plane);
- _e_plane_renderer_unset(plane);
+ e_plane_renderer_unset(plane);
e_plane_role_set(plane, E_PLANE_ROLE_NONE);
}
}
renderer = plane->renderer;
if (!renderer) return;
- renderer_buffer = _e_plane_renderer_buffer_get(renderer, tsurface);
- EINA_SAFETY_ON_NULL_RETURN(renderer_buffer);
+ if (renderer->exported_wl_buffer_count > 0) renderer->exported_wl_buffer_count--;
if (renderer_trace_debug)
ELOGF("E_PLANE_RENDERER", "Destroy Renderer(%p) tsurface(%p) tqueue(%p)",
NULL, NULL, renderer, tsurface, renderer->tqueue);
- if (renderer->state != E_PLANE_RENDERER_STATE_PENDING_DEACTIVATE) return;
-
- if (renderer_buffer->exported)
+ renderer_buffer = _e_plane_renderer_buffer_get(renderer, tsurface);
+ if (renderer_buffer)
{
- if (!_e_plane_renderer_release_exported_renderer_buffer(renderer, renderer_buffer))
- ERR("failed to _e_plane_renderer_release_exported_renderer_buffer");
+ if (renderer->state == E_PLANE_RENDERER_STATE_PENDING_DEACTIVATE)
+ {
+ if (renderer_buffer->exported)
+ {
+ if (!_e_plane_renderer_release_exported_renderer_buffer(renderer, renderer_buffer))
+ ERR("failed to _e_plane_renderer_release_exported_renderer_buffer");
+ }
+ }
}
+
+ if (!plane->is_fb && !renderer->exported_wl_buffer_count && !renderer->ec)
+ e_plane_renderer_unset(plane);
}
static void
if (renderer->tqueue_width != ec->w || renderer->tqueue_height != ec->h)
{
/* recreate tqueue */
+ e_plane_renderer_clean(plane);
e_plane_renderer_surface_queue_destroy(renderer);
tqueue = e_plane_renderer_surface_queue_create(renderer, ec->w, ec->h, plane->buffer_flags);
tbm_surface_queue_remove_destroy_cb(renderer->tqueue, _e_plane_renderer_cb_surface_queue_destroy, (void *)renderer);
role = e_plane_role_get(plane);
-
- if (role == E_PLANE_ROLE_OVERLAY)
- {
- if (plane->reserved_memory)
- {
- e_plane_renderer_reserved_deactivate(renderer);
- e_plane_renderer_surface_queue_destroy(renderer);
- }
- else
- {
- e_plane_renderer_deactivate(renderer);
- }
- }
- else if (role == E_PLANE_ROLE_CURSOR)
+ if (role == E_PLANE_ROLE_CURSOR)
{
if (ec)
{
_e_plane_renderer_recover_ec(renderer);
tbm_surface_destroy(renderer->cursor_tsurface);
}
+ else
+ {
+ if (plane->reserved_memory)
+ {
+ e_plane_renderer_reserved_deactivate(renderer);
+ e_plane_renderer_surface_queue_destroy(renderer);
+ }
+ else
+ e_plane_renderer_deactivate(renderer);
+ }
if (ec)
{
_e_plane_renderer_surface_exported_surface_destroy_cb,
(void *)plane);
+ renderer->exported_wl_buffer_count++;
renderer->exported_surfaces = eina_list_append(renderer->exported_surfaces, tsurface);
renderer_buffer = _e_plane_renderer_buffer_get(renderer, tsurface);