diff --git a/video/out/wldmabuf/ra_wldmabuf.c b/video/out/wldmabuf/ra_wldmabuf.c index cd3bcdd35c..5285738d96 100644 --- a/video/out/wldmabuf/ra_wldmabuf.c +++ b/video/out/wldmabuf/ra_wldmabuf.c @@ -15,6 +15,8 @@ * License along with mpv. If not, see . */ +#include + #include "video/out/wayland_common.h" #include "video/out/gpu/ra.h" #include "ra_wldmabuf.h" @@ -34,25 +36,26 @@ bool ra_compatible_format(struct ra *ra, int imgfmt, uint32_t drm_format, uint64 struct vo_wayland_state *wl = p->vo->wl; struct drm_format *formats = wl->compositor_formats; - - // If we were able to make the DRM query, filter out the planar formats. - // If not, just assume they all work and hope for the best. - if (wl->planar_formats) { - bool supported_planar_format = false; - for (int i = 0; i < wl->num_planar_formats; i++) { - if (drm_format == wl->planar_formats[i]) { - supported_planar_format = true; - break; - } - } - if (!supported_planar_format) - return false; + // Always check if the compositor supports the format. + bool supported_compositor_format = false; + for (int i = 0; i < wl->num_compositor_formats; ++i) { + if (formats[i].format != drm_format || formats[i].modifier == DRM_FORMAT_MOD_INVALID) + continue; + if (modifier == formats[i].modifier) + return true; + supported_compositor_format = true; } - // Always check if the compositor supports the format. - for (int i = 0; i < wl->num_compositor_formats; ++i) { - if (drm_format == formats[i].format && modifier == formats[i].modifier) - return true; + if (!supported_compositor_format) + return false; + + // If the compositor supports the format but there are no valid modifiers, + // see if this is a planar format which can be still be supported. + if (wl->planar_formats) { + for (int i = 0; i < wl->num_planar_formats; i++) { + if (drm_format == wl->planar_formats[i]) + return true; + } } return false;