frontends/va: Implement vaMapBuffer2
authorDavid Rosca <nowrep@gmail.com>
Mon, 9 Oct 2023 15:28:06 +0000 (17:28 +0200)
committerMarge Bot <emma+marge@anholt.net>
Wed, 18 Oct 2023 16:07:19 +0000 (16:07 +0000)
Reviewed-by: Sil Vilerino <sivileri@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25620>

src/gallium/frontends/va/buffer.c
src/gallium/frontends/va/context.c
src/gallium/frontends/va/va_private.h

index ca0f79d90762b3a47608dd111d6d9188241080ed..dd160439aa690c717c28bce9e59ee33902d15455 100644 (file)
 #include <va/va_win32.h>
 #endif
 
+#ifndef VA_MAPBUFFER_FLAG_DEFAULT
+#define VA_MAPBUFFER_FLAG_DEFAULT 0
+#define VA_MAPBUFFER_FLAG_READ    1
+#define VA_MAPBUFFER_FLAG_WRITE   2
+#endif
+
 VAStatus
 vlVaCreateBuffer(VADriverContextP ctx, VAContextID context, VABufferType type,
                  unsigned int size, unsigned int num_elements, void *data,
@@ -111,6 +117,12 @@ vlVaBufferSetNumElements(VADriverContextP ctx, VABufferID buf_id,
 
 VAStatus
 vlVaMapBuffer(VADriverContextP ctx, VABufferID buf_id, void **pbuff)
+{
+   return vlVaMapBuffer2(ctx, buf_id, pbuff, VA_MAPBUFFER_FLAG_DEFAULT);
+}
+
+VAStatus vlVaMapBuffer2(VADriverContextP ctx, VABufferID buf_id,
+                        void **pbuff, uint32_t flags)
 {
    vlVaDriver *drv;
    vlVaBuffer *buf;
@@ -135,6 +147,7 @@ vlVaMapBuffer(VADriverContextP ctx, VABufferID buf_id, void **pbuff)
    if (buf->derived_surface.resource) {
       struct pipe_resource *resource;
       struct pipe_box box;
+      unsigned usage = 0;
       void *(*map_func)(struct pipe_context *,
              struct pipe_resource *resource,
              unsigned level,
@@ -153,11 +166,23 @@ vlVaMapBuffer(VADriverContextP ctx, VABufferID buf_id, void **pbuff)
       else
          map_func = drv->pipe->texture_map;
 
-      /* For VAImageBufferType, use PIPE_MAP_WRITE for now,
-       * PIPE_MAP_READ_WRITE degradate perf with two copies when map/unmap. */
-      *pbuff = map_func(drv->pipe, resource, 0,
-                        buf->type == VAEncCodedBufferType ?
-                        PIPE_MAP_READ : PIPE_MAP_WRITE,
+      if (flags == VA_MAPBUFFER_FLAG_DEFAULT) {
+         /* For VAImageBufferType, use PIPE_MAP_WRITE for now,
+          * PIPE_MAP_READ_WRITE degradate perf with two copies when map/unmap. */
+         if (buf->type == VAEncCodedBufferType)
+            usage = PIPE_MAP_READ;
+         else
+            usage = PIPE_MAP_WRITE;
+      }
+
+      if (flags & VA_MAPBUFFER_FLAG_READ)
+         usage |= PIPE_MAP_READ;
+      if (flags & VA_MAPBUFFER_FLAG_WRITE)
+         usage |= PIPE_MAP_WRITE;
+
+      assert(usage);
+
+      *pbuff = map_func(drv->pipe, resource, 0, usage,
                         &box, &buf->derived_surface.transfer);
       mtx_unlock(&drv->mutex);
 
index b206d2a647de2129cfcdae808c001f1a48d6734e..4f4f0ff5656721d6c98da3f41b071f9d9eb5f10b 100644 (file)
@@ -106,6 +106,10 @@ static struct VADriverVTable vtable =
    NULL, /* vaSyncSurface2 */
    &vlVaSyncBuffer,
 #endif
+#if VA_CHECK_VERSION(1, 21, 0)
+   NULL, /* vaCopy */
+   &vlVaMapBuffer2,
+#endif
 };
 
 static struct VADriverVTableVPP vtable_vpp =
index 54abc4c5d8a9a6c3861a85699e982c32db83dba0..37c0aec7ec016265f311ce347132f5efd5ac211a 100644 (file)
@@ -503,6 +503,7 @@ VAStatus vlVaQueryVideoProcFilterCaps(VADriverContextP ctx, VAContextID context,
 VAStatus vlVaQueryVideoProcPipelineCaps(VADriverContextP ctx, VAContextID context, VABufferID *filters,
                                         unsigned int num_filters, VAProcPipelineCaps *pipeline_cap);
 VAStatus vlVaSyncBuffer(VADriverContextP ctx, VABufferID buf_id, uint64_t timeout_ns);
+VAStatus vlVaMapBuffer2(VADriverContextP ctx, VABufferID buf_id, void **pbuf, uint32_t flags);
 
 // internal functions
 VAStatus vlVaHandleVAProcPipelineParameterBufferType(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);