tests: let create_shm_buffer() handle any format
authorPekka Paalanen <pekka.paalanen@collabora.co.uk>
Fri, 20 May 2016 15:30:03 +0000 (18:30 +0300)
committerPekka Paalanen <pekka.paalanen@collabora.co.uk>
Wed, 29 Jun 2016 09:41:31 +0000 (12:41 +0300)
Change create_shm_buffer() to handle any pixel format known to Pixman.
Presumably in the future we might want to test e.g. RGB565 content with
screenshot tests.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
Reviewed-by: Daniel Stone <daniels@collabora.com>
tests/weston-test-client-helper.c

index bfe9a0b..76b5cdd 100644 (file)
@@ -414,55 +414,63 @@ static const struct wl_surface_listener surface_listener = {
        surface_leave
 };
 
-static struct wl_buffer *
-create_shm_buffer(struct client *client, int width, int height, void **pixels)
+static struct buffer *
+create_shm_buffer(struct client *client, int width, int height,
+                 pixman_format_code_t format, uint32_t wlfmt)
 {
        struct wl_shm *shm = client->wl_shm;
-       int stride = width * 4;
-       int size = stride * height;
+       struct buffer *buf;
+       size_t stride_bytes;
        struct wl_shm_pool *pool;
-       struct wl_buffer *buffer;
        int fd;
        void *data;
+       size_t bytes_pp;
+
+       assert(width > 0);
+       assert(height > 0);
+
+       buf = xzalloc(sizeof *buf);
+
+       bytes_pp = PIXMAN_FORMAT_BPP(format) / 8;
+       stride_bytes = width * bytes_pp;
+       /* round up to multiple of 4 bytes for Pixman */
+       stride_bytes = (stride_bytes + 3) & ~3u;
+       assert(stride_bytes / bytes_pp >= (unsigned)width);
 
-       fd = os_create_anonymous_file(size);
+       buf->len = stride_bytes * height;
+       assert(buf->len / stride_bytes == (unsigned)height);
+
+       fd = os_create_anonymous_file(buf->len);
        assert(fd >= 0);
 
-       data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+       data = mmap(NULL, buf->len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
        if (data == MAP_FAILED) {
                close(fd);
                assert(data != MAP_FAILED);
        }
 
-       pool = wl_shm_create_pool(shm, fd, size);
-       buffer = wl_shm_pool_create_buffer(pool, 0, width, height, stride,
-                                          WL_SHM_FORMAT_ARGB8888);
+       pool = wl_shm_create_pool(shm, fd, buf->len);
+       buf->proxy = wl_shm_pool_create_buffer(pool, 0, width, height,
+                                              stride_bytes, wlfmt);
        wl_shm_pool_destroy(pool);
-
        close(fd);
 
-       if (pixels)
-               *pixels = data;
+       buf->image = pixman_image_create_bits(format, width, height,
+                                             data, stride_bytes);
+
+       assert(buf->proxy);
+       assert(buf->image);
 
-       return buffer;
+       return buf;
 }
 
 struct buffer *
 create_shm_buffer_a8r8g8b8(struct client *client, int width, int height)
 {
-       struct buffer *buf;
-       void *pixels;
-
-       buf = xzalloc(sizeof *buf);
-       buf->proxy = create_shm_buffer(client, width, height, &pixels);
-       buf->image = pixman_image_create_bits(PIXMAN_a8r8g8b8, width, height,
-                                             pixels, width * 4);
-       buf->len = width * height * 4;
-
-       assert(buf->proxy);
-       assert(buf->image);
+       assert(client->has_argb);
 
-       return buf;
+       return create_shm_buffer(client, width, height,
+                                PIXMAN_a8r8g8b8, WL_SHM_FORMAT_ARGB8888);
 }
 
 void