DirectFB
1. DirectFB概述
在嵌入式GUI中需要實現多種圖形功能,包括圖形繪製以及圖形拷貝等。其中的許多功能需要進行大量的數據傳遞(如圖形拷貝)或者需要進行大量的數值計算(如畫樣條曲線)。如果這些功能都由軟件來實現的話,會佔用大量的CPU時間且需要傳遞大量的數據,從而影響了圖形性能。許多顯示芯片都帶有圖形處理器,能夠從硬件上實現一部分圖形功能。支持硬件加速的圖形庫就可以通過圖形處理器來實現這些功能,從而減輕了CPU的負擔,並減少了數據在總線上的傳輸時間,提高了圖形性能。
正是基於以上的情況,出現了DirectFB圖形庫。
DirectFB圖形庫是專門爲滿足嵌入式設備要求而開發的小巧、強大、靈活和易於使用的圖形庫,並且試圖成爲一個構建於Linux Framebuffer Device之上的新圖形標準。它在Framebuffer的基礎上提供了圖形加速、輸入設備處理提取、透明窗口和多重顯示層的功能,能夠對嵌入式GUI有較好的支持。與那些通用的嵌入式GUI系統相比,它具有非常簡潔、高效的體系結構和硬件圖形加速功能。
2. DirectFB體系結構
(1)DirectFB訪問硬件顯卡
DirectFB依靠內核中的Framebuffer設備驅動(/dev/fb)所提供的現有接
口來訪問圖形硬件。這就意味着DirectFB必須要有一個能夠正常工作的
Framebuffer設備驅動才能正常運行。有些芯片組需要在Linux內核中有
特定的Framebuffer驅動。對於那些沒有被支持的芯片組,VESA
Framebuffer也能正常工作(但會有些限制)。不管圖形加速功能有沒有用
到,DirectFB都將用Framebuffer設備驅動來完成以下任務:
A. 設置視頻模式(分辨率、色深、時序)
B. 從Framebuffer到顯卡的內存映射
C. 改變Framebuffer視口(針對雙緩衝)
如果某種顯卡被DirectFB支持且在Linux內核中也有這種圖形處理器的
Framebuffer驅動。DirectFB則利用Framebuffer設備做如下額外的工作:
A. 映射顯存IO端口
B. 關閉Framebuffer驅動中自帶的加速功能
針對具體的圖形操作(如圖片拷貝),DirectFB加速驅動訪問顯存映射的
圖形處理器I/O端口向圖形處理器提交命令。也就是說真正的硬件加速
完全是在用戶空間實現。這樣DirectFB就可以對它支持的圖形處理器提
供最大限度的硬件圖形加速。
(2)DirectFB訪問輸入設備
DirectFB使用Linux內核提供的標準設備接口訪問輸入設備,而不是直接
訪問輸入硬件。
(3)DirectFB支持的系統
DirectFB支持的系統有:fbdev、osx(Mac OS)、sdl、vnc、x11,這可以在
DirectFB代碼目錄中的systems中找到。在具體開發基於DirectFB的應用
程序時,DirectFB支持的系統可以通過其配置文件directfbrc來配置。
3. 在Linux下建立一個基於DirectFB的應用程序開發環境
(1)選擇一個合適的DirectFB版本,下載並安裝。
(2)建立DirectFB的配置文件directfbrc
(3)運行DirectFB的例子程序,如果運行成功,則可以開始編寫基於DirectFB
的應用程序了。
這裏重點講解第二步,如何配置DirectFB運行所需要的配置文件directfbrc:
所有的DirectFB應用程序在啓動時都會試圖去讀取其配置文件directfbrc(如果存在的話)。
DirectFB有兩個配置文件,一個位於/etc/directfbrc,是全局的;一個位於$HOME/.directfbrc,是局部的。當然局部的可以覆蓋全局的。
默認情況下,配置文件directfbrc是不存在的,此時,DirectFB程序會按照默認的設置運行,如默認情況下,DirectFB程序是基於Framebuffer的。如果想改變這種默認設置,如讓DirectFB程序基於X11或者SDL等運行,則可以自己建立該配置文件directfbrc,其語法如下:
(在directfbrc使用的參數也可以在命令行裏傳遞給DirectFB應用程序,只需要加上前綴:--dfb:)
directfbrc文件每一行包含一個變量。註釋行以井號“#”開始,一直到行尾。空行被忽略。
許多參數只是一種開關,控制着一些特性的開/關。這些開關選項有一個no-變量,可以關閉相應的特性。下面介紹一些實用的參數和一些默認的參數:
參數(以下參數可以在directfbrc文件中設定):
system=<system>
設定使用的圖形系統。默認使用Linux framebuffer (fbdev),但你也可以在SDL或者X11上運行DirectFB應用程序。其它的系統在將來可能會被擴展近來。
fbdev=<device>
打開指定的framebuffer設備,而不是默認的/dev/fb0。
mode=<width>x<height>
設定默認的屏幕顯示。如果不設定,DirectFB將使用/etc/fb.modes 的第一個設定值。一些framebuffer設備(如vesafb)不支持模式切換,而只能使用啓動時設定的值。
depth=<pixeldepth>
使用二進制位數設置每像素默認的像素深度。如果沒有指定,DirectFB將使用/etc/fb.modes 裏面的第一個指定的深度值。DirectFB支持8, 15, 16, 24和32位的顏色深度(color depths),這些值依賴於你使用的framebuffer設備是否支持。一些frame buffer設備(如vesafb)根本就不支持模式切換,只能使用在啓動時設定的像素深度值。
pixelformat=<pixelformat>
設置默認的像素格式。和上面描述的深度參數類似但允許更精細的控制。Pixelformat的值可以爲LUT8, RGB332, RGB16, RGB24和RGB32。一些設備可能還支持更奇怪的A8, ALUT44, ARGB, ARGB1555, I420, UYVY, YUY2和YV12像素格式。
session=<num>
選擇被添加或創建的多應用程序。開始爲0,如果強行設置爲負值,則使用一個可用的最小值。設定的值將覆蓋環境變量“DIRECTFB_SESSION”的值。
primary-layer=<id>
選定哪一個層爲“主層”(primary layer),默認的是第一個。查看‘dfbinfo’可以找到你的硬件支持的層列表。
tmpfs=<directory>
使用給定的文件夾(tmpfs掛載點)來多應用程序模式下創建共享內存文件。這個選項只在自動檢測失敗或者渴望非tmpfs存儲時纔有用。
memcpy=<method>
使用這個選項,對memcpy()程序(routines)的探測會被忽略,節省了不少啓動時間。傳遞“help”參數可以看到一系列的可能值。
quiet
禁止從DirectFB控制檯(console)輸出。只顯示錯誤信息。
[no-]banner
啓動時使輸出DirectFB標誌(banner)有效。默認有效。
[no-]debug
使debug輸出有效。默認有效,但是除非你編譯DirectFB時支持debug選項,否則,你不會不看到任何錯誤輸出。
force-windowed
強制主表面(primary surface)爲一個窗口。這樣可以使設計成全屏顯示的應用程序在一個窗口上運行。
force-desktop
強制使主表面(primary surface)成爲桌面的後臺表面(background surface)。
[no-]hardware
置硬件加速爲有效。默認會自動探測硬件加速。如果你置它爲無效,則顯卡驅動雖然也會被加載並可以訪問其它的顯示層(如果有的話),但是,所有的圖形操作將被軟件來渲染(renderer)。
[no-]sync
初始化DirectFB之前清空所有的硬盤緩衝區(disk buffers) 。當你工作環境爲實驗性的設備驅動和預計會出現衝突(crashes)時比較有用。默認此功能爲無效。
[no-]mmx
選相no-mmx使得即使檢測到有MMX的支持也不能使用MMX程序(routines)。如果提供了MMX並在編譯時加入了MMX的支持,默認該選相有效。
[no-]argb-font
向ARGB面載入字的輪廓(glyphs),而不是使用A8面(alpha masks)。該設置使用了更多的內存,但是一些顯卡在使用A8面時會出現一些詭異現象。如果你的字體看起來比較奇怪,試試該選項。
[no-]a1-font
向A1平面載入字的輪廓(glyphs),而不是使用A8平面(alpha masks)。如果圖形驅動不支持彩色+混合平移(blit,譯者注,blit此處翻譯成平移,具體的含義見附錄),該選項可以加速字體渲染,但會影響質量。一般情況下你根本不需要使用該選項,因爲基於A8字體的軟件已經是高度優化和足夠快了。
[no-]sighandler
默認情況下,DirectFB爲一些信號量(signal)安裝了一個可以使應用程序退出的信號量句柄(handler)。這個信號量句柄試圖在退出應用程序前解除初始化的DirectFB引擎。使用該選項可以開/關此特性。
dont-catch=<num>[[,<num>]...]
和上面對sighandler 選項描述類似。使用該選項你可以對不能使用該方式被處理的信號量列出一個詳細的清單。
[no-]deinit-check
默認情況下,DirectFB在退出時會檢查所有已釋放所分配的資源,如果沒有,它將在應用程序退出後釋放之。該選項可以開/關此功能。
block-all-signals
該選項可以阻塞所有的信號量,對DirectFB daemons有用(DirectFB master應用程序除了是一個master外,什麼也不做)。
[no-]vt-switch
默認情況下,DirectFB會分配一個新的虛擬終端並轉向使用它。
[no-]vt-switching
可以使用<Ctrl>+<Alt>+<F?>來切換虛擬終端。這是一個實驗特性,經常無效,你看着辦吧。
[no-]graphics-vt
使虛擬終端轉爲圖形模式。有如下優點:當DirectFB應用程序運行時,內核的消息不會在屏幕上顯示。
[no-]motion-compression
DirectFB常常壓縮(compresse)鼠標移動事件。也就是說,一系列的鼠標移動事件被看作一個簡單的鼠標移動事件。這樣可以達到更快的響應但是鼠標處理的精確度會受到影響。
mouse-protocol=<protocol>
爲一個串口鼠標指定使用的協議。以下的協議被支持:
MS 使用微軟鼠標協議的兩個按鈕的鼠標;
MS3使用擴展的微軟鼠標協議的三按鈕鼠標;
MouseMan使用一種Logitech開發的另一種擴展的微軟鼠標協議的三按鈕的鼠標;
MouseSystems 廣泛使用的三按鈕鼠標。
串口鼠標所使用的協議的詳細信息可參考相關資料。
[no-]lefty
切換鼠標左右按鍵,對“左撇子”(^_^)比較有用。
[no-]capslock-meta
把CapsLock鍵映射到Meta。對建在WM的用戶有用,因爲鍵盤上沒有Meta鍵(例如Window鍵)。
[no-]cursor
默認情況下,DirectFB在使用窗口時顯示一個鼠標箭頭。該選項允許徹底關閉鼠標箭頭。即使在應用程序裏也不能讓它再出現。
disable-module=<modulename>
禁止該模塊的載入。模塊的名字爲文件名,但不能帶有libdirectfb前綴也不能是其擴展(例如,若文件名爲keyboard,則鍵盤輸入模塊載入被禁止)。
bg-none
使背景處理完全無效。不要設置給選項,否則鼠標和窗口移動時會在背景留下難看的痕跡。
bg-color=AARRGGBB
控制背景的顏色。顏色的值爲十六進制值。默認的alpha值爲完全不透明並可能被忽略。例如,設定背景色爲紅紫色(magenta),可以使用bg-color=FF00FF。
bg-image=<filename>
使用給定的文件中的圖象充填背景。圖象會被伸縮(stretch)以適應屏幕的尺寸。
bg-tile=<filename>
類似bg-image,這裏使用圖象的圖快(tile)方式在屏幕的尺寸顯示,而不是伸縮方式。
[no-]translucent-windows
默認情況下,DirectFB窗口可能是半透明的。如果你使該選項無效,則窗口會被強制爲完全不透明或者是全透明。當你的顯卡不支持alpha半透明圖快(alpha-transparent blit)時,該選項比較有用。
videoram-limit=<amount>
限制DirectFB使用的視頻RAM。視頻RAM大小的單位爲K字節數。
matrox-tv-standard=[pal|ntsc]
控制由Matrox卡的TV輸出產生的信號。
[no-]matrox-sgram
一些老的Matrox G400卡有SGRAM並且如果設定該選項,一些圖形操作在這些卡上執行相當快。如果你的卡上沒有SGRAM,不要試圖選中該選項,否則,你不得不重起。
[no-]matrox-crtc2
如果你有個雙重的head G400/G450/G550,你可是使用該選項利用第二個head驅動附加層。
screenshot-dir=<directory>
如果選定該選項,當你按下<Print>鍵,DirectFB將把屏幕的內容以PPM格式放到這個指定的目錄。
window-surface-policy=<policy>
控制窗口平面存放的位置。<policy>的值可以是:
auto DirectFB依據硬件特性自動判斷,默認爲該選項;
videohigh 以高優先級方式切換(swap)系統/視頻內存;
videolow 以低優先級方式切換(swap)系統/視頻內存;
systemonly 窗口平面保存在系統內存中;
videoonly 窗口平面保存在視頻內存中。
desktop-buffer-mode=<mode>
控制桌面緩衝區模式。無論何時,窗口在移動、打開、關閉、調整大小或者變換內容,DirectFB將在受影響的範圍內重新合成窗口堆棧,這是通過和平移(blit)在該範圍的窗口一起來完成的。不通明窗口被直接平移,而半透明的窗口則使用alpha混合或顏色鍵來平移。如果有後端緩衝區(back buffer)的話,合成是不可見的,因爲只有最終的結果會被拷貝到前端緩衝區(front buffer)。如果沒有後端緩衝區,合成的每一步都是可見的,這將導致明顯的閃爍,除非所有的窗口都是非透明的。
<mode>的可選值有:
auto DirectFB依據硬件特性來判斷,爲默認值。如果硬件支持簡單blit(從後端向前端緩衝區中拷貝)操作,DirectFB會在視頻緩衝區中選取一個後端緩衝區。如果沒有加速功能,會在系統內存中開闢一個後端緩衝區,因爲這樣軟件裏的alpha混合合成操作可以執行地更好,並可以避免在結果已經拷貝到前端緩衝區中的情況下,再重新從視頻緩衝區中讀取。
backsystem 在系統內存中開闢一個後端緩衝區。如果你的硬件支持簡單blitting但卻沒有alpha混合,這是推薦選擇,你將得到許多alpha混合窗口。
backvideo 在視頻內存中分配前端和後端緩衝區。該值特別不建議設定,因爲如果blit被加速的話,‘auto’模式下會選擇該值。沒有加速的blit操作,該值不推薦使用。
frontonly 沒有後端緩衝區。如果你僅僅使用不透明窗口並且不使用任何顏色鍵,這是一個最佳選擇。
vsync-after
flip操作後等待垂直折回(vertical retrace)。默認情況下在做flip操作前等待。
vsync-none
對垂直折回(vertical retrace)關閉polling操作。
例子
下面的例子說明了怎麼在命令行模式下,把上面介紹的參數傳遞給DirectFB應用程序。
df_neo --dfb:no-hardware
以沒有硬件加速的方式開始運行df_neo
df_neo --dfb:help
列出可以傳遞給df-neo的所有可選參數。