spice图形子系统

来源:互联网 发布:mysql 拼接字符串函数 编辑:程序博客网 时间:2024/06/05 22:48
    1、spice server
    Spice server通过通道(channel)与client通信,每个通道类型专用于特定类型的数据。每个通道使用一个特定的tcp socket(可以是ssl或非安全的)。
    主通道和输入通道受handler函数(在reds.c中实现)控制,显示和光标通道在red worker线程(每个display一个线程)里面处理,音频回放和录音通道有自己的handler(snd_worker.c)。libspice和VDI主机程序(比如qemu)通过为每个功能(qxl,agent,keyboard,mouse等)定义的接口来通信。

    2、图形子系统


    与其它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管道中传递的消息。


References:
    1. http://spice-space.org/docs/spice_for_newbies.pdf