From 6a598cccc3ca9b64c291959a537e818014cf9cef Mon Sep 17 00:00:00 2001 From: David Rosca Date: Thu, 29 Aug 2024 19:06:36 +0200 Subject: [PATCH] radeonsi/vcn: Select layer for rate control This makes the per-layer rate control work. Previously it would always use rate control params for last configured layer. Reviewed-by: Ruijing Dong Part-of: --- src/gallium/drivers/radeonsi/radeon_vcn_enc.c | 12 +++++++----- src/gallium/drivers/radeonsi/radeon_vcn_enc_1_2.c | 3 +++ src/gallium/drivers/radeonsi/radeon_vcn_enc_2_0.c | 3 +++ 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_enc.c b/src/gallium/drivers/radeonsi/radeon_vcn_enc.c index 9ffd61c810e..748873f401d 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc.c @@ -279,6 +279,8 @@ static void radeon_vcn_enc_h264_get_rc_param(struct radeon_encoder *enc, uint32_t frame_rate_den, frame_rate_num, max_qp; enc->enc_pic.num_temporal_layers = pic->seq.num_temporal_layers ? pic->seq.num_temporal_layers : 1; + enc->enc_pic.temporal_id = MIN2(pic->pic_ctrl.temporal_id, enc->enc_pic.num_temporal_layers - 1); + for (int i = 0; i < enc->enc_pic.num_temporal_layers; i++) { enc->enc_pic.rc_layer_init[i].target_bit_rate = pic->rate_ctrl[i].target_bitrate; enc->enc_pic.rc_layer_init[i].peak_bit_rate = pic->rate_ctrl[i].peak_bitrate; @@ -568,6 +570,8 @@ static void radeon_vcn_enc_hevc_get_rc_param(struct radeon_encoder *enc, uint32_t frame_rate_den, frame_rate_num, max_qp; enc->enc_pic.num_temporal_layers = pic->seq.num_temporal_layers ? pic->seq.num_temporal_layers : 1; + enc->enc_pic.temporal_id = MIN2(pic->pic.temporal_id, enc->enc_pic.num_temporal_layers - 1); + for (int i = 0; i < enc->enc_pic.num_temporal_layers; i++) { enc->enc_pic.rc_layer_init[i].target_bit_rate = pic->rc[i].target_bitrate; enc->enc_pic.rc_layer_init[i].peak_bit_rate = pic->rc[i].peak_bitrate; @@ -682,7 +686,6 @@ static void radeon_vcn_enc_hevc_get_param(struct radeon_encoder *enc, enc->enc_pic.bit_depth_luma_minus8 = pic->seq.bit_depth_luma_minus8; enc->enc_pic.bit_depth_chroma_minus8 = pic->seq.bit_depth_chroma_minus8; enc->enc_pic.nal_unit_type = pic->pic.nal_unit_type; - enc->enc_pic.temporal_id = pic->pic.temporal_id; if (enc->dpb_type == DPB_TIER_2) { for (uint32_t i = 0; i < ARRAY_SIZE(pic->dpb); i++) { @@ -762,6 +765,9 @@ static void radeon_vcn_enc_av1_get_rc_param(struct radeon_encoder *enc, { uint32_t frame_rate_den, frame_rate_num, min_qp, max_qp; + enc->enc_pic.num_temporal_layers = pic->seq.num_temporal_layers ? pic->seq.num_temporal_layers : 1; + enc->enc_pic.temporal_id = MIN2(pic->temporal_id, enc->enc_pic.num_temporal_layers - 1); + for (int i = 0; i < ARRAY_SIZE(enc->enc_pic.rc_layer_init); i++) { enc->enc_pic.rc_layer_init[i].target_bit_rate = pic->rc[i].target_bitrate; enc->enc_pic.rc_layer_init[i].peak_bit_rate = pic->rc[i].peak_bitrate; @@ -875,10 +881,6 @@ static void radeon_vcn_enc_av1_get_param(struct radeon_encoder *enc, enc_pic->render_width = pic->render_width; enc_pic->render_height = pic->render_height; - enc_pic->num_temporal_layers = - pic->seq.num_temporal_layers <= RENCODE_MAX_NUM_TEMPORAL_LAYERS ? - pic->seq.num_temporal_layers : RENCODE_MAX_NUM_TEMPORAL_LAYERS; - enc_pic->enc_params.reference_picture_index = pic->ref_list0[0] == PIPE_H2645_LIST_REF_INVALID_ENTRY ? 0xffffffff : pic->dpb_ref_frame_idx[pic->ref_list0[0]]; diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_enc_1_2.c b/src/gallium/drivers/radeonsi/radeon_vcn_enc_1_2.c index 5aca2c182a4..479c37cc15d 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc_1_2.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc_1_2.c @@ -1438,6 +1438,9 @@ static void encode(struct radeon_encoder *enc) } while (++i < enc->enc_pic.num_temporal_layers); } + enc->enc_pic.layer_sel.temporal_layer_index = enc->enc_pic.temporal_id; + enc->layer_select(enc); + enc->encode_headers(enc); enc->ctx(enc); enc->bitstream(enc); diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_enc_2_0.c b/src/gallium/drivers/radeonsi/radeon_vcn_enc_2_0.c index 24efc4b4bc3..1414c8992c1 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc_2_0.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc_2_0.c @@ -168,6 +168,9 @@ static void encode(struct radeon_encoder *enc) } while (++i < enc->enc_pic.num_temporal_layers); } + enc->enc_pic.layer_sel.temporal_layer_index = enc->enc_pic.temporal_id; + enc->layer_select(enc); + enc->encode_headers(enc); enc->ctx(enc); enc->ctx_override(enc);