From 7332eb6427fd19ca0f1a2d11f33b8b90eff405a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Manuel=20J=C3=A1quez=20Leal?= Date: Mon, 4 Dec 2023 20:05:48 +0100 Subject: [PATCH] vaallocator: force non-derived for old mesa drivers Mesa <23.3 can't map derived images for P010 format. This patch forces non-derived if this is the case. See: https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24381 Part-of: --- .../gst-libs/gst/va/gstvaallocator.c | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/va/gstvaallocator.c b/subprojects/gst-plugins-bad/gst-libs/gst/va/gstvaallocator.c index 05917defe8..a5256d0f58 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/va/gstvaallocator.c +++ b/subprojects/gst-plugins-bad/gst-libs/gst/va/gstvaallocator.c @@ -42,6 +42,8 @@ #include #endif +#include /* sscanf */ + #include "gstvasurfacecopy.h" #include "gstvavideoformat.h" #include "vasurfaceimage.h" @@ -1321,6 +1323,50 @@ _reset_mem (GstVaMemory * mem, GstAllocator * allocator, gsize size) 0 /* align */ , 0 /* offset */ , size); } +/* + * HACK: + * + * This method should be defined as a public method of GstVaDisplay. But in + * order to backport this fix, it's kept locally. + */ +static gboolean +_gst_va_display_get_vendor_version (GstVaDisplay * display, guint * major, + guint * minor) +{ + VADisplay dpy; + guint maj, min; + const char *vendor; + + dpy = gst_va_display_get_va_dpy (display); + vendor = vaQueryVendorString (dpy); + if (vendor && sscanf (vendor, "Mesa Gallium driver %d.%d.", &maj, &min) == 2) { + *major = maj; + *minor = min; + return TRUE; + } + + return FALSE; +} + +static gboolean +_is_old_mesa (GstVaAllocator * va_allocator) +{ + guint major, minor; + + if (!GST_VA_DISPLAY_IS_IMPLEMENTATION (va_allocator->display, MESA_GALLIUM)) + return FALSE; + if (!_gst_va_display_get_vendor_version (va_allocator->display, &major, + &minor)) { + GST_WARNING ("Could not parse version from Mesa vendor string"); + return FALSE; + } + if (major > 23) + return FALSE; + if (major == 23 && minor > 2) + return FALSE; + return TRUE; +} + static inline void _update_info (GstVideoInfo * info, const VAImage * image) { @@ -1364,6 +1410,18 @@ _update_image_info (GstVaAllocator * va_allocator) va_allocator->feat_use_derived = GST_VA_FEATURE_DISABLED; } va_allocator->use_derived = FALSE; +#else + /* XXX: Derived in Mesa <23.3 can't use derived images for P010 format + * https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24381 + */ + if (va_allocator->img_format == GST_VIDEO_FORMAT_P010_10LE + && _is_old_mesa (va_allocator)) { + if (va_allocator->feat_use_derived != GST_VA_FEATURE_DISABLED) { + GST_INFO_OBJECT (va_allocator, "Disable image derive on old Mesa."); + va_allocator->feat_use_derived = GST_VA_FEATURE_DISABLED; + } + va_allocator->use_derived = FALSE; + } #endif /* Try derived first, but different formats can never derive */ if (va_allocator->feat_use_derived != GST_VA_FEATURE_DISABLED