From 3611d60cea8e26d67ef8cf49e2e514625558a33d Mon Sep 17 00:00:00 2001 From: Benjamin Cheng Date: Thu, 26 Feb 2026 12:07:57 -0500 Subject: [PATCH] radeonsi/vcn: Use full pitch for pre-encode input In 1f83e731451, the pre-encode input picture size was also reduced. However it was recently discovered that VCN FW uses the input picture pitch as the pitch for this, which means that previous change broke pre-encode. Fixes: 1f83e731451 ("radeonsi/vcn: Reduce allocated size for pre-encode recon pics") Reviewed-by: Ruijing Dong (cherry picked from commit 2b2b1d405a3213e25d41be7213223eb86df9e654) Part-of: --- .pick_status.json | 2 +- src/gallium/drivers/radeonsi/radeon_vcn_enc.c | 22 +++++++++++-------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 5b71379c644..e8a688801a6 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -4914,7 +4914,7 @@ "description": "radeonsi/vcn: Use full pitch for pre-encode input", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "1f83e731451b84b16cc1fa2f04b46a71a66e43ff", "notes": null diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_enc.c b/src/gallium/drivers/radeonsi/radeon_vcn_enc.c index 8699872cccb..f2127495019 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc.c @@ -1314,7 +1314,8 @@ static int setup_dpb(struct radeon_encoder *enc, uint32_t num_reconstructed_pict uint32_t aligned_width = align(enc->base.width, rec_alignment); uint32_t aligned_height = align(enc->base.height, rec_alignment); uint32_t pitch = align(aligned_width, enc->alignment); - uint32_t luma_size, chroma_size, pre_luma_size = 0, pre_chroma_size = 0, offset; + uint32_t luma_size, chroma_size, offset; + uint32_t pre_luma_size = 0, pre_chroma_size = 0, pre_input_plane_size = 0; struct radeon_enc_pic *enc_pic = &enc->enc_pic; int i; bool has_b = enc_pic->spec_misc.b_picture_enabled; /* for h264 only */ @@ -1328,15 +1329,18 @@ static int setup_dpb(struct radeon_encoder *enc, uint32_t num_reconstructed_pict if (enc_pic->quality_modes.pre_encode_mode) { uint32_t scale = enc_pic->quality_modes.pre_encode_mode; uint32_t pre_pitch = align(aligned_width / scale, enc->alignment); - uint32_t pre_aligned_height = align(aligned_height / scale, enc->alignment); + uint32_t pre_aligned_height = MAX2(align(aligned_height / scale, enc->alignment), 256); - pre_luma_size = align(pre_pitch * MAX2(256, pre_aligned_height), enc->alignment); + /* VCN FW always writes the preencode input picture using the input picture pitch. */ + pre_input_plane_size = align(pitch * pre_aligned_height, enc->alignment); + pre_luma_size = align(pre_pitch * pre_aligned_height, enc->alignment); pre_chroma_size = align(pre_luma_size / 2, enc->alignment); } if (enc_pic->bit_depth_luma_minus8 || enc_pic->bit_depth_chroma_minus8) { luma_size *= 2; chroma_size *= 2; + pre_input_plane_size *= 2; pre_luma_size *= 2; pre_chroma_size *= 2; } @@ -1366,11 +1370,11 @@ static int setup_dpb(struct radeon_encoder *enc, uint32_t num_reconstructed_pict if (enc_pic->quality_modes.pre_encode_mode) { enc_pic->ctx_buf.pre_encode_input_picture.rgb.red_offset = offset; - offset += pre_luma_size; + offset += pre_input_plane_size; enc_pic->ctx_buf.pre_encode_input_picture.rgb.green_offset = offset; - offset += pre_luma_size; + offset += pre_input_plane_size; enc_pic->ctx_buf.pre_encode_input_picture.rgb.blue_offset = offset; - offset += pre_luma_size; + offset += pre_input_plane_size; } if (is_av1) { @@ -1408,11 +1412,11 @@ static int setup_dpb(struct radeon_encoder *enc, uint32_t num_reconstructed_pict if (enc_pic->quality_modes.pre_encode_mode) { enc_pic->ctx_buf.pre_encode_input_picture.rgb.red_offset = offset; - offset += pre_luma_size; + offset += pre_input_plane_size; enc_pic->ctx_buf.pre_encode_input_picture.rgb.green_offset = offset; - offset += pre_luma_size; + offset += pre_input_plane_size; enc_pic->ctx_buf.pre_encode_input_picture.rgb.blue_offset = offset; - offset += pre_luma_size; + offset += pre_input_plane_size; } for (i = 0; i < num_reconstructed_pictures; i++) {