mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-03 13:40:11 +01:00
anv: fix to set default cdf buf correctly.
v1. Store cdf index values to the state of the commnad buffer. (Lionel Landwerlin <lionel.g.landwerlin@intel.com>) Fixes: dEQP-VK.video.decode.av1.sizeup_8_separated_dpb Signed-off-by: Hyunjun Ko <zzoon@igalia.com> Acked-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32775>
This commit is contained in:
parent
e510efed05
commit
ec60462a65
2 changed files with 59 additions and 11 deletions
|
|
@ -6356,12 +6356,18 @@ enum anv_vid_mem_av1_types {
|
|||
ANV_VID_MEM_AV1_MAX,
|
||||
};
|
||||
|
||||
struct anv_av1_video_refs_info {
|
||||
const struct anv_image *img;
|
||||
uint8_t default_cdf_index;
|
||||
};
|
||||
|
||||
struct anv_video_session {
|
||||
struct vk_video_session vk;
|
||||
|
||||
bool cdf_initialized;
|
||||
/* the decoder needs some private memory allocations */
|
||||
struct anv_vid_mem vid_mem[ANV_VID_MEM_AV1_MAX];
|
||||
struct anv_av1_video_refs_info prev_refs[STD_VIDEO_AV1_NUM_REF_FRAMES];
|
||||
};
|
||||
|
||||
struct anv_video_session_params {
|
||||
|
|
|
|||
|
|
@ -1324,6 +1324,42 @@ get_relative_dist(const VkVideoDecodeAV1PictureInfoKHR *av1_pic_info,
|
|||
return diff;
|
||||
}
|
||||
|
||||
struct av1_refs_info {
|
||||
const struct anv_image *img;
|
||||
uint8_t order_hint;
|
||||
uint8_t ref_order_hints[STD_VIDEO_AV1_NUM_REF_FRAMES];
|
||||
uint8_t disable_frame_end_update_cdf;
|
||||
uint8_t idx;
|
||||
uint8_t frame_type;
|
||||
uint32_t frame_width;
|
||||
uint32_t frame_height;
|
||||
uint8_t default_cdf_index;
|
||||
};
|
||||
|
||||
static int
|
||||
find_cdf_index(const struct anv_video_session *vid,
|
||||
const struct av1_refs_info *refs_info,
|
||||
const struct anv_image *img)
|
||||
{
|
||||
for (uint32_t i = 0; i < STD_VIDEO_AV1_NUM_REF_FRAMES; i++) {
|
||||
if (vid) {
|
||||
if (!vid->prev_refs[i].img)
|
||||
continue;
|
||||
|
||||
if (vid->prev_refs[i].img == img)
|
||||
return vid->prev_refs[i].default_cdf_index;
|
||||
} else {
|
||||
if (!refs_info[i].img)
|
||||
continue;
|
||||
|
||||
if (refs_info[i].img == img)
|
||||
return refs_info[i].default_cdf_index;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
anv_av1_decode_video_tile(struct anv_cmd_buffer *cmd_buffer,
|
||||
const VkVideoDecodeInfoKHR *frame_info,
|
||||
|
|
@ -1377,16 +1413,7 @@ anv_av1_decode_video_tile(struct anv_cmd_buffer *cmd_buffer,
|
|||
mfx.MFXSyncControlFlag = 1;
|
||||
}
|
||||
|
||||
struct refs_info {
|
||||
const struct anv_image *img;
|
||||
uint8_t order_hint;
|
||||
uint8_t ref_order_hints[STD_VIDEO_AV1_NUM_REF_FRAMES];
|
||||
uint8_t disable_frame_end_update_cdf;
|
||||
uint8_t idx;
|
||||
uint8_t frame_type;
|
||||
uint32_t frame_width;
|
||||
uint32_t frame_height;
|
||||
} ref_info[STD_VIDEO_AV1_NUM_REF_FRAMES] = {};
|
||||
struct av1_refs_info ref_info[AV1_TOTAL_REFS_PER_FRAME] = { 0, };
|
||||
|
||||
const struct anv_image_view *dst_iv =
|
||||
anv_image_view_from_handle(frame_info->dstPictureResource.imageViewBinding);
|
||||
|
|
@ -1433,6 +1460,7 @@ anv_av1_decode_video_tile(struct anv_cmd_buffer *cmd_buffer,
|
|||
ref_info[i + 1].order_hint = std_ref_info->OrderHint;
|
||||
memcpy(ref_info[i + 1].ref_order_hints, std_ref_info->SavedOrderHints, STD_VIDEO_AV1_NUM_REF_FRAMES);
|
||||
ref_info[i + 1].disable_frame_end_update_cdf = std_ref_info->flags.disable_frame_end_update_cdf;
|
||||
ref_info[i + 1].default_cdf_index = find_cdf_index(vid, NULL, ref_img);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1865,14 +1893,20 @@ anv_av1_decode_video_tile(struct anv_cmd_buffer *cmd_buffer,
|
|||
if (std_pic_info->primary_ref_frame == 7) {
|
||||
use_default_cdf = true;
|
||||
} else {
|
||||
if (ref_info[std_pic_info->primary_ref_frame + 1].disable_frame_end_update_cdf)
|
||||
if (ref_info[std_pic_info->primary_ref_frame + 1].disable_frame_end_update_cdf) {
|
||||
use_default_cdf = true;
|
||||
|
||||
const struct anv_image *ref_img = ref_info[std_pic_info->primary_ref_frame + 1].img;
|
||||
cdf_index = find_cdf_index(vid, NULL, ref_img);
|
||||
}
|
||||
}
|
||||
|
||||
if (use_default_cdf) {
|
||||
buf.CDFTablesInitializationBufferAddress = (struct anv_address) {
|
||||
vid->vid_mem[ANV_VID_MEM_AV1_CDF_DEFAULTS_0 + cdf_index].mem->bo,
|
||||
vid->vid_mem[ANV_VID_MEM_AV1_CDF_DEFAULTS_0 + cdf_index].offset };
|
||||
|
||||
ref_info[0].default_cdf_index = cdf_index;
|
||||
} else {
|
||||
const struct anv_image *ref_img = ref_info[std_pic_info->primary_ref_frame + 1].img;
|
||||
buf.CDFTablesInitializationBufferAddress = anv_image_address(ref_img,
|
||||
|
|
@ -2417,6 +2451,14 @@ anv_av1_decode_video_tile(struct anv_cmd_buffer *cmd_buffer,
|
|||
vd.AVPPipelineCommandFlush = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Set necessary info from current refs to the prev_refs */
|
||||
for (int i = 0; i < STD_VIDEO_AV1_NUM_REF_FRAMES; ++i) {
|
||||
vid->prev_refs[i].img = ref_info[i].img;
|
||||
vid->prev_refs[i].default_cdf_index =
|
||||
i == 0 ? ref_info[i].default_cdf_index :
|
||||
find_cdf_index(NULL, ref_info, ref_info[i].img);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue