virgl: add support for hardware video acceleration

Currently H.264 and H.265 decoding is supported, and other profiles
and encodings will be added in the future.

This function relies on the virglrenderer commit:
a92fed821f5ac173ca82c011a5d7e5b25e7bd0eb

Signed-off-by: Feng Jiang <jiangfeng@kylinos.cn>
Signed-off-by: Ming Xie <xieming@kylinos.cn>
Signed-off-by: Liming Sun <sunliming@kylinos.cn>
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17157>
This commit is contained in:
Feng Jiang
2022-06-20 15:10:58 +08:00
committed by Marge Bot
parent 15c210649d
commit 6b5aecb195
12 changed files with 1212 additions and 2 deletions
+22
View File
@@ -546,6 +546,26 @@ struct virgl_caps_v1 {
uint32_t max_texture_gather_components;
};
struct virgl_video_caps {
uint32_t profile:8;
uint32_t entrypoint:8;
uint32_t max_level:8;
uint32_t stacked_frames:8;
uint32_t max_width:16;
uint32_t max_height:16;
uint32_t prefered_format:16;
uint32_t max_macroblocks:16;
uint32_t npot_texture:1;
uint32_t supports_progressive:1;
uint32_t supports_interlaced:1;
uint32_t prefers_interlaced:1;
uint32_t max_temporal_layers:8;
uint32_t reserved:20;
};
/*
* This struct should be growable when used in capset 2,
* so we shouldn't have to add a v3 ever.
@@ -603,6 +623,8 @@ struct virgl_caps_v2 {
uint32_t max_shader_sampler_views;
struct virgl_supported_format_mask supported_multisample_formats;
uint32_t max_const_buffer_size[6]; // PIPE_SHADER_TYPES
uint32_t num_video_caps;
struct virgl_video_caps video_caps[32];
};
union virgl_caps {
+60
View File
@@ -117,6 +117,18 @@ enum virgl_context_cmd {
VIRGL_CCMD_GET_MEMORY_INFO,
VIRGL_CCMD_EMIT_STRING_MARKER,
VIRGL_CCMD_LINK_SHADER,
/* video codec */
VIRGL_CCMD_CREATE_VIDEO_CODEC,
VIRGL_CCMD_DESTROY_VIDEO_CODEC,
VIRGL_CCMD_CREATE_VIDEO_BUFFER,
VIRGL_CCMD_DESTROY_VIDEO_BUFFER,
VIRGL_CCMD_BEGIN_FRAME,
VIRGL_CCMD_DECODE_MACROBLOCK,
VIRGL_CCMD_DECODE_BITSTREAM,
VIRGL_CCMD_ENCODE_BITSTREAM,
VIRGL_CCMD_END_FRAME,
VIRGL_MAX_COMMANDS
};
@@ -696,4 +708,52 @@ enum vrend_tweak_type {
#define VIRGL_LINK_SHADER_TESS_EVAL_HANDLE 5
#define VIRGL_LINK_SHADER_COMPUTE_HANDLE 6
/* VIRGL_CCMD_CREATE_VIDEO_CODEC */
#define VIRGL_CREATE_VIDEO_CODEC_SIZE 7
#define VIRGL_CREATE_VIDEO_CODEC_HANDLE 1
#define VIRGL_CREATE_VIDEO_CODEC_PROFILE 2
#define VIRGL_CREATE_VIDEO_CODEC_ENTRYPOINT 3
#define VIRGL_CREATE_VIDEO_CODEC_CHROMA_FMT 4
#define VIRGL_CREATE_VIDEO_CODEC_LEVEL 5
#define VIRGL_CREATE_VIDEO_CODEC_WIDTH 6
#define VIRGL_CREATE_VIDEO_CODEC_HEIGHT 7
/* VIRGL_CCMD_DESTROY_VIDEO_CODEC */
#define VIRGL_DESTROY_VIDEO_CODEC_SIZE 1
#define VIRGL_DESTROY_VIDEO_CODEC_HANDLE 1
/* VIRGL_CCMD_CREATE_VIDEO_BUFFER */
#define VIRGL_CREATE_VIDEO_BUFFER_MIN_SIZE 5
#define VIRGL_CREATE_VIDEO_BUFFER_HANDLE 1
#define VIRGL_CREATE_VIDEO_BUFFER_FORMAT 2
#define VIRGL_CREATE_VIDEO_BUFFER_WIDTH 3
#define VIRGL_CREATE_VIDEO_BUFFER_HEIGHT 4
#define VIRGL_CREATE_VIDEO_BUFFER_RES_BASE 5
/* VIRGL_CCMD_DESTROY_VIDEO_BUFFER */
#define VIRGL_DESTROY_VIDEO_BUFFER_SIZE 1
#define VIRGL_DESTROY_VIDEO_BUFFER_HANDLE 1
/* VIRGL_CCMD_BEGIN_FRAME */
#define VIRGL_BEGIN_FRAME_SIZE 2
#define VIRGL_BEGIN_FRAME_CDC_HANDLE 1
#define VIRGL_BEGIN_FRAME_TGT_HANDLE 2
/* VIRGL_CCMD_DECODE_MACROBLOCK */
/* VIRGL_CCMD_DECODE_BITSTREAM */
#define VIRGL_DECODE_BS_SIZE 5
#define VIRGL_DECODE_BS_CDC_HANDLE 1
#define VIRGL_DECODE_BS_TGT_HANDLE 2
#define VIRGL_DECODE_BS_DSC_HANDLE 3
#define VIRGL_DECODE_BS_BUF_HANDLE 4
#define VIRGL_DECODE_BS_BUF_SIZE 5
/* VIRGL_CCMD_ENCODE_BITSTREAM */
/* VIRGL_CCMD_END_FRAME */
#define VIRGL_END_FRAME_SIZE 2
#define VIRGL_END_FRAME_CDC_HANDLE 1
#define VIRGL_END_FRAME_TGT_HANDLE 2
#endif