上文分析对比了virgl_test_server和virgl_render_server的差异,本文来分析下virgl_test_server的具体用法,可以帮助开发virtio后端的开发者提供一种不依赖前端虚拟机的快速测试方法。
1. 概述
virgl_test_server(简称vtest_server)是virglrenderer项目的测试服务器组件,主要用于开发、测试和验证virglrenderer的功能。它提供了一个简单而直接的接口来测试GPU虚拟化功能,支持多种渲染后端和配置选项。
2. 服务器架构
该测试套件采用C/S架构,因此核心组件就是代表server端的vtest_server和代表客户端的vtest_client,实现于vtest_server.c中,具体分析见下文。
2.1 核心组件
struct vtest_server {
const char *socket_name; // Unix socket路径
int socket; // socket文件描述符
const char *read_file; // 输入文件(测试模式)
const char *render_device; // 渲染设备路径
// 运行模式
bool main_server; // 是否为主服务器
bool do_fork; // 是否创建子进程
bool loop; // 是否循环运行
bool multi_clients; // 是否支持多客户端
// 渲染后端配置
bool use_glx; // 使用GLX
bool use_egl_surfaceless; // 使用EGL surfaceless
bool use_gles; // 使用OpenGL ES
bool venus; // 启用Venus Vulkan
bool no_virgl; // 禁用Virgl
bool use_compat_profile; // 使用兼容性配置文件
int ctx_flags; // 上下文标志
// 客户端管理
struct list_head new_clients; // 新客户端列表
struct list_head active_clients; // 活跃客户端列表
struct list_head inactive_clients;// 非活跃客户端列表
};
2.2 客户端管理
struct vtest_client {
int in_fd; // 输入文件描述符
int out_fd; // 输出文件描述符
struct vtest_input input; // 输入处理
struct list_head head; // 链表节点
bool in_fd_ready; // 输入就绪标志
struct vtest_context *context; // 渲染上下文
int context_poll_fd; // 上下文轮询fd
bool context_need_poll; // 是否需要轮询
};
3. 启动参数详解
要想进行测试,首先要启动server。
3.1 命令行语法
virgl_test_server [选项] [文件]
3.2 详细参数说明
进程管理参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
--no-fork |
标志 | false | 不创建子进程,在当前进程中运行 |
--no-loop-or-fork |
标志 | false | 既不循环也不fork,处理完一个客户端后退出 |
--multi-clients |
标志 | false | 启用多客户端支持(客户端必须互相信任) |
使用示例:
# 单进程模式,便于调试
virgl_test_server --no-fork
# 处理单个客户端后退出
virgl_test_server --no-loop-or-fork
# 支持多个客户端同时连接
virgl_test_server --multi-clients
渲染后端参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
--use-glx |
标志 | false | 使用GLX作为渲染后端 |
--use-egl-surfaceless |
标志 | false | 使用EGL surfaceless模式 |
--use-gles |
标志 | false | 使用OpenGL ES |
--no-virgl |
标志 | false | 禁用Virgl功能 |
--compat |
标志 | false | 使用OpenGL兼容性配置文件 |
后端兼容性规则:
# 错误组合:GLX不能与surfaceless或GLES同时使用
virgl_test_server --use-glx --use-egl-surfaceless # 错误!
# 错误组合:兼容性配置文件不能与GLES同时使用
virgl_test_server --use-gles --compat # 错误!
# 正确组合示例
virgl_test_server --use-egl-surfaceless --use-gles # 正确
virgl_test_server --use-glx # 正确
设备和路径参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
--rendernode <device> |
字符串 | null | 指定DRM渲染节点设备路径 |
--socket-path <path> |
字符串 | /tmp/.virgl_test |
指定Unix socket路径 |
使用示例:
# 指定渲染设备
virgl_test_server --rendernode /dev/dri/renderD128
# 自定义socket路径
virgl_test_server --socket-path /tmp/my_virgl_socket
高级功能参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
--venus |
标志 | false | 启用Venus Vulkan支持(需编译时支持) |
Venus支持:
# 启用Venus Vulkan(仅在编译时启用ENABLE_VENUS时可用)
virgl_test_server --venus --use-egl-surfaceless
文件输入模式
# 从文件读取命令而不是socket
virgl_test_server commands.bin
当指定文件参数时,服务器会:
- 从指定文件读取命令
- 将输出重定向到
/dev/null - 自动设置
loop=false和do_fork=false
3.3 环境变量配置
vtest_server还支持通过环境变量进行配置:
| 环境变量 | 对应参数 | 说明 |
|---|---|---|
VTEST_USE_GLX |
--use-glx |
启用GLX后端 |
VTEST_USE_EGL_SURFACELESS |
--use-egl-surfaceless |
启用EGL surfaceless |
VTEST_USE_GLES |
--use-gles |
启用OpenGL ES |
VTEST_RENDERNODE |
--rendernode |
指定渲染设备 |
VTEST_USE_COMPATIBILITY_PROFILE |
--compat |
使用兼容性配置文件 |
环境变量示例:
# 通过环境变量配置
export VTEST_USE_EGL_SURFACELESS=1
export VTEST_USE_GLES=1
export VTEST_RENDERNODE=/dev/dri/renderD128
virgl_test_server
4. 通信协议详解
4.1 协议基础
vtest使用自定义的二进制协议进行通信,代码实现在vtess_protocol.h中,具体协议的处理在vtest_renderer.c中。
#define VTEST_PROTOCOL_VERSION 3
#define VTEST_DEFAULT_SOCKET_NAME "/tmp/.virgl_test"
// 消息头格式
#define VTEST_HDR_SIZE 2
#define VTEST_CMD_LEN 0 // 数据长度字段
#define VTEST_CMD_ID 1 // 命令ID字段
#define VTEST_CMD_DATA_START 2 // 数据开始位置
4.2 支持的命令
基础命令(协议版本1)
| 命令ID | 命令名 | 说明 |
|---|---|---|
| 1 | VCMD_GET_CAPS |
获取渲染器能力信息 |
| 2 | VCMD_RESOURCE_CREATE |
创建资源 |
| 3 | VCMD_RESOURCE_UNREF |
释放资源引用 |
| 4 | VCMD_TRANSFER_GET |
从资源读取数据 |
| 5 | VCMD_TRANSFER_PUT |
向资源写入数据 |
| 6 | VCMD_SUBMIT_CMD |
提交渲染命令 |
| 7 | VCMD_RESOURCE_BUSY_WAIT |
等待资源完成 |
| 8 | VCMD_CREATE_RENDERER |
创建渲染器 |
扩展命令(协议版本2)
| 命令ID | 命令名 | 说明 |
|---|---|---|
| 9 | VCMD_GET_CAPS2 |
获取扩展能力信息 |
| 10 | VCMD_PING_PROTOCOL_VERSION |
Ping协议版本 |
| 11 | VCMD_PROTOCOL_VERSION |
协议版本协商 |
| 12 | VCMD_RESOURCE_CREATE2 |
创建资源v2 |
| 13 | VCMD_TRANSFER_GET2 |
数据传输v2(读) |
| 14 | VCMD_TRANSFER_PUT2 |
数据传输v2(写) |
高级命令(协议版本3)
| 命令ID | 命令名 | 说明 |
|---|---|---|
| 15 | VCMD_GET_PARAM |

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



