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 */