Re: [PATCH v14 33/41] compositor-drm: Ignore views on other outputs

2018-01-26 Thread Pekka Paalanen
On Wed, 20 Dec 2017 12:26:50 +
Daniel Stone  wrote:

> When we come to assign_planes, try very hard to ignore views which are
> only visible on other outputs, rather than forcibly moving them to the
> primary plane, which causes damage all round and unnecessary repaints.
> 
> Signed-off-by: Daniel Stone 
> ---
>  libweston/compositor-drm.c | 23 +++
>  1 file changed, 15 insertions(+), 8 deletions(-)
> 
> diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
> index 049c80932..845f43e5b 100644
> --- a/libweston/compositor-drm.c
> +++ b/libweston/compositor-drm.c
> @@ -1389,10 +1389,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;
>  
> @@ -2925,10 +2921,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;
> @@ -3088,6 +3080,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. */
> @@ -3137,6 +3139,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.
>*

Ooh, nice find!

Reviewed-by: Pekka Paalanen 


Thanks,
pq


pgpmVt0i4x8xw.pgp
Description: OpenPGP digital signature
___
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel


[PATCH v14 33/41] compositor-drm: Ignore views on other outputs

2017-12-20 Thread Daniel Stone
When we come to assign_planes, try very hard to ignore views which are
only visible on other outputs, rather than forcibly moving them to the
primary plane, which causes damage all round and unnecessary repaints.

Signed-off-by: Daniel Stone 
---
 libweston/compositor-drm.c | 23 +++
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
index 049c80932..845f43e5b 100644
--- a/libweston/compositor-drm.c
+++ b/libweston/compositor-drm.c
@@ -1389,10 +1389,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;
 
@@ -2925,10 +2921,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;
@@ -3088,6 +3080,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. */
@@ -3137,6 +3139,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.
 *
-- 
2.14.3

___
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel