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 <ruijing.dong@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31148>
This commit is contained in:
David Rosca 2024-08-29 19:06:36 +02:00 committed by Marge Bot
parent d2ad188915
commit 6a598cccc3
3 changed files with 13 additions and 5 deletions

View file

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

View file

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

View file

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