diff --git a/.pick_status.json b/.pick_status.json index 452d864894d..3e2fc41db8b 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -2864,7 +2864,7 @@ "description": "radv/video: Fix initializing rc structs with default rate control", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "32a02720a88a23cf3836d4515e81ab4164c68c0a", "notes": null diff --git a/src/amd/vulkan/radv_video_enc.c b/src/amd/vulkan/radv_video_enc.c index eae8b69dc16..7fa03e58181 100644 --- a/src/amd/vulkan/radv_video_enc.c +++ b/src/amd/vulkan/radv_video_enc.c @@ -174,6 +174,22 @@ radv_vcn_per_frame_frac(uint32_t bitrate, uint32_t den, uint32_t num) return (uint32_t)((remainder << 32) / num); } +static void +radv_enc_rc_layer_init_default(rvcn_enc_rate_ctl_layer_init_t *layer_init) +{ + uint32_t frame_rate_num = 30; + uint32_t frame_rate_den = 1; + + layer_init[0].frame_rate_den = frame_rate_den; + layer_init[0].frame_rate_num = frame_rate_num; + layer_init[0].vbv_buffer_size = 20000000; + layer_init[0].target_bit_rate = 16000; + layer_init[0].peak_bit_rate = 32000; + layer_init[0].avg_target_bits_per_picture = radv_vcn_per_frame_integer(16000, frame_rate_den, frame_rate_num); + layer_init[0].peak_bits_per_picture_integer = radv_vcn_per_frame_integer(32000, frame_rate_den, frame_rate_num); + layer_init[0].peak_bits_per_picture_fractional = radv_vcn_per_frame_frac(32000, frame_rate_den, frame_rate_num); +} + static void radv_enc_set_emulation_prevention(struct radv_cmd_buffer *cmd_buffer, bool set) { @@ -3051,22 +3067,10 @@ radv_video_enc_control_video_coding(struct radv_cmd_buffer *cmd_buffer, const Vk rvcn_enc_rate_ctl_per_picture_t rc_per_pic[RADV_ENC_MAX_RATE_LAYER]; if (control_info->flags & VK_VIDEO_CODING_CONTROL_RESET_BIT_KHR) { - uint32_t frame_rate_num = 30; - uint32_t frame_rate_den = 1; - cmd_buffer->video.enc.rate_control_mode = VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHR; cmd_buffer->video.enc.rate_control_num_layers = 1; radv_enc_rc_per_pic_default(vid, &rc_per_pic[0]); - rc_layer_init[0].frame_rate_den = frame_rate_den; - rc_layer_init[0].frame_rate_num = frame_rate_num; - rc_layer_init[0].vbv_buffer_size = 20000000; - rc_layer_init[0].target_bit_rate = 16000; - rc_layer_init[0].peak_bit_rate = 32000; - rc_layer_init[0].avg_target_bits_per_picture = radv_vcn_per_frame_integer(16000, frame_rate_den, frame_rate_num); - rc_layer_init[0].peak_bits_per_picture_integer = - radv_vcn_per_frame_integer(32000, frame_rate_den, frame_rate_num); - rc_layer_init[0].peak_bits_per_picture_fractional = - radv_vcn_per_frame_frac(32000, frame_rate_den, frame_rate_num); + radv_enc_rc_layer_init_default(&rc_layer_init[0]); session_init = true; rate_control_init = true; @@ -3085,7 +3089,11 @@ radv_video_enc_control_video_coding(struct radv_cmd_buffer *cmd_buffer, const Vk cmd_buffer->video.enc.rate_control_mode = rate_control->rateControlMode; - if (rate_control->rateControlMode != VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHR) { + if (rate_control->rateControlMode == VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHR) { + cmd_buffer->video.enc.rate_control_num_layers = 1; + radv_enc_rc_per_pic_default(vid, &rc_per_pic[0]); + radv_enc_rc_layer_init_default(&rc_layer_init[0]); + } else { if (h264_rate_control) cmd_buffer->video.enc.rate_control_num_layers = MAX2(1, h264_rate_control->temporalLayerCount); else if (h265_rate_control)