if (sscreen->info.has_hw_decode) {
sctx->b.create_video_codec = si_uvd_create_decoder;
sctx->b.create_video_buffer = si_video_buffer_create;
+ if (screen->resource_create_with_modifiers)
+ sctx->b.create_video_buffer_with_modifiers = si_video_buffer_create_with_modifiers;
} else {
sctx->b.create_video_codec = vl_create_decoder;
sctx->b.create_video_buffer = vl_video_buffer_create;
struct pipe_video_buffer *si_video_buffer_create(struct pipe_context *pipe,
const struct pipe_video_buffer *tmpl);
+struct pipe_video_buffer *si_video_buffer_create_with_modifiers(struct pipe_context *pipe,
+ const struct pipe_video_buffer *tmpl,
+ const uint64_t *modifiers,
+ unsigned int modifiers_count);
/* si_viewport.c */
void si_get_small_prim_cull_info(struct si_context *sctx, struct si_small_prim_cull_info *out);
int modifiers_count = 0;
uint64_t mod = DRM_FORMAT_MOD_LINEAR;
- /* TODO: get tiling working */
+ /* To get tiled buffers, users need to explicitly provide a list of
+ * modifiers. */
vidbuf.bind |= PIPE_BIND_LINEAR;
if (pipe->screen->resource_create_with_modifiers) {
modifiers_count);
}
+struct pipe_video_buffer *si_video_buffer_create_with_modifiers(struct pipe_context *pipe,
+ const struct pipe_video_buffer *tmpl,
+ const uint64_t *modifiers,
+ unsigned int modifiers_count)
+{
+ uint64_t *allowed_modifiers;
+ unsigned int allowed_modifiers_count, i;
+
+ /* Filter out DCC modifiers, because we don't support them for video
+ * for now. */
+ allowed_modifiers = calloc(modifiers_count, sizeof(uint64_t));
+ if (!allowed_modifiers)
+ return NULL;
+
+ allowed_modifiers_count = 0;
+ for (i = 0; i < modifiers_count; i++) {
+ if (ac_modifier_has_dcc(modifiers[i]))
+ continue;
+ allowed_modifiers[allowed_modifiers_count++] = modifiers[i];
+ }
+
+ struct pipe_video_buffer *buf =
+ vl_video_buffer_create_as_resource(pipe, tmpl, allowed_modifiers, allowed_modifiers_count);
+ free(allowed_modifiers);
+ return buf;
+}
+
/* set the decoding target buffer offsets */
static struct pb_buffer *si_uvd_set_dtb(struct ruvd_msg *msg, struct vl_video_buffer *buf)
{