ac/vcn_dec: Fix AV1 film grain on VCN5

Cc: mesa-stable
Reviewed-by: Ruijing Dong <ruijing.dong@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33376>
(cherry picked from commit 62b0f84981)
This commit is contained in:
David Rosca 2025-02-04 15:26:44 +01:00 committed by Eric Engestrom
parent 741763f32c
commit 19f1546fb3
5 changed files with 38 additions and 22 deletions

View file

@ -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

View file

@ -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;
}
}
}

View file

@ -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

View file

@ -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;

View file

@ -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");