Spice代碼閱讀二:Primary surface 創建過程


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進行光標的初始化處理。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章