render/pixel_format: add pixel_format_get_opaque_substitute()

We'll soon move opaque substitutes outside of the format table.
Prepare the work by introducing a separate function to get this
piece of information.
This commit is contained in:
Simon Ser 2026-02-19 15:43:51 +01:00
parent f295d0322a
commit 2d95d8d292
4 changed files with 20 additions and 10 deletions

View file

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

View file

@ -68,4 +68,10 @@ bool pixel_format_has_alpha(uint32_t fmt);
*/ */
bool pixel_format_is_ycbcr(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 #endif

View file

@ -372,3 +372,11 @@ bool pixel_format_is_ycbcr(uint32_t format) {
} }
return false; return false;
} }
uint32_t pixel_format_get_opaque_substitute(uint32_t fmt) {
const struct wlr_pixel_format_info *info = drm_get_pixel_format_info(fmt);
if (info == NULL) {
return DRM_FORMAT_INVALID;
}
return info->opaque_substitute;
}