...
DRI3 clients 自己分配缓存,取代了必须依赖Xserver分配的方式。
DRI3 去除了不安全的GEM 管理机制。因为GEM name是全局的,所以其他进程可以随意遍历所有name,就能访问到共享内容。使用PRIME dma-bufs机制来共享,新机制使用文件描述符来共享。由于文件描述符是独立的,如果不通过unix socket 传递的话,其他进程无法访问到其他进程的fd指向的内容。
但是在client端分配缓存打破了GLX之前关于多个client共同渲染一个窗口的设计。所以从此多个client无法共同渲染同一个窗口。进一步将,DRI client管理缓存,能有效实现窗口和缓存的尺寸匹配需求,解决了DRI2模式下的问题。还有一个优点是窗口合成管理器(也是一个dri3 client)就可以尽量保留历史的buffer,复用于下一帧的显示。但是在client端分配缓存打破了GLX之前关于多个client共同渲染一个窗口的设计。所以从此多个client无法共同渲染同一个窗口。进一步讲,DRI client管理缓存能有效实现窗口和缓存的尺寸匹配需求,解决了DRI2模式下的问题。还有一个优点是窗口合成管理器(也是一个dri3 client)就可以保留历史的buffer,复用于下一帧的显示,以节省空间。
从技术上讲,DRI有两个不同扩展组成,“Present”和“DRI3”。DRI3扩展主要用于共享缓存,client分配缓存作为渲染目标,而xserver使用x11 的object名称pixmap来表示这些缓存。DRI3提供两个操作,DRI3PixmapFromBuffer
和 DRI3BufferFromPixmap
,其中一个是通过GEM buffer object(在DRI client 空间)创建pixmap(x server的空间),另外一个是反向操作。从x pixmap获得gem buffer object。在这些操作中,gembuffer object 都通过dmabuf 文件描述符进行传递。不同于DRI2,DRI3open操作,必须在每个driclient第一步被调用,以获取到底用哪个drm device。 它会返回一个关于设备节点的已打开的文件描述符,而不是一个设备节点名。同时也会由Xserver 在高级模式下执行后续需要的认证流程。
...