virgl/video: Add support for vc1 decoding
authorHonglei Huang <honglei1.huang@amd.com>
Wed, 23 Nov 2022 08:56:21 +0000 (16:56 +0800)
committerMarge Bot <emma+marge@anholt.net>
Wed, 19 Jul 2023 07:06:37 +0000 (07:06 +0000)
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>

src/gallium/drivers/virgl/virgl_screen.c
src/gallium/drivers/virgl/virgl_video.c
src/virtio/virtio-gpu/virgl_video_hw.h

index b3b7aa4..dc2f370 100644 (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:
index 8ab51fd..de8e6d1 100644 (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;
     }
index 0e9ebbb..a9b66ae 100644 (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;
 };