天天看點

三代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擴充,新鮮程度沒有激起我非常強的表述欲,就當沒看見了。

DRM

繼續閱讀