diff --git a/src/amd/common/ac_vcn_enc.h b/src/amd/common/ac_vcn_enc.h index 3708d19828c..5ee42c1c425 100644 --- a/src/amd/common/ac_vcn_enc.h +++ b/src/amd/common/ac_vcn_enc.h @@ -655,6 +655,7 @@ typedef struct rvcn_enc_cmd_s { uint32_t enc_qp_map; uint32_t metadata; uint32_t ctx_override; + uint32_t enc_latency; } rvcn_enc_cmd_t; typedef struct rvcn_enc_quality_modes_s @@ -784,4 +785,9 @@ typedef struct rvcn_enc_qp_map_s struct rvcn_enc_qp_map_region map[RENCODE_QP_MAP_MAX_REGIONS]; }rvcn_enc_qp_map_t; +typedef struct rvcn_enc_latency_s +{ + uint32_t encode_latency; +} rvcn_enc_latency_t; + #endif diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_enc.c b/src/gallium/drivers/radeonsi/radeon_vcn_enc.c index 9b2c95ea564..0f0ff698d2d 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc.c @@ -195,6 +195,14 @@ static void radeon_vcn_enc_get_roi_param(struct radeon_encoder *enc, } } +static void radeon_vcn_enc_get_latency_param(struct radeon_encoder *enc) +{ + struct si_screen *sscreen = (struct si_screen *)enc->screen; + + enc->enc_pic.enc_latency.encode_latency = + sscreen->debug_flags & DBG(LOW_LATENCY_ENCODE) ? 1000 : 0; +} + static void radeon_vcn_enc_h264_get_cropping_param(struct radeon_encoder *enc, struct pipe_h264_enc_picture_desc *pic) { @@ -455,6 +463,7 @@ static void radeon_vcn_enc_h264_get_param(struct radeon_encoder *enc, use_filter = enc->enc_pic.h264_deblock.disable_deblocking_filter_idc != 1; radeon_vcn_enc_get_intra_refresh_param(enc, use_filter, &pic->intra_refresh); radeon_vcn_enc_get_roi_param(enc, &pic->roi); + radeon_vcn_enc_get_latency_param(enc); } static void radeon_vcn_enc_hevc_get_cropping_param(struct radeon_encoder *enc, @@ -679,6 +688,7 @@ static void radeon_vcn_enc_hevc_get_param(struct radeon_encoder *enc, !(enc->enc_pic.hevc_deblock.deblocking_filter_disabled), &pic->intra_refresh); radeon_vcn_enc_get_roi_param(enc, &pic->roi); + radeon_vcn_enc_get_latency_param(enc); } static void radeon_vcn_enc_av1_get_spec_misc_param(struct radeon_encoder *enc, @@ -892,6 +902,7 @@ static void radeon_vcn_enc_av1_get_param(struct radeon_encoder *enc, true, &pic->intra_refresh); radeon_vcn_enc_get_roi_param(enc, &pic->roi); + radeon_vcn_enc_get_latency_param(enc); } static void radeon_vcn_enc_get_param(struct radeon_encoder *enc, struct pipe_picture_desc *picture) diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_enc.h b/src/gallium/drivers/radeonsi/radeon_vcn_enc.h index ecf719e8523..1f303ce7fbd 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc.h +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc.h @@ -187,6 +187,7 @@ struct radeon_enc_pic { rvcn_enc_output_format_t enc_output_format; rvcn_enc_qp_map_t enc_qp_map; rvcn_enc_metadata_buffer_t metadata; + rvcn_enc_latency_t enc_latency; }; struct radeon_encoder { @@ -237,6 +238,7 @@ struct radeon_encoder { void (*ctx_override)(struct radeon_encoder *enc); void (*metadata)(struct radeon_encoder *enc); void (*tile_config)(struct radeon_encoder *enc); + void (*encode_latency)(struct radeon_encoder *enc); /* mq is used for preversing multiple queue ibs */ void (*mq_begin)(struct radeon_encoder *enc); void (*mq_encode)(struct radeon_encoder *enc); diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_enc_1_2.c b/src/gallium/drivers/radeonsi/radeon_vcn_enc_1_2.c index 645e30d9f14..d533246ec34 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc_1_2.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc_1_2.c @@ -36,6 +36,7 @@ #define RENCODE_IB_PARAM_RATE_CONTROL_PER_PIC_EX 0x0000001d #define RENCODE_IB_PARAM_DIRECT_OUTPUT_NALU 0x00000020 #define RENCODE_IB_PARAM_QP_MAP 0x00000021 +#define RENCODE_IB_PARAM_ENCODE_LATENCY 0x00000022 #define RENCODE_IB_PARAM_ENCODE_STATISTICS 0x00000024 #define RENCODE_HEVC_IB_PARAM_SLICE_CONTROL 0x00100001 @@ -1318,6 +1319,13 @@ static void radeon_enc_qp_map(struct radeon_encoder *enc) RADEON_ENC_END(); } +static void radeon_enc_encode_latency(struct radeon_encoder *enc) +{ + RADEON_ENC_BEGIN(enc->cmd.enc_latency); + RADEON_ENC_CS(enc->enc_pic.enc_latency.encode_latency); + RADEON_ENC_END(); +} + static void radeon_enc_op_init(struct radeon_encoder *enc) { RADEON_ENC_BEGIN(RENCODE_IB_OP_INITIALIZE); @@ -1380,6 +1388,7 @@ static void begin(struct radeon_encoder *enc) enc->layer_control(enc); enc->rc_session_init(enc); enc->quality_params(enc); + enc->encode_latency(enc); i = 0; do { @@ -1617,6 +1626,7 @@ void radeon_enc_1_2_init(struct radeon_encoder *enc) enc->encode_statistics = radeon_enc_encode_statistics; enc->nalu_aud = radeon_enc_nalu_aud; enc->qp_map = radeon_enc_qp_map; + enc->encode_latency = radeon_enc_encode_latency; if (u_reduce_video_profile(enc->base.profile) == PIPE_VIDEO_FORMAT_MPEG4_AVC) { enc->slice_control = radeon_enc_slice_control; @@ -1669,6 +1679,7 @@ void radeon_enc_1_2_init(struct radeon_encoder *enc) enc->cmd.deblocking_filter_h264 = RENCODE_H264_IB_PARAM_DEBLOCKING_FILTER; enc->cmd.enc_statistics = RENCODE_IB_PARAM_ENCODE_STATISTICS; enc->cmd.enc_qp_map = RENCODE_IB_PARAM_QP_MAP; + enc->cmd.enc_latency = RENCODE_IB_PARAM_ENCODE_LATENCY; enc->enc_pic.session_info.interface_version = ((RENCODE_FW_INTERFACE_MAJOR_VERSION << RENCODE_IF_MAJOR_VERSION_SHIFT) | diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_enc_2_0.c b/src/gallium/drivers/radeonsi/radeon_vcn_enc_2_0.c index 7ba95ec6a43..e703d472414 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc_2_0.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc_2_0.c @@ -35,6 +35,7 @@ #define RENCODE_IB_PARAM_VIDEO_BITSTREAM_BUFFER 0x00000012 #define RENCODE_IB_PARAM_QP_MAP 0x00000014 #define RENCODE_IB_PARAM_FEEDBACK_BUFFER 0x00000015 +#define RENCODE_IB_PARAM_ENCODE_LATENCY 0x00000018 #define RENCODE_IB_PARAM_ENCODE_STATISTICS 0x00000019 #define RENCODE_HEVC_IB_PARAM_SLICE_CONTROL 0x00100001 @@ -590,6 +591,7 @@ void radeon_enc_2_0_init(struct radeon_encoder *enc) enc->cmd.deblocking_filter_h264 = RENCODE_H264_IB_PARAM_DEBLOCKING_FILTER; enc->cmd.enc_statistics = RENCODE_IB_PARAM_ENCODE_STATISTICS; enc->cmd.enc_qp_map = RENCODE_IB_PARAM_QP_MAP; + enc->cmd.enc_latency = RENCODE_IB_PARAM_ENCODE_LATENCY; enc->enc_pic.session_info.interface_version = ((RENCODE_FW_INTERFACE_MAJOR_VERSION << RENCODE_IF_MAJOR_VERSION_SHIFT) |