From efde05c631c1f34ed31485f9d713fc0249164603 Mon Sep 17 00:00:00 2001 From: Boyuan Zhang Date: Sat, 26 Feb 2022 19:49:08 -0500 Subject: [PATCH] radeonsi/vcn: add session init ib for vcn 4.0 Implement session init ib based on new interface for VCN 4.0. Signed-off-by: Boyuan Zhang Acked-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/gallium/drivers/radeonsi/radeon_vcn_enc.h | 1 + .../drivers/radeonsi/radeon_vcn_enc_4_0.c | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_enc.h b/src/gallium/drivers/radeonsi/radeon_vcn_enc.h index 70d5edba146..5824b0eab72 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc.h +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc.h @@ -187,6 +187,7 @@ typedef struct rvcn_enc_session_init_s { uint32_t padding_height; uint32_t pre_encode_mode; uint32_t pre_encode_chroma_enabled; + uint32_t slice_output_enabled; uint32_t display_remote; } rvcn_enc_session_init_t; 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 b45c2c26819..0c349863483 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc_4_0.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc_4_0.c @@ -38,6 +38,38 @@ #define RENCODE_FW_INTERFACE_MAJOR_VERSION 1 #define RENCODE_FW_INTERFACE_MINOR_VERSION 0 +static void radeon_enc_session_init(struct radeon_encoder *enc) +{ + if (u_reduce_video_profile(enc->base.profile) == PIPE_VIDEO_FORMAT_MPEG4_AVC) { + enc->enc_pic.session_init.encode_standard = RENCODE_ENCODE_STANDARD_H264; + enc->enc_pic.session_init.aligned_picture_width = align(enc->base.width, 16); + } else if (u_reduce_video_profile(enc->base.profile) == PIPE_VIDEO_FORMAT_HEVC) { + enc->enc_pic.session_init.encode_standard = RENCODE_ENCODE_STANDARD_HEVC; + enc->enc_pic.session_init.aligned_picture_width = align(enc->base.width, 64); + } + enc->enc_pic.session_init.aligned_picture_height = align(enc->base.height, 16); + enc->enc_pic.session_init.padding_width = + enc->enc_pic.session_init.aligned_picture_width - enc->base.width; + enc->enc_pic.session_init.padding_height = + enc->enc_pic.session_init.aligned_picture_height - enc->base.height; + enc->enc_pic.session_init.pre_encode_mode = RENCODE_PREENCODE_MODE_NONE; + enc->enc_pic.session_init.pre_encode_chroma_enabled = false; + enc->enc_pic.session_init.slice_output_enabled = false; + enc->enc_pic.session_init.display_remote = 0; + + RADEON_ENC_BEGIN(enc->cmd.session_init); + RADEON_ENC_CS(enc->enc_pic.session_init.encode_standard); + RADEON_ENC_CS(enc->enc_pic.session_init.aligned_picture_width); + RADEON_ENC_CS(enc->enc_pic.session_init.aligned_picture_height); + RADEON_ENC_CS(enc->enc_pic.session_init.padding_width); + RADEON_ENC_CS(enc->enc_pic.session_init.padding_height); + RADEON_ENC_CS(enc->enc_pic.session_init.pre_encode_mode); + RADEON_ENC_CS(enc->enc_pic.session_init.pre_encode_chroma_enabled); + RADEON_ENC_CS(enc->enc_pic.session_init.slice_output_enabled); + RADEON_ENC_CS(enc->enc_pic.session_init.display_remote); + RADEON_ENC_END(); +} + static void radeon_enc_ctx(struct radeon_encoder *enc) { enc->enc_pic.ctx_buf.swizzle_mode = 0; @@ -95,6 +127,7 @@ void radeon_enc_4_0_init(struct radeon_encoder *enc) { radeon_enc_3_0_init(enc); + enc->session_init = radeon_enc_session_init; enc->ctx = radeon_enc_ctx; enc->enc_pic.session_info.interface_version =