diff --git a/src/intel/genxml/gen75.xml b/src/intel/genxml/gen75.xml index 128f721..5ebf77c 100644 --- a/src/intel/genxml/gen75.xml +++ b/src/intel/genxml/gen75.xml @@ -1507,10 +1507,15 @@ - - + + + + + - + + + diff --git a/src/intel/vulkan_hasvk/genX_video.c b/src/intel/vulkan_hasvk/genX_video.c index 504ab15..1e5a611 100644 --- a/src/intel/vulkan_hasvk/genX_video.c +++ b/src/intel/vulkan_hasvk/genX_video.c @@ -156,7 +156,7 @@ anv_h264_decode_video(struct anv_cmd_buffer *cmd_buffer, anv_batch_emit(&cmd_buffer->batch, GENX(MFX_IND_OBJ_BASE_ADDR_STATE), index_obj) { index_obj.MFXIndirectBitstreamObjectAddress = anv_address_add(src_buffer->address, - frame_info->srcBufferOffset); + frame_info->srcBufferOffset & ~4095); #if GFX_VERx10 == 75 index_obj.MFXIndirectBitstreamObjectMOCS = anv_mocs(cmd_buffer->device, src_buffer->address.bo, 0); @@ -342,14 +342,26 @@ anv_h264_decode_video(struct anv_cmd_buffer *cmd_buffer, anv_batch_emit(&cmd_buffer->batch, GENX(MFX_AVC_DIRECTMODE_STATE), avc_directmode) { /* bind reference frame DMV */ + struct anv_bo *dmv_bo = NULL; for (unsigned i = 0; i < frame_info->referenceSlotCount; i++) { int idx = frame_info->pReferenceSlots[i].slotIndex; const struct VkVideoDecodeH264DpbSlotInfoKHR *dpb_slot = vk_find_struct_const(frame_info->pReferenceSlots[i].pNext, VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR); const struct anv_image_view *ref_iv = anv_image_view_from_handle(frame_info->pReferenceSlots[i].pPictureResource->imageViewBinding); const StdVideoDecodeH264ReferenceInfo *ref_info = dpb_slot->pStdReferenceInfo; - avc_directmode.DirectMVBufferAddress[idx] = anv_image_address(ref_iv->image, - &ref_iv->image->vid_dmv_top_surface); + if (i == 0) { + dmv_bo = anv_image_address(ref_iv->image, + &ref_iv->image->vid_dmv_top_surface).bo; + } + +#if GFX_VERx10 == 75 + if (idx == 0) + avc_directmode.DirectMVBuffer0Address = anv_image_address(ref_iv->image, + &ref_iv->image->vid_dmv_top_surface); + else + avc_directmode.DirectMVBufferAddress1[idx - 1] = anv_image_address(ref_iv->image, + &ref_iv->image->vid_dmv_top_surface); +#endif avc_directmode.POCList[2 * idx] = ref_info->PicOrderCnt[0]; avc_directmode.POCList[2 * idx + 1] = ref_info->PicOrderCnt[1]; } @@ -359,6 +371,10 @@ anv_h264_decode_video(struct anv_cmd_buffer *cmd_buffer, #else avc_directmode.DirectMVBufferWriteAddress = anv_image_address(img, &img->vid_dmv_top_surface); +#if GFX_VERx10 == 75 + avc_directmode.DirectMVBufferMOCS = anv_mocs(cmd_buffer->device, dmv_bo, 0); + avc_directmode.DirectMVBufferWriteMOCS = anv_mocs(cmd_buffer->device, avc_directmode.DirectMVBufferWriteAddress.bo, 0); +#endif #endif avc_directmode.POCList[32] = h264_pic_info->pStdPictureInfo->PicOrderCnt[0]; avc_directmode.POCList[33] = h264_pic_info->pStdPictureInfo->PicOrderCnt[1];