三代DRI的变化

DRI1

首先要说,DRI1已经不在考虑使用了,这里说一下它的原理:

DRI1由于当时图形卡内存大小,只有一个屏幕front buffer+back buffer由所有DRI clients和X server使用,front buffer和back buffer就像现在显示系统的双缓冲一样,所有要做渲染操作的实体都直接渲染到back buffer,然后执行swap就更新画面,front变back,back变front。另外所有渲染实体在开始渲染时,都会独占DRM设备,就像互斥锁保护的内存资源,其他的渲染实体就要等,并且渲染实体在释放设备时,所有之前上传的数据(如纹理等)都会丢失,总之,性能不行。

DRI2

DRI2和DRI3现在都在使用,但是DRI3性能更好一些,说一下DRI2原理:

DRI2是进入compositor时代的设计,buffer开始变成离屏buffer,并且离屏buffer可以做直接渲染,DRM也经过了一次大更新;每个DRI client都有自己的back buffer(附带着深度和模版 缓冲区),DRI client在back buffer做完渲染后的swap也不再是直接显示出去,而是变成提交给compositor作为一个compose源,最终的屏幕内容是compositor根据各个源的叠加、透明、边界裁剪得到,并swap到真的front buffer。

为了管理各个DRI client都有自己的back buffer这个事儿,DRM加了新功能,内存管理TTM,但是后来又重写成GEM,这些东西到DRM的事儿里再说。但是有了这个内存管理之后,DRI2 client渲染时不再锁定整个DRM设备,并且在暂停渲染时也不必释放所有显存资源。

DRI3

DRI3 client申请自己的渲染buffer,而不是去调用X server来做申请,这带来了易于改变窗口大小、重复利用之前的buffer等特性(compositor刷帧只需要更新部分缓存内容即可);DRI3放弃了不安全的机遇GEM共享buffer的机制,转而使用DMA的fd来传递,并且DRI3PixmapFromBuffer和DRI3BufferFromPixmap可以完成X server buffer与DMA buffer的转换,同样一块内存,在DRI client和X server之间传递。DRI3还有Present扩展,新鲜程度没有激起我非常强的表述欲,就当没看见了。

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