From e00171d87191038372fd6a57299ed6c25e908a7c Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Thu, 5 Mar 2026 16:49:05 +0100 Subject: [PATCH] render/pixel_format: generate opaque substitute table via kdfs --- render/gen_pixel_format.sh | 19 ++++++++++++++ render/pixel_format.c | 32 ----------------------- render/pixel_format_table.c | 51 +++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 32 deletions(-) diff --git a/render/gen_pixel_format.sh b/render/gen_pixel_format.sh index 587d97464..145cb4f7d 100755 --- a/render/gen_pixel_format.sh +++ b/render/gen_pixel_format.sh @@ -28,6 +28,17 @@ gen_opaque() { ' } +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[] @@ -57,6 +68,14 @@ $(gen_opaque) } } +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) diff --git a/render/pixel_format.c b/render/pixel_format.c index d05d261bf..83f131393 100644 --- a/render/pixel_format.c +++ b/render/pixel_format.c @@ -81,35 +81,3 @@ bool pixel_format_info_check_stride(const struct wlr_pixel_format_info *fmt, bool pixel_format_has_alpha(uint32_t fmt) { return !pixel_format_is_opaque(fmt); } - -uint32_t pixel_format_get_opaque_substitute(uint32_t fmt) { - switch (fmt) { - case DRM_FORMAT_ARGB8888: - return DRM_FORMAT_XRGB8888; - case DRM_FORMAT_ABGR8888: - return DRM_FORMAT_XBGR8888; - case DRM_FORMAT_RGBA8888: - return DRM_FORMAT_RGBX8888; - case DRM_FORMAT_BGRA8888: - return DRM_FORMAT_BGRX8888; - case DRM_FORMAT_RGBA4444: - return DRM_FORMAT_RGBX4444; - case DRM_FORMAT_BGRA4444: - return DRM_FORMAT_BGRX4444; - case DRM_FORMAT_RGBA5551: - return DRM_FORMAT_RGBX5551; - case DRM_FORMAT_BGRA5551: - return DRM_FORMAT_BGRX5551; - case DRM_FORMAT_ARGB1555: - return DRM_FORMAT_XRGB1555; - case DRM_FORMAT_ARGB2101010: - return DRM_FORMAT_XRGB2101010; - case DRM_FORMAT_ABGR2101010: - return DRM_FORMAT_XBGR2101010; - case DRM_FORMAT_ABGR16161616F: - return DRM_FORMAT_XBGR16161616F; - case DRM_FORMAT_ABGR16161616: - return DRM_FORMAT_XBGR16161616; - } - return DRM_FORMAT_INVALID; -} diff --git a/render/pixel_format_table.c b/render/pixel_format_table.c index fc75e10a8..78f0737dc 100644 --- a/render/pixel_format_table.c +++ b/render/pixel_format_table.c @@ -518,6 +518,57 @@ bool pixel_format_is_opaque(uint32_t format) { } } +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: