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

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