diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c index dc092e61..e6db80c9 100644 --- a/libweston/backend-drm/drm.c +++ b/libweston/backend-drm/drm.c @@ -723,14 +723,13 @@ create_gbm_device(int fd) static int fallback_format_for(uint32_t format) { - switch (format) { - case GBM_FORMAT_XRGB8888: - return GBM_FORMAT_ARGB8888; - case GBM_FORMAT_XRGB2101010: - return GBM_FORMAT_ARGB2101010; - default: + const struct pixel_format_info *pf; + + pf = pixel_format_get_info_by_opaque_substitute(format); + if (!pf) return 0; - } + + return pf->format; } static int diff --git a/libweston/pixel-formats.c b/libweston/pixel-formats.c index b96f3b21..23d7d5b9 100644 --- a/libweston/pixel-formats.c +++ b/libweston/pixel-formats.c @@ -436,6 +436,19 @@ pixel_format_get_opaque_substitute(const struct pixel_format_info *info) return pixel_format_get_info(info->opaque_substitute); } +WL_EXPORT const struct pixel_format_info * +pixel_format_get_info_by_opaque_substitute(uint32_t format) +{ + unsigned int i; + + for (i = 0; i < ARRAY_LENGTH(pixel_format_table); i++) { + if (pixel_format_table[i].opaque_substitute == format) + return &pixel_format_table[i]; + } + + return NULL; +} + WL_EXPORT unsigned int pixel_format_width_for_plane(const struct pixel_format_info *info, unsigned int plane, diff --git a/libweston/pixel-formats.h b/libweston/pixel-formats.h index 4e651bbb..48395725 100644 --- a/libweston/pixel-formats.h +++ b/libweston/pixel-formats.h @@ -191,6 +191,23 @@ pixel_format_is_opaque(const struct pixel_format_info *format); const struct pixel_format_info * pixel_format_get_opaque_substitute(const struct pixel_format_info *format); +/** + * For an opaque format, get the equivalent format with alpha instead of an + * ignored channel + * + * This is the opposite lookup from pixel_format_get_opaque_substitute(). + * Finds the format whose opaque substitute is the given format. + * + * If the input format is not opaque or does not have ignored (X) bits, then + * the search cannot find a match. + * + * @param format DRM format code to search for + * @returns A pixel format info structure for the pixel format whose opaque + * substitute is the argument, or NULL if no match. + */ +const struct pixel_format_info * +pixel_format_get_info_by_opaque_substitute(uint32_t format); + /** * Return the effective sampling width for a given plane *