[PATCH] Add a weston_buffer structure to replace wl_buffer

Jason Ekstrand jason at jlekstrand.net
Thu Jun 20 18:29:46 PDT 2013


NEGLECT THIS PATCH

New one to come


On Thu, Jun 20, 2013 at 8:16 PM, Jason Ekstrand <jason at jlekstrand.net>wrote:

> This commit adds a weston_buffer structure to replace wl_buffer.  This way
> we can hold onto buffers by just their resource.  In order to do this, the
> every renderer.attach function has to fill in the weston_buffer.width and
> weston_buffer.height fields.
> ---
>
> NOTE: While this patch touches compositor-drm and rpi-renderer, I have NOT
> tested this patch on DRM/KMS or on the Rhaspbery Pi.  This is because I do
> not own a Rhaspbery Pi and my laptop is refusing to do DRM/KMS right now
> for some unknown reason.
>
>  src/compositor-drm.c  | 14 ++++++-------
>  src/compositor.c      | 57
> ++++++++++++++++++++++++++++++++++++++++++---------
>  src/compositor.h      | 25 ++++++++++++++++++----
>  src/gl-renderer.c     | 29 ++++++++++++++++----------
>  src/noop-renderer.c   |  2 +-
>  src/pixman-renderer.c | 21 ++++++++++++-------
>  src/rpi-renderer.c    | 30 ++++++++++++++++-----------
>  src/screenshooter.c   | 15 +++++++++-----
>  8 files changed, 136 insertions(+), 57 deletions(-)
>
> diff --git a/src/compositor-drm.c b/src/compositor-drm.c
> index 8787723..5e5c51c 100644
> --- a/src/compositor-drm.c
> +++ b/src/compositor-drm.c
> @@ -371,7 +371,7 @@ err_free:
>  }
>
>  static void
> -drm_fb_set_buffer(struct drm_fb *fb, struct wl_buffer *buffer)
> +drm_fb_set_buffer(struct drm_fb *fb, struct weston_buffer *buffer)
>  {
>         assert(fb->buffer_ref.buffer == NULL);
>
> @@ -437,7 +437,7 @@ drm_output_prepare_scanout_surface(struct
> weston_output *_output,
>         struct drm_output *output = (struct drm_output *) _output;
>         struct drm_compositor *c =
>                 (struct drm_compositor *) output->base.compositor;
> -       struct wl_buffer *buffer = es->buffer_ref.buffer;
> +       struct weston_buffer *buffer = es->buffer_ref.buffer;
>         struct gbm_bo *bo;
>         uint32_t format;
>
> @@ -791,7 +791,7 @@ drm_output_prepare_overlay_surface(struct
> weston_output *output_base,
>         if (es->alpha != 1.0f)
>                 return NULL;
>
> -       if (wl_buffer_is_shm(es->buffer_ref.buffer))
> +       if (wl_shm_buffer_get(es->buffer_ref.buffer->resource))
>                 return NULL;
>
>         if (!drm_surface_transform_supported(es))
> @@ -915,7 +915,7 @@ drm_output_prepare_cursor_surface(struct weston_output
> *output_base,
>         if (c->cursors_are_broken)
>                 return NULL;
>         if (es->buffer_ref.buffer == NULL ||
> -           !wl_buffer_is_shm(es->buffer_ref.buffer) ||
> +           !wl_shm_buffer_get(es->buffer_ref.buffer->resource) ||
>             es->geometry.width > 64 || es->geometry.height > 64)
>                 return NULL;
>
> @@ -949,8 +949,8 @@ drm_output_set_cursor(struct drm_output *output)
>                 output->current_cursor ^= 1;
>                 bo = output->cursor_bo[output->current_cursor];
>                 memset(buf, 0, sizeof buf);
> -               stride = wl_shm_buffer_get_stride(es->buffer_ref.buffer);
> -               s = wl_shm_buffer_get_data(es->buffer_ref.buffer);
> +               stride =
> wl_shm_buffer_get_stride(es->buffer_ref.buffer->shm_buffer);
> +               s =
> wl_shm_buffer_get_data(es->buffer_ref.buffer->shm_buffer);
>                 for (i = 0; i < es->geometry.height; i++)
>                         memcpy(buf + i * 64, s + i * stride,
>                                es->geometry.width * 4);
> @@ -1008,7 +1008,7 @@ drm_assign_planes(struct weston_output *output)
>                  * non-shm, or small enough to be a cursor
>                  */
>                 if ((es->buffer_ref.buffer &&
> -                    !wl_buffer_is_shm(es->buffer_ref.buffer)) ||
> +                    !wl_shm_buffer_get(es->buffer_ref.buffer->resource))
> ||
>                     (es->geometry.width <= 64 && es->geometry.height <=
> 64))
>                         es->keep_buffer = 1;
>                 else
> diff --git a/src/compositor.c b/src/compositor.c
> index 5c82413..af273b9 100644
> --- a/src/compositor.c
> +++ b/src/compositor.c
> @@ -1053,6 +1053,42 @@ destroy_surface(struct wl_resource *resource)
>  }
>
>  static void
> +weston_buffer_destroy_handler(struct wl_listener *listener, void *data)
> +{
> +       struct weston_buffer *buffer =
> +               container_of(listener, struct weston_buffer,
> destroy_listener);
> +
> +       wl_signal_emit(&buffer->destroy_signal, buffer);
> +       free(buffer);
> +}
> +
> +struct weston_buffer *
> +weston_buffer_from_resource(struct wl_resource *resource)
> +{
> +       struct weston_buffer *buffer;
> +       struct wl_listener *listener;
> +
> +       listener = wl_resource_get_destroy_listener(resource,
> +
> weston_buffer_destroy_handler);
> +
> +       if (listener) {
> +               buffer = container_of(listener, struct weston_buffer,
> +                                     destroy_listener);
> +       } else {
> +               buffer = malloc(sizeof *buffer);
> +               memset(buffer, 0, sizeof *buffer);
> +
> +               buffer->resource = resource;
> +               wl_signal_init(&buffer->destroy_signal);
> +               buffer->destroy_listener.notify =
> weston_buffer_destroy_handler;
> +               wl_resource_add_destroy_listener(resource,
> +
>  &buffer->destroy_listener);
> +       }
> +
> +       return buffer;
> +}
> +
> +static void
>  weston_buffer_reference_handle_destroy(struct wl_listener *listener,
>                                        void *data)
>  {
> @@ -1060,19 +1096,19 @@ weston_buffer_reference_handle_destroy(struct
> wl_listener *listener,
>                 container_of(listener, struct weston_buffer_reference,
>                              destroy_listener);
>
> -       assert((struct wl_buffer *)data == ref->buffer);
> +       assert((struct weston_buffer *)data == ref->buffer);
>         ref->buffer = NULL;
>  }
>
>  WL_EXPORT void
>  weston_buffer_reference(struct weston_buffer_reference *ref,
> -                       struct wl_buffer *buffer)
> +                       struct weston_buffer *buffer)
>  {
>         if (ref->buffer && buffer != ref->buffer) {
>                 ref->buffer->busy_count--;
>                 if (ref->buffer->busy_count == 0) {
> -                       assert(ref->buffer->resource.client != NULL);
> -                       wl_resource_queue_event(&ref->buffer->resource,
> +
> assert(wl_resource_get_client(ref->buffer->resource));
> +                       wl_resource_queue_event(ref->buffer->resource,
>                                                 WL_BUFFER_RELEASE);
>                 }
>                 wl_list_remove(&ref->destroy_listener.link);
> @@ -1080,7 +1116,7 @@ weston_buffer_reference(struct
> weston_buffer_reference *ref,
>
>         if (buffer && buffer != ref->buffer) {
>                 buffer->busy_count++;
> -               wl_signal_add(&buffer->resource.destroy_signal,
> +               wl_signal_add(&buffer->destroy_signal,
>                               &ref->destroy_listener);
>         }
>
> @@ -1089,7 +1125,8 @@ weston_buffer_reference(struct
> weston_buffer_reference *ref,
>  }
>
>  static void
> -weston_surface_attach(struct weston_surface *surface, struct wl_buffer
> *buffer)
> +weston_surface_attach(struct weston_surface *surface,
> +                     struct weston_buffer *buffer)
>  {
>         weston_buffer_reference(&surface->buffer_ref, buffer);
>
> @@ -1135,7 +1172,7 @@ surface_accumulate_damage(struct weston_surface
> *surface,
>                           pixman_region32_t *opaque)
>  {
>         if (surface->buffer_ref.buffer &&
> -           wl_buffer_is_shm(surface->buffer_ref.buffer))
> +           wl_shm_buffer_get(surface->buffer_ref.buffer->resource))
>                 surface->compositor->renderer->flush_damage(surface);
>
>         if (surface->transform.enabled) {
> @@ -1398,10 +1435,10 @@ surface_attach(struct wl_client *client,
>                struct wl_resource *buffer_resource, int32_t sx, int32_t sy)
>  {
>         struct weston_surface *surface =
> wl_resource_get_user_data(resource);
> -       struct wl_buffer *buffer = NULL;
> +       struct weston_buffer *buffer = NULL;
>
>         if (buffer_resource)
> -               buffer = buffer_resource->data;
> +               buffer = weston_buffer_from_resource(buffer_resource);
>
>         /* Attach, attach, without commit in between does not send
>          * wl_buffer.release. */
> @@ -1413,7 +1450,7 @@ surface_attach(struct wl_client *client,
>         surface->pending.buffer = buffer;
>         surface->pending.newly_attached = 1;
>         if (buffer) {
> -               wl_signal_add(&buffer->resource.destroy_signal,
> +               wl_signal_add(&buffer->destroy_signal,
>                               &surface->pending.buffer_destroy_listener);
>         }
>  }
> diff --git a/src/compositor.h b/src/compositor.h
> index 774fb96..a419d4f 100644
> --- a/src/compositor.h
> +++ b/src/compositor.h
> @@ -48,6 +48,7 @@ struct weston_transform {
>  };
>
>  struct weston_surface;
> +struct weston_buffer;
>  struct shell_surface;
>  struct weston_seat;
>  struct weston_output;
> @@ -488,7 +489,7 @@ struct weston_renderer {
>         void (*repaint_output)(struct weston_output *output,
>                                pixman_region32_t *output_damage);
>         void (*flush_damage)(struct weston_surface *surface);
> -       void (*attach)(struct weston_surface *es, struct wl_buffer
> *buffer);
> +       void (*attach)(struct weston_surface *es, struct weston_buffer
> *buffer);
>         int (*create_surface)(struct weston_surface *surface);
>         void (*surface_set_color)(struct weston_surface *surface,
>                                float red, float green,
> @@ -573,8 +574,21 @@ struct weston_compositor {
>         struct weston_xkb_info xkb_info;
>  };
>
> +struct weston_buffer {
> +       struct wl_resource *resource;
> +       struct wl_signal destroy_signal;
> +       struct wl_listener destroy_listener;
> +
> +       union {
> +               struct wl_shm_buffer *shm_buffer;
> +               struct wl_buffer *legacy_buffer;
> +       };
> +       int32_t width, height;
> +       uint32_t busy_count;
> +};
> +
>  struct weston_buffer_reference {
> -       struct wl_buffer *buffer;
> +       struct weston_buffer *buffer;
>         struct wl_listener destroy_listener;
>  };
>
> @@ -739,7 +753,7 @@ struct weston_surface {
>         struct {
>                 /* wl_surface.attach */
>                 int newly_attached;
> -               struct wl_buffer *buffer;
> +               struct weston_buffer *buffer;
>                 struct wl_listener buffer_destroy_listener;
>                 int32_t sx;
>                 int32_t sy;
> @@ -1016,9 +1030,12 @@ weston_surface_unmap(struct weston_surface
> *surface);
>  struct weston_surface *
>  weston_surface_get_main_surface(struct weston_surface *surface);
>
> +struct weston_buffer *
> +weston_buffer_from_resource(struct wl_resource *resource);
> +
>  void
>  weston_buffer_reference(struct weston_buffer_reference *ref,
> -                       struct wl_buffer *buffer);
> +                       struct weston_buffer *buffer);
>
>  uint32_t
>  weston_compositor_get_time(void);
> diff --git a/src/gl-renderer.c b/src/gl-renderer.c
> index 7d27a97..6b88d6a 100644
> --- a/src/gl-renderer.c
> +++ b/src/gl-renderer.c
> @@ -1100,7 +1100,7 @@ gl_renderer_flush_damage(struct weston_surface
> *surface)
>  {
>         struct gl_renderer *gr = get_renderer(surface->compositor);
>         struct gl_surface_state *gs = get_surface_state(surface);
> -       struct wl_buffer *buffer = gs->buffer_ref.buffer;
> +       struct weston_buffer *buffer = gs->buffer_ref.buffer;
>
>  #ifdef GL_UNPACK_ROW_LENGTH
>         pixman_box32_t *rectangles;
> @@ -1131,7 +1131,7 @@ gl_renderer_flush_damage(struct weston_surface
> *surface)
>                 glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT,
>                              gs->pitch, buffer->height, 0,
>                              GL_BGRA_EXT, GL_UNSIGNED_BYTE,
> -                            wl_shm_buffer_get_data(buffer));
> +                            wl_shm_buffer_get_data(buffer->shm_buffer));
>
>                 goto done;
>         }
> @@ -1139,7 +1139,7 @@ gl_renderer_flush_damage(struct weston_surface
> *surface)
>  #ifdef GL_UNPACK_ROW_LENGTH
>         /* Mesa does not define GL_EXT_unpack_subimage */
>         glPixelStorei(GL_UNPACK_ROW_LENGTH, gs->pitch);
> -       data = wl_shm_buffer_get_data(buffer);
> +       data = wl_shm_buffer_get_data(buffer->shm_buffer);
>         rectangles = pixman_region32_rectangles(&gs->texture_damage, &n);
>         for (i = 0; i < n; i++) {
>                 pixman_box32_t r;
> @@ -1182,11 +1182,12 @@ ensure_textures(struct gl_surface_state *gs, int
> num_textures)
>  }
>
>  static void
> -gl_renderer_attach(struct weston_surface *es, struct wl_buffer *buffer)
> +gl_renderer_attach(struct weston_surface *es, struct weston_buffer
> *buffer)
>  {
>         struct weston_compositor *ec = es->compositor;
>         struct gl_renderer *gr = get_renderer(ec);
>         struct gl_surface_state *gs = get_surface_state(es);
> +       struct wl_shm_buffer *shm_buffer;
>         EGLint attribs[3], format;
>         int i, num_planes;
>
> @@ -1203,16 +1204,21 @@ gl_renderer_attach(struct weston_surface *es,
> struct wl_buffer *buffer)
>                 return;
>         }
>
> -       if (wl_buffer_is_shm(buffer)) {
> +       shm_buffer = wl_shm_buffer_get(buffer->resource);
> +       if (shm_buffer) {
> +               buffer->shm_buffer = shm_buffer;
> +               buffer->width = wl_shm_buffer_get_width(shm_buffer);
> +               buffer->height = wl_shm_buffer_get_height(shm_buffer);
> +
>                 /* Only allocate a texture if it doesn't match existing
> one.
>                  * If gs->num_images is not 0, then a switch from DRM
> allocated
>                  * buffer to a SHM buffer is happening, and we need to
> allocate
>                  * a new texture buffer. */
> -               if (wl_shm_buffer_get_stride(buffer) / 4 != gs->pitch ||
> -                   wl_shm_buffer_get_height(buffer) != gs->height ||
> +               if (wl_shm_buffer_get_stride(shm_buffer) / 4 != gs->pitch
> ||
> +                   buffer->height != gs->height ||
>                     gs->num_images > 0) {
> -                       gs->pitch = wl_shm_buffer_get_stride(buffer) / 4;
> -                       gs->height = wl_shm_buffer_get_height(buffer);
> +                       gs->pitch =  wl_shm_buffer_get_stride(shm_buffer)
> / 4;
> +                       gs->height = buffer->height;
>                         gs->target = GL_TEXTURE_2D;
>
>                         ensure_textures(gs, 1);
> @@ -1227,11 +1233,12 @@ gl_renderer_attach(struct weston_surface *es,
> struct wl_buffer *buffer)
>                                                    gs->height /
> es->buffer_scale);
>                 }
>
> -               if (wl_shm_buffer_get_format(buffer) ==
> WL_SHM_FORMAT_XRGB8888)
> +               if (wl_shm_buffer_get_format(shm_buffer) ==
> WL_SHM_FORMAT_XRGB8888)
>                         gs->shader = &gr->texture_shader_rgbx;
>                 else
>                         gs->shader = &gr->texture_shader_rgba;
> -       } else if (gr->query_buffer(gr->egl_display, buffer,
> +       } else if (gr->query_buffer(gr->egl_display,
> +                                   (struct wl_buffer *)buffer->resource,
>                                     EGL_TEXTURE_FORMAT, &format)) {
>                 for (i = 0; i < gs->num_images; i++)
>                         gr->destroy_image(gr->egl_display, gs->images[i]);
> diff --git a/src/noop-renderer.c b/src/noop-renderer.c
> index c0765f2..91659f5 100644
> --- a/src/noop-renderer.c
> +++ b/src/noop-renderer.c
> @@ -47,7 +47,7 @@ noop_renderer_flush_damage(struct weston_surface
> *surface)
>  }
>
>  static void
> -noop_renderer_attach(struct weston_surface *es, struct wl_buffer *buffer)
> +noop_renderer_attach(struct weston_surface *es, struct weston_buffer
> *buffer)
>  {
>  }
>
> diff --git a/src/pixman-renderer.c b/src/pixman-renderer.c
> index 0bae1a4..25bffbe 100644
> --- a/src/pixman-renderer.c
> +++ b/src/pixman-renderer.c
> @@ -529,9 +529,10 @@ pixman_renderer_flush_damage(struct weston_surface
> *surface)
>  }
>
>  static void
> -pixman_renderer_attach(struct weston_surface *es, struct wl_buffer
> *buffer)
> +pixman_renderer_attach(struct weston_surface *es, struct weston_buffer
> *buffer)
>  {
>         struct pixman_surface_state *ps = get_surface_state(es);
> +       struct wl_shm_buffer *shm_buffer;
>         pixman_format_code_t pixman_format;
>
>         weston_buffer_reference(&ps->buffer_ref, buffer);
> @@ -543,14 +544,16 @@ pixman_renderer_attach(struct weston_surface *es,
> struct wl_buffer *buffer)
>
>         if (!buffer)
>                 return;
> +
> +       shm_buffer = wl_shm_buffer_get(buffer->resource);
>
> -       if (!wl_buffer_is_shm(buffer)) {
> +       if (! shm_buffer) {
>                 weston_log("Pixman renderer supports only SHM buffers\n");
>                 weston_buffer_reference(&ps->buffer_ref, NULL);
>                 return;
>         }
>
> -       switch (wl_shm_buffer_get_format(buffer)) {
> +       switch (wl_shm_buffer_get_format(shm_buffer)) {
>         case WL_SHM_FORMAT_XRGB8888:
>                 pixman_format = PIXMAN_x8r8g8b8;
>                 break;
> @@ -563,11 +566,15 @@ pixman_renderer_attach(struct weston_surface *es,
> struct wl_buffer *buffer)
>                 return;
>         break;
>         }
> +
> +       buffer->shm_buffer = shm_buffer;
> +       buffer->width = wl_shm_buffer_get_width(shm_buffer);
> +       buffer->height = wl_shm_buffer_get_height(shm_buffer);
> +
>         ps->image = pixman_image_create_bits(pixman_format,
> -               wl_shm_buffer_get_width(buffer),
> -               wl_shm_buffer_get_height(buffer),
> -               wl_shm_buffer_get_data(buffer),
> -               wl_shm_buffer_get_stride(buffer));
> +               buffer->width, buffer->height,
> +               wl_shm_buffer_get_data(shm_buffer),
> +               wl_shm_buffer_get_stride(shm_buffer));
>  }
>
>  static int
> diff --git a/src/rpi-renderer.c b/src/rpi-renderer.c
> index c361185..919ecc5 100644
> --- a/src/rpi-renderer.c
> +++ b/src/rpi-renderer.c
> @@ -226,7 +226,7 @@ rpi_resource_realloc(struct rpi_resource *resource,
> VC_IMAGE_TYPE_T ifmt,
>  #define PREMULT_ALPHA_FLAG (1 << 31)
>
>  static VC_IMAGE_TYPE_T
> -shm_buffer_get_vc_format(struct wl_buffer *buffer)
> +shm_buffer_get_vc_format(struct wl_shm_buffer *buffer)
>  {
>         switch (wl_shm_buffer_get_format(buffer)) {
>         case WL_SHM_FORMAT_XRGB8888:
> @@ -240,7 +240,7 @@ shm_buffer_get_vc_format(struct wl_buffer *buffer)
>  }
>
>  static int
> -rpi_resource_update(struct rpi_resource *resource, struct wl_buffer
> *buffer,
> +rpi_resource_update(struct rpi_resource *resource, struct weston_buffer
> *buffer,
>                     pixman_region32_t *region)
>  {
>         pixman_region32_t write_region;
> @@ -259,11 +259,11 @@ rpi_resource_update(struct rpi_resource *resource,
> struct wl_buffer *buffer,
>         if (!buffer)
>                 return -1;
>
> -       ifmt = shm_buffer_get_vc_format(buffer);
> -       width = wl_shm_buffer_get_width(buffer);
> -       height = wl_shm_buffer_get_height(buffer);
> -       stride = wl_shm_buffer_get_stride(buffer);
> -       pixels = wl_shm_buffer_get_data(buffer);
> +       ifmt = shm_buffer_get_vc_format(buffer->shm_buffer);
> +       width = wl_shm_buffer_get_width(buffer->shm_buffer);
> +       height = wl_shm_buffer_get_height(buffer->shm_buffer);
> +       stride = wl_shm_buffer_get_stride(buffer->shm_buffer);
> +       pixels = wl_shm_buffer_get_data(buffer->shm_buffer);
>
>         ret = rpi_resource_realloc(resource, ifmt & ~PREMULT_ALPHA_FLAG,
>                                    width, height, stride, height);
> @@ -356,7 +356,7 @@ rpir_surface_destroy(struct rpir_surface *surface)
>  }
>
>  static int
> -rpir_surface_damage(struct rpir_surface *surface, struct wl_buffer
> *buffer,
> +rpir_surface_damage(struct rpir_surface *surface, struct weston_buffer
> *buffer,
>                     pixman_region32_t *damage)
>  {
>         pixman_region32_t upload;
> @@ -1113,11 +1113,11 @@ rpi_renderer_flush_damage(struct weston_surface
> *base)
>          * having an shm buffer.
>          */
>         struct rpir_surface *surface = to_rpir_surface(base);
> -       struct wl_buffer *buffer = surface->buffer_ref.buffer;
> +       struct weston_buffer *buffer = surface->buffer_ref.buffer;
>         int ret;
>
>         assert(buffer);
> -       assert(wl_buffer_is_shm(buffer));
> +       assert(wl_shm_buffer_get(buffer->resource));
>
>         ret = rpir_surface_damage(surface, buffer, &base->damage);
>         if (ret)
> @@ -1128,7 +1128,7 @@ rpi_renderer_flush_damage(struct weston_surface
> *base)
>  }
>
>  static void
> -rpi_renderer_attach(struct weston_surface *base, struct wl_buffer *buffer)
> +rpi_renderer_attach(struct weston_surface *base, struct weston_buffer
> *buffer)
>  {
>         /* Called every time a client commits an attach. */
>         static int warned;
> @@ -1138,12 +1138,18 @@ rpi_renderer_attach(struct weston_surface *base,
> struct wl_buffer *buffer)
>         if (!surface)
>                 return;
>
> -       if (buffer && !wl_buffer_is_shm(buffer) && !warned) {
> +       if (buffer && !wl_shm_buffer_get(buffer->resource) && !warned) {
>                 weston_log("Error: non-wl_shm buffers not supported.\n");
>                 warned = 1;
>                 return;
>         }
>
> +       if (wl_shm_buffer_get(buffer->resource)) {
> +               buffer->shm_buffer = wl_shm_buffer_get(buffer->resource);
> +               buffer->width =
> wl_shm_buffer_get_width(buffer->shm_buffer);
> +               buffer->height =
> wl_shm_buffer_get_height(buffer->shm_buffer);
> +       }
> +
>         weston_buffer_reference(&surface->buffer_ref, buffer);
>
>         /* XXX: need to check if in middle of update
> diff --git a/src/screenshooter.c b/src/screenshooter.c
> index 1fdfc9a..be2e34f 100644
> --- a/src/screenshooter.c
> +++ b/src/screenshooter.c
> @@ -46,7 +46,7 @@ struct screenshooter {
>
>  struct screenshooter_frame_listener {
>         struct wl_listener listener;
> -       struct wl_buffer *buffer;
> +       struct weston_buffer *buffer;
>         struct wl_resource *resource;
>  };
>
> @@ -140,9 +140,9 @@ screenshooter_frame_notify(struct wl_listener
> *listener, void *data)
>                              0, 0, output->current->width,
>                              output->current->height);
>
> -       stride = wl_shm_buffer_get_stride(l->buffer);
> +       stride = wl_shm_buffer_get_stride(l->buffer->shm_buffer);
>
> -       d = wl_shm_buffer_get_data(l->buffer);
> +       d = wl_shm_buffer_get_data(l->buffer->shm_buffer);
>         s = pixels + stride * (l->buffer->height - 1);
>
>         switch (compositor->read_format) {
> @@ -178,10 +178,15 @@ screenshooter_shoot(struct wl_client *client,
>         struct weston_output *output =
>                 wl_resource_get_user_data(output_resource);
>         struct screenshooter_frame_listener *l;
> -       struct wl_buffer *buffer = buffer_resource->data;
> +       struct weston_buffer *buffer =
> +               weston_buffer_from_resource(buffer_resource);
>
> -       if (!wl_buffer_is_shm(buffer))
> +       if (!wl_shm_buffer_get(buffer->resource))
>                 return;
> +
> +       buffer->shm_buffer = wl_shm_buffer_get(buffer->resource);
> +       buffer->width = wl_shm_buffer_get_width(buffer->shm_buffer);
> +       buffer->height = wl_shm_buffer_get_height(buffer->shm_buffer);
>
>         if (buffer->width < output->current->width ||
>             buffer->height < output->current->height)
> --
> 1.8.1.4
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/wayland-devel/attachments/20130620/c8e271c1/attachment-0001.html>


More information about the wayland-devel mailing list