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
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,
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
*