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