radeonsi/vcn: Add High Quality encoding preset for AV1

Reviewed-by: Boyuan Zhang <Boyuan.Zhang@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25564>
This commit is contained in:
David Rosca
2023-10-03 17:55:54 +02:00
committed by Marge Bot
parent 75fe0ad8e7
commit ff36024576
3 changed files with 31 additions and 2 deletions
+2
View File
@@ -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
@@ -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;
@@ -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;