From 19f1546fb3b34fa12a266b47997ccf2774184647 Mon Sep 17 00:00:00 2001 From: David Rosca Date: Tue, 4 Feb 2025 15:26:44 +0100 Subject: [PATCH] ac/vcn_dec: Fix AV1 film grain on VCN5 Cc: mesa-stable Reviewed-by: Ruijing Dong Part-of: (cherry picked from commit 62b0f849813739282d141bbc3fb4539aeea78f83) --- .pick_status.json | 2 +- src/amd/common/ac_vcn_dec.c | 46 ++++++++++++------- src/amd/common/ac_vcn_dec.h | 3 +- src/amd/vulkan/radv_video.c | 3 +- src/gallium/drivers/radeonsi/radeon_vcn_dec.c | 6 +-- 5 files changed, 38 insertions(+), 22 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 78af32e0fba..6784be5d094 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -694,7 +694,7 @@ "description": "ac/vcn_dec: Fix AV1 film grain on VCN5", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/amd/common/ac_vcn_dec.c b/src/amd/common/ac_vcn_dec.c index bd56a7010e6..b358f652d4e 100644 --- a/src/amd/common/ac_vcn_dec.c +++ b/src/amd/common/ac_vcn_dec.c @@ -412,7 +412,7 @@ radv_vcn_av1_film_grain_init_scaling(uint8_t scaling_points[][2], uint8_t num, s } void -ac_vcn_av1_init_film_grain_buffer(rvcn_dec_film_grain_params_t *fg_params, rvcn_dec_av1_fg_init_buf_t *fg_buf) +ac_vcn_av1_init_film_grain_buffer(unsigned av1_version, rvcn_dec_film_grain_params_t *fg_params, rvcn_dec_av1_fg_init_buf_t *fg_buf) { const int32_t luma_block_size_y = LUMA_BLOCK_SIZE_Y; const int32_t luma_block_size_x = LUMA_BLOCK_SIZE_X; @@ -542,24 +542,38 @@ ac_vcn_av1_init_film_grain_buffer(rvcn_dec_film_grain_params_t *fg_params, rvcn_ } align_ptr = &fg_buf->luma_grain_block[0][0]; - for (i = 0; i < 64; i++) { - for (j = 0; j < 80; j++) - *align_ptr++ = luma_grain_block_tmp[i][j]; - - if (((i + 1) % 4) == 0) - align_ptr += 64; - } - align_ptr0 = &fg_buf->cb_grain_block[0][0]; align_ptr1 = &fg_buf->cr_grain_block[0][0]; - for (i = 0; i < 32; i++) { - for (j = 0; j < 40; j++) { - *align_ptr0++ = cb_grain_block_tmp[i][j]; - *align_ptr1++ = cr_grain_block_tmp[i][j]; + + if (av1_version == RDECODE_AV1_VER_2) { + for (i = 0; i < 64; i++) + for (j = 0; j < 64; j++) + *align_ptr++ = luma_grain_block_tmp[i][j]; + + for (i = 0; i < 32; i++) { + for (j = 0; j < 32; j++) { + *align_ptr0++ = cb_grain_block_tmp[i][j]; + *align_ptr1++ = cr_grain_block_tmp[i][j]; + } } - if (((i + 1) % 8) == 0) { - align_ptr0 += 64; - align_ptr1 += 64; + } else { + for (i = 0; i < 64; i++) { + for (j = 0; j < 80; j++) + *align_ptr++ = luma_grain_block_tmp[i][j]; + + if (((i + 1) % 4) == 0) + align_ptr += 64; + } + + for (i = 0; i < 32; i++) { + for (j = 0; j < 40; j++) { + *align_ptr0++ = cb_grain_block_tmp[i][j]; + *align_ptr1++ = cr_grain_block_tmp[i][j]; + } + if (((i + 1) % 8) == 0) { + align_ptr0 += 64; + align_ptr1 += 64; + } } } diff --git a/src/amd/common/ac_vcn_dec.h b/src/amd/common/ac_vcn_dec.h index 2d9ec343858..8ee00ad10a5 100644 --- a/src/amd/common/ac_vcn_dec.h +++ b/src/amd/common/ac_vcn_dec.h @@ -433,6 +433,7 @@ #define RDECODE_AV1_VER_0 0 #define RDECODE_AV1_VER_1 1 +#define RDECODE_AV1_VER_2 2 typedef struct rvcn_decode_buffer_s { unsigned int valid_buf_flag; @@ -1216,6 +1217,6 @@ struct jpeg_params { unsigned ac_vcn_dec_calc_ctx_size_av1(unsigned av1_version); void ac_vcn_av1_init_probs(unsigned av1_version, uint8_t *prob); -void ac_vcn_av1_init_film_grain_buffer(rvcn_dec_film_grain_params_t *fg_params, rvcn_dec_av1_fg_init_buf_t *fg_buf); +void ac_vcn_av1_init_film_grain_buffer(unsigned av1_version, rvcn_dec_film_grain_params_t *fg_params, rvcn_dec_av1_fg_init_buf_t *fg_buf); #endif diff --git a/src/amd/vulkan/radv_video.c b/src/amd/vulkan/radv_video.c index 1c7fc52aa9d..2b433cd6ca6 100644 --- a/src/amd/vulkan/radv_video.c +++ b/src/amd/vulkan/radv_video.c @@ -1523,6 +1523,7 @@ static rvcn_dec_message_av1_t get_av1_msg(struct radv_device *device, struct radv_video_session *vid, struct radv_video_session_params *params, const struct VkVideoDecodeInfoKHR *frame_info, void *probs_ptr, int *update_reference_slot) { + const struct radv_physical_device *pdev = radv_device_physical(device); rvcn_dec_message_av1_t result; unsigned i, j; const struct VkVideoDecodeAV1PictureInfoKHR *av1_pic_info = @@ -1879,7 +1880,7 @@ get_av1_msg(struct radv_device *device, struct radv_video_session *vid, struct r fg_params->overlap_flag = pi->pFilmGrain->flags.overlap_flag; fg_params->clip_to_restricted_range = pi->pFilmGrain->flags.clip_to_restricted_range; - ac_vcn_av1_init_film_grain_buffer(fg_params, fg_buf); + ac_vcn_av1_init_film_grain_buffer(pdev->av1_version, fg_params, fg_buf); } result.uncompressed_header_size = 0; diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_dec.c b/src/gallium/drivers/radeonsi/radeon_vcn_dec.c index 6555bbbb445..86939ffb40a 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_dec.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_dec.c @@ -1092,7 +1092,7 @@ static rvcn_dec_message_av1_t get_av1_msg(struct radeon_decoder *dec, fg_params->clip_to_restricted_range = pic->picture_parameter.film_grain_info.film_grain_info_fields.clip_to_restricted_range; - ac_vcn_av1_init_film_grain_buffer(fg_params, fg_buf); + ac_vcn_av1_init_film_grain_buffer(dec->av1_version, fg_params, fg_buf); } result.uncompressed_header_size = 0; @@ -2952,12 +2952,12 @@ struct pipe_video_codec *radeon_create_decoder(struct pipe_context *context, case VCN_5_0_0: dec->jpg_reg.version = RDECODE_JPEG_REG_VER_V3; dec->addr_gfx_mode = RDECODE_ARRAY_MODE_ADDRLIB_SEL_GFX11; - dec->av1_version = RDECODE_AV1_VER_1; + dec->av1_version = RDECODE_AV1_VER_2; break; case VCN_5_0_1: dec->jpg_reg.version = RDECODE_JPEG_REG_VER_V3; dec->addr_gfx_mode = RDECODE_ARRAY_MODE_ADDRLIB_SEL_GFX9; - dec->av1_version = RDECODE_AV1_VER_1; + dec->av1_version = RDECODE_AV1_VER_2; break; default: RADEON_DEC_ERR("VCN is not supported.\n");