X协议虽然是间接渲染的代表性协议,但是实际上它也支持直接渲染扩展。和原生的直接渲染协议——wayland相比,x协议只是没有把合成器和窗口管理器合二为一了。X协议虽然是间接渲染的代表性协议,但是实际上它也支持直接渲染扩展。和原生的直接渲染协议——wayland相比,x协议和wayland协议的主要差异就是没有把合成器和窗口管理器合二为一了,这也是性能损失最大的地方(合成器和窗口管理器做了很多重复的工作,且多做了很多不需要的正文切换)。
DRI1
由于早期的显卡(video cards)内存大小很小,在最初的dri框架里,DRI client和server共享一个front buffer和back buffer(其实还有其他depth buffer和stencil buffer也只有一个实例)。所有的程序直接将图形渲染到back buffer,然后vb 间隔里和front buffer交换,以完成显示。
...
由于合成窗口管理器如compiz(特殊的Xclient)越来越受欢迎,DRI需要重新设计来满足X client在使用直接渲染时也可以进行离线渲染功能。一般情况下X client时满足重定向图形到由X server提供的另外一个pixmap(offscreen pixmap)作为渲染目标,但是DRI client还是只能渲染到共享的backbuffer,这个流程充当了实际的合成管理器,导致compiz等实际的合成管理器无效。终极解决方案时改变DRI处理渲染buffer的方式,这就导致一个完全不同的DRI client如果还是只能渲染到唯一且共享的back buffer,那它实际相当于做了合成管理器的工作,导致compiz这个实际的合成管理器被旁路。终极解决方案时改变DRI处理渲染buffer的方式,这就导致一个完全不同的DRI 扩展——DRI2被设计出来。DRI2不是DRI1的延续,而是另外一个扩展。
在DRI2中,摒弃了只有一个唯一的back 在DRI2中,摒弃了只有一个唯一共享的back buffer的方案,取而代之的是每个DRI client都可以拥有自己的back buffer,这样每个client都可以使用硬件加速渲染将窗口内容。然后client将一个假的front buffer和backbuffer进行交换,这个假的front buffer又是下一个阶段——窗口合成管理器的输入之一。合成窗口管理器将所有的输入合成到最后的back buffer里,在vblank间隔内交换到front buffer。
...