Spice-QXL

news/2024/10/31 5:24:32/

QXL消息流程

QXL message flow:

以上绿色线表示为一个图形绘制流程,当GuestOS上的一个user应用需要产生一个渲染操作的时候,

  1. 由Guest APP发送请求给Guest的图形引擎(GDI/X)
  2. 图形引擎将命令传送给qxl驱动
  3. qxl驱动将命令翻译为qxl命令推送到qemu中qxl设备的消息队列里面
  4. libspice从队列里面取数据,将其加入到display Tree中
  5. display Tree包含了命令的集合,执行这些命令会产生显示内容。这棵树也可以优化掉那些会被覆盖掉的命令。这个命令树还用来检测video数据流。
  6. 当一条命令从队列中取出发给客户端是,发送的命令被转换为Spice协议消息,同时这个命令从发送队列和树上移除。
  7. 当一个命令不再使用时,libspice将其放入驱动release ring,qxl驱动释放掉命令资源。client收到图形命令后用其来更新显示。

QXL–>VDI

Spice中的VDI是一个接口规范,此类接口设计的主要目标是在尽量不改变原有代码的情况下,通过动态库的方式来为原有软件提供全新的功能组件。qemu也是通过VDI借口与Spice交互的
VDI
VDI接口规范本身非常简单,它仅为开发人员提供一种标准的开发方式,具体的VDI接口功能则由程序员自己负责。具体的约束总结如下:

  1. 必须包含一个固定的BaseInterface结构体成员。
  2. Back-end与Front-end的交互关系初始化工作由Back-end负责发起。
  3. Back-end负责实现与Back-end内部强相关且Front-end感兴趣的功能接口。
  4. Front-end负责实现与Front-end内部强相关且Back-end感兴趣的功能接口。

QXLInterface是最主要也是最复杂的一个VDI,并且与其他VDI不同的是,Front-end有一个单独的网络处理模型, QXLInterface在Front-end有自己单独的处理线程。Back-end端需要实现Qxl device,同时需要Guest OS的Driver配合工作。另外,Qemu需要Spice为其提供相关的接口来完成一些交互工作。

QXL图形子系统

Spice server通过通道(channel)与client通信,每个通道类型专用于特定类型的数据。每个通道使用一个特定的tcp socket(可以是ssl或非安全的)。
主通道和输入通道受handler函数(在reds.c中实现)控制,显示和光标通道在red worker线程(每个display一个线程)里面处理,音频回放和录音通道有自己的handler(snd_worker.c)。libspice和VDI主机程序(比如qemu)通过为每个功能(qxl,agent,keyboard,mouse等)定义的接口来通信。
red 与其它spice server中的子系统不同,图形子系统是与spice server并行的一个专门线程。这种架构可以使qemu流程与处理和渲染图形命令独立开来,因为后者会占用大量cpu资源。Red server在每个新的qxl接口中初始化一个dispatcher,dispatcher创建一个red worker。red worker处理的命令来自三处:1) 同步的qxl设备命令;2)red server命令;3)异步qxl设备命令。其中1)和2)由red dispatcher通过socket传送,3)由red worker从qxl设备ring中通过接口取出。
Red Worker(red_worker.c)
spice server为每个qxl设备实例运行一个red worker线程。

red worker的作用主要有:
* 处理qxl设备命令;
* 处理从dispatcher收到的消息;
* channel pipe和pipe item;
* 显示和光标通道;
* 图形压缩(使用quic,lz,glz);
* 视频流---识别、编码、创建流;
* 缓存---client共享的pixman缓存、光标、调色板缓存
* Cairo和OpenGL渲染----canvas,surface等 
Red Dispatcher(red_dispatcher.c)
* 每个qxl实例一个dispatcher
* 初始化red worker,创建red worker线程
* 使用socketpair通道调度worker
* qxl设备使用QxlWorker接口,dispatcher实现并attach这些接口,将设备调用翻译成在worker管道中传递的消息。

QXL指令

qxl指令分为异步和同步。

QXL指令代码流程
Spice源码流程


http://www.ppmy.cn/news/215618.html

相关文章

QC-LDPC简介

QC-LDPC简介 QC-LDPC(Quasi-Cyslic Low-Density Parity-Check Codes)即准循环LDPC码。之前介绍的LDPC码基本属于随机构造法,构造出的码性能很好,但校验矩阵具有不规律性,存在校验矩阵存储于读取困难、编码复杂度高等问…

qcc514x-qcc304x调试笔记-Mic

1、MIC配置 adk\src\domains\audio\kymera\kymera_config.h 具体怎么配置通道那些,需要结合硬件的原理图 /* Always define mic 1..3. Number of microphones can be checked using Kymera_GetNumberOfMics() */ #if (defined HAVE_RDP_HW_YE134) || (defined HAVE_RDP_HW_…

Add Defect To QC from QTP that use the QCUtil.QCConnection sub

QTP执行时,有时我们可能想直接向QC/TD中添加defect, 那么具体怎么做喃?那么我将以两种方式来进行从qtp中提交defect今天先用第一种方式. 下面是具体代码 description : Add Defect To QC from QTP that use the QCUtil.QCConnection sub ,This co…

com.qcby

基本数据类型 整型:byte(1字节) short(2字节) int(4字节) long(8字节) 浮点型:float(4字节) double (8) 布尔型:boolen 字符型:char 引用…

缺陷管理工具-QC篇

缺陷管理工具-QC篇 一、QC介绍: QC的全称Quality center, 质量中心的意思,它是一款缺陷管理工具,可以组织和管理一个项目所有的测试阶段,如:从需求-用例编写-用例执行-提交缺陷-回归测试等。 QC的背景:原…

视频转码、腾讯爱奇艺等各网站缓存文件转mp4等

不需要下载软件,windows命令可搞定,清晰度同下载的一样且无水印 如题:以腾讯视频为类,缓存的文件只有用腾讯视频才能打开,并且会将其分成十几秒的小段,并带有logo 找到缓存的片段,放置于一个文…

qq视频转码失败怎么办_微信视频大于25M发送失败怎么办?学会这3招教你秒传视频...

微信在我们的生活和工作中可谓是占有重要地位呀,接收和传送文件是常有的事。不知道大家有没有发现当我们发送视频时,超过25M的就不能发送出去了!今天教给大家三招,大于25M的视频很快就可以发送出去啦! 一:修…

优酷、爱奇艺视频码率与YouTube视频码率

YouTube视频码率 144p,288p,360p,480p,720p(HD),1080p(HD),1440p(HD),2160p(4K),4320p(8K) 优酷视频码率 标清448x336,高清576x432,超清1104x622 &#xff…