virgl/video: Add support for vc1 decoding

Implement for virgl vc1 decoding.

Signed-off-by: Honglei Huang <honglei1.huang@amd.com>
Reviewed-by: Leo Liu <leo.liu@amd.com>
Reviewed-by: Boyuan Zhang <boyuan.zhang@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:
Honglei Huang
2022-11-23 16:56:21 +08:00
committed by Marge Bot
parent deafeab1ee
commit dad4b79ee0
3 changed files with 88 additions and 1 deletions
+1
View File
@@ -499,6 +499,7 @@ virgl_get_video_param(struct pipe_screen *screen,
entrypoint == PIPE_VIDEO_ENTRYPOINT_ENCODE);
break;
case PIPE_VIDEO_FORMAT_MPEG12:
case PIPE_VIDEO_FORMAT_VC1:
drv_supported = (entrypoint == PIPE_VIDEO_ENTRYPOINT_BITSTREAM);
break;
default:
+49 -1
View File
@@ -594,6 +594,51 @@ static int fill_mpeg12_picture_desc(const struct pipe_picture_desc *desc,
}
static int fill_vc1_picture_desc(const struct pipe_picture_desc *desc,
union virgl_picture_desc *vdsc)
{
unsigned i;
struct virgl_video_buffer *vbuf;
struct virgl_vc1_picture_desc *vvc1 = &vdsc->vc1;
struct pipe_vc1_picture_desc *vc1 = (struct pipe_vc1_picture_desc *)desc;
fill_base_picture_desc(desc, &vvc1->base);
for (i = 0; i < 2; i++) {
vbuf = virgl_video_buffer(vc1->ref[i]);
vvc1->ref[i] = vbuf ? vbuf->handle : 0;
}
ITEM_SET(vvc1, vc1, picture_type);
ITEM_SET(vvc1, vc1, pulldown);
ITEM_SET(vvc1, vc1, interlace);
ITEM_SET(vvc1, vc1, tfcntrflag);
ITEM_SET(vvc1, vc1, finterpflag);
ITEM_SET(vvc1, vc1, psf);
ITEM_SET(vvc1, vc1, dquant);
ITEM_SET(vvc1, vc1, panscan_flag);
ITEM_SET(vvc1, vc1, refdist_flag);
ITEM_SET(vvc1, vc1, quantizer);
ITEM_SET(vvc1, vc1, extended_mv);
ITEM_SET(vvc1, vc1, extended_dmv);
ITEM_SET(vvc1, vc1, overlap);
ITEM_SET(vvc1, vc1, vstransform);
ITEM_SET(vvc1, vc1, loopfilter);
ITEM_SET(vvc1, vc1, fastuvmc);
ITEM_SET(vvc1, vc1, range_mapy_flag);
ITEM_SET(vvc1, vc1, range_mapy);
ITEM_SET(vvc1, vc1, range_mapuv_flag);
ITEM_SET(vvc1, vc1, range_mapuv);
ITEM_SET(vvc1, vc1, multires);
ITEM_SET(vvc1, vc1, syncmarker);
ITEM_SET(vvc1, vc1, rangered);
ITEM_SET(vvc1, vc1, maxbframes);
ITEM_SET(vvc1, vc1, deblockEnable);
ITEM_SET(vvc1, vc1, pquant);
ITEM_SET(vvc1, vc1, slice_count);
return 0;
}
#undef ITEM_SET
#undef ITEM_CPY
@@ -609,6 +654,8 @@ static int fill_picture_desc(const struct pipe_picture_desc *desc,
return fill_h265_picture_desc(desc, vdsc);
case PIPE_VIDEO_FORMAT_MPEG12:
return fill_mpeg12_picture_desc(desc, vdsc);
case PIPE_VIDEO_FORMAT_VC1:
return fill_vc1_picture_desc(desc, vdsc);
default:
return -1;
}
@@ -862,7 +909,8 @@ 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: /* fall through */
case PIPE_VIDEO_FORMAT_MPEG12:
case PIPE_VIDEO_FORMAT_VC1: /* fall through */
default:
break;
}
+38
View File
@@ -582,12 +582,50 @@ struct virgl_mpeg12_picture_desc
uint32_t ref[2];
};
struct virgl_vc1_picture_desc
{
struct virgl_base_picture_desc base;
uint32_t slice_count;
uint8_t picture_type;
uint8_t frame_coding_mode;
uint8_t postprocflag;
uint8_t pulldown;
uint8_t interlace;
uint8_t tfcntrflag;
uint8_t finterpflag;
uint8_t psf;
uint8_t dquant;
uint8_t panscan_flag;
uint8_t refdist_flag;
uint8_t quantizer;
uint8_t extended_mv;
uint8_t extended_dmv;
uint8_t overlap;
uint8_t vstransform;
uint8_t loopfilter;
uint8_t fastuvmc;
uint8_t range_mapy_flag;
uint8_t range_mapy;
uint8_t range_mapuv_flag;
uint8_t range_mapuv;
uint8_t multires;
uint8_t syncmarker;
uint8_t rangered;
uint8_t maxbframes;
uint8_t deblockEnable;
uint8_t pquant;
uint32_t ref[2];
};
union virgl_picture_desc {
struct virgl_base_picture_desc base;
struct virgl_h264_picture_desc h264;
struct virgl_h265_picture_desc h265;
struct virgl_mpeg4_picture_desc mpeg4;
struct virgl_mpeg12_picture_desc mpeg12;
struct virgl_vc1_picture_desc vc1;
struct virgl_h264_enc_picture_desc h264_enc;
struct virgl_h265_enc_picture_desc h265_enc;
};