radeonsi/vcn: support encoding preset modes
authorRuijing Dong <ruijing.dong@amd.com>
Fri, 19 Aug 2022 23:59:59 +0000 (19:59 -0400)
committerMarge Bot <emma+marge@anholt.net>
Tue, 23 Aug 2022 15:56:07 +0000 (15:56 +0000)
- support preset modes for all vcn versions
- SAO HEVC cannot use SPEED mode from vcn2 and up

Signed-off-by: Ruijing Dong <ruijing.dong@amd.com>
Reviewed-by: Boyuan Zhang <boyuan.zhang@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17994>

src/gallium/drivers/radeonsi/radeon_vcn_enc_1_2.c
src/gallium/drivers/radeonsi/radeon_vcn_enc_2_0.c

index b48695c..aeaeab5 100644 (file)
@@ -1205,9 +1205,18 @@ static void radeon_enc_op_init_rc_vbv(struct radeon_encoder *enc)
    RADEON_ENC_END();
 }
 
-static void radeon_enc_op_speed(struct radeon_encoder *enc)
+static void radeon_enc_op_preset(struct radeon_encoder *enc)
 {
-   RADEON_ENC_BEGIN(RENCODE_IB_OP_SET_SPEED_ENCODING_MODE);
+   uint32_t preset_mode;
+
+   if (enc->enc_pic.quality_modes.preset_mode == RENCODE_PRESET_MODE_QUALITY)
+      preset_mode = RENCODE_IB_OP_SET_QUALITY_ENCODING_MODE;
+   else if (enc->enc_pic.quality_modes.preset_mode == RENCODE_PRESET_MODE_BALANCE)
+      preset_mode = RENCODE_IB_OP_SET_BALANCE_ENCODING_MODE;
+   else
+      preset_mode = RENCODE_IB_OP_SET_SPEED_ENCODING_MODE;
+
+   RADEON_ENC_BEGIN(preset_mode);
    RADEON_ENC_END();
 }
 
@@ -1381,7 +1390,7 @@ void radeon_enc_1_2_init(struct radeon_encoder *enc)
    enc->op_enc = radeon_enc_op_enc;
    enc->op_init_rc = radeon_enc_op_init_rc;
    enc->op_init_rc_vbv = radeon_enc_op_init_rc_vbv;
-   enc->op_preset = radeon_enc_op_speed;
+   enc->op_preset = radeon_enc_op_preset;
    enc->encode_params = radeon_enc_encode_params;
    enc->session_init = radeon_enc_session_init;
 
index cfa38cd..af6e1bc 100644 (file)
 #define RENCODE_COLOR_PACKING_FORMAT_NV12          0
 #define RENCODE_COLOR_PACKING_FORMAT_P010          1
 
-static void radeon_enc_op_balance(struct radeon_encoder *enc)
+static void radeon_enc_op_preset(struct radeon_encoder *enc)
 {
-   RADEON_ENC_BEGIN(RENCODE_IB_OP_SET_BALANCE_ENCODING_MODE);
+   uint32_t preset_mode;
+
+   if (enc->enc_pic.quality_modes.preset_mode == RENCODE_PRESET_MODE_SPEED &&
+         (enc->enc_pic.sample_adaptive_offset_enabled_flag &&
+         (u_reduce_video_profile(enc->base.profile) == PIPE_VIDEO_FORMAT_HEVC)))
+      preset_mode = RENCODE_IB_OP_SET_BALANCE_ENCODING_MODE;
+   else if (enc->enc_pic.quality_modes.preset_mode == RENCODE_PRESET_MODE_QUALITY)
+      preset_mode = RENCODE_IB_OP_SET_QUALITY_ENCODING_MODE;
+   else if (enc->enc_pic.quality_modes.preset_mode == RENCODE_PRESET_MODE_BALANCE)
+      preset_mode = RENCODE_IB_OP_SET_BALANCE_ENCODING_MODE;
+   else
+      preset_mode = RENCODE_IB_OP_SET_SPEED_ENCODING_MODE;
+
+   RADEON_ENC_BEGIN(preset_mode);
    RADEON_ENC_END();
 }
 
@@ -489,7 +502,7 @@ void radeon_enc_2_0_init(struct radeon_encoder *enc)
    enc->input_format = radeon_enc_input_format;
    enc->output_format = radeon_enc_output_format;
    enc->ctx = radeon_enc_ctx;
-   enc->op_preset = radeon_enc_op_balance;
+   enc->op_preset = radeon_enc_op_preset;
 
    if (u_reduce_video_profile(enc->base.profile) == PIPE_VIDEO_FORMAT_HEVC) {
       enc->deblocking_filter = radeon_enc_loop_filter_hevc;