clients/simple-dmabuf-egl: add format option

This allows to specify a custom DRM format. For instance, to test
XBGR2101010:

    weston-simple-dmabuf-egl -f 0x30334258

Signed-off-by: Simon Ser <contact@emersion.fr>
This commit is contained in:
Simon Ser 2021-02-24 11:25:30 +01:00
parent 0b61620c22
commit 8df8532ee5

View file

@ -66,7 +66,6 @@
#define OPT_MANDELBROT (1 << 2) /* render mandelbrot */
#define OPT_DIRECT_DISPLAY (1 << 3) /* direct-display */
#define BUFFER_FORMAT DRM_FORMAT_XRGB8888
#define MAX_BUFFER_PLANES 4
struct display {
@ -78,6 +77,7 @@ struct display {
struct zwp_linux_dmabuf_v1 *dmabuf;
struct weston_direct_display_v1 *direct_display;
struct zwp_linux_explicit_synchronization_v1 *explicit_sync;
uint32_t format;
uint64_t *modifiers;
int modifiers_count;
int req_dmabuf_immediate;
@ -337,7 +337,7 @@ create_dmabuf_buffer(struct display *display, struct buffer *buffer,
buffer->display = display;
buffer->width = width;
buffer->height = height;
buffer->format = BUFFER_FORMAT;
buffer->format = display->format;
buffer->release_fence_fd = -1;
#ifdef HAVE_GBM_MODIFIERS
@ -998,16 +998,12 @@ dmabuf_modifiers(void *data, struct zwp_linux_dmabuf_v1 *zwp_linux_dmabuf,
{
struct display *d = data;
switch (format) {
case BUFFER_FORMAT:
if (format == d->format) {
++d->modifiers_count;
d->modifiers = realloc(d->modifiers,
d->modifiers_count * sizeof(*d->modifiers));
d->modifiers[d->modifiers_count - 1] =
((uint64_t)modifier_hi << 32) | modifier_lo;
break;
default:
break;
}
}
@ -1270,7 +1266,7 @@ display_update_supported_modifiers_for_egl(struct display *d)
if (try_modifiers) {
ret = d->egl.query_dma_buf_modifiers(d->egl.display,
BUFFER_FORMAT,
d->format,
0, /* max_modifiers */
NULL, /* modifiers */
NULL, /* external_only */
@ -1295,7 +1291,7 @@ display_update_supported_modifiers_for_egl(struct display *d)
egl_modifiers = zalloc(num_egl_modifiers * sizeof(*egl_modifiers));
ret = d->egl.query_dma_buf_modifiers(d->egl.display,
BUFFER_FORMAT,
d->format,
num_egl_modifiers,
egl_modifiers,
NULL, /* external_only */
@ -1355,7 +1351,7 @@ display_set_up_gbm(struct display *display, char const* drm_render_node)
}
static struct display *
create_display(char const *drm_render_node, int opts)
create_display(char const *drm_render_node, uint32_t format, int opts)
{
struct display *display = NULL;
@ -1370,6 +1366,7 @@ create_display(char const *drm_render_node, int opts)
display->display = wl_display_connect(NULL);
assert(display->display);
display->format = format;
display->req_dmabuf_immediate = opts & OPT_IMMEDIATE;
display->registry = wl_display_get_registry(display->display);
@ -1384,7 +1381,8 @@ create_display(char const *drm_render_node, int opts)
wl_display_roundtrip(display->display);
if (!display->modifiers_count) {
fprintf(stderr, "format XRGB8888 is not available\n");
fprintf(stderr, "format 0x%"PRIX32" is not available\n",
display->format);
goto error;
}
@ -1450,6 +1448,8 @@ print_usage_and_exit(void)
"\t'-e,--explicit-sync=<>'"
"\n\t\t0 to disable explicit sync, "
"\n\t\t1 to enable explicit sync (default: 1)\n"
"\t'-f,--format=0x<>'"
"\n\t\tthe DRM format code to use\n"
"\t'-m,--mandelbrot'"
"\n\t\trender a mandelbrot set with multiple draw calls\n"
"\t'-g,--direct-display'"
@ -1479,6 +1479,7 @@ main(int argc, char **argv)
struct sigaction sigint;
struct display *display;
struct window *window;
uint32_t format = DRM_FORMAT_XRGB8888;
int opts = 0;
char const *drm_render_node = "/dev/dri/renderD128";
int c, option_index, ret = 0;
@ -1489,13 +1490,14 @@ main(int argc, char **argv)
{"drm-render-node", required_argument, 0, 'd' },
{"size", required_argument, 0, 's' },
{"explicit-sync", required_argument, 0, 'e' },
{"format", required_argument, 0, 'f' },
{"mandelbrot", no_argument, 0, 'm' },
{"direct-display", no_argument, 0, 'g' },
{"help", no_argument , 0, 'h' },
{0, 0, 0, 0}
};
while ((c = getopt_long(argc, argv, "hi:d:s:e:mg",
while ((c = getopt_long(argc, argv, "hi:d:s:e:f:mg",
long_options, &option_index)) != -1) {
switch (c) {
case 'i':
@ -1518,12 +1520,15 @@ main(int argc, char **argv)
case 'g':
opts |= OPT_DIRECT_DISPLAY;
break;
case 'f':
format = strtoul(optarg, NULL, 0);
break;
default:
print_usage_and_exit();
}
}
display = create_display(drm_render_node, opts);
display = create_display(drm_render_node, format, opts);
if (!display)
return 1;
window = create_window(display, window_size, window_size, opts);