libweston: iterate paint nodes on output repaint

Iterate paint nodes instead of the global view list. Right now this does
not change behavior.

This is a step towards using per-output view lists that can then be
optimized for the output in libweston core.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
dev
Pekka Paalanen 4 years ago
parent 29cdb34019
commit 6d6b36738f
  1. 46
      libweston/compositor.c

@ -2837,7 +2837,7 @@ static int
weston_output_repaint(struct weston_output *output, void *repaint_data) weston_output_repaint(struct weston_output *output, void *repaint_data)
{ {
struct weston_compositor *ec = output->compositor; struct weston_compositor *ec = output->compositor;
struct weston_view *ev; struct weston_paint_node *pnode;
struct weston_animation *animation, *next; struct weston_animation *animation, *next;
struct weston_frame_callback *cb, *cnext; struct weston_frame_callback *cb, *cnext;
struct wl_list frame_callback_list; struct wl_list frame_callback_list;
@ -2855,18 +2855,20 @@ weston_output_repaint(struct weston_output *output, void *repaint_data)
weston_compositor_build_view_list(ec, output); weston_compositor_build_view_list(ec, output);
/* Find the highest protection desired for an output */ /* Find the highest protection desired for an output */
wl_list_for_each(ev, &ec->view_list, link) { wl_list_for_each(pnode, &output->paint_node_z_order_list,
if (ev->surface->output_mask & (1u << output->id)) { z_order_link) {
/* /* TODO: turn this into assert once z_order_list is pruned. */
* The desired_protection of the output should be the if ((pnode->surface->output_mask & (1u << output->id)) == 0)
* maximum of the desired_protection of the surfaces, continue;
* that are displayed on that output, to avoid
* reducing the protection for existing surfaces. /*
*/ * The desired_protection of the output should be the
if (ev->surface->desired_protection > highest_requested) * maximum of the desired_protection of the surfaces,
highest_requested = * that are displayed on that output, to avoid
ev->surface->desired_protection; * reducing the protection for existing surfaces.
} */
if (pnode->surface->desired_protection > highest_requested)
highest_requested = pnode->surface->desired_protection;
} }
output->desired_protection = highest_requested; output->desired_protection = highest_requested;
@ -2874,23 +2876,25 @@ weston_output_repaint(struct weston_output *output, void *repaint_data)
if (output->assign_planes && !output->disable_planes) { if (output->assign_planes && !output->disable_planes) {
output->assign_planes(output, repaint_data); output->assign_planes(output, repaint_data);
} else { } else {
wl_list_for_each(ev, &ec->view_list, link) { wl_list_for_each(pnode, &output->paint_node_z_order_list,
weston_view_move_to_plane(ev, &ec->primary_plane); z_order_link) {
ev->psf_flags = 0; weston_view_move_to_plane(pnode->view, &ec->primary_plane);
pnode->view->psf_flags = 0;
} }
} }
wl_list_init(&frame_callback_list); wl_list_init(&frame_callback_list);
wl_list_for_each(ev, &ec->view_list, link) { wl_list_for_each(pnode, &output->paint_node_z_order_list,
z_order_link) {
/* Note: This operation is safe to do multiple times on the /* Note: This operation is safe to do multiple times on the
* same surface. * same surface.
*/ */
if (ev->surface->output == output) { if (pnode->surface->output == output) {
wl_list_insert_list(&frame_callback_list, wl_list_insert_list(&frame_callback_list,
&ev->surface->frame_callback_list); &pnode->surface->frame_callback_list);
wl_list_init(&ev->surface->frame_callback_list); wl_list_init(&pnode->surface->frame_callback_list);
weston_output_take_feedback_list(output, ev->surface); weston_output_take_feedback_list(output, pnode->surface);
} }
} }

Loading…
Cancel
Save