virgl: Implement vp9 hardware decode

Implement vp9 hardware decode by filling vp9 picture desc.

Signed-off-by: Boyuan Zhang <boyuan.zhang@amd.com>
Reviewed-by: Leo Liu <leo.liu@amd.com>
Reviewed-by: Daniel Almeida <daniel.almeida@collabora.com>
Reviewed-by: Feng Jiang <jiangfeng@kylinos.cn>
Signed-off-by: Huang Rui <ray.huang@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22108>
This commit is contained in:
Boyuan Zhang
2023-03-27 19:31:57 +08:00
committed by Marge Bot
parent 7eff5cdbac
commit d4220c14cc
+80 -3
View File
@@ -693,6 +693,82 @@ static int fill_mjpeg_picture_desc(const struct pipe_picture_desc *desc,
return 0;
}
static int fill_vp9_picture_desc(const struct pipe_picture_desc *desc,
union virgl_picture_desc *vdsc)
{
unsigned i;
struct virgl_video_buffer *vbuf;
struct virgl_vp9_picture_desc *vvp9 = &vdsc->vp9;
struct pipe_vp9_picture_desc *vp9 = (struct pipe_vp9_picture_desc *)desc;
fill_base_picture_desc(desc, &vvp9->base);
for (i = 0; i < 16; i++) {
vbuf = virgl_video_buffer(vp9->ref[i]);
vvp9->ref[i] = vbuf ? vbuf->handle : 0;
}
ITEM_SET(vvp9, vp9, picture_parameter.frame_width);
ITEM_SET(vvp9, vp9, picture_parameter.frame_height);
ITEM_SET(vvp9, vp9, picture_parameter.pic_fields.subsampling_x);
ITEM_SET(vvp9, vp9, picture_parameter.pic_fields.subsampling_y);
ITEM_SET(vvp9, vp9, picture_parameter.pic_fields.frame_type);
ITEM_SET(vvp9, vp9, picture_parameter.pic_fields.show_frame);
ITEM_SET(vvp9, vp9, picture_parameter.pic_fields.error_resilient_mode);
ITEM_SET(vvp9, vp9, picture_parameter.pic_fields.intra_only);
ITEM_SET(vvp9, vp9, picture_parameter.pic_fields.allow_high_precision_mv);
ITEM_SET(vvp9, vp9, picture_parameter.pic_fields.mcomp_filter_type);
ITEM_SET(vvp9, vp9, picture_parameter.pic_fields.frame_parallel_decoding_mode);
ITEM_SET(vvp9, vp9, picture_parameter.pic_fields.reset_frame_context);
ITEM_SET(vvp9, vp9, picture_parameter.pic_fields.refresh_frame_context);
ITEM_SET(vvp9, vp9, picture_parameter.pic_fields.frame_context_idx);
ITEM_SET(vvp9, vp9, picture_parameter.pic_fields.segmentation_enabled);
ITEM_SET(vvp9, vp9, picture_parameter.pic_fields.segmentation_temporal_update);
ITEM_SET(vvp9, vp9, picture_parameter.pic_fields.segmentation_update_map);
ITEM_SET(vvp9, vp9, picture_parameter.pic_fields.last_ref_frame);
ITEM_SET(vvp9, vp9, picture_parameter.pic_fields.last_ref_frame_sign_bias);
ITEM_SET(vvp9, vp9, picture_parameter.pic_fields.golden_ref_frame);
ITEM_SET(vvp9, vp9, picture_parameter.pic_fields.golden_ref_frame_sign_bias);
ITEM_SET(vvp9, vp9, picture_parameter.pic_fields.alt_ref_frame);
ITEM_SET(vvp9, vp9, picture_parameter.pic_fields.alt_ref_frame_sign_bias);
ITEM_SET(vvp9, vp9, picture_parameter.pic_fields.lossless_flag);
ITEM_SET(vvp9, vp9, picture_parameter.filter_level);
ITEM_SET(vvp9, vp9, picture_parameter.sharpness_level);
ITEM_SET(vvp9, vp9, picture_parameter.log2_tile_rows);
ITEM_SET(vvp9, vp9, picture_parameter.log2_tile_columns);
ITEM_SET(vvp9, vp9, picture_parameter.frame_header_length_in_bytes);
ITEM_SET(vvp9, vp9, picture_parameter.first_partition_size);
ITEM_CPY(vvp9, vp9, picture_parameter.mb_segment_tree_probs);
ITEM_CPY(vvp9, vp9, picture_parameter.segment_pred_probs);
ITEM_SET(vvp9, vp9, picture_parameter.profile);
ITEM_SET(vvp9, vp9, picture_parameter.bit_depth);
ITEM_SET(vvp9, vp9, picture_parameter.mode_ref_delta_enabled);
ITEM_SET(vvp9, vp9, picture_parameter.mode_ref_delta_update);
ITEM_SET(vvp9, vp9, picture_parameter.base_qindex);
ITEM_SET(vvp9, vp9, picture_parameter.y_dc_delta_q);
ITEM_SET(vvp9, vp9, picture_parameter.uv_ac_delta_q);
ITEM_SET(vvp9, vp9, picture_parameter.uv_dc_delta_q);
ITEM_SET(vvp9, vp9, picture_parameter.abs_delta);
ITEM_CPY(vvp9, vp9, picture_parameter.ref_deltas);
ITEM_CPY(vvp9, vp9, picture_parameter.mode_deltas);
vvp9->slice_parameter.slice_data_size = vp9->slice_parameter.slice_data_size[0];
vvp9->slice_parameter.slice_data_offset = vp9->slice_parameter.slice_data_offset[0];
vvp9->slice_parameter.slice_data_flag = vp9->slice_parameter.slice_data_flag[0];
for (i = 0; i < 8; i++) {
ITEM_SET(vvp9, vp9, slice_parameter.seg_param[i].segment_flags.segment_reference_enabled);
ITEM_SET(vvp9, vp9, slice_parameter.seg_param[i].segment_flags.segment_reference);
ITEM_SET(vvp9, vp9, slice_parameter.seg_param[i].segment_flags.segment_reference_skipped);
ITEM_CPY(vvp9, vp9, slice_parameter.seg_param[i].filter_level);
ITEM_SET(vvp9, vp9, slice_parameter.seg_param[i].luma_ac_quant_scale);
ITEM_SET(vvp9, vp9, slice_parameter.seg_param[i].luma_dc_quant_scale);
ITEM_SET(vvp9, vp9, slice_parameter.seg_param[i].chroma_ac_quant_scale);
ITEM_SET(vvp9, vp9, slice_parameter.seg_param[i].chroma_dc_quant_scale);
}
return 0;
}
#undef ITEM_SET
#undef ITEM_CPY
@@ -965,9 +1041,10 @@ virgl_video_create_codec(struct pipe_context *ctx,
height = align(height, VL_MACROBLOCK_HEIGHT);
break;
case PIPE_VIDEO_FORMAT_HEVC:
case PIPE_VIDEO_FORMAT_MPEG12:
case PIPE_VIDEO_FORMAT_VC1:
case PIPE_VIDEO_FORMAT_JPEG: /* fall through */
case PIPE_VIDEO_FORMAT_MPEG12:
case PIPE_VIDEO_FORMAT_VC1:
case PIPE_VIDEO_FORMAT_JPEG:
case PIPE_VIDEO_FORMAT_VP9: /* fall through */
default:
break;
}