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