Merge branch 'kdfs' into 'master'

render/pixel_format: generate tables via kdfs

See merge request wlroots/wlroots!5271
This commit is contained in:
Simon Ser 2026-04-12 11:38:37 +00:00
commit 5d859d09be
7 changed files with 716 additions and 310 deletions

View file

@ -163,11 +163,10 @@ static struct wlr_drm_fb *drm_fb_create(struct wlr_drm_backend *drm,
attribs.modifier)) {
// The format isn't supported by the plane. Try stripping the alpha
// channel, if any.
const struct wlr_pixel_format_info *info =
drm_get_pixel_format_info(attribs.format);
if (info != NULL && info->opaque_substitute != DRM_FORMAT_INVALID &&
wlr_drm_format_set_has(formats, info->opaque_substitute, attribs.modifier)) {
attribs.format = info->opaque_substitute;
uint32_t opaque_substitute = pixel_format_get_opaque_substitute(attribs.format);
if (opaque_substitute != DRM_FORMAT_INVALID &&
wlr_drm_format_set_has(formats, opaque_substitute, attribs.modifier)) {
attribs.format = opaque_substitute;
} else {
wlr_log(WLR_DEBUG, "Buffer format 0x%"PRIX32" with modifier "
"0x%"PRIX64" cannot be scanned out",

View file

@ -157,11 +157,8 @@ bool drm_plane_pick_render_format(struct wlr_drm_plane *plane,
uint32_t format = DRM_FORMAT_ARGB8888;
if (!wlr_drm_format_set_get(&plane->formats, format)) {
const struct wlr_pixel_format_info *format_info =
drm_get_pixel_format_info(format);
assert(format_info != NULL &&
format_info->opaque_substitute != DRM_FORMAT_INVALID);
format = format_info->opaque_substitute;
format = pixel_format_get_opaque_substitute(format);
assert(format != DRM_FORMAT_INVALID);
}
const struct wlr_drm_format *render_format =

View file

@ -18,17 +18,15 @@
struct wlr_pixel_format_info {
uint32_t drm_format;
/* Equivalent of the format if it has an alpha channel,
* DRM_FORMAT_INVALID (0) if NA
*/
uint32_t opaque_substitute;
/* Bytes per block (including padding) */
uint32_t bytes_per_block;
/* Size of a block in pixels (zero for 1×1) */
/* Size of a block in pixels */
uint32_t block_width, block_height;
};
extern const struct wlr_pixel_format_info pixel_format_info[];
extern const size_t pixel_format_info_len;
/**
* Get pixel format information from a DRM FourCC.
*
@ -58,6 +56,8 @@ uint32_t convert_wl_shm_format_to_drm(enum wl_shm_format fmt);
*/
enum wl_shm_format convert_drm_format_to_wl_shm(uint32_t fmt);
bool pixel_format_is_opaque(uint32_t fmt);
/**
* Return true if the DRM FourCC fmt has an alpha channel, false otherwise.
*/
@ -68,4 +68,10 @@ bool pixel_format_has_alpha(uint32_t fmt);
*/
bool pixel_format_is_ycbcr(uint32_t fmt);
/**
* Get the equivalent opaque variant of a format if it has an alpha channel,
* DRM_FORMAT_INVALID otherwise.
*/
uint32_t pixel_format_get_opaque_substitute(uint32_t fmt);
#endif

87
render/gen_pixel_format.sh Executable file
View file

@ -0,0 +1,87 @@
#!/bin/sh -eu
#
# usage: gen_pixel_format.sh pixel_format_table.c
KDFS=${KDFS:-kdfs}
output_file="$1"
gen_info() {
"$KDFS" show --json 'DRM_FORMAT_*' | jq -r '
to_entries[]
| select((.value.bytes_plane | length) == 1)
|
" {\n" +
" .drm_format = \(.key),\n" +
" .bytes_per_block = \(.value.bytes_plane[0]),\n" +
" .block_width = \(.value.texel_block_dimension[0]),\n" +
" .block_height = \(.value.texel_block_dimension[1]),\n" +
" },"
'
}
gen_opaque() {
"$KDFS" show --json 'DRM_FORMAT_*' | jq -r '
to_entries[]
| select(any(.value.sample_info[]; .channel == "a") | not)
| " case \(.key):"
'
}
gen_opaque_substitute() {
"$KDFS" compat --json --with 'DRM_FORMAT_*' --filter-channel=a --strip-channel=a 'DRM_FORMAT_*' | jq -r '
to_entries[]
| select((.value | to_entries[] | select(.value.little_endian and .value.big_endian) | length) > 0)
| (.key as $format | .value | to_entries[] | { format: $format, opaque_substitute: .key })
|
" case \(.format):\n" +
" return \(.opaque_substitute);"
'
}
gen_ycbcr() {
"$KDFS" show --json 'DRM_FORMAT_*' | jq -r '
to_entries[]
| select(.value.color_model == "yuvsda")
| " case \(.key):"
'
}
cat >"$output_file" << EOF
// Generated by gen_pixel_formats.sh - DO NOT EDIT
#include <drm_fourcc.h>
#include "render/pixel_format.h"
const struct wlr_pixel_format_info pixel_format_info[] = {
$(gen_info)
};
const size_t pixel_format_info_len = sizeof(pixel_format_info) / sizeof(pixel_format_info[0]);
bool pixel_format_is_opaque(uint32_t format) {
switch (format) {
$(gen_opaque)
return true;
default:
return false;
}
}
uint32_t pixel_format_get_opaque_substitute(uint32_t format) {
switch (format) {
$(gen_opaque_substitute)
default:
return DRM_FORMAT_INVALID;
}
}
bool pixel_format_is_ycbcr(uint32_t format) {
switch (format) {
$(gen_ycbcr)
return true;
default:
return false;
}
}
EOF

View file

@ -13,11 +13,17 @@ wlr_files += files(
'drm_syncobj.c',
'pass.c',
'pixel_format.c',
'pixel_format_table.c',
'swapchain.c',
'wlr_renderer.c',
'wlr_texture.c',
)
run_target(
'gen-pixel-format',
command: [files('gen_pixel_format.sh'), files('pixel_format_table.c')],
)
has_dma_buf_import_sync_file = cc.has_header('linux/dma-buf.h') and cc.has_define(
'DMA_BUF_IOCTL_IMPORT_SYNC_FILE',
prefix: '#include <linux/dma-buf.h>',

View file

@ -3,228 +3,8 @@
#include <wlr/util/log.h>
#include "render/pixel_format.h"
static const struct wlr_pixel_format_info pixel_format_info[] = {
{
.drm_format = DRM_FORMAT_XRGB8888,
.bytes_per_block = 4,
},
{
.drm_format = DRM_FORMAT_ARGB8888,
.opaque_substitute = DRM_FORMAT_XRGB8888,
.bytes_per_block = 4,
},
{
.drm_format = DRM_FORMAT_XBGR8888,
.bytes_per_block = 4,
},
{
.drm_format = DRM_FORMAT_ABGR8888,
.opaque_substitute = DRM_FORMAT_XBGR8888,
.bytes_per_block = 4,
},
{
.drm_format = DRM_FORMAT_RGBX8888,
.bytes_per_block = 4,
},
{
.drm_format = DRM_FORMAT_RGBA8888,
.opaque_substitute = DRM_FORMAT_RGBX8888,
.bytes_per_block = 4,
},
{
.drm_format = DRM_FORMAT_BGRX8888,
.bytes_per_block = 4,
},
{
.drm_format = DRM_FORMAT_BGRA8888,
.opaque_substitute = DRM_FORMAT_BGRX8888,
.bytes_per_block = 4,
},
{
.drm_format = DRM_FORMAT_R8,
.bytes_per_block = 1,
},
{
.drm_format = DRM_FORMAT_R16F,
.bytes_per_block = 2,
},
{
.drm_format = DRM_FORMAT_R32F,
.bytes_per_block = 4,
},
{
.drm_format = DRM_FORMAT_GR88,
.bytes_per_block = 2,
},
{
.drm_format = DRM_FORMAT_GR1616F,
.bytes_per_block = 4,
},
{
.drm_format = DRM_FORMAT_GR3232F,
.bytes_per_block = 8,
},
{
.drm_format = DRM_FORMAT_RGB888,
.bytes_per_block = 3,
},
{
.drm_format = DRM_FORMAT_BGR888,
.bytes_per_block = 3,
},
{
.drm_format = DRM_FORMAT_BGR161616,
.bytes_per_block = 6,
},
{
.drm_format = DRM_FORMAT_BGR161616F,
.bytes_per_block = 6,
},
{
.drm_format = DRM_FORMAT_BGR323232F,
.bytes_per_block = 12,
},
{
.drm_format = DRM_FORMAT_RGBX4444,
.bytes_per_block = 2,
},
{
.drm_format = DRM_FORMAT_RGBA4444,
.opaque_substitute = DRM_FORMAT_RGBX4444,
.bytes_per_block = 2,
},
{
.drm_format = DRM_FORMAT_BGRX4444,
.bytes_per_block = 2,
},
{
.drm_format = DRM_FORMAT_BGRA4444,
.opaque_substitute = DRM_FORMAT_BGRX4444,
.bytes_per_block = 2,
},
{
.drm_format = DRM_FORMAT_RGBX5551,
.bytes_per_block = 2,
},
{
.drm_format = DRM_FORMAT_RGBA5551,
.opaque_substitute = DRM_FORMAT_RGBX5551,
.bytes_per_block = 2,
},
{
.drm_format = DRM_FORMAT_BGRX5551,
.bytes_per_block = 2,
},
{
.drm_format = DRM_FORMAT_BGRA5551,
.opaque_substitute = DRM_FORMAT_BGRX5551,
.bytes_per_block = 2,
},
{
.drm_format = DRM_FORMAT_XRGB1555,
.bytes_per_block = 2,
},
{
.drm_format = DRM_FORMAT_ARGB1555,
.opaque_substitute = DRM_FORMAT_XRGB1555,
.bytes_per_block = 2,
},
{
.drm_format = DRM_FORMAT_RGB565,
.bytes_per_block = 2,
},
{
.drm_format = DRM_FORMAT_BGR565,
.bytes_per_block = 2,
},
{
.drm_format = DRM_FORMAT_XRGB2101010,
.bytes_per_block = 4,
},
{
.drm_format = DRM_FORMAT_ARGB2101010,
.opaque_substitute = DRM_FORMAT_XRGB2101010,
.bytes_per_block = 4,
},
{
.drm_format = DRM_FORMAT_XBGR2101010,
.bytes_per_block = 4,
},
{
.drm_format = DRM_FORMAT_ABGR2101010,
.opaque_substitute = DRM_FORMAT_XBGR2101010,
.bytes_per_block = 4,
},
{
.drm_format = DRM_FORMAT_XBGR16161616F,
.bytes_per_block = 8,
},
{
.drm_format = DRM_FORMAT_ABGR16161616F,
.opaque_substitute = DRM_FORMAT_XBGR16161616F,
.bytes_per_block = 8,
},
{
.drm_format = DRM_FORMAT_ABGR32323232F,
.bytes_per_block = 16,
},
{
.drm_format = DRM_FORMAT_XBGR16161616,
.bytes_per_block = 8,
},
{
.drm_format = DRM_FORMAT_ABGR16161616,
.opaque_substitute = DRM_FORMAT_XBGR16161616,
.bytes_per_block = 8,
},
{
.drm_format = DRM_FORMAT_YVYU,
.bytes_per_block = 4,
.block_width = 2,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_VYUY,
.bytes_per_block = 4,
.block_width = 2,
.block_height = 1,
},
};
static const uint32_t opaque_pixel_formats[] = {
DRM_FORMAT_XRGB8888,
DRM_FORMAT_XBGR8888,
DRM_FORMAT_RGBX8888,
DRM_FORMAT_BGRX8888,
DRM_FORMAT_R8,
DRM_FORMAT_GR88,
DRM_FORMAT_RGB888,
DRM_FORMAT_BGR888,
DRM_FORMAT_RGBX4444,
DRM_FORMAT_BGRX4444,
DRM_FORMAT_RGBX5551,
DRM_FORMAT_BGRX5551,
DRM_FORMAT_XRGB1555,
DRM_FORMAT_RGB565,
DRM_FORMAT_BGR565,
DRM_FORMAT_XRGB2101010,
DRM_FORMAT_XBGR2101010,
DRM_FORMAT_XBGR16161616F,
DRM_FORMAT_XBGR16161616,
DRM_FORMAT_YVYU,
DRM_FORMAT_VYUY,
DRM_FORMAT_NV12,
DRM_FORMAT_P010,
};
static const size_t pixel_format_info_size =
sizeof(pixel_format_info) / sizeof(pixel_format_info[0]);
static const size_t opaque_pixel_formats_size =
sizeof(opaque_pixel_formats) / sizeof(opaque_pixel_formats[0]);
const struct wlr_pixel_format_info *drm_get_pixel_format_info(uint32_t fmt) {
for (size_t i = 0; i < pixel_format_info_size; ++i) {
for (size_t i = 0; i < pixel_format_info_len; ++i) {
if (pixel_format_info[i].drm_format == fmt) {
return &pixel_format_info[i];
}
@ -256,8 +36,7 @@ enum wl_shm_format convert_drm_format_to_wl_shm(uint32_t fmt) {
}
uint32_t pixel_format_info_pixels_per_block(const struct wlr_pixel_format_info *info) {
uint32_t pixels = info->block_width * info->block_height;
return pixels > 0 ? pixels : 1;
return info->block_width * info->block_height;
}
static int32_t div_round_up(int32_t dividend, int32_t divisor) {
@ -300,75 +79,5 @@ bool pixel_format_info_check_stride(const struct wlr_pixel_format_info *fmt,
}
bool pixel_format_has_alpha(uint32_t fmt) {
for (size_t i = 0; i < opaque_pixel_formats_size; i++) {
if (fmt == opaque_pixel_formats[i]) {
return false;
}
}
return true;
}
bool pixel_format_is_ycbcr(uint32_t format) {
switch (format) {
case DRM_FORMAT_AYUV:
case DRM_FORMAT_NV12:
case DRM_FORMAT_NV15:
case DRM_FORMAT_NV16:
case DRM_FORMAT_NV20:
case DRM_FORMAT_NV21:
case DRM_FORMAT_NV24:
case DRM_FORMAT_NV30:
case DRM_FORMAT_NV42:
case DRM_FORMAT_NV61:
case DRM_FORMAT_P010:
case DRM_FORMAT_P012:
case DRM_FORMAT_P016:
case DRM_FORMAT_P030:
case DRM_FORMAT_P210:
case DRM_FORMAT_Q401:
case DRM_FORMAT_Q410:
case DRM_FORMAT_S010:
case DRM_FORMAT_S012:
case DRM_FORMAT_S016:
case DRM_FORMAT_S210:
case DRM_FORMAT_S212:
case DRM_FORMAT_S216:
case DRM_FORMAT_S410:
case DRM_FORMAT_S412:
case DRM_FORMAT_S416:
case DRM_FORMAT_UYVY:
case DRM_FORMAT_VUY101010:
case DRM_FORMAT_VUY888:
case DRM_FORMAT_VYUY:
case DRM_FORMAT_X0L0:
case DRM_FORMAT_X0L2:
case DRM_FORMAT_XVYU12_16161616:
case DRM_FORMAT_XVYU16161616:
case DRM_FORMAT_XVYU2101010:
case DRM_FORMAT_XYUV8888:
case DRM_FORMAT_Y0L0:
case DRM_FORMAT_Y0L2:
case DRM_FORMAT_Y210:
case DRM_FORMAT_Y212:
case DRM_FORMAT_Y216:
case DRM_FORMAT_Y410:
case DRM_FORMAT_Y412:
case DRM_FORMAT_Y416:
case DRM_FORMAT_YUV410:
case DRM_FORMAT_YUV411:
case DRM_FORMAT_YUV420:
case DRM_FORMAT_YUV420_10BIT:
case DRM_FORMAT_YUV420_8BIT:
case DRM_FORMAT_YUV422:
case DRM_FORMAT_YUV444:
case DRM_FORMAT_YUYV:
case DRM_FORMAT_YVU410:
case DRM_FORMAT_YVU411:
case DRM_FORMAT_YVU420:
case DRM_FORMAT_YVU422:
case DRM_FORMAT_YVU444:
case DRM_FORMAT_YVYU:
return true;
}
return false;
return !pixel_format_is_opaque(fmt);
}

602
render/pixel_format_table.c Normal file
View file

@ -0,0 +1,602 @@
// Generated by gen_pixel_formats.sh - DO NOT EDIT
#include <drm_fourcc.h>
#include "render/pixel_format.h"
const struct wlr_pixel_format_info pixel_format_info[] = {
{
.drm_format = DRM_FORMAT_ABGR1555,
.bytes_per_block = 2,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_ABGR16161616,
.bytes_per_block = 8,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_ABGR16161616F,
.bytes_per_block = 8,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_ABGR2101010,
.bytes_per_block = 4,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_ABGR32323232F,
.bytes_per_block = 16,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_ABGR4444,
.bytes_per_block = 2,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_ABGR8888,
.bytes_per_block = 4,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_ARGB1555,
.bytes_per_block = 2,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_ARGB16161616,
.bytes_per_block = 8,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_ARGB16161616F,
.bytes_per_block = 8,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_ARGB2101010,
.bytes_per_block = 4,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_ARGB4444,
.bytes_per_block = 2,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_ARGB8888,
.bytes_per_block = 4,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_AVUY8888,
.bytes_per_block = 4,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_AXBXGXRX106106106106,
.bytes_per_block = 8,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_AYUV,
.bytes_per_block = 4,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_BGR161616,
.bytes_per_block = 6,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_BGR161616F,
.bytes_per_block = 6,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_BGR233,
.bytes_per_block = 1,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_BGR323232F,
.bytes_per_block = 12,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_BGR565,
.bytes_per_block = 2,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_BGR888,
.bytes_per_block = 3,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_BGRA1010102,
.bytes_per_block = 4,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_BGRA4444,
.bytes_per_block = 2,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_BGRA5551,
.bytes_per_block = 2,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_BGRA8888,
.bytes_per_block = 4,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_BGRX1010102,
.bytes_per_block = 4,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_BGRX4444,
.bytes_per_block = 2,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_BGRX5551,
.bytes_per_block = 2,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_BGRX8888,
.bytes_per_block = 4,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_GR1616,
.bytes_per_block = 4,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_GR1616F,
.bytes_per_block = 4,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_GR3232F,
.bytes_per_block = 8,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_GR88,
.bytes_per_block = 2,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_R10,
.bytes_per_block = 2,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_R12,
.bytes_per_block = 2,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_R16,
.bytes_per_block = 2,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_R16F,
.bytes_per_block = 2,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_R32F,
.bytes_per_block = 4,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_R8,
.bytes_per_block = 1,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_RG1616,
.bytes_per_block = 4,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_RG88,
.bytes_per_block = 2,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_RGB161616,
.bytes_per_block = 6,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_RGB332,
.bytes_per_block = 1,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_RGB565,
.bytes_per_block = 2,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_RGB888,
.bytes_per_block = 3,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_RGBA1010102,
.bytes_per_block = 4,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_RGBA4444,
.bytes_per_block = 2,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_RGBA5551,
.bytes_per_block = 2,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_RGBA8888,
.bytes_per_block = 4,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_RGBX1010102,
.bytes_per_block = 4,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_RGBX4444,
.bytes_per_block = 2,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_RGBX5551,
.bytes_per_block = 2,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_RGBX8888,
.bytes_per_block = 4,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_UYVY,
.bytes_per_block = 4,
.block_width = 2,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_VUY888,
.bytes_per_block = 3,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_VYUY,
.bytes_per_block = 4,
.block_width = 2,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_XBGR1555,
.bytes_per_block = 2,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_XBGR16161616,
.bytes_per_block = 8,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_XBGR16161616F,
.bytes_per_block = 8,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_XBGR2101010,
.bytes_per_block = 4,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_XBGR4444,
.bytes_per_block = 2,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_XBGR8888,
.bytes_per_block = 4,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_XRGB1555,
.bytes_per_block = 2,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_XRGB16161616,
.bytes_per_block = 8,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_XRGB16161616F,
.bytes_per_block = 8,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_XRGB2101010,
.bytes_per_block = 4,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_XRGB4444,
.bytes_per_block = 2,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_XRGB8888,
.bytes_per_block = 4,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_XVUY8888,
.bytes_per_block = 4,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_XYUV8888,
.bytes_per_block = 4,
.block_width = 1,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_YUYV,
.bytes_per_block = 4,
.block_width = 2,
.block_height = 1,
},
{
.drm_format = DRM_FORMAT_YVYU,
.bytes_per_block = 4,
.block_width = 2,
.block_height = 1,
},
};
const size_t pixel_format_info_len = sizeof(pixel_format_info) / sizeof(pixel_format_info[0]);
bool pixel_format_is_opaque(uint32_t format) {
switch (format) {
case DRM_FORMAT_BGR161616:
case DRM_FORMAT_BGR161616F:
case DRM_FORMAT_BGR233:
case DRM_FORMAT_BGR323232F:
case DRM_FORMAT_BGR565:
case DRM_FORMAT_BGR888:
case DRM_FORMAT_BGRX1010102:
case DRM_FORMAT_BGRX4444:
case DRM_FORMAT_BGRX5551:
case DRM_FORMAT_BGRX8888:
case DRM_FORMAT_GR1616:
case DRM_FORMAT_GR1616F:
case DRM_FORMAT_GR3232F:
case DRM_FORMAT_GR88:
case DRM_FORMAT_NV12:
case DRM_FORMAT_NV16:
case DRM_FORMAT_NV21:
case DRM_FORMAT_NV24:
case DRM_FORMAT_NV42:
case DRM_FORMAT_NV61:
case DRM_FORMAT_R10:
case DRM_FORMAT_R12:
case DRM_FORMAT_R16:
case DRM_FORMAT_R16F:
case DRM_FORMAT_R32F:
case DRM_FORMAT_R8:
case DRM_FORMAT_RG1616:
case DRM_FORMAT_RG88:
case DRM_FORMAT_RGB161616:
case DRM_FORMAT_RGB332:
case DRM_FORMAT_RGB565:
case DRM_FORMAT_RGB888:
case DRM_FORMAT_RGBX1010102:
case DRM_FORMAT_RGBX4444:
case DRM_FORMAT_RGBX5551:
case DRM_FORMAT_RGBX8888:
case DRM_FORMAT_S016:
case DRM_FORMAT_S216:
case DRM_FORMAT_S416:
case DRM_FORMAT_UYVY:
case DRM_FORMAT_VUY888:
case DRM_FORMAT_VYUY:
case DRM_FORMAT_XBGR1555:
case DRM_FORMAT_XBGR16161616:
case DRM_FORMAT_XBGR16161616F:
case DRM_FORMAT_XBGR2101010:
case DRM_FORMAT_XBGR4444:
case DRM_FORMAT_XBGR8888:
case DRM_FORMAT_XRGB1555:
case DRM_FORMAT_XRGB16161616:
case DRM_FORMAT_XRGB16161616F:
case DRM_FORMAT_XRGB2101010:
case DRM_FORMAT_XRGB4444:
case DRM_FORMAT_XRGB8888:
case DRM_FORMAT_XVUY8888:
case DRM_FORMAT_XYUV8888:
case DRM_FORMAT_YUV420:
case DRM_FORMAT_YUV422:
case DRM_FORMAT_YUV444:
case DRM_FORMAT_YUYV:
case DRM_FORMAT_YVU420:
case DRM_FORMAT_YVU422:
case DRM_FORMAT_YVU444:
case DRM_FORMAT_YVYU:
return true;
default:
return false;
}
}
uint32_t pixel_format_get_opaque_substitute(uint32_t format) {
switch (format) {
case DRM_FORMAT_ABGR1555:
return DRM_FORMAT_XBGR1555;
case DRM_FORMAT_ABGR16161616:
return DRM_FORMAT_XBGR16161616;
case DRM_FORMAT_ABGR16161616F:
return DRM_FORMAT_XBGR16161616F;
case DRM_FORMAT_ABGR2101010:
return DRM_FORMAT_XBGR2101010;
case DRM_FORMAT_ABGR4444:
return DRM_FORMAT_XBGR4444;
case DRM_FORMAT_ABGR8888:
return DRM_FORMAT_XBGR8888;
case DRM_FORMAT_ARGB1555:
return DRM_FORMAT_XRGB1555;
case DRM_FORMAT_ARGB16161616:
return DRM_FORMAT_XRGB16161616;
case DRM_FORMAT_ARGB16161616F:
return DRM_FORMAT_XRGB16161616F;
case DRM_FORMAT_ARGB2101010:
return DRM_FORMAT_XRGB2101010;
case DRM_FORMAT_ARGB4444:
return DRM_FORMAT_XRGB4444;
case DRM_FORMAT_ARGB8888:
return DRM_FORMAT_XRGB8888;
case DRM_FORMAT_AVUY8888:
return DRM_FORMAT_XVUY8888;
case DRM_FORMAT_AYUV:
return DRM_FORMAT_XYUV8888;
case DRM_FORMAT_BGRA1010102:
return DRM_FORMAT_BGRX1010102;
case DRM_FORMAT_BGRA4444:
return DRM_FORMAT_BGRX4444;
case DRM_FORMAT_BGRA5551:
return DRM_FORMAT_BGRX5551;
case DRM_FORMAT_BGRA8888:
return DRM_FORMAT_BGRX8888;
case DRM_FORMAT_RGBA1010102:
return DRM_FORMAT_RGBX1010102;
case DRM_FORMAT_RGBA4444:
return DRM_FORMAT_RGBX4444;
case DRM_FORMAT_RGBA5551:
return DRM_FORMAT_RGBX5551;
case DRM_FORMAT_RGBA8888:
return DRM_FORMAT_RGBX8888;
default:
return DRM_FORMAT_INVALID;
}
}
bool pixel_format_is_ycbcr(uint32_t format) {
switch (format) {
case DRM_FORMAT_AVUY8888:
case DRM_FORMAT_AYUV:
case DRM_FORMAT_NV12:
case DRM_FORMAT_NV16:
case DRM_FORMAT_NV21:
case DRM_FORMAT_NV24:
case DRM_FORMAT_NV42:
case DRM_FORMAT_NV61:
case DRM_FORMAT_S016:
case DRM_FORMAT_S216:
case DRM_FORMAT_S416:
case DRM_FORMAT_UYVY:
case DRM_FORMAT_VUY888:
case DRM_FORMAT_VYUY:
case DRM_FORMAT_XVUY8888:
case DRM_FORMAT_XYUV8888:
case DRM_FORMAT_YUV420:
case DRM_FORMAT_YUV422:
case DRM_FORMAT_YUV444:
case DRM_FORMAT_YUYV:
case DRM_FORMAT_YVU420:
case DRM_FORMAT_YVU422:
case DRM_FORMAT_YVU444:
case DRM_FORMAT_YVYU:
return true;
default:
return false;
}
}