From 8a3cd28973210b1c91d822c0f371b888641d05d8 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Sun, 1 Aug 2021 19:28:36 +0200 Subject: [PATCH] render/pixman/pixel_format: add more formats Add a bunch of new formats for Pixman: a few missing 32-bit ones, some 16-bit and 32-bit formats as well. Mostly based on a Weston patch [1]. [1]: https://gitlab.freedesktop.org/wayland/weston/-/merge_requests/664 --- render/pixman/pixel_format.c | 63 +++++++++++++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/render/pixman/pixel_format.c b/render/pixman/pixel_format.c index 166f8580..5a460a0a 100644 --- a/render/pixman/pixel_format.c +++ b/render/pixman/pixel_format.c @@ -35,7 +35,68 @@ static const struct wlr_pixman_pixel_format formats[] = { #else .pixman_format = PIXMAN_a8b8g8r8, #endif - } + }, + { + .drm_format = DRM_FORMAT_RGBA8888, +#if WLR_BIG_ENDIAN + .pixman_format = PIXMAN_a8b8g8r8, +#else + .pixman_format = PIXMAN_r8g8b8a8, +#endif + }, + { + .drm_format = DRM_FORMAT_RGBX8888, +#if WLR_BIG_ENDIAN + .pixman_format = PIXMAN_x8b8g8r8, +#else + .pixman_format = PIXMAN_r8g8b8x8, +#endif + }, + { + .drm_format = DRM_FORMAT_BGRA8888, +#if WLR_BIG_ENDIAN + .pixman_format = PIXMAN_a8r8g8b8, +#else + .pixman_format = PIXMAN_b8g8r8a8, +#endif + }, + { + .drm_format = DRM_FORMAT_BGRX8888, +#if WLR_BIG_ENDIAN + .pixman_format = PIXMAN_x8r8g8b8, +#else + .pixman_format = PIXMAN_b8g8r8x8, +#endif + }, +#if WLR_LITTLE_ENDIAN + // Since DRM formats are always little-endian, they don't have an + // equivalent on big-endian if their components are spanning across + // multiple bytes. + { + .drm_format = DRM_FORMAT_RGB565, + .pixman_format = PIXMAN_r5g6b5, + }, + { + .drm_format = DRM_FORMAT_BGR565, + .pixman_format = PIXMAN_b5g6r5, + }, + { + .drm_format = DRM_FORMAT_ARGB2101010, + .pixman_format = PIXMAN_a2r10g10b10, + }, + { + .drm_format = DRM_FORMAT_XRGB2101010, + .pixman_format = PIXMAN_x2r10g10b10, + }, + { + .drm_format = DRM_FORMAT_ABGR2101010, + .pixman_format = PIXMAN_a2b10g10r10, + }, + { + .drm_format = DRM_FORMAT_XBGR2101010, + .pixman_format = PIXMAN_x2b10g10r10, + }, +#endif }; pixman_format_code_t get_pixman_format_from_drm(uint32_t fmt) {