diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c index 6ce7515b..a5c84dcb 100644 --- a/libweston/compositor-drm.c +++ b/libweston/compositor-drm.c @@ -1562,10 +1562,6 @@ drm_fb_get_from_view(struct drm_output_state *state, struct weston_view *ev) struct linux_dmabuf_buffer *dmabuf; struct drm_fb *fb; - /* Don't import buffers which span multiple outputs. */ - if (ev->output_mask != (1u << output->base.id)) - return NULL; - if (ev->alpha != 1.0f) return NULL; @@ -3135,10 +3131,6 @@ drm_output_prepare_cursor_view(struct drm_output_state *output_state, if (plane->state_cur->output && plane->state_cur->output != output) return NULL; - /* Don't import buffers which span multiple outputs. */ - if (ev->output_mask != (1u << output->base.id)) - return NULL; - /* We use GBM to import SHM buffers. */ if (b->gbm == NULL) return NULL; @@ -3296,6 +3288,16 @@ drm_output_propose_state(struct weston_output *output_base, wl_list_for_each(ev, &output_base->compositor->view_list, link) { struct weston_plane *next_plane = NULL; + /* If this view doesn't touch our output at all, there's no + * reason to do anything with it. */ + if (!(ev->output_mask & (1u << output->base.id))) + continue; + + /* We only assign planes to views which are exclusively present + * on our output. */ + if (ev->output_mask != (1u << output->base.id)) + next_plane = primary; + /* Since we process views from top to bottom, we know that if * the view intersects the calculated renderer region, it must * be part of, or occluded by, it, and cannot go on a plane. */ @@ -3345,6 +3347,11 @@ drm_assign_planes(struct weston_output *output_base, void *repaint_data) wl_list_for_each(ev, &output_base->compositor->view_list, link) { struct drm_plane *target_plane = NULL; + /* If this view doesn't touch our output at all, there's no + * reason to do anything with it. */ + if (!(ev->output_mask & (1u << output->base.id))) + continue; + /* Test whether this buffer can ever go into a plane: * non-shm, or small enough to be a cursor. *