anv: Enable remapping picture ID
Fix to handle 16 refs. v1. handle the case where a slot index is negative. (Lionel Landwerlin <lionel.g.landwerlin@intel.com>) Signed-off-by: Hyunjun Ko <zzoon@igalia.com> Reviewed-by: Dave Airlie <airlied@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32823>
This commit is contained in:
@@ -880,6 +880,8 @@ anv_h264_decode_video(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
const StdVideoH264SequenceParameterSet *sps = vk_video_find_h264_dec_std_sps(¶ms->vk, h264_pic_info->pStdPictureInfo->seq_parameter_set_id);
|
const StdVideoH264SequenceParameterSet *sps = vk_video_find_h264_dec_std_sps(¶ms->vk, h264_pic_info->pStdPictureInfo->seq_parameter_set_id);
|
||||||
const StdVideoH264PictureParameterSet *pps = vk_video_find_h264_dec_std_pps(¶ms->vk, h264_pic_info->pStdPictureInfo->pic_parameter_set_id);
|
const StdVideoH264PictureParameterSet *pps = vk_video_find_h264_dec_std_pps(¶ms->vk, h264_pic_info->pStdPictureInfo->pic_parameter_set_id);
|
||||||
|
|
||||||
|
uint8_t dpb_slots[ANV_VIDEO_H264_MAX_DPB_SLOTS] = { 0,};
|
||||||
|
|
||||||
anv_batch_emit(&cmd_buffer->batch, GENX(MI_FLUSH_DW), flush) {
|
anv_batch_emit(&cmd_buffer->batch, GENX(MI_FLUSH_DW), flush) {
|
||||||
flush.DWordLength = 2;
|
flush.DWordLength = 2;
|
||||||
flush.VideoPipelineCacheInvalidate = 1;
|
flush.VideoPipelineCacheInvalidate = 1;
|
||||||
@@ -974,8 +976,16 @@ anv_h264_decode_video(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
for (unsigned i = 0; i < frame_info->referenceSlotCount; i++) {
|
for (unsigned i = 0; i < frame_info->referenceSlotCount; i++) {
|
||||||
const struct anv_image_view *ref_iv = anv_image_view_from_handle(frame_info->pReferenceSlots[i].pPictureResource->imageViewBinding);
|
const struct anv_image_view *ref_iv = anv_image_view_from_handle(frame_info->pReferenceSlots[i].pPictureResource->imageViewBinding);
|
||||||
int idx = frame_info->pReferenceSlots[i].slotIndex;
|
int idx = frame_info->pReferenceSlots[i].slotIndex;
|
||||||
buf.ReferencePictureAddress[idx] = anv_image_address(ref_iv->image,
|
|
||||||
&ref_iv->image->planes[0].primary_surface.memory_range);
|
assert(idx < ANV_VIDEO_H264_MAX_DPB_SLOTS);
|
||||||
|
|
||||||
|
if (idx < 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
dpb_slots[idx] = i;
|
||||||
|
|
||||||
|
buf.ReferencePictureAddress[i] = anv_image_address(ref_iv->image,
|
||||||
|
&ref_iv->image->planes[0].primary_surface.memory_range);
|
||||||
|
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
ref_bo = ref_iv->image->bindings[0].address.bo;
|
ref_bo = ref_iv->image->bindings[0].address.bo;
|
||||||
@@ -1029,7 +1039,12 @@ anv_h264_decode_video(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
const struct VkVideoDecodeH264DpbSlotInfoKHR *dpb_slot =
|
const struct VkVideoDecodeH264DpbSlotInfoKHR *dpb_slot =
|
||||||
vk_find_struct_const(frame_info->pReferenceSlots[i].pNext, VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR);
|
vk_find_struct_const(frame_info->pReferenceSlots[i].pNext, VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR);
|
||||||
const StdVideoDecodeH264ReferenceInfo *ref_info = dpb_slot->pStdReferenceInfo;
|
const StdVideoDecodeH264ReferenceInfo *ref_info = dpb_slot->pStdReferenceInfo;
|
||||||
int idx = frame_info->pReferenceSlots[i].slotIndex;
|
|
||||||
|
if (frame_info->pReferenceSlots[i].slotIndex < 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int idx = dpb_slots[frame_info->pReferenceSlots[i].slotIndex];
|
||||||
|
|
||||||
avc_dpb.NonExistingFrame[idx] = ref_info->flags.is_non_existing;
|
avc_dpb.NonExistingFrame[idx] = ref_info->flags.is_non_existing;
|
||||||
avc_dpb.LongTermFrame[idx] = ref_info->flags.used_for_long_term_reference;
|
avc_dpb.LongTermFrame[idx] = ref_info->flags.used_for_long_term_reference;
|
||||||
if (!ref_info->flags.top_field_flag && !ref_info->flags.bottom_field_flag)
|
if (!ref_info->flags.top_field_flag && !ref_info->flags.bottom_field_flag)
|
||||||
@@ -1041,7 +1056,14 @@ anv_h264_decode_video(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
anv_batch_emit(&cmd_buffer->batch, GENX(MFD_AVC_PICID_STATE), picid) {
|
anv_batch_emit(&cmd_buffer->batch, GENX(MFD_AVC_PICID_STATE), picid) {
|
||||||
picid.PictureIDRemappingDisable = true;
|
unsigned i = 0;
|
||||||
|
picid.PictureIDRemappingDisable = false;
|
||||||
|
|
||||||
|
for (i = 0; i < frame_info->referenceSlotCount; i++)
|
||||||
|
picid.PictureID[i] = frame_info->pReferenceSlots[i].slotIndex;
|
||||||
|
|
||||||
|
for (; i < ANV_VIDEO_H264_MAX_NUM_REF_FRAME; i++)
|
||||||
|
picid.PictureID[i] = 0xffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t pic_height = sps->pic_height_in_map_units_minus1 + 1;
|
uint32_t pic_height = sps->pic_height_in_map_units_minus1 + 1;
|
||||||
@@ -1123,7 +1145,11 @@ anv_h264_decode_video(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
/* bind reference frame DMV */
|
/* bind reference frame DMV */
|
||||||
struct anv_bo *dmv_bo = NULL;
|
struct anv_bo *dmv_bo = NULL;
|
||||||
for (unsigned i = 0; i < frame_info->referenceSlotCount; i++) {
|
for (unsigned i = 0; i < frame_info->referenceSlotCount; i++) {
|
||||||
int idx = frame_info->pReferenceSlots[i].slotIndex;
|
if (frame_info->pReferenceSlots[i].slotIndex < 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int idx = dpb_slots[frame_info->pReferenceSlots[i].slotIndex];
|
||||||
|
|
||||||
const struct VkVideoDecodeH264DpbSlotInfoKHR *dpb_slot =
|
const struct VkVideoDecodeH264DpbSlotInfoKHR *dpb_slot =
|
||||||
vk_find_struct_const(frame_info->pReferenceSlots[i].pNext, VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR);
|
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 struct anv_image_view *ref_iv = anv_image_view_from_handle(frame_info->pReferenceSlots[i].pPictureResource->imageViewBinding);
|
||||||
|
Reference in New Issue
Block a user