From 5d61e05e6c6ccc05b4aebfd99df79a0ccb1cdf66 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Wed, 19 Mar 2025 07:19:50 +1000 Subject: [PATCH] vulkan/video: add support for inline session paramters. This is part of VK_KHR_video_maintenance2 Reviewed-by: Lynne Part-of: --- src/vulkan/runtime/vk_video.c | 44 +++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/src/vulkan/runtime/vk_video.c b/src/vulkan/runtime/vk_video.c index 581d57aac3e..4c1ce06ee7e 100644 --- a/src/vulkan/runtime/vk_video.c +++ b/src/vulkan/runtime/vk_video.c @@ -658,8 +658,20 @@ vk_video_get_h264_parameters(const struct vk_video_session *session, const StdVideoH264SequenceParameterSet *sps = NULL; const StdVideoH264PictureParameterSet *pps = NULL; - sps = vk_video_find_h264_dec_std_sps(params, h264_pic_info->pStdPictureInfo->seq_parameter_set_id); - pps = vk_video_find_h264_dec_std_pps(params, h264_pic_info->pStdPictureInfo->pic_parameter_set_id); + if (session->flags & VK_VIDEO_SESSION_CREATE_INLINE_SESSION_PARAMETERS_BIT_KHR) { + const struct VkVideoDecodeH264InlineSessionParametersInfoKHR *inline_params = + vk_find_struct_const(decode_info->pNext, VIDEO_DECODE_H264_INLINE_SESSION_PARAMETERS_INFO_KHR); + + if (inline_params) { + sps = inline_params->pStdSPS; + pps = inline_params->pStdPPS; + } + } + + if (!sps) + sps = vk_video_find_h264_dec_std_sps(params, h264_pic_info->pStdPictureInfo->seq_parameter_set_id); + if (!pps) + pps = vk_video_find_h264_dec_std_pps(params, h264_pic_info->pStdPictureInfo->pic_parameter_set_id); *sps_p = sps; *pps_p = pps; @@ -676,8 +688,20 @@ vk_video_get_h265_parameters(const struct vk_video_session *session, const StdVideoH265SequenceParameterSet *sps = NULL; const StdVideoH265PictureParameterSet *pps = NULL; - sps = vk_video_find_h265_dec_std_sps(params, h265_pic_info->pStdPictureInfo->pps_seq_parameter_set_id); - pps = vk_video_find_h265_dec_std_pps(params, h265_pic_info->pStdPictureInfo->pps_pic_parameter_set_id); + if (session->flags & VK_VIDEO_SESSION_CREATE_INLINE_SESSION_PARAMETERS_BIT_KHR) { + const struct VkVideoDecodeH265InlineSessionParametersInfoKHR *inline_params = + vk_find_struct_const(decode_info->pNext, VIDEO_DECODE_H265_INLINE_SESSION_PARAMETERS_INFO_KHR); + + if (inline_params) { + sps = inline_params->pStdSPS; + pps = inline_params->pStdPPS; + } + } + + if (!sps) + sps = vk_video_find_h265_dec_std_sps(params, h265_pic_info->pStdPictureInfo->pps_seq_parameter_set_id); + if (!pps) + pps = vk_video_find_h265_dec_std_pps(params, h265_pic_info->pStdPictureInfo->pps_pic_parameter_set_id); *sps_p = sps; *pps_p = pps; @@ -691,7 +715,17 @@ vk_video_get_av1_parameters(const struct vk_video_session *session, { const StdVideoAV1SequenceHeader *seq_hdr = NULL; - seq_hdr = ¶ms->av1_dec.seq_hdr.base; + if (session->flags & VK_VIDEO_SESSION_CREATE_INLINE_SESSION_PARAMETERS_BIT_KHR) { + const struct VkVideoDecodeAV1InlineSessionParametersInfoKHR *inline_params = + vk_find_struct_const(decode_info->pNext, VIDEO_DECODE_AV1_INLINE_SESSION_PARAMETERS_INFO_KHR); + + if (inline_params) { + seq_hdr = inline_params->pStdSequenceHeader; + } + } + + if (!seq_hdr) + seq_hdr = ¶ms->av1_dec.seq_hdr.base; *seq_hdr_p = seq_hdr; }