Module: Mesa Branch: main Commit: ff3602457690d7b5bb05cb74e62959ce36af5cf6 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=ff3602457690d7b5bb05cb74e62959ce36af5cf6
Author: David Rosca <[email protected]> Date: Tue Oct 3 17:55:54 2023 +0200 radeonsi/vcn: Add High Quality encoding preset for AV1 Reviewed-by: Boyuan Zhang <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25564> --- src/amd/common/ac_vcn_enc.h | 2 ++ src/gallium/drivers/radeonsi/radeon_vcn_enc.c | 9 +++++++-- src/gallium/drivers/radeonsi/radeon_vcn_enc_4_0.c | 22 ++++++++++++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/amd/common/ac_vcn_enc.h b/src/amd/common/ac_vcn_enc.h index 382143cb992..41a63d7ddcd 100644 --- a/src/amd/common/ac_vcn_enc.h +++ b/src/amd/common/ac_vcn_enc.h @@ -36,6 +36,7 @@ #define RENCODE_IB_OP_SET_SPEED_ENCODING_MODE 0x01000006 #define RENCODE_IB_OP_SET_BALANCE_ENCODING_MODE 0x01000007 #define RENCODE_IB_OP_SET_QUALITY_ENCODING_MODE 0x01000008 +#define RENCODE_IB_OP_SET_HIGH_QUALITY_ENCODING_MODE 0x01000009 #define RENCODE_IF_MAJOR_VERSION_MASK 0xFFFF0000 #define RENCODE_IF_MAJOR_VERSION_SHIFT 16 @@ -59,6 +60,7 @@ #define RENCODE_PRESET_MODE_SPEED 0x00000000 #define RENCODE_PRESET_MODE_BALANCE 0x00000001 #define RENCODE_PRESET_MODE_QUALITY 0x00000002 +#define RENCODE_PRESET_MODE_HIGH_QUALITY 0x00000003 #define RENCODE_H264_SLICE_CONTROL_MODE_FIXED_MBS 0x00000000 #define RENCODE_H264_SLICE_CONTROL_MODE_FIXED_BITS 0x00000001 diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_enc.c b/src/gallium/drivers/radeonsi/radeon_vcn_enc.c index 2510a3346bb..d79bcd101eb 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc.c @@ -26,9 +26,14 @@ static void radeon_vcn_enc_quality_modes(struct radeon_encoder *enc, { rvcn_enc_quality_modes_t *p = &enc->enc_pic.quality_modes; - p->preset_mode = in->preset_mode > RENCODE_PRESET_MODE_QUALITY - ? RENCODE_PRESET_MODE_QUALITY + p->preset_mode = in->preset_mode > RENCODE_PRESET_MODE_HIGH_QUALITY + ? RENCODE_PRESET_MODE_HIGH_QUALITY : in->preset_mode; + + if (u_reduce_video_profile(enc->base.profile) != PIPE_VIDEO_FORMAT_AV1 && + p->preset_mode == RENCODE_PRESET_MODE_HIGH_QUALITY) + p->preset_mode = RENCODE_PRESET_MODE_QUALITY; + p->pre_encode_mode = in->pre_encode_mode ? RENCODE_PREENCODE_MODE_4X : RENCODE_PREENCODE_MODE_NONE; p->vbaq_mode = in->vbaq_mode ? RENCODE_VBAQ_AUTO : RENCODE_VBAQ_NONE; diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_enc_4_0.c b/src/gallium/drivers/radeonsi/radeon_vcn_enc_4_0.c index 99b0edc04ae..37fb9991e61 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc_4_0.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc_4_0.c @@ -58,6 +58,27 @@ static void radeon_enc_sq_destroy(struct radeon_encoder *enc) rvcn_sq_tail(&enc->cs, &enc->sq); } +static void radeon_enc_op_preset(struct radeon_encoder *enc) +{ + 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_HIGH_QUALITY) + preset_mode = RENCODE_IB_OP_SET_HIGH_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(); +} + static void radeon_enc_session_init(struct radeon_encoder *enc) { bool av1_encoding = false; @@ -1014,6 +1035,7 @@ void radeon_enc_4_0_init(struct radeon_encoder *enc) enc->begin = radeon_enc_sq_begin; enc->encode = radeon_enc_sq_encode; enc->destroy = radeon_enc_sq_destroy; + enc->op_preset = radeon_enc_op_preset; if (u_reduce_video_profile(enc->base.profile) == PIPE_VIDEO_FORMAT_AV1) { enc->before_encode = radeon_enc_av1_dpb_management;
