Mesa代碼解讀 - VirtioGPU Winsys Layer

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()

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