mirror of
https://gitlab.freedesktop.org/wayland/weston.git
synced 2025-12-20 08:10:10 +01:00
tests: Ensure wl_shm format support before testing
Tests shouldn't fail on platforms lacking support for a particular format. Signed-off-by: Loïc Molinari <loic.molinari@collabora.com>
This commit is contained in:
parent
b9ae1eb4a9
commit
ad85a4a2d1
3 changed files with 43 additions and 7 deletions
|
|
@ -472,6 +472,18 @@ static const struct wl_surface_listener surface_listener = {
|
||||||
surface_leave
|
surface_leave
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool
|
||||||
|
support_shm_format(struct client *client, uint32_t shm_format)
|
||||||
|
{
|
||||||
|
uint32_t *p;
|
||||||
|
|
||||||
|
wl_array_for_each(p, &client->shm_formats)
|
||||||
|
if (*p == shm_format)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
struct buffer *
|
struct buffer *
|
||||||
create_shm_buffer(struct client *client, int width, int height,
|
create_shm_buffer(struct client *client, int width, int height,
|
||||||
uint32_t drm_format)
|
uint32_t drm_format)
|
||||||
|
|
@ -484,6 +496,7 @@ create_shm_buffer(struct client *client, int width, int height,
|
||||||
int fd;
|
int fd;
|
||||||
void *data;
|
void *data;
|
||||||
size_t bytes_pp;
|
size_t bytes_pp;
|
||||||
|
uint32_t shm_format;
|
||||||
|
|
||||||
assert(width > 0);
|
assert(width > 0);
|
||||||
assert(height > 0);
|
assert(height > 0);
|
||||||
|
|
@ -491,6 +504,10 @@ create_shm_buffer(struct client *client, int width, int height,
|
||||||
pfmt = pixel_format_get_info(drm_format);
|
pfmt = pixel_format_get_info(drm_format);
|
||||||
assert(pfmt);
|
assert(pfmt);
|
||||||
assert(pixel_format_get_plane_count(pfmt) == 1);
|
assert(pixel_format_get_plane_count(pfmt) == 1);
|
||||||
|
shm_format = pixel_format_get_shm_format(pfmt);
|
||||||
|
|
||||||
|
if (!support_shm_format(client, shm_format))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
buf = xzalloc(sizeof *buf);
|
buf = xzalloc(sizeof *buf);
|
||||||
|
|
||||||
|
|
@ -532,8 +549,6 @@ create_shm_buffer(struct client *client, int width, int height,
|
||||||
struct buffer *
|
struct buffer *
|
||||||
create_shm_buffer_a8r8g8b8(struct client *client, int width, int height)
|
create_shm_buffer_a8r8g8b8(struct client *client, int width, int height)
|
||||||
{
|
{
|
||||||
assert(client->has_argb);
|
|
||||||
|
|
||||||
return create_shm_buffer(client, width, height, DRM_FORMAT_ARGB8888);
|
return create_shm_buffer(client, width, height, DRM_FORMAT_ARGB8888);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -574,9 +589,11 @@ static void
|
||||||
shm_format(void *data, struct wl_shm *wl_shm, uint32_t format)
|
shm_format(void *data, struct wl_shm *wl_shm, uint32_t format)
|
||||||
{
|
{
|
||||||
struct client *client = data;
|
struct client *client = data;
|
||||||
|
uint32_t *p;
|
||||||
|
|
||||||
if (format == WL_SHM_FORMAT_ARGB8888)
|
p = wl_array_add(&client->shm_formats, sizeof *p);
|
||||||
client->has_argb = 1;
|
assert(p);
|
||||||
|
*p = format;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct wl_shm_listener shm_listener = {
|
struct wl_shm_listener shm_listener = {
|
||||||
|
|
@ -1014,6 +1031,7 @@ create_client(void)
|
||||||
client = xzalloc(sizeof *client);
|
client = xzalloc(sizeof *client);
|
||||||
client->wl_display = wl_display_connect(NULL);
|
client->wl_display = wl_display_connect(NULL);
|
||||||
assert(client->wl_display);
|
assert(client->wl_display);
|
||||||
|
wl_array_init(&client->shm_formats);
|
||||||
wl_list_init(&client->global_list);
|
wl_list_init(&client->global_list);
|
||||||
wl_list_init(&client->inputs);
|
wl_list_init(&client->inputs);
|
||||||
wl_list_init(&client->output_list);
|
wl_list_init(&client->output_list);
|
||||||
|
|
@ -1029,8 +1047,9 @@ create_client(void)
|
||||||
* events */
|
* events */
|
||||||
client_roundtrip(client);
|
client_roundtrip(client);
|
||||||
|
|
||||||
/* must have WL_SHM_FORMAT_ARGB32 */
|
/* must have WL_SHM_FORMAT_*RGB8888 */
|
||||||
assert(client->has_argb);
|
assert(support_shm_format(client, WL_SHM_FORMAT_ARGB8888));
|
||||||
|
assert(support_shm_format(client, WL_SHM_FORMAT_XRGB8888));
|
||||||
|
|
||||||
/* must have weston_test interface */
|
/* must have weston_test interface */
|
||||||
assert(client->test);
|
assert(client->test);
|
||||||
|
|
@ -1130,6 +1149,8 @@ client_destroy(struct client *client)
|
||||||
if (client->surface)
|
if (client->surface)
|
||||||
surface_destroy(client->surface);
|
surface_destroy(client->surface);
|
||||||
|
|
||||||
|
wl_array_release(&client->shm_formats);
|
||||||
|
|
||||||
while (!wl_list_empty(&client->inputs)) {
|
while (!wl_list_empty(&client->inputs)) {
|
||||||
input_destroy(container_of(client->inputs.next,
|
input_destroy(container_of(client->inputs.next,
|
||||||
struct input, link));
|
struct input, link));
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,7 @@ struct client {
|
||||||
struct wl_list inputs;
|
struct wl_list inputs;
|
||||||
struct output *output;
|
struct output *output;
|
||||||
struct surface *surface;
|
struct surface *surface;
|
||||||
int has_argb;
|
struct wl_array shm_formats;
|
||||||
struct wl_list global_list;
|
struct wl_list global_list;
|
||||||
struct wl_list output_list; /* struct output::link */
|
struct wl_list output_list; /* struct output::link */
|
||||||
};
|
};
|
||||||
|
|
@ -215,6 +215,9 @@ surface_set_opaque_rect(struct surface *surface, const struct rectangle *rect);
|
||||||
struct client *
|
struct client *
|
||||||
create_client_and_test_surface(int x, int y, int width, int height);
|
create_client_and_test_surface(int x, int y, int width, int height);
|
||||||
|
|
||||||
|
bool
|
||||||
|
support_shm_format(struct client *client, uint32_t shm_format);
|
||||||
|
|
||||||
struct buffer *
|
struct buffer *
|
||||||
create_shm_buffer(struct client *client, int width, int height,
|
create_shm_buffer(struct client *client, int width, int height,
|
||||||
uint32_t drm_format);
|
uint32_t drm_format);
|
||||||
|
|
|
||||||
|
|
@ -83,6 +83,11 @@ yuv_buffer_create(struct client *client,
|
||||||
struct yuv_buffer *buf;
|
struct yuv_buffer *buf;
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
|
/* wl_shm format codes match DRM format codes except argb8888 and
|
||||||
|
* xrgb8888 but we don't mind because we're testing YUV formats here. */
|
||||||
|
if (!support_shm_format(client, drm_format))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
buf = xzalloc(sizeof *buf);
|
buf = xzalloc(sizeof *buf);
|
||||||
buf->bytes = bytes;
|
buf->bytes = bytes;
|
||||||
buf->width = width;
|
buf->width = width;
|
||||||
|
|
@ -588,12 +593,19 @@ TEST_P(yuv_buffer_shm, yuv_cases)
|
||||||
client = create_client();
|
client = create_client();
|
||||||
client->surface = create_test_surface(client);
|
client->surface = create_test_surface(client);
|
||||||
buf = my_case->create_buffer(client, my_case->drm_format, img);
|
buf = my_case->create_buffer(client, my_case->drm_format, img);
|
||||||
|
if (!buf) {
|
||||||
|
testlog("%s: Skipped: format %s not supported by compositor\n",
|
||||||
|
get_test_name(), my_case->drm_format_name);
|
||||||
|
goto format_not_supported;
|
||||||
|
}
|
||||||
show_window_with_yuv(client, buf);
|
show_window_with_yuv(client, buf);
|
||||||
|
|
||||||
match = verify_screen_content(client, "yuv-buffer", 0, NULL, 0, NULL);
|
match = verify_screen_content(client, "yuv-buffer", 0, NULL, 0, NULL);
|
||||||
assert(match);
|
assert(match);
|
||||||
|
|
||||||
yuv_buffer_destroy(buf);
|
yuv_buffer_destroy(buf);
|
||||||
|
|
||||||
|
format_not_supported:
|
||||||
pixman_image_unref(img);
|
pixman_image_unref(img);
|
||||||
client_destroy(client);
|
client_destroy(client);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue