clients/simple-dmabuf-feedback: Add fallback print method for unknown formats

Using `pixel_format_get_info()` can result in formats being
reported as `UNKNOWN` when used on compositors other than Weston.

As `weston-simple-dmabuf-feedback` somewhat succeeds `wayland-info`
as tool for `zwp_linux_dmabuf_v1` debugging from version 4 on, copy
the approach from the later for these cases.

Signed-off-by: Robert Mader <robert.mader@collabora.com>
This commit is contained in:
Robert Mader 2022-02-16 00:23:53 +01:00
parent f81aacdf2f
commit 2669853562
1 changed files with 39 additions and 2 deletions

View File

@ -26,6 +26,7 @@
#include "config.h"
#include <assert.h>
#include <ctype.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
@ -1050,18 +1051,54 @@ dmabuf_feedback_tranche_formats(void *data,
}
}
static char
bits2graph(uint32_t value, unsigned bitoffset)
{
int c = (value >> bitoffset) & 0xff;
if (isgraph(c) || isspace(c))
return c;
return '?';
}
static void
fourcc2str(uint32_t format, char *str, int len)
{
int i;
assert(len >= 5);
for (i = 0; i < 4; i++)
str[i] = bits2graph(format, i * 8);
str[i] = '\0';
}
static void
print_tranche_format_modifier(uint32_t format, uint64_t modifier)
{
const struct pixel_format_info *fmt_info;
char *format_str;
char *mod_name;
int len;
fmt_info = pixel_format_get_info(format);
mod_name = pixel_format_get_modifier(modifier);
fmt_info = pixel_format_get_info(format);
if (fmt_info) {
len = asprintf(&format_str, "%s", fmt_info->drm_format_name);
} else {
char fourcc_str[5];
fourcc2str(format, fourcc_str, sizeof(fourcc_str));
len = asprintf(&format_str, "0x%08x (%s)", format, fourcc_str);
}
assert(len > 0);
fprintf(stderr, "│ ├────────tranche format/modifier pair - format %s, modifier %s\n",
fmt_info ? fmt_info->drm_format_name : "UNKNOWN", mod_name);
format_str, mod_name);
free(format_str);
free(mod_name);
}