Mesa VirtioGPU Winsys Layer部分的代碼,最重要的兩個數據結構和賦值操作:
struct virgl_screen繼承自struct pipe_screen,通過struct pipe_screen *virgl_create_screen(struct virgl_winsys *vws)完成struct pipe_screen中函數指針的賦值;
struct virgl_drm_winsys繼承自struct virgl_winsys,通過struct virgl_winsys *virgl_drm_winsys_create(int drmFD)完成struct virgl_winsys中函數指針的賦值;
因爲mesa採用C語言實現,它的繼承實際上是通過將結構體首個數據成員定義爲其"基類"實例來實現。
比如
struct virgl_drm_winsys
{
struct virgl_winsys base;
...
}
struct virgl_screen {
struct pipe_screen base;
...
}
通過"基類"指針訪問"子類"的函數:
struct virgl_screen *virgl_screen(struct pipe_screen *pipe)
{
return (struct virgl_screen *)pipe;
}
struct virgl_drm_winsys *virgl_drm_winsys(struct virgl_winsys *iws)
{
return (struct virgl_drm_winsys *)iws;
}
“子類”訪問“基類”就簡單了,數據成員base即是。
VirtioGPU Winsys Layer這一層只對外提供一個接口:
struct pipe_screen *virgl_drm_screen_create(int fd);
這個函數完成了上述兩對基類-子類結構體的所有函數指針賦值。
該函數的Call Trace:
virgl_drm_screen_create()
pipe_virgl_create_screen()
pipe_loader_create_screen()
dri2_init_screen()