少于 1 分钟阅读

关于2D driver的调用,Xorg中画折线 初始化某个颜色的区域 或者画字 会走drv

Display有多个Screen -> 一个Screen有多个Window 一般只有rootWindow,Screen属于back end在driver里面用(include muti _GC),Window属于front end在app里面用,window在driver里面就是drawable,一个Drawable属于某个个screen

/* types for Drawable */
#define DRAWABLE_WINDOW 0
#define DRAWABLE_PIXMAP 1
#define UNDRAWABLE_WINDOW 2

对于Xorg,在server端GCOps和GCFuncs已经在内存中,有一个走GL的默认实现,我们的实现指直接通过CLI3里面的command实现一些操作。 如果一个2D函数底层glamor.SavedGCOps 说明走的Xorg自带的函数fb***

2Ddriver中的函数主要实现了GCfuncs和GCOps,包括原生的mi 还有rxa和glamor

rxa 走PrepareAcces并自己组织一些command操作 glamor就是加一些fence sync操作然后调原生的Saved的 rxa_copy_window 在同一个window下的move

例如rxa_poly_fill_rect :多边形填充之矩形,底层用GL实现,最后两个参数为矩形数量和区域

fbGetSpans:”Spans”在这里可能指的是一连串的像素行或者区域

xorg中的PrivKeyList就是一个index map

perfetto工具 + gdb可以调试

关于3D driver,OpenGL 层会做一层wrap,这一层和mesa类似;然后调Elite3k文件夹中的 __glE3k中实际的api,和mesa也类似;最后call CIL2或者CIL3中的api,也就是具体的实现和kernel,drm的调用

service have info-> (hDevice handle from) and include context and device info __GLScreenGlobals *sg; sg->__glDevice; pDevice->dpDevice = pE3kDeviceInfo; e3kSvr = &pE3kDeviceInfo->rootSvr; __GLE3kDeviceInfo *pE3kDeviceInfo;

create context

只对自己管理的engine创建context,3d有两个engine ring(实际上只有一个),根据context的PRIORITY决定选择哪个ring。默认走low,有选择PRIORITY的函数

video + gfx

surface 只是格式的抽象 包括window,pixmap,offscreen/Pbuffer