Add a weston_buffer structure to replace wl_buffer
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.
Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
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 @@
}
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 @@
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 @@
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