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: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5778>
This commit is contained in:
Víctor Manuel Jáquez Leal 2023-12-04 20:05:48 +01:00 committed by GStreamer Marge Bot
parent eda890c073
commit 0cf8936ef7

View file

@ -40,6 +40,8 @@
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h> /* sscanf */
#include "gstvasurfacecopy.h"
#include "gstvavideoformat.h"
#include "vasurfaceimage.h"
@ -1212,6 +1214,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)
{
@ -1244,6 +1290,18 @@ _update_image_info (GstVaAllocator * va_allocator)
GST_VIDEO_INFO_WIDTH (&va_allocator->info),
GST_VIDEO_INFO_HEIGHT (&va_allocator->info));
/* 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;
}
/* Try derived first, but different formats can never derive */
if (va_allocator->feat_use_derived != GST_VA_FEATURE_DISABLED
&& va_allocator->surface_format == va_allocator->img_format) {