diff --git a/src/intel/vulkan_hasvk/genX_cmd_video.c b/src/intel/vulkan_hasvk/genX_cmd_video.c index 64542a0..6bcdceb 100644 --- a/src/intel/vulkan_hasvk/genX_cmd_video.c +++ b/src/intel/vulkan_hasvk/genX_cmd_video.c @@ -1197,8 +1197,22 @@ anv_h264_encode_video(struct anv_cmd_buffer *cmd_buffer, * counter is only stable after the MFC pipe has drained, so a CS stall plus * MFX_WAIT is issued first (mirroring the frame-end sync in * CmdEndVideoCodingKHR). */ - if (cmd_buffer->video.encode_feedback_query_addr.bo != NULL) { - struct anv_address addr = cmd_buffer->video.encode_feedback_query_addr; + /* VK_KHR_video_maintenance1 lets the query be chained onto the encode + * command instead of bracketing it with vkCmdBeginQuery/vkCmdEndQuery, in + * which case nothing recorded an address for us and we derive it here. */ + struct anv_address feedback_addr = cmd_buffer->video.encode_feedback_query_addr; + const VkVideoInlineQueryInfoKHR *inline_query = + vk_find_struct_const(encode_info->pNext, VIDEO_INLINE_QUERY_INFO_KHR); + if (inline_query && inline_query->queryPool != VK_NULL_HANDLE) { + ANV_FROM_HANDLE(anv_query_pool, iq_pool, inline_query->queryPool); + feedback_addr = (struct anv_address) { + .bo = iq_pool->bo, + .offset = inline_query->firstQuery * iq_pool->stride, + }; + } + + if (feedback_addr.bo != NULL) { + struct anv_address addr = feedback_addr; #if GFX_VER == 8 anv_batch_emit(&cmd_buffer->batch, GENX(MI_FLUSH_DW), flush) {