VTest Server 详细用法分析

上文分析对比了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=falsedo_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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeeplyMind

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值