anv/video: convert to common parameters retrieval code

Reviewed-by: Lynne <dev@lynne.ee>
Reviewed-by: Hyunjun Ko <zzoon@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34204>
This commit is contained in:
Dave Airlie 2025-03-19 07:17:02 +10:00 committed by Marge Bot
parent feef12b2a8
commit e4981731be

View file

@ -180,10 +180,10 @@ anv_h265_decode_video(struct anv_cmd_buffer *cmd_buffer,
const struct VkVideoDecodeH265PictureInfoKHR *h265_pic_info =
vk_find_struct_const(frame_info->pNext, VIDEO_DECODE_H265_PICTURE_INFO_KHR);
const StdVideoH265SequenceParameterSet *sps =
vk_video_find_h265_dec_std_sps(&params->vk, h265_pic_info->pStdPictureInfo->pps_seq_parameter_set_id);
const StdVideoH265PictureParameterSet *pps =
vk_video_find_h265_dec_std_pps(&params->vk, h265_pic_info->pStdPictureInfo->pps_pic_parameter_set_id);
const StdVideoH265SequenceParameterSet *sps;
const StdVideoH265PictureParameterSet *pps;
vk_video_get_h265_parameters(&vid->vk, params ? &params->vk : NULL, frame_info, h265_pic_info, &sps, &pps);
struct vk_video_h265_reference ref_slots[2][8] = { 0 };
uint8_t dpb_idx[ANV_VIDEO_H265_MAX_NUM_REF_FRAME] = { 0,};
@ -888,8 +888,11 @@ anv_h264_decode_video(struct anv_cmd_buffer *cmd_buffer,
struct anv_video_session_params *params = cmd_buffer->video.params;
const struct VkVideoDecodeH264PictureInfoKHR *h264_pic_info =
vk_find_struct_const(frame_info->pNext, VIDEO_DECODE_H264_PICTURE_INFO_KHR);
const StdVideoH264SequenceParameterSet *sps = vk_video_find_h264_dec_std_sps(&params->vk, h264_pic_info->pStdPictureInfo->seq_parameter_set_id);
const StdVideoH264PictureParameterSet *pps = vk_video_find_h264_dec_std_pps(&params->vk, h264_pic_info->pStdPictureInfo->pic_parameter_set_id);
const StdVideoH264SequenceParameterSet *sps;
const StdVideoH264PictureParameterSet *pps;
vk_video_get_h264_parameters(&vid->vk, params ? &params->vk : NULL, frame_info, h264_pic_info, &sps, &pps);
uint8_t dpb_slots[ANV_VIDEO_H264_MAX_DPB_SLOTS] = { 0,};
@ -1310,13 +1313,13 @@ frame_is_key_or_intra(const StdVideoAV1FrameType frame_type)
static int32_t
get_relative_dist(const VkVideoDecodeAV1PictureInfoKHR *av1_pic_info,
const struct anv_video_session_params *params,
const StdVideoAV1SequenceHeader *seq_hdr,
int32_t a, int32_t b)
{
if (!params->vk.av1_dec.seq_hdr.base.flags.enable_order_hint)
if (!seq_hdr->flags.enable_order_hint)
return 0;
int32_t bits = params->vk.av1_dec.seq_hdr.base.order_hint_bits_minus_1 + 1;
int32_t bits = seq_hdr->order_hint_bits_minus_1 + 1;
int32_t diff = a - b;
int32_t m = 1 << (bits - 1);
diff = (diff & (m - 1)) - (diff & m);
@ -1363,15 +1366,15 @@ find_cdf_index(const struct anv_video_session *vid,
static void
anv_av1_decode_video_tile(struct anv_cmd_buffer *cmd_buffer,
const VkVideoDecodeInfoKHR *frame_info,
const StdVideoAV1SequenceHeader *seq_hdr,
int tile_idx)
{
ANV_FROM_HANDLE(anv_buffer, src_buffer, frame_info->srcBuffer);
struct anv_video_session *vid = cmd_buffer->video.vid;
struct anv_video_session_params *params = cmd_buffer->video.params;
const VkVideoDecodeAV1PictureInfoKHR *av1_pic_info =
vk_find_struct_const(frame_info->pNext, VIDEO_DECODE_AV1_PICTURE_INFO_KHR);
const StdVideoDecodeAV1PictureInfo *std_pic_info = av1_pic_info->pStdPictureInfo;
const StdVideoAV1SequenceHeader *seq_hdr = &params->vk.av1_dec.seq_hdr.base;
int cdf_index = 0;
if (std_pic_info->pQuantization->base_q_idx <= 20)
cdf_index = 0;
@ -1971,11 +1974,11 @@ anv_av1_decode_video_tile(struct anv_cmd_buffer *cmd_buffer,
for (enum av1_ref_frame r = AV1_LAST_FRAME; r <= AV1_ALTREF_FRAME; r++) {
if (seq_hdr->flags.enable_order_hint &&
!frame_is_key_or_intra(std_pic_info->frame_type)) {
if (get_relative_dist(av1_pic_info, params,
if (get_relative_dist(av1_pic_info, seq_hdr,
ref_info[r].order_hint, ref_info[AV1_INTRA_FRAME].order_hint) > 0)
ref_frame_sign_bias |= (1 << r);
if ((get_relative_dist(av1_pic_info, params,
if ((get_relative_dist(av1_pic_info, seq_hdr,
ref_info[r].order_hint, ref_info[AV1_INTRA_FRAME].order_hint) > 0) ||
ref_info[r].order_hint == ref_info[AV1_INTRA_FRAME].order_hint)
ref_frame_side |= (1 << r);
@ -2001,14 +2004,14 @@ anv_av1_decode_video_tile(struct anv_cmd_buffer *cmd_buffer,
}
}
if (get_relative_dist(av1_pic_info, params,
if (get_relative_dist(av1_pic_info, seq_hdr,
ref_info[AV1_BWDREF_FRAME].order_hint,
ref_info[AV1_INTRA_FRAME].order_hint) > 0 &&
!frame_is_key_or_intra(ref_info[AV1_BWDREF_FRAME - AV1_LAST_FRAME + 1].frame_type)) {
mfmv_ref[num_mfmv++] = AV1_BWDREF_FRAME - AV1_LAST_FRAME;
}
if (get_relative_dist(av1_pic_info, params,
if (get_relative_dist(av1_pic_info, seq_hdr,
ref_info[AV1_ALTREF2_FRAME].order_hint,
ref_info[AV1_INTRA_FRAME].order_hint) > 0 &&
!frame_is_key_or_intra(ref_info[AV1_ALTREF2_FRAME - AV1_LAST_FRAME + 1].frame_type)) {
@ -2016,7 +2019,7 @@ anv_av1_decode_video_tile(struct anv_cmd_buffer *cmd_buffer,
}
if (num_mfmv < total &&
get_relative_dist(av1_pic_info, params,
get_relative_dist(av1_pic_info, seq_hdr,
ref_info[AV1_ALTREF_FRAME].order_hint,
ref_info[AV1_INTRA_FRAME].order_hint) > 0 &&
!frame_is_key_or_intra(ref_info[AV1_ALTREF_FRAME - AV1_LAST_FRAME + 1].frame_type)) {
@ -2463,14 +2466,12 @@ anv_av1_decode_video_tile(struct anv_cmd_buffer *cmd_buffer,
static void
anv_av1_calculate_xstep_qn(struct anv_cmd_buffer *cmd_buffer,
const VkVideoDecodeInfoKHR *frame_info)
const VkVideoDecodeInfoKHR *frame_info,
const StdVideoAV1SequenceHeader *seq_hdr)
{
const VkVideoDecodeAV1PictureInfoKHR *av1_pic_info =
vk_find_struct_const(frame_info->pNext, VIDEO_DECODE_AV1_PICTURE_INFO_KHR);
const StdVideoDecodeAV1PictureInfo *std_pic_info = av1_pic_info->pStdPictureInfo;
struct anv_video_session_params *params = cmd_buffer->video.params;
const StdVideoAV1SequenceHeader *seq_hdr = &params->vk.av1_dec.seq_hdr.base;
VkExtent2D frameExtent = frame_info->dstPictureResource.codedExtent;
unsigned tile_cols = std_pic_info->pTileInfo->TileCols;
@ -2555,11 +2556,16 @@ anv_av1_decode_video(struct anv_cmd_buffer *cmd_buffer,
{
const VkVideoDecodeAV1PictureInfoKHR *av1_pic_info =
vk_find_struct_const(frame_info->pNext, VIDEO_DECODE_AV1_PICTURE_INFO_KHR);
struct anv_video_session *vid = cmd_buffer->video.vid;
struct anv_video_session_params *params = cmd_buffer->video.params;
const StdVideoAV1SequenceHeader *seq_hdr;
anv_av1_calculate_xstep_qn(cmd_buffer, frame_info);
vk_video_get_av1_parameters(&vid->vk, params ? &params->vk : NULL, frame_info, &seq_hdr);
anv_av1_calculate_xstep_qn(cmd_buffer, frame_info, seq_hdr);
for (unsigned t = 0; t < av1_pic_info->tileCount; t++)
anv_av1_decode_video_tile(cmd_buffer, frame_info, t);
anv_av1_decode_video_tile(cmd_buffer, frame_info, seq_hdr, t);
}
#endif