radeonsi/vcn: Add low latency encode support
This feature should be enabled for use cases when the lowest encoding latency is desired, such as real-time game streaming. Disabled by default due to increased power usage. There is no libva interface currently that could be used for this, so for now it can only be enabled by setting AMD_DEBUG=lowlatencyenc environment variable. See: https://gitlab.freedesktop.org/drm/amd/-/issues/3336 Reviewed-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/30039>
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) |
|
||||
|
||||
@@ -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) |
|
||||
|
||||
Reference in New Issue
Block a user