Module: Mesa
Branch: master
Commit: 364857ffe810d21bb3946f06f24149b7b580711b
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=364857ffe810d21bb3946f06f24149b7b580711b

Author: Simon Ser <[email protected]>
Date:   Fri Feb 26 16:49:17 2021 +0100

radeonsi/uvd: make format modifiers-aware

When format modifiers are supported, use
resource_create_with_modifiers instead of resource_create. This
allows radeonsi to set the modifier field, and allows VA-API
clients to have a proper modifier instead of
DRM_FORMAT_MOD_INVALID.

Signed-off-by: Simon Ser <[email protected]>
Reviewed-by: Bas Nieuwenhuizen <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9308>

---

 src/gallium/auxiliary/vl/vl_video_buffer.c | 11 +++++++++--
 src/gallium/auxiliary/vl/vl_video_buffer.h |  4 +++-
 src/gallium/drivers/radeonsi/si_uvd.c      | 13 ++++++++++++-
 3 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/src/gallium/auxiliary/vl/vl_video_buffer.c 
b/src/gallium/auxiliary/vl/vl_video_buffer.c
index 54cc0c52909..eb13f89dd16 100644
--- a/src/gallium/auxiliary/vl/vl_video_buffer.c
+++ b/src/gallium/auxiliary/vl/vl_video_buffer.c
@@ -466,7 +466,9 @@ vl_video_buffer_create_ex2(struct pipe_context *pipe,
 /* Create pipe_video_buffer by using resource_create with planar formats. */
 struct pipe_video_buffer *
 vl_video_buffer_create_as_resource(struct pipe_context *pipe,
-                                   const struct pipe_video_buffer *tmpl)
+                                   const struct pipe_video_buffer *tmpl,
+                                   const uint64_t *modifiers,
+                                   int modifiers_count)
 {
    struct pipe_resource templ, *resources[VL_NUM_COMPONENTS] = {0};
    unsigned array_size =  tmpl->interlaced ? 2 : 1;
@@ -487,7 +489,12 @@ vl_video_buffer_create_as_resource(struct pipe_context 
*pipe,
    else
       templ.format = tmpl->buffer_format;
 
-   resources[0] = pipe->screen->resource_create(pipe->screen, &templ);
+   if (modifiers)
+      resources[0] = pipe->screen->resource_create_with_modifiers(pipe->screen,
+                                                                  &templ, 
modifiers,
+                                                                  
modifiers_count);
+   else
+      resources[0] = pipe->screen->resource_create(pipe->screen, &templ);
    if (!resources[0])
       return NULL;
 
diff --git a/src/gallium/auxiliary/vl/vl_video_buffer.h 
b/src/gallium/auxiliary/vl/vl_video_buffer.h
index 2045f04a391..f777ddb0fa3 100644
--- a/src/gallium/auxiliary/vl/vl_video_buffer.h
+++ b/src/gallium/auxiliary/vl/vl_video_buffer.h
@@ -150,6 +150,8 @@ vl_video_buffer_create_ex2(struct pipe_context *pipe,
 /* Create pipe_video_buffer by using resource_create with planar formats. */
 struct pipe_video_buffer *
 vl_video_buffer_create_as_resource(struct pipe_context *pipe,
-                                   const struct pipe_video_buffer *tmpl);
+                                   const struct pipe_video_buffer *tmpl,
+                                   const uint64_t *modifiers,
+                                   int modifiers_count);
 
 #endif /* vl_video_buffer_h */
diff --git a/src/gallium/drivers/radeonsi/si_uvd.c 
b/src/gallium/drivers/radeonsi/si_uvd.c
index 0f38cce0f96..b6656fdc865 100644
--- a/src/gallium/drivers/radeonsi/si_uvd.c
+++ b/src/gallium/drivers/radeonsi/si_uvd.c
@@ -25,6 +25,7 @@
  *
  **************************************************************************/
 
+#include "drm-uapi/drm_fourcc.h"
 #include "radeon/radeon_uvd.h"
 #include "radeon/radeon_uvd_enc.h"
 #include "radeon/radeon_vce.h"
@@ -41,10 +42,20 @@ struct pipe_video_buffer *si_video_buffer_create(struct 
pipe_context *pipe,
                                                  const struct 
pipe_video_buffer *tmpl)
 {
    struct pipe_video_buffer vidbuf = *tmpl;
+   uint64_t *modifiers = NULL;
+   int modifiers_count = 0;
+   uint64_t mod = DRM_FORMAT_MOD_LINEAR;
+
    /* TODO: get tiling working */
    vidbuf.bind |= PIPE_BIND_LINEAR;
 
-   return vl_video_buffer_create_as_resource(pipe, &vidbuf);
+   if (pipe->screen->resource_create_with_modifiers) {
+      modifiers = &mod;
+      modifiers_count = 1;
+   }
+
+   return vl_video_buffer_create_as_resource(pipe, &vidbuf, modifiers,
+                                             modifiers_count);
 }
 
 /* set the decoding target buffer offsets */

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to