[PATCH] compositor: update the surface size when there is a size change without a buffer attach

Pekka Paalanen ppaalanen at gmail.com
Wed Jun 18 23:57:45 PDT 2014


On Wed, 18 Jun 2014 12:38:50 -0700
Jason Ekstrand <jason at jlekstrand.net> wrote:

> On Fri, Jun 13, 2014 at 9:14 AM, George Kiagiadakis <
> george.kiagiadakis at collabora.com> wrote:
> 
> > This fixes at least the case where you want to do
> > wl_viewport.set_destination
> > to resize the surface but without attaching new content in it.
> > ---
> >  src/compositor.c | 60
> > +++++++++++++++++++++++++++++++++++++++++++-------------
> >  src/compositor.h |  2 ++
> >  2 files changed, 48 insertions(+), 14 deletions(-)
> >
> > diff --git a/src/compositor.c b/src/compositor.c
> > index 2fbfdbf..973c7e4 100644
> > --- a/src/compositor.c
> > +++ b/src/compositor.c
> > @@ -404,6 +404,7 @@ weston_surface_create(struct weston_compositor
> > *compositor)
> >         surface->buffer_viewport.buffer.scale = 1;
> >         surface->buffer_viewport.buffer.src_width = wl_fixed_from_int(-1);
> >         surface->buffer_viewport.surface.width = -1;
> > +       surface->pending.buffer_viewport.changed = 0;
> >         surface->pending.buffer_viewport = surface->buffer_viewport;
> >         surface->output = NULL;
> >         surface->pending.newly_attached = 0;
> > @@ -1211,13 +1212,12 @@ fixed_round_up_to_int(wl_fixed_t f)
> >  }
> >
> >  static void
> > -weston_surface_set_size_from_buffer(struct weston_surface *surface)
> > +weston_surface_calculate_size_from_buffer(struct weston_surface *surface)
> >  {
> >         struct weston_buffer_viewport *vp = &surface->buffer_viewport;
> >         int32_t width, height;
> >
> >         if (!surface->buffer_ref.buffer) {
> > -               surface_set_size(surface, 0, 0);
> >                 surface->width_from_buffer = 0;
> >                 surface->height_from_buffer = 0;
> >                 return;
> > @@ -1239,14 +1239,24 @@ weston_surface_set_size_from_buffer(struct
> > weston_surface *surface)
> >
> >         surface->width_from_buffer = width;
> >         surface->height_from_buffer = height;
> > +}
> > +
> > +static void
> > +weston_surface_update_size(struct weston_surface *surface)
> > +{
> > +       struct weston_buffer_viewport *vp = &surface->buffer_viewport;
> > +       int32_t width, height;
> > +
> > +       width = surface->width_from_buffer;
> > +       height = surface->height_from_buffer;
> >
> > -       if (vp->surface.width != -1) {
> > +       if (width != 0 && vp->surface.width != -1) {
> >                 surface_set_size(surface,
> >                                  vp->surface.width, vp->surface.height);
> >                 return;
> >         }
> >
> > -       if (vp->buffer.src_width != wl_fixed_from_int(-1)) {
> > +       if (width != 0 && vp->buffer.src_width != wl_fixed_from_int(-1)) {
> >                 int32_t w = fixed_round_up_to_int(vp->buffer.src_width);
> >                 int32_t h = fixed_round_up_to_int(vp->buffer.src_height);
> >
> > @@ -1351,6 +1361,7 @@ weston_surface_reset_pending_buffer(struct
> > weston_surface *surface)
> >         surface->pending.sx = 0;
> >         surface->pending.sy = 0;
> >         surface->pending.newly_attached = 0;
> > +       surface->pending.buffer_viewport.changed = 0;
> >  }
> >
> >  struct weston_frame_callback {
> > @@ -1520,7 +1531,7 @@ weston_surface_attach(struct weston_surface *surface,
> >
> >         surface->compositor->renderer->attach(surface, buffer);
> >
> > -       weston_surface_set_size_from_buffer(surface);
> > +       weston_surface_calculate_size_from_buffer(surface);
> >  }
> >
> 
> I think we have an issue here.  If a client attaches a new buffer but does
> not commit for a while, the width/height_from_buffer and width/height will
> be out of sync.  That said, I think having surface_set_size_from_buffer
> here was wrong in the first place.  The new surface size should only take
> over after the commit.  Other than that, the patch looks fine to me.

Hmm, but weston_surface_attach() is only called from
weston_surface_commit() and weston_subsurface_commit_from_cache()...

The wl_surface.attach protocol handler is surface_attach() IIRC. Was
that a confusion?


Thanks,
pq


More information about the wayland-devel mailing list