0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何選擇Embedded Linux的圖形框架

Linux閱碼場(chǎng) ? 來(lái)源:fqj ? 2019-05-27 14:59 ? 次閱讀

對(duì)于Android開(kāi)發(fā)者來(lái)說(shuō),基本不用關(guān)心圖形方案這些細(xì)節(jié),你只要調(diào)用java的class,最后的性能都是有原廠(chǎng)和谷歌驗(yàn)證過(guò)的。 但對(duì)Linux開(kāi)發(fā)者來(lái)說(shuō),情況要復(fù)雜的多,沒(méi)有一個(gè)完美方案。。所以當(dāng)你決定要在Linux要開(kāi)發(fā)應(yīng)用的時(shí)候,一定要明確你的需求,對(duì)比方案間的優(yōu)劣。

小框圖:

如何選擇Embedded Linux的圖形框架

X11

X11的基礎(chǔ)構(gòu)架,建議先谷歌一下,太龐大,歷史遺留比較多,到現(xiàn)在我也沒(méi)弄清楚一些調(diào)用流程。下面主要講講dri2。dri2是xserver用來(lái)連接gpu的結(jié)構(gòu),下面這個(gè)鏈接里蠻詳細(xì)的。大概理解,dri2自己管理一個(gè)window下面的buffers, xserver都不會(huì)過(guò)問(wèn),只有swap front buffer的時(shí)候,才會(huì)調(diào)一些函數(shù)來(lái)wait page flip來(lái)進(jìn)行畫(huà)面的同步。
不過(guò)這個(gè)front buffer是false的,要注意,最后顯示還要進(jìn)行compoiste(以rk的xserver為例,這里會(huì)用到cpu blit, 而wayland和qt eglfs這步是gpu做的)。dri2全屏和不全屏的性能差距會(huì)比較大,因?yàn)槿恋那闆r下,dri2出來(lái)的flase front buffer,也就是這個(gè)window的drawbuffer, 是直接被作為全局的font buffer,送到ddx顯示的,省去了compoiste。
所以在x11下開(kāi)發(fā)3d應(yīng)用的時(shí)候,一定要全屏,保證沒(méi)有多余的compoiste,比如qt的qmlwindow就是一個(gè)完整的gl窗口(注:debian上不是)。另外一提,rk平臺(tái)上的xserver,還支持了glamor,意味一些compoiste可以被gpu加速到,如果是做多窗口的應(yīng)用或者desktop類(lèi)型的產(chǎn)品,這個(gè)featrue還是非常有用的,能運(yùn)行x11上的所有軟件,又有g(shù)pu加速合成。

2017.3.10

做了些實(shí)驗(yàn),x11下egl的lag,在拉高cpu頻率之后,顯著的緩解,所以應(yīng)該就是cpu參與了合成步驟,導(dǎo)致效率變低。

2017.5.21

在debian看到一些比較慢的現(xiàn)象,要注意不是x11的問(wèn)題,而是debian的程序編譯選項(xiàng)一般沒(méi)帶上gles。

QT EGLFS

QT EGLFS是qt自己實(shí)現(xiàn)的一個(gè)gui系統(tǒng),不支持多窗口,但也因此少了window compoiste。QT EGLFS和dri2的方式也差不多,區(qū)別就在于,qt eglfs的font buffer在自己用gpu compoiste后,是直接送給drm去顯示,而X里是送Window manager去做compoiste,所以EGLFS在效率上是有優(yōu)勢(shì)的。另外除了QT,常用的UI庫(kù)里,SDL也是支持這種DRM+GL的方式的。

2017.3.11

QT EGLFS的流程其實(shí)可以通過(guò)代碼追蹤一下。根據(jù)代碼,一個(gè)qmlvideo的顯示過(guò)程會(huì)是這樣的(非qml的話(huà)不一樣,會(huì)優(yōu)先用xvimagesink的subwindow),surface路徑會(huì)是QDeclarativeVideoOutput->QDeclarativeVideoRendererBackend,顯示一幀frame的話(huà),會(huì)先調(diào)用到QDeclarativeVideoRendererBackend::updatePaintNode,然后就是返回一個(gè)NV12 to RGB的shader,走正常qtquick程序的顯示顯示,最后QOpenGLCompositor會(huì)合成所有的window。Qt EGLFS的流程還是很清晰的,就是先window自己render(qquickwindow是用的GPU)一個(gè)buffer, 然后QOpenGLCompositor把所有的window再render到一個(gè)buffer上,然后這個(gè)buffer送drm顯示(如果就是一個(gè)primary window,就直接送drm了)。

Wayland

wayland是Linux上下一代的display server,從結(jié)構(gòu)上來(lái)講,也最相近android上的HWC,全部的compoiste都是gpu來(lái)做的,不會(huì)有xserver那樣cpu合成的場(chǎng)景。wayland除了gpu合成以外,另一個(gè)優(yōu)勢(shì),就是overlay接口的存在,能允許移動(dòng)平臺(tái)上的一些2d加速模塊,display模塊在這個(gè)接口上被調(diào)用(這些模塊才是移動(dòng)平臺(tái)能跑大分辨率ui的關(guān)鍵)。wayland主要的問(wèn)題是兼容性,比如你用qtmultimedia的話(huà),會(huì)發(fā)現(xiàn)video sink不能換,因?yàn)椴患嫒輜ayland的窗口api。

應(yīng)用場(chǎng)景

3d應(yīng)用

3d應(yīng)用的瓶頸最主要在計(jì)算單元上,拷貝,compoiste一類(lèi)的開(kāi)銷(xiāo),根據(jù)具體場(chǎng)景再考慮。建議直接raw的drm api或者qt eglfs。

視頻播放

對(duì)視頻播放來(lái)說(shuō),拷貝,compoiste的開(kāi)銷(xiāo)是決定性的。Spec上的視頻播放極限,比如rk3399,rk3288播放4k,rk3036播放1080p,基本上是不可能在通用框架,也就是走gpu實(shí)現(xiàn)的。 因?yàn)檫_(dá)到了芯片bandwidth的上限場(chǎng)景,如果讓gpu去拷貝和轉(zhuǎn)格式的話(huà)速度會(huì)很慢,必須要display的部分自己去處理顯示視頻數(shù)據(jù)。
但想讓display部分去處理的話(huà),軟件上必須有對(duì)應(yīng)的支持——-然而desktop based的gui framework大多缺失了這樣一個(gè)東西。之前在rk的系統(tǒng)上,我base X11做了一個(gè)“gstreamer sink” 。通過(guò)x的api獲取窗口的位置,然后直接drm的api,繞過(guò)X系統(tǒng),overlay畫(huà)在窗口的位置。
這樣做確實(shí)可以發(fā)揮視頻播放的極限,主要的問(wèn)題就是沒(méi)辦法和gui系統(tǒng)融合,沒(méi)辦法疊加控件,如果使用的場(chǎng)景都是fullscreen,可以試試這做。上文提了下wayland框架支持overlay,所以最理想的,還是wayland通過(guò)overlay的機(jī)制直接call的display單元顯示,像android那樣。
總結(jié)一下,所以如果視頻性能不是那么高,又需要復(fù)雜UI,建議用gpu的框架。qt eglfs,放視頻,按rk3288的性能,可以達(dá)到1080p 60fps。x11,gles在rk平臺(tái)的軟件上,測(cè)試下來(lái),性能比較差;不過(guò)已經(jīng)有rkximagesink的overlay顯示方案。wayland暫時(shí)沒(méi)有研究,理論上原生支持overlay的wayland是最好的,但是我覺(jué)得應(yīng)該也就類(lèi)似rkximageisnk的那種效果,不能和正常的窗口兼容。

Tips

libmali

libmali是mali gpu的userspace library,我也看不到代碼,完全是黑盒,只能說(shuō)根據(jù)一些類(lèi)似的代碼和文檔猜測(cè)他的實(shí)現(xiàn)方式。libmali有很多編譯選項(xiàng),我猜的話(huà),除了軟件硬件版本,還有下面兩種。一個(gè)是fbdev和gbm,分別對(duì)應(yīng)了fbdev和drm兩種內(nèi)核驅(qū)動(dòng)的場(chǎng)景。fbdev對(duì)比gbm有幾個(gè)差異。
1.vblank用fbdev去跑on-screen的glmark,分?jǐn)?shù)一般是要比gbm的高,原因就是這套流程沒(méi)有去等待vblank。gbm的實(shí)現(xiàn)都會(huì)在最后swap front buffer的時(shí)候等待vblank,所以on-screen只能跑幾十fps,fbdev的不會(huì)去等,因此fbdev的libmali on-screen的fps和off-screen的差不多。
2.zero-copy所謂zero-copy就是不拷貝texture。一段在內(nèi)存里的texture,要讓gpu去使用,必須先用cpu把數(shù)據(jù)從這段內(nèi)存拷到gpu能用的buf(dma-buf)里。如果這個(gè)texture數(shù)據(jù)本來(lái)就在一個(gè)dma-buf里的話(huà),可以通過(guò)特定的api直接讓gpu load,從而避免拷貝。dma-buf在gbm上的實(shí)現(xiàn),搜索EGL_LINUX_DMA_BUF_EXT就可以。在fbdev上的實(shí)現(xiàn),比較麻煩,“fbdev zero-copy” 。還有就是display server的選項(xiàng),比如xserver,比如wayland。 這個(gè)就是支持在display server下運(yùn)行,沒(méi)什么好說(shuō)的。

libdrm

drm的api分legacy api和新一點(diǎn)的atomic api,如果你直接用drm api開(kāi)發(fā)程序,一定要注意這兩個(gè)api的區(qū)別。legacy api:drmModeSetCrtc, drmModeSetPlane, drmModePageFlip都是legacy的api,這些函數(shù)什么意思,怎么用,可以搜索下網(wǎng)絡(luò)資料。
大致上,drmModeSetCrtc包括了drmModeSetPlane包括了drmModePageFlip。在rk平臺(tái)上,drmModeSetCrtc和drmModeSetPlane都是atomic的,意味著你調(diào)用這些api后會(huì)一直block到vblank,drmModePageFlip是noneblock的,你調(diào)用后就會(huì)返回。
一般來(lái)說(shuō)不在一個(gè)程序里順序調(diào)用會(huì)block的api,性能不會(huì)有太大問(wèn)題。atomic api:legacy的api都是atomic的,而且容易重復(fù)調(diào)用,這就導(dǎo)致有些場(chǎng)景會(huì)很沒(méi)效率。比如wayland drm的場(chǎng)景下,有3個(gè)plane,每個(gè)周期內(nèi)要更新這幾個(gè)plane,如果全用drmModeSetPlane的話(huà),就意味著要等待3次vblank,那么一個(gè)60hz的屏幕,你的fps最高只會(huì)有20fps。
為了解決這種情況,我們就需要有一個(gè)api,能在一次調(diào)用里,解決掉所有的事情,比如更新所有的plane,然后只用等一次vblank。drmModeAtomicCommit,具體用法請(qǐng)谷歌。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11212

    瀏覽量

    208721
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2952

    瀏覽量

    104487

原文標(biāo)題:怎么選擇 Embedded Linux 的圖形框架

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    一文讀懂Linux各模塊框架

    Linux各模塊框架整理。
    的頭像 發(fā)表于 06-30 11:27 ?8516次閱讀
    一文讀懂<b class='flag-5'>Linux</b>各模塊<b class='flag-5'>框架</b>

    Mentor Graphics新擴(kuò)展Mentor Embedded Linux功能

    Mentor Graphics公司(納斯達(dá)克代碼:MENT)今日宣布,即將推出可兼容 AMD 嵌入式 R 系列處理器的 Mentor? Embedded Linux?運(yùn)行軟件和開(kāi)發(fā)工具。第二代
    發(fā)表于 11-06 11:02 ?1137次閱讀

    嵌入式Linux圖形系統(tǒng)(GUI)快速參考手冊(cè)

    安裝Linux時(shí),你通常在很少的幾個(gè)"標(biāo)準(zhǔn)"的圖形支持組件中選擇。你很可能使用X Windows系統(tǒng)(XFree86或者Xorg)作為顯示界面的基礎(chǔ)(與Linux驅(qū)
    發(fā)表于 02-14 13:40

    基于NXP iMX6Q SoC平臺(tái)的Apalis iMX6 ARM核心板的相關(guān)資料推薦

    By Toradex秦海1).簡(jiǎn)介Qt圖形開(kāi)發(fā)框架作為嵌入式ARM平臺(tái)配合Embedded Linux系統(tǒng)最常用的圖形界面開(kāi)發(fā)工具已經(jīng)被廣泛
    發(fā)表于 12-17 06:34

    Embedded SIG | 多 OS 混合部署框架

    Embedded 的角度,混合關(guān)鍵性系統(tǒng)的大致架構(gòu)如圖 1 所示,所面向的硬件是具有同構(gòu)或異構(gòu)多核的片上系統(tǒng),從應(yīng)用的角度看會(huì)同時(shí)部署多個(gè) OS /運(yùn)行時(shí),例如 Linux 負(fù)責(zé)系統(tǒng)管理與服務(wù)、1 個(gè)
    發(fā)表于 06-29 10:08

    基于Qt/Embedded的嵌入式控制界面開(kāi)發(fā)

    作者通過(guò)結(jié)合Qt/Embedded的特性和優(yōu)點(diǎn),提出用Qt/Embedded實(shí)現(xiàn)風(fēng)力發(fā)電控制系統(tǒng)的圖形界面的思路和設(shè)計(jì)原則,重點(diǎn)介紹了在嵌入式Linux內(nèi)核基礎(chǔ)上Qt/
    發(fā)表于 08-12 10:14 ?49次下載

    基于QT/Embedded的可變情報(bào)板應(yīng)用程序開(kāi)發(fā)

    基于QT/Embedded的可變情報(bào)板應(yīng)用程序開(kāi)發(fā) QT是奇趣科技推出的一種多平臺(tái)的C++圖形用戶(hù)界面應(yīng)用程序框架。它包括QT開(kāi)發(fā)庫(kù)QT Library、快速開(kāi)發(fā)工具QT Designer、國(guó)際化工
    發(fā)表于 03-03 09:36 ?772次閱讀

    Qt/Embedded開(kāi)發(fā)入門(mén)

    通過(guò)Qt API與Linux I/O設(shè)施直接交互,成為嵌入式Linux端口。同Qt/X11相比,Qt/Embedded很省內(nèi)存,因?yàn)樗恍枰粋€(gè)X服務(wù)器或是Xlib庫(kù),它在底層拋棄了X lib,采用
    發(fā)表于 10-18 14:43 ?10次下載
    Qt/<b class='flag-5'>Embedded</b>開(kāi)發(fā)入門(mén)

    采用Linux還是Windows Embedded,研華選擇后者

    在IIC-China 2009深圳技術(shù)研討會(huì)上,工控領(lǐng)域的老大研華科技的副總經(jīng)理陳培齊一語(yǔ)驚人:基于Windows Embedded OS的開(kāi)發(fā)成本比Linux更低,而且開(kāi)發(fā)周期更短。我們大部分產(chǎn)品
    發(fā)表于 12-04 12:55 ?346次閱讀

    Linux DMA Engine框架的介紹

    此會(huì)話(huà)描述如何從設(shè)備驅(qū)動(dòng)程序在Linux中使用DMA。 這包括內(nèi)存分配,緩存控制和DMA設(shè)備控制。 詳細(xì)介紹了Linux DMA Engine框架。
    的頭像 發(fā)表于 11-23 06:29 ?6233次閱讀

    你對(duì)Linux總線(xiàn)設(shè)備驅(qū)動(dòng)框架是否了解

    Linux的設(shè)備驅(qū)動(dòng)模型,或者說(shuō),Linux的設(shè)備驅(qū)動(dòng)框架,都是同一個(gè)意思。應(yīng)該這樣理解,(Linux的設(shè)備)驅(qū)動(dòng)框架,即某類(lèi)設(shè)備對(duì)應(yīng)的驅(qū)動(dòng)
    發(fā)表于 05-05 15:13 ?720次閱讀

    Linux內(nèi)核開(kāi)發(fā)框架學(xué)習(xí)資料匯總

    Linux內(nèi)核開(kāi)發(fā)框架學(xué)習(xí)資料匯總
    發(fā)表于 06-17 09:29 ?24次下載

    當(dāng)前HarmonyOS輕設(shè)備圖形框架的總體特性介紹

    HarmonyOS輕設(shè)備圖形框架概述 HarmonyOS輕設(shè)備圖形框架是一款面向帶屏設(shè)備界面開(kāi)發(fā)框架,可運(yùn)行于LiteOS/
    的頭像 發(fā)表于 07-28 14:27 ?1631次閱讀
    當(dāng)前HarmonyOS輕設(shè)備<b class='flag-5'>圖形</b><b class='flag-5'>框架</b>的總體特性介紹

    基于STM32移植UCGUI圖形界面框架(3.9.0源碼版本)

    基于STM32移植UCGUI圖形界面框架(3.9.0源碼版本)
    發(fā)表于 11-30 16:06 ?0次下載
    基于STM32移植UCGUI<b class='flag-5'>圖形</b>界面<b class='flag-5'>框架</b>(3.9.0源碼版本)

    ThunderGP:基于HLS的FPGA圖形處理框架

    電子發(fā)燒友網(wǎng)站提供《ThunderGP:基于HLS的FPGA圖形處理框架.zip》資料免費(fèi)下載
    發(fā)表于 10-27 16:49 ?0次下載
    ThunderGP:基于HLS的FPGA<b class='flag-5'>圖形</b>處理<b class='flag-5'>框架</b>