<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > DirectFB圖形加速在嵌入式系統(tǒng)中的應(yīng)用

          DirectFB圖形加速在嵌入式系統(tǒng)中的應(yīng)用

          作者: 時(shí)間:2009-03-12 來(lái)源:網(wǎng)絡(luò) 收藏
          引 言
          GUI中需要實(shí)現(xiàn)多功能,包括繪制以及拷貝等。其中的許多功能需要進(jìn)行大量的數(shù)據(jù)傳遞(如拷貝),或者需要進(jìn)行大量的數(shù)值運(yùn)算(如畫樣條曲線)。如果這些功能都由純軟件實(shí)現(xiàn)的話,會(huì)占用大量的CPU時(shí)間并且需要傳遞大量的數(shù)據(jù),從而影響了圖形性能。許多顯卡芯片帶有圖形處理器,能夠從硬件上實(shí)現(xiàn)一部分圖形功能。支持硬件的圖形庫(kù)可以通過(guò)圖形處理器實(shí)現(xiàn)這些圖形功能,從而減輕了CPU的負(fù)擔(dān)并減少了數(shù)據(jù)在總線上的傳輸時(shí)間,提高了圖形性能。
          本文就如何實(shí)現(xiàn)的圖形功能做了詳細(xì)的介紹,并將實(shí)現(xiàn)之后在性能上得到的改進(jìn)與實(shí)現(xiàn)之前做比較,說(shuō)明在優(yōu)化GUI上的作用。

          1 體系結(jié)構(gòu)
          1.1 DirectFB簡(jiǎn)介

          DirectFB項(xiàng)目是由德國(guó)Convergence公司推動(dòng)的Open source計(jì)劃的一部分,它是專門為滿足設(shè)備要求而開發(fā)的小巧、強(qiáng)大、靈活和易于使用的圖形,并且試圖成為一個(gè)建構(gòu)于Linux Framebuffer Device之上的新圖形標(biāo)準(zhǔn)。它在FrameBuffer的基礎(chǔ)上提供了圖形、輸入設(shè)備處理提取、透明窗口和多重顯示層的功能,能夠?qū)η度胧?a class="contentlabel" href="http://www.ex-cimer.com/news/listbylabel/label/系統(tǒng)">系統(tǒng)GUI有較好的支持。與那些通用的嵌入式GUI系統(tǒng)相比,它具有非常簡(jiǎn)潔、高效的體系結(jié)構(gòu)和硬件圖形加速功能。
          1.2 DirectFB體系結(jié)構(gòu)
          (1)DirectFB訪問(wèn)硬件顯卡
          DirectFB依賴已有的內(nèi)核接口即幀緩沖設(shè)備(/dev/fb)訪問(wèn)圖形處理器,也就是說(shuō)DireetFB需要一個(gè)正在工作的幀緩沖驅(qū)動(dòng)。Linux內(nèi)核有專門的幀緩沖驅(qū)動(dòng)支持某些圖形處理器。對(duì)于不支持的圖形處理器,內(nèi)核提供VE―SA幀緩沖(這種幀緩沖有一些限制)。DirectFB利用幀緩沖設(shè)備做如下工作:
          ◆設(shè)置顯卡工作模式(分辨率,顏色深度,時(shí)序)
          ◆映射顯存
          ◆改變幀緩沖視口(針對(duì)雙緩沖)
          如果某種顯卡被DirecFB支持并且在Linux內(nèi)核中也有這種圖形處理器的幀緩沖驅(qū)動(dòng),DirectFB利用幀緩沖設(shè)備做如下額外的工作:
          ◆映射顯存IO端口
          ◆關(guān)閉幀緩沖驅(qū)動(dòng)中自帶的加速功能
          針對(duì)具體的圖形操作(例如圖片拷貝),DirectFB加速驅(qū)動(dòng)訪問(wèn)顯存映射的圖形處理器I/O端口向圖形處理器提交命令。也就是說(shuō)真正的硬件加速完全是在用戶空間實(shí)現(xiàn)。這樣DirectFB就可以對(duì)它支持的圖形處理器提供最大限度的硬件圖形加速。上層APl支持DirectFB的有:XdirectFB、DirectFBGL、GTK+、DFBTerm、DFBSee、DFBPoint、MythTV、Qt on DirectFB、SDL等。
          (2)DirectFB訪問(wèn)輸入設(shè)備
          DirectFB使用Linux內(nèi)核提供的標(biāo)準(zhǔn)設(shè)備接口訪問(wèn)輸入設(shè)備,而不是直接訪問(wèn)輸入硬件。具體的結(jié)構(gòu)如圖1所示。

          本文引用地址:http://www.ex-cimer.com/article/152590.htm

          2 DirectFB加速驅(qū)動(dòng)原理
          本節(jié)結(jié)合筆者的硬件平臺(tái)來(lái)說(shuō)明如何實(shí)現(xiàn)DirectFB加速驅(qū)動(dòng),筆者所用的平臺(tái)是MPC8540,圖形處理器是Fujitsu MB86296。要實(shí)現(xiàn)DirectFB加速驅(qū)動(dòng),需要有以下幾個(gè)模塊:系統(tǒng)、圖形加速器、屏幕及圖層。其中系統(tǒng)是指幀緩沖和硬件管理。DirectFB支持的系統(tǒng)有dev/fb、osx、sdl、xll、/dev/mem等。系統(tǒng)可以在DirectFB程序配置文件directfbrc中配置。屏幕是指輸出設(shè)備,如LCD。圖層代表獨(dú)立的圖像緩沖區(qū),一般是在顯示的時(shí)候自動(dòng)由硬件融合,硬件一般采用alpha技術(shù)融合。圖層數(shù)量的多少取決于圖形處理器,一般復(fù)雜的圖形處理器都支持多層顯示。一層內(nèi)容的改變不影響其他層的內(nèi)容。
          DirectFB驅(qū)動(dòng)的幾點(diǎn)基本要素是:
          ①必須賦給驅(qū)動(dòng)一個(gè)唯一的名字并且用如下宏實(shí)現(xiàn):DFB_GRAPHICS_DRIVER(MB86296)。
          ②上面的宏需要定義6個(gè)函數(shù)供DirectFB Core使用,即初始化/關(guān)閉驅(qū)動(dòng)、初始化/關(guān)閉加速重獲驅(qū)動(dòng)元數(shù)據(jù)。
          ③在驅(qū)動(dòng)中需要實(shí)現(xiàn)的函數(shù)有以下6個(gè)。
          a)static int dnver_probe(GraphicsDevice*device);
          如果系統(tǒng)支持某種硬件此函數(shù)應(yīng)該返回非零值,它用DirectFB Core來(lái)探測(cè)哪個(gè)驅(qū)動(dòng)支持系統(tǒng)硬件。

          b)static void driver_get_info(GraphicsDevice *device, GraphicsDriverInfo *info);

          些函數(shù)用來(lái)設(shè)驅(qū)動(dòng)信息。

          c)static DFBResult driver_init_driver (GraphicsDevice *device, GraphicsDeviceFuncs *funcs, void *driver_data, void *device_data, CoreDFB *core);

          初始化驅(qū)動(dòng)。在成功獲得所有需要的資源后驅(qū)動(dòng)應(yīng)該注冊(cè)屏幕和層。同時(shí)也需要通過(guò)funcs返回硬件加速函數(shù)列表。實(shí)現(xiàn)方式如下所示。

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          上一頁(yè) 1 2 下一頁(yè)

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();