Spice 主窗口表面的創建應該由虛擬機的QXL驅動發起,經由QEMU將相關參數傳遞給spice server(主要由負責顯示的red_worker.c完成),最後spice server將SPICE_SURFACE_FLAGS_PRIMARY 消息發給spice client完成。上圖中省略了QXL driver與 spice client相關部分的過程,用文字來說明。
文件 |
方法 |
描述 |
QEMU Qxl.c |
ioport_write |
接受CPU QXL部分的模擬指令,當指令是QXL_IO_CREATE_PRIMARY 的時候調用qxl_create_guest_primary()進行處理 |
|
qxl_create_guest_primary() |
第一個參數是PCIQXLDevice,裏面包含了primary surface的信息,負責將其轉換成surface數據結構的形式,然後調用qemu_spice_create_primary_surface繼續(同步的話是調用(qxl_create_guest_primary_complete),下面都以異步來說明 |
QEMU Spice-display.c |
qemu_spice_create_primary_surface() |
調用RedWorker的create_primary_surface方法,但是由於這是個回調函數,實際調用的是Red_dispatcher.c的qxl_worker_create_primary_surface 方法 |
LibSpice Red_dispatcher.c |
qxl_worker_create_primary_surface() |
簡單調用 red_dispatcher_create_primary_surface() |
|
red_dispatcher_create_primary_surface() |
根據同步異步設置,調用相應的方法,這裏默認是同步,調用red_dispatcher_create_primary_surface_sync |
|
red_dispatcher_create_primary_surface_sync() |
Dispatcher與Red_worker之間是通過雙向的socketpair發消息通信的,因此這裏Dispatcher發了一個RED_WORKER_MESSAGE_CREATE_PRIMARY_SURFACE消息給Red_worker |
LibSpice Red_worker.c |
handle_dev_create_primary_surface()
|
Red_worker收到創建Primary surface的消息後開始在handle_dev_create_primary_surface()進行處理,簡單轉給dev_create_primary_surface() |
|
dev_create_primary_surface() |
主要做了三件事情: 1. 調用red_create_surface()創建primary surface(通過調用PIXMAN的API完成)併發送SPICE_SURFACE_FLAGS_PRIMARY消息給spice client,由spice client的Display_channel.cpp處理完成; 2. 調用red_worker_push_monitors_config 發送監視器的配置給spice client; 3. 調用red_channel_pipes_add_type 發送PIPE_ITEM_TYPE_CURSOR_INIT消息給spice client,spice client調用Cursor_channel.cpp的handle_init進行光標的初始化處理。
|