From a7b3a279fb544431043908d12d5503916e18942e Mon Sep 17 00:00:00 2001 From: Ruijing Dong Date: Fri, 2 Dec 2022 16:11:52 -0500 Subject: [PATCH] radeonsi/vcn: av1 film_grain output fix use film grain surface as the output instead of target, which should be kept for DPB process. fixed: https://gitlab.freedesktop.org/mesa/mesa/-/issues/6903 CC: 22.3 Reviewed-by: Leo Liu Signed-off-by: Ruijing Dong Part-of: --- src/gallium/drivers/radeonsi/radeon_vcn_dec.c | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_dec.c b/src/gallium/drivers/radeonsi/radeon_vcn_dec.c index 389a3df3127..b6e39b4564b 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_dec.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_dec.c @@ -955,6 +955,16 @@ static void rvcn_av1_init_film_grain_buffer(rvcn_dec_film_grain_params_t *fg_par } } +static void rvcn_dec_av1_film_grain_surface(struct pipe_video_buffer **target, + struct pipe_av1_picture_desc *pic) +{ + if (!pic->picture_parameter.film_grain_info.film_grain_info_fields.apply_grain || + !pic->film_grain_target) + return; + + *target = pic->film_grain_target; +} + static rvcn_dec_message_av1_t get_av1_msg(struct radeon_decoder *dec, struct pipe_video_buffer *target, struct pipe_av1_picture_desc *pic) @@ -1917,9 +1927,9 @@ static struct pb_buffer *rvcn_dec_message_decode(struct radeon_decoder *dec, { DECRYPT_PARAMETERS *decrypt = (DECRYPT_PARAMETERS *)picture->decrypt_key; bool encrypted = (DECRYPT_PARAMETERS *)picture->protected_playback; - struct si_texture *luma = (struct si_texture *)((struct vl_video_buffer *)target)->resources[0]; - struct si_texture *chroma = - (struct si_texture *)((struct vl_video_buffer *)target)->resources[1]; + struct si_texture *luma; + struct si_texture *chroma; + struct pipe_video_buffer *out_surf = target; ASSERTED struct si_screen *sscreen = (struct si_screen *)dec->screen; rvcn_dec_message_header_t *header; rvcn_dec_message_index_t *index_codec; @@ -2117,9 +2127,15 @@ static struct pb_buffer *rvcn_dec_message_decode(struct radeon_decoder *dec, dec->ws->cs_flush(&dec->cs, RADEON_FLUSH_TOGGLE_SECURE_SUBMISSION, NULL); } + if (dec->stream_type == RDECODE_CODEC_AV1) + rvcn_dec_av1_film_grain_surface(&out_surf, (struct pipe_av1_picture_desc *)picture); + + luma = (struct si_texture *)((struct vl_video_buffer *)out_surf)->resources[0]; + chroma = (struct si_texture *)((struct vl_video_buffer *)out_surf)->resources[1]; + decode->dpb_size = (dec->dpb_type != DPB_DYNAMIC_TIER_2) ? dec->dpb.res->buf->size : 0; - decode->dt_size = si_resource(((struct vl_video_buffer *)target)->resources[0])->buf->size + - si_resource(((struct vl_video_buffer *)target)->resources[1])->buf->size; + decode->dt_size = si_resource(((struct vl_video_buffer *)out_surf)->resources[0])->buf->size + + si_resource(((struct vl_video_buffer *)out_surf)->resources[1])->buf->size; decode->sct_size = 0; decode->sc_coeff_size = 0; @@ -2146,7 +2162,7 @@ static struct pb_buffer *rvcn_dec_message_decode(struct radeon_decoder *dec, decode->dt_tiling_mode = 0; decode->dt_swizzle_mode = luma->surface.u.gfx9.swizzle_mode; decode->dt_array_mode = dec->addr_gfx_mode; - decode->dt_field_mode = ((struct vl_video_buffer *)target)->base.interlaced; + decode->dt_field_mode = ((struct vl_video_buffer *)out_surf)->base.interlaced; decode->dt_surf_tile_config = 0; decode->dt_uv_surf_tile_config = 0;