謝曉燕,崔繼興,鄧軍勇,蔣 林
(1.西安郵電大學 計算機學院,陜西 西安 710121;2.西安郵電大學 電子工程學院,陜西 西安 710121)
基于VxWorks圖形應用編程接口庫的設計與實現
謝曉燕1,崔繼興1,鄧軍勇2,蔣林2
(1.西安郵電大學 計算機學院,陜西 西安 710121;2.西安郵電大學 電子工程學院,陜西 西安 710121)
摘要:針對圖形應用編程接口庫的圖形處理器應用問題,設計一個圖形應用編程接口函數庫。該函數庫基于開放的圖形庫標準OpenGL,采用3層結構設計實現。應用編程接口管理層管理和封裝整個函數庫,函數預處理層完成上下文的建立和函數參數的校驗,命令解析層將函數參數轉換成圖形處理器能夠識別的指令序列,參數轉換完成后調用驅動程序將指令序列傳遞給底層硬件。以VxWorks為軟件平臺,對該函數庫進行測試驗證,結果表明該函數庫可以滿足圖形處理器系統的要求。
關鍵詞:圖形軟件庫;應用編程接口;Open Graphics Library;圖形處理器
新一代圖形處理器[1](GraphicsProcessingUnit,GPU)不僅可以代替中央處理器(CentralProcessingUnit,CPU)實現視頻編解碼、圖形加速等功能, 而且在某些方面計算速度是CPU的數十倍[2]。三維圖形處理應用編程接口[3](ApplicationProgrammingInterface,API)通過將上層函數接口和底層驅動隔離,使得應用程序具有可移植性,是GPU的重要組成部分。
與GPU配套的圖形API庫很多,典型的是多媒體編程接口DirectX,該圖形API庫基于組件對象模型(ComponentObjectModel,COM),由C++編程語言設計實現,被廣泛應用于電子游戲開發[4]。但是DirectX軟件庫可移植性差,用戶只能在Windows平臺上使用[5]。具有移植性較好圖形API庫的Mesa3D軟件庫[6]是由C語言設計實現。該軟件庫是一個與硬件無關的3D圖形模型庫,能夠滿足大多數用戶對于3D圖形開發的需求[7]。但是Mesa3D軟件庫中的大部分API函數并沒有實現硬件加速功能,不能很好發揮GPU的性能。因此,需要一套功能較全并且能夠充分發揮GPU硬件加速功能的圖形API軟件庫。
OpenGL[8](OpenGraphicsLibrary)定義了一個跨編程語言、跨平臺的專業圖形程序接口標準。從本質上說它是一個3D圖形和模型庫,具有高度的可移植性,并且具有非常快的渲染速度[9]。本文基于OpenGL標準及Mesa3D開源軟件庫,在VxWorks平臺[10]設計一種面向GPU硬件的圖形API軟件庫。通過API管理層、函數預處理層和命令解析層三層結構設計來實現圖形API軟件庫。
1圖形API庫的系統架構
圖形API庫由API管理層、函數預處理層和命令解析層三層結構管理組成,結構如圖1所示。其中最頂層是API管理層,用于管理和封裝整個API庫,能夠對應用程序的語法錯誤進行簡單的處理,同時方便圖形API庫版本的管理;中間層是函數預處理層,用于完成上下文的建立、函數參數的錯誤檢測和處理,以及API管理層和命令預處理層的連接,提高OpenGL庫的穩定性;最底層是命令解析層,該層是整個軟件庫的核心部分,主要完成將函數參數轉換為GPU可識別的指令序列,從而實現硬件加速功能,并且接收硬件反饋的數據完成軟硬件的數據交互。

圖1 圖形API庫結構
2圖形API庫的設計與實現
2.1API管理層的設計與實現
API管理層采用函數分發表的思想設計實現,Fun_Dispatch是由函數指針組成的函數分發表,Current_Dispatch是指向當前函數分發表的指針。
當用戶調用圖形API庫中的函數時,先通過宏定義找到當前函數分發表的指針Current_Dispatch,再通過當前函數分發表指針找到該函數的函數體,最后圖形處理器執行該函數的函數體完成用戶分配的任務。如果用戶輸入的函數參數和圖形API庫中的函數參數不匹配,則程序執行過程將會跳過該API函數并且將錯誤反饋給用戶,從而提高圖形API庫的穩定性。
2.2函數預處理層的設計與實現
函數預處理層采用上下文機制管理圖形API庫的狀態信息,其中Context是一個結構體即圖形API庫中的上下文,該結構體包含函數分發表、驅動函數表、矩陣參數、顯示列表狀態、各緩沖區屬性、光照屬性、錯誤標志等狀態信息。上述狀態信息將在圖形API庫預處理過程中完成初始化,并且當用戶調用狀態信息查詢命令時,會返回當前的狀態值。函數預處理層的工作流程如圖2所示。

圖2 預處理層流程
2.3命令解析層的設計與實現
命令解析層負責將API函數轉換成特定格式的命令標識符,以供GPU底層硬件識別和處理。圖形API庫的指令集是由160位的二進制數組成,從高到低分別是命令碼(159~ 138位)、控制字(137~128位)、參數3(127~96位)、參數2(95~64位)、參數1(63~32位)、參數0(31~0位)。
命令碼用于識別不同的API命令,控制字用來指定函數參數的數據格式和個數,參數3到0用來傳遞函數參數。例如,將函數glVertex(x,y,z,w)轉換成160位的命令標識符,具體轉換過程如下。
(1)通過查找命令碼表,可得函數glVertex命令碼為000001010110。
(2)通過查找控制字表,可得函數glVertex的控制字為0100000011。
(3)將函數參數x、y、z、w分別轉換為32位二進制數,分別作為參數3、參數2、參數1、參數0。所有的圖形API函數采用類似的方法進行編譯。
命令解析層的處理流程如圖3所示。

圖3 命令解析層流程
3軟硬件數據交互的設計與實現
基于嵌入式操作系統Vxworks設計圖形API庫,在采用3層結構設計軟件庫的過程中,由于軟硬件存儲命令的方式不同,需要進行適當的轉換。具體過程如下。
(1)將每一條指令分為5部分,每部分由32位二進制數組成。
(2)將每部分分別轉換為無符號十進制數,一共5個十進制數。
(3)將上述5個十進制數進行大小端轉換。
(4)將轉換完成的數據存入命令存儲區。
當命令存儲區中的命令條數超過限定值或者用戶調用刷新內存命令時,函數庫將命令存儲區的起始地址和命令條數分別寫入GPU內部命令處理器的基址寄存器和命令條數寄存器中。GPU會根據這兩個寄存器的值從相應的地址讀取命令,完成硬件從軟件獲取數據的操作。
為了提高驅動程序的安全性和并行性,圖像API庫在內存中設置兩塊命令存儲區:緩存區0和緩存區1,用來存放解析好的命令。當GPU從緩存區0讀取命令時,經過解析的命令可以存放在緩存區1中;當GPU從緩存區1讀取命令時,可以將解析的命令存放在緩存區0中。交替使用兩個緩存區來實現解析命令與GPU讀取命令的并行操作。
4系統測試
為驗證API函數庫的正確性,編寫4 246個測試程序在圖形處理原型系統[11]中對其進行測試,并與在Windows及Mesa3D中的運行結果比較。
圖4所示為兩個典型程序分別在圖形API庫、Windows及Mesa3D平臺上的繪制結果,其中圖4(a)為Windows的繪制結果,圖4(b)為Mesa3D的繪制結果,圖4(c)圖形API庫的繪制結果。

(a) Windows的測試結果

(b) Mesa3D的測試結果

(c) 圖形API庫的測試結果
經過使用4 246個測試程序對圖形API庫進行驗證測試,并且將運行結果同Windows及Mesa3D的運行結果比較,結果表明圖形API庫可以實現OpenGL核心函數庫的全部功能,而且繪圖質量可以滿足普通GPU系統的要求。
5結語
基于OpenGL標準及Mesa3D開源軟件庫,設計管理和封裝整個函數庫的API管理層;建立上下文和校驗函數參數的函數預處理層;將函數參數轉換成GPU可識別的指令序列的命令預處理層3個層次的圖形API庫,通過驅動程序將指令序列傳遞給底層硬件。使用4 246個OpenGL測試程序對開發的圖形API庫進行測試和驗證,并與Windows及Mesa3D的運行結果比較,結果表明圖形API軟件庫可實現OpenGL核心函數庫的全部功能,且繪圖質量滿足三維圖形開發要求。
參考文獻
[1]闕恒.嵌入式圖形處理器的設計[D].南京:南京航空航天大學,2007:2.
[2]韓俊剛,劉有耀,張 曉. 圖形處理器的歷史現狀和發展趨勢[J]. 西安郵電學院學報,2011,16(3)61-64.
[3]劉暉,田澤,黎小玉,等. 3D圖形處理器API符合性驗證方法關鍵技術研究[J]. 計算機技術與發展,2014,24(10):193-196.DOI:10.3969/j.issn.1673-629X.2014.10.047.
[4]任義. 基于DirectX的 3D圖形引擎的設計和實現[D].南京:南京航空航天大學,2008:9.
[5]周思遠.3D圖形引擎的研究與實現[D].北京:北京郵電大學,2010:7.
[6]Themesa3dgraphicslibrary[EB/OL].[2015-11-25].http://www.mesa3d.org.
[7]馬棟,韓俊剛.VxWorks的三維圖形環境的開發[J]. 計算機技術與發展,2014,24(9):187-190.DOI:10.3969/j.issn.1673-629X.2014.09.043.
[8]SHREINERD.OpenGL編程指南[M].7版,李軍,徐波譯.北京:機械工業出版社,2010:1-18.
[9]LIULF,LIUML,WANGCJ.AnOptimizedGP-GPUWarpSchedulingAlgorithmforSparseMatrix-VectorMultiplication[C]//2013IEEEEighthInternationalConferenceonNetworking,ArchitectureandStorage(NAS).Xi’an:IEEE,2013:222-231.DOI:10.1109/NAS.2013.35.
[10]翁羽翔.基于嵌入式VxWorks系統的應用研究 [D].上海:同濟大學,2007:6.
[11]馬城城,田 澤,黎小玉. 基于GPUFPGA芯片原型的VxWorks下驅動軟件開發[J].計算機技術與發展,2013,23(7):84-86.DOI:10.3969/j.issn.1673-629X.2013.07.021
[責任編輯:祝劍]
DesignandimplementationofgraphicsapplicationprogramminginterfacelibrarybasedonVxWorks
XIEXiaoyan1,CUIJixing1,DENGJunyong2,JIANGLin2
(1.SchoolofComputerScienceandTechnology,Xi’anUniversityofPostsandTelecommunications,Xi’an710121,China;2.SchoolofElectronicEngineering,Xi’anUniversityofPostsandTelecommunications,Xi’an710121,China)
Abstract:To accommodate the application of graphics processing unit, a graphics application programming interface library is designed. The library follows the open graphics library standards OpenGL and is implemented with three-layer architecture. The management layer provides an interface to whole function library. The function pre-process layer is used to set up contexts and verify parameters. The command resolution layer is used to translate parameters to instruction sequences which can be recognized by graphics processing unit. After the completion of the parameter conversion, the instruction sequences can then be delivered to underlying hardware by drivers. This graphics application programming interface library is tested and verified in graphics processing unit prototype system based on VxWorks platform. The results show that the designed graphics library can meet the common requirements of graphics processing system.
Keywords:graphics software library, application programming interface, ppen graphics library(OpenGL), graphics processing unit
doi:10.13682/j.issn.2095-6533.2016.02.019
收稿日期:2015-10-16
基金項目:國家自然科學基金資助項目(61272120);陜西省自然科學基金資助項目(2015JM6326);西安郵電大學研究生創新基金資助項目(CXL2014-20)
作者簡介:謝曉燕(1972-),女,碩士,教授,從事視頻編解碼算法研究。E-mail: 35731599@qq.com 崔繼興(1989-),男,碩士研究生,研究方向為服務計算及其應用關鍵技術。E-mail:841040934@qq.com
中圖分類號:TP399
文獻標識碼:A
文章編號:2095-6533(2016)02-0098-04