From e09a2e808fed6031a1d8b976d25860fb716ac90d Mon Sep 17 00:00:00 2001 From: David Rosca Date: Mon, 24 Mar 2025 12:14:22 +0100 Subject: [PATCH] radeonsi/vce: Support old VCE firmware Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/12866 Fixes: 104f9c66545 ("radeonsi/vce: Remove support for FW 50 and older") Reviewed-by: Ruijing Dong Part-of: (cherry picked from commit a2b4617c00ea5c7dd86b95d2294e02ab843c898b) --- .pick_status.json | 2 +- src/gallium/drivers/radeonsi/radeon_vce.c | 14 ++----- src/gallium/drivers/radeonsi/radeon_vce.h | 1 + src/gallium/drivers/radeonsi/radeon_vce_52.c | 43 +++++++++++--------- 4 files changed, 29 insertions(+), 31 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 0767a863239..60f10e1e2c8 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1624,7 +1624,7 @@ "description": "radeonsi/vce: Support old VCE firmware", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "104f9c6654583c67251fb442c49b3cf86b416efb", "notes": null diff --git a/src/gallium/drivers/radeonsi/radeon_vce.c b/src/gallium/drivers/radeonsi/radeon_vce.c index b0b61dd75bb..d86a9594083 100644 --- a/src/gallium/drivers/radeonsi/radeon_vce.c +++ b/src/gallium/drivers/radeonsi/radeon_vce.c @@ -419,6 +419,7 @@ struct pipe_video_codec *si_vce_create_encoder(struct pipe_context *context, goto error; } + enc->fw_version = (sscreen->info.vce_fw_version & (0xff << 24)) >> 24; si_vce_52_init(enc); return &enc->base; @@ -435,17 +436,8 @@ error: */ bool si_vce_is_fw_version_supported(struct si_screen *sscreen) { - switch (sscreen->info.vce_fw_version) { - case FW_52_0_3: - case FW_52_4_3: - case FW_52_8_3: - return true; - default: - if ((sscreen->info.vce_fw_version & (0xff << 24)) >= FW_53) - return true; - else - return false; - } + unsigned version = (sscreen->info.vce_fw_version & (0xff << 24)) >> 24; + return version >= 40; } /** diff --git a/src/gallium/drivers/radeonsi/radeon_vce.h b/src/gallium/drivers/radeonsi/radeon_vce.h index 365fe0c69f1..71961c23ba4 100644 --- a/src/gallium/drivers/radeonsi/radeon_vce.h +++ b/src/gallium/drivers/radeonsi/radeon_vce.h @@ -343,6 +343,7 @@ struct rvce_encoder { bool use_vm; bool dual_pipe; + unsigned fw_version; }; struct rvce_output_unit_segment { diff --git a/src/gallium/drivers/radeonsi/radeon_vce_52.c b/src/gallium/drivers/radeonsi/radeon_vce_52.c index 46d583c2498..65a11653303 100644 --- a/src/gallium/drivers/radeonsi/radeon_vce_52.c +++ b/src/gallium/drivers/radeonsi/radeon_vce_52.c @@ -198,7 +198,7 @@ static void get_param(struct rvce_encoder *enc, struct pipe_h264_enc_picture_des enc->enc_pic.i_remain = pic->i_remain; enc->enc_pic.pic_order_cnt = pic->pic_order_cnt; enc->enc_pic.not_referenced = pic->not_referenced; - enc->enc_pic.addrmode_arraymode_disrdo_distwoinstants = 0x01000201; + enc->enc_pic.addrmode_arraymode_disrdo_distwoinstants = enc->fw_version >= 52 ? 0x01000201 : 0; enc->enc_pic.is_idr = (pic->picture_type == PIPE_H2645_ENC_PICTURE_TYPE_IDR); enc->enc_pic.eo.enc_idr_pic_id = pic->idr_pic_id; enc->enc_pic.ec.enc_vbaq_mode = @@ -309,10 +309,12 @@ static void create(struct rvce_encoder *enc) RVCE_CS(enc->enc_pic.addrmode_arraymode_disrdo_distwoinstants); - RVCE_CS(enc->enc_pic.ec.enc_pre_encode_context_buffer_offset); - RVCE_CS(enc->enc_pic.ec.enc_pre_encode_input_luma_buffer_offset); - RVCE_CS(enc->enc_pic.ec.enc_pre_encode_input_chroma_buffer_offset); - RVCE_CS(enc->enc_pic.ec.enc_pre_encode_mode_chromaflag_vbaqmode_scenechangesensitivity); + if (enc->fw_version >= 52) { + RVCE_CS(enc->enc_pic.ec.enc_pre_encode_context_buffer_offset); + RVCE_CS(enc->enc_pic.ec.enc_pre_encode_input_luma_buffer_offset); + RVCE_CS(enc->enc_pic.ec.enc_pre_encode_input_chroma_buffer_offset); + RVCE_CS(enc->enc_pic.ec.enc_pre_encode_mode_chromaflag_vbaqmode_scenechangesensitivity); + } RVCE_END(); } @@ -373,7 +375,7 @@ static void encode(struct rvce_encoder *enc) enc->enc_pic.eo.enc_input_pic_swizzle_mode = enc->luma->u.gfx9.swizzle_mode; } - enc->enc_pic.eo.enc_disable_two_pipe_mode = !enc->dual_pipe; + enc->enc_pic.eo.enc_disable_two_pipe_mode = enc->fw_version >= 50 ? !enc->dual_pipe : 0; RVCE_CS(enc->enc_pic.eo.enc_input_pic_addr_array_disable2pipe_disablemboffload); RVCE_CS(enc->enc_pic.eo.enc_input_pic_tile_config); RVCE_CS(enc->enc_pic.picture_type); // encPicType @@ -457,17 +459,18 @@ static void encode(struct rvce_encoder *enc) RVCE_CS(enc->enc_pic.eo.num_ir_pic_remain_in_rcgop); RVCE_CS(enc->enc_pic.eo.enable_intra_refresh); - RVCE_CS(enc->enc_pic.eo.aq_variance_en); - RVCE_CS(enc->enc_pic.eo.aq_block_size); - RVCE_CS(enc->enc_pic.eo.aq_mb_variance_sel); - RVCE_CS(enc->enc_pic.eo.aq_frame_variance_sel); - RVCE_CS(enc->enc_pic.eo.aq_param_a); - RVCE_CS(enc->enc_pic.eo.aq_param_b); - RVCE_CS(enc->enc_pic.eo.aq_param_c); - RVCE_CS(enc->enc_pic.eo.aq_param_d); - RVCE_CS(enc->enc_pic.eo.aq_param_e); - - RVCE_CS(enc->enc_pic.eo.context_in_sfb); + if (enc->fw_version >= 52) { + RVCE_CS(enc->enc_pic.eo.aq_variance_en); + RVCE_CS(enc->enc_pic.eo.aq_block_size); + RVCE_CS(enc->enc_pic.eo.aq_mb_variance_sel); + RVCE_CS(enc->enc_pic.eo.aq_frame_variance_sel); + RVCE_CS(enc->enc_pic.eo.aq_param_a); + RVCE_CS(enc->enc_pic.eo.aq_param_b); + RVCE_CS(enc->enc_pic.eo.aq_param_c); + RVCE_CS(enc->enc_pic.eo.aq_param_d); + RVCE_CS(enc->enc_pic.eo.aq_param_e); + RVCE_CS(enc->enc_pic.eo.context_in_sfb); + } RVCE_END(); } @@ -498,8 +501,10 @@ static void rate_control(struct rvce_encoder *enc) RVCE_CS(enc->enc_pic.rc.b_pics_delta_qp); RVCE_CS(enc->enc_pic.rc.ref_b_pics_delta_qp); RVCE_CS(enc->enc_pic.rc.rc_reinit_disable); - RVCE_CS(enc->enc_pic.rc.enc_lcvbr_init_qp_flag); - RVCE_CS(enc->enc_pic.rc.lcvbrsatd_based_nonlinear_bit_budget_flag); + if (enc->fw_version >= 50) { + RVCE_CS(enc->enc_pic.rc.enc_lcvbr_init_qp_flag); + RVCE_CS(enc->enc_pic.rc.lcvbrsatd_based_nonlinear_bit_budget_flag); + } RVCE_END(); }