319 lines
12 KiB
Diff
319 lines
12 KiB
Diff
|
From ca69230ef227402c3e32b9aa34bb9a8826ebda10 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?V=C3=ADctor=20Manuel=20J=C3=A1quez=20Leal?=
|
||
|
<vjaquez@igalia.com>
|
||
|
Date: Thu, 30 Nov 2023 12:00:27 +0100
|
||
|
Subject: [PATCH 1/5] vaallocator: don't fail if drm fourcc are different
|
||
|
|
||
|
When exporting a DMABuf from a VASurface the user might tell that the surface
|
||
|
was allocated with certain fourcc, but the returned VADRMPRIMESurfaceDescriptor
|
||
|
migth tell a different fourcc, as in the case or radeonsi driver, for duplicated
|
||
|
fourcc, such as YUY2 and YUYV.
|
||
|
|
||
|
Originally it was supposed to be a failed exportation. This patch relax this
|
||
|
validation by allowing different fourcc.
|
||
|
|
||
|
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5760>
|
||
|
---
|
||
|
.../gst-plugins-bad/gst-libs/gst/va/gstvaallocator.c | 7 +++++--
|
||
|
1 file changed, 5 insertions(+), 2 deletions(-)
|
||
|
|
||
|
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 dedf86794f1..c1d88924dd1 100644
|
||
|
--- a/subprojects/gst-plugins-bad/gst-libs/gst/va/gstvaallocator.c
|
||
|
+++ b/subprojects/gst-plugins-bad/gst-libs/gst/va/gstvaallocator.c
|
||
|
@@ -607,10 +607,13 @@ gst_va_dmabuf_allocator_setup_buffer_full (GstAllocator * allocator,
|
||
|
|
||
|
g_assert (GST_VIDEO_INFO_N_PLANES (&self->info) == desc.num_layers);
|
||
|
|
||
|
+ /* YUY2 and YUYV are the same. radeonsi returns always YUYV.
|
||
|
+ * There's no reason to fail if the different fourcc if there're dups.
|
||
|
+ * https://fourcc.org/pixel-format/yuv-yuy2/ */
|
||
|
if (fourcc != desc.fourcc) {
|
||
|
- GST_ERROR ("Unsupported fourcc: %" GST_FOURCC_FORMAT,
|
||
|
+ GST_INFO ("Different fourcc: requested %" GST_FOURCC_FORMAT " - returned %"
|
||
|
+ GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc),
|
||
|
GST_FOURCC_ARGS (desc.fourcc));
|
||
|
- goto failed;
|
||
|
}
|
||
|
|
||
|
if (desc.num_objects == 0) {
|
||
|
--
|
||
|
GitLab
|
||
|
|
||
|
|
||
|
From e5642b496f11d8b7500d4e9da48c79a561418407 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?V=C3=ADctor=20Manuel=20J=C3=A1quez=20Leal?=
|
||
|
<vjaquez@igalia.com>
|
||
|
Date: Thu, 30 Nov 2023 16:52:02 +0100
|
||
|
Subject: [PATCH 2/5] va: check surface status before get derive image
|
||
|
|
||
|
According with documentation the surface has to be in ready state before getting
|
||
|
it derived image. This patch adds that check.
|
||
|
|
||
|
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5760>
|
||
|
---
|
||
|
.../gst-libs/gst/va/vasurfaceimage.c | 15 +++++++++++++++
|
||
|
1 file changed, 15 insertions(+)
|
||
|
|
||
|
diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/va/vasurfaceimage.c b/subprojects/gst-plugins-bad/gst-libs/gst/va/vasurfaceimage.c
|
||
|
index d6d8f4985ae..96d169e500b 100644
|
||
|
--- a/subprojects/gst-plugins-bad/gst-libs/gst/va/vasurfaceimage.c
|
||
|
+++ b/subprojects/gst-plugins-bad/gst-libs/gst/va/vasurfaceimage.c
|
||
|
@@ -147,6 +147,21 @@ va_get_derive_image (GstVaDisplay * display, VASurfaceID surface,
|
||
|
{
|
||
|
VADisplay dpy = gst_va_display_get_va_dpy (display);
|
||
|
VAStatus status;
|
||
|
+ VASurfaceStatus state;
|
||
|
+
|
||
|
+ /* When directly accessing a surface special care must be taken to insure sync
|
||
|
+ * proper synchronization with the graphics hardware. Clients should call
|
||
|
+ * vaQuerySurfaceStatus to insure that a surface is not the target of
|
||
|
+ * concurrent rendering or currently being displayed by an overlay. */
|
||
|
+ status = vaQuerySurfaceStatus (dpy, surface, &state);
|
||
|
+ if (status != VA_STATUS_SUCCESS) {
|
||
|
+ GST_WARNING ("vaQuerySurfaceStatus: %s", vaErrorStr (status));
|
||
|
+ return FALSE;
|
||
|
+ }
|
||
|
+ if (state != VASurfaceReady) {
|
||
|
+ GST_INFO ("Surface not ready");
|
||
|
+ return FALSE;
|
||
|
+ }
|
||
|
|
||
|
status = vaDeriveImage (dpy, surface, image);
|
||
|
if (status != VA_STATUS_SUCCESS) {
|
||
|
--
|
||
|
GitLab
|
||
|
|
||
|
|
||
|
From eab752c8649bd01d96a89fc0c87f632c1ad78e97 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?V=C3=ADctor=20Manuel=20J=C3=A1quez=20Leal?=
|
||
|
<vjaquez@igalia.com>
|
||
|
Date: Mon, 4 Dec 2023 20:05:48 +0100
|
||
|
Subject: [PATCH 3/5] 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/5760>
|
||
|
---
|
||
|
.../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 c1d88924dd1..faf8c63a6fb 100644
|
||
|
--- a/subprojects/gst-plugins-bad/gst-libs/gst/va/gstvaallocator.c
|
||
|
+++ b/subprojects/gst-plugins-bad/gst-libs/gst/va/gstvaallocator.c
|
||
|
@@ -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) {
|
||
|
--
|
||
|
GitLab
|
||
|
|
||
|
|
||
|
From 28bf83ca3d89845c57ad8fb4c4caf6eed07ae5d4 Mon Sep 17 00:00:00 2001
|
||
|
From: Mengkejiergeli Ba <mengkejiergeli.ba@intel.com>
|
||
|
Date: Thu, 13 Jul 2023 16:56:56 +0800
|
||
|
Subject: [PATCH 4/5] vaallocator: let pool alloc_info be consitent with the
|
||
|
test order in gst_va_allocator_try
|
||
|
|
||
|
In gst_va_allocator_try, the first try is to use derive_image, if it
|
||
|
succeeds, we should use info from derived image to create bufferpool.
|
||
|
If derive fails, then try create_image and give created image info
|
||
|
to the pool.
|
||
|
|
||
|
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5046>
|
||
|
---
|
||
|
.../gst-libs/gst/va/gstvaallocator.c | 16 ++++++----------
|
||
|
1 file changed, 6 insertions(+), 10 deletions(-)
|
||
|
|
||
|
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 faf8c63a6fb..e418e6be07d 100644
|
||
|
--- a/subprojects/gst-plugins-bad/gst-libs/gst/va/gstvaallocator.c
|
||
|
+++ b/subprojects/gst-plugins-bad/gst-libs/gst/va/gstvaallocator.c
|
||
|
@@ -1091,7 +1091,6 @@ struct _GstVaAllocator
|
||
|
guint32 fourcc;
|
||
|
guint32 rt_format;
|
||
|
|
||
|
- GstVideoInfo derived_info;
|
||
|
GstVideoInfo info;
|
||
|
guint usage_hint;
|
||
|
|
||
|
@@ -1307,9 +1306,7 @@ _update_image_info (GstVaAllocator * va_allocator)
|
||
|
&& va_allocator->surface_format == va_allocator->img_format) {
|
||
|
if (va_get_derive_image (va_allocator->display, surface, &image)) {
|
||
|
va_allocator->use_derived = TRUE;
|
||
|
- va_allocator->derived_info = va_allocator->info;
|
||
|
- _update_info (&va_allocator->derived_info, &image);
|
||
|
- va_destroy_image (va_allocator->display, image.image_id);
|
||
|
+ goto done;
|
||
|
}
|
||
|
image.image_id = VA_INVALID_ID; /* reset it */
|
||
|
}
|
||
|
@@ -1328,6 +1325,7 @@ _update_image_info (GstVaAllocator * va_allocator)
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
+done:
|
||
|
_update_info (&va_allocator->info, &image);
|
||
|
va_destroy_image (va_allocator->display, image.image_id);
|
||
|
va_destroy_surfaces (va_allocator->display, &surface, 1);
|
||
|
@@ -1386,23 +1384,21 @@ _va_map_unlocked (GstVaMemory * mem, GstMapFlags flags)
|
||
|
* problematic */
|
||
|
use_derived = va_allocator->use_derived && !((flags & GST_MAP_READ)
|
||
|
|| ((flags & GST_MAP_WRITE)
|
||
|
- && GST_VIDEO_INFO_IS_YUV (&va_allocator->derived_info)));
|
||
|
+ && GST_VIDEO_INFO_IS_YUV (&va_allocator->info)));
|
||
|
break;
|
||
|
case GST_VA_IMPLEMENTATION_MESA_GALLIUM:
|
||
|
/* Reading RGB derived images, with non-standard resolutions,
|
||
|
* looks like tiled too. TODO(victor): fill a bug in Mesa. */
|
||
|
use_derived = va_allocator->use_derived && !((flags & GST_MAP_READ)
|
||
|
- && GST_VIDEO_INFO_IS_RGB (&va_allocator->derived_info));
|
||
|
+ && GST_VIDEO_INFO_IS_RGB (&va_allocator->info));
|
||
|
break;
|
||
|
default:
|
||
|
use_derived = va_allocator->use_derived;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
- if (use_derived)
|
||
|
- info = &va_allocator->derived_info;
|
||
|
- else
|
||
|
- info = &va_allocator->info;
|
||
|
+
|
||
|
+ info = &va_allocator->info;
|
||
|
|
||
|
if (!va_ensure_image (display, mem->surface, info, &mem->image, use_derived))
|
||
|
return NULL;
|
||
|
--
|
||
|
GitLab
|
||
|
|
||
|
|
||
|
From 4f294570d2fdc17511bb9dccb401a483246f3d03 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?V=C3=ADctor=20Manuel=20J=C3=A1quez=20Leal?=
|
||
|
<vjaquez@igalia.com>
|
||
|
Date: Mon, 11 Dec 2023 15:26:11 +0100
|
||
|
Subject: [PATCH 5/5] vaallocator: only i965 can switch derived/non-derived at
|
||
|
mapping
|
||
|
|
||
|
Since newer drivers change the strides and offset, and they have to be defined
|
||
|
at allocation time because those parameters are stored in the GstVideoMeta in
|
||
|
the buffer pool.
|
||
|
|
||
|
Thinks patch is based on commit 6b1fba14 and commit 809a984b
|
||
|
---
|
||
|
.../gst-libs/gst/va/gstvaallocator.c | 13 -------------
|
||
|
1 file changed, 13 deletions(-)
|
||
|
|
||
|
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 e418e6be07d..b9a38684c6f 100644
|
||
|
--- a/subprojects/gst-plugins-bad/gst-libs/gst/va/gstvaallocator.c
|
||
|
+++ b/subprojects/gst-plugins-bad/gst-libs/gst/va/gstvaallocator.c
|
||
|
@@ -1372,13 +1372,6 @@ _va_map_unlocked (GstVaMemory * mem, GstMapFlags flags)
|
||
|
use_derived = FALSE;
|
||
|
} else {
|
||
|
switch (gst_va_display_get_implementation (display)) {
|
||
|
- case GST_VA_IMPLEMENTATION_INTEL_IHD:
|
||
|
- /* On Gen7+ Intel graphics the memory is mappable but not
|
||
|
- * cached, so normal memcpy() access is very slow to read, but
|
||
|
- * it's ok for writing. So let's assume that users won't prefer
|
||
|
- * direct-mapped memory if they request read access. */
|
||
|
- use_derived = va_allocator->use_derived && !(flags & GST_MAP_READ);
|
||
|
- break;
|
||
|
case GST_VA_IMPLEMENTATION_INTEL_I965:
|
||
|
/* YUV derived images are tiled, so writing them is also
|
||
|
* problematic */
|
||
|
@@ -1386,12 +1379,6 @@ _va_map_unlocked (GstVaMemory * mem, GstMapFlags flags)
|
||
|
|| ((flags & GST_MAP_WRITE)
|
||
|
&& GST_VIDEO_INFO_IS_YUV (&va_allocator->info)));
|
||
|
break;
|
||
|
- case GST_VA_IMPLEMENTATION_MESA_GALLIUM:
|
||
|
- /* Reading RGB derived images, with non-standard resolutions,
|
||
|
- * looks like tiled too. TODO(victor): fill a bug in Mesa. */
|
||
|
- use_derived = va_allocator->use_derived && !((flags & GST_MAP_READ)
|
||
|
- && GST_VIDEO_INFO_IS_RGB (&va_allocator->info));
|
||
|
- break;
|
||
|
default:
|
||
|
use_derived = va_allocator->use_derived;
|
||
|
break;
|
||
|
--
|
||
|
GitLab
|
||
|
|