劉 暉,田 澤,馬城城,張 駿,薛凌藝
(1.中國航空工業西安航空計算技術研究所,陜西 西安 710068;22.集成電路與微系統設計航空科技重點試驗室,陜西 西安 710068;3.西安翔騰微電子科技有限公司,陜西 西安 710068)
圖形處理顯示列表的設計與實現
劉 暉1,2,田 澤1,2,馬城城1,2,張 駿1,2,薛凌藝3
(1.中國航空工業西安航空計算技術研究所,陜西 西安 710068;22.集成電路與微系統設計航空科技重點試驗室,陜西 西安 710068;3.西安翔騰微電子科技有限公司,陜西 西安 710068)
顯示列表功能是圖形處理器3D處理引擎的核心功能,通過將一段圖形繪制指令存儲到圖形處理器內部,來完成復雜場景下同一物體的重復繪制。該功能極大地減少了主機與圖形處理器之間的數據吞吐量,降低數據帶寬的壓力、高效地繪制復雜場景。文中基于Xilinx XC7VX1140T構建FPGA原型系統,參考ALT-M9芯片的實現能力,提出了一種軟硬件協同方式的顯示列表設計實現方法。該方法充分利用了CPU與GPU的處理能力,靈活實現了圖形處理命令在不同實現方式下顯示列表的設計與實現。驗證結果表明,軟硬件協同方式實現的顯示列表性能優越,空間分配管理靈活,可靠性高。
圖形處理器;OpenGL;顯示列表;空間管理
顯示列表功能廣泛應用于物體重復繪制、物體運動軌跡描述、儀表盤繪制等復雜場景繪制中,是一種簡單、高效的使用方式,極大地降低了CPU與GPU之間的帶寬壓力,提高了編程的效率與靈活性[1]。顯示列表已成為圖形處理器應用的一個新方向。
顯示列表分為編譯模式和編譯執行模式。在編譯模式下,圖形繪制指令僅存儲到圖形處理器內部;在編譯執行模式下,圖形繪制指令存儲到圖形處理器內部的同時發送給3D處理單元進行執行。傳統的硬件實現方式靈活性較差[2],浪費了主機處理器的性能,限制了圖形處理命令的實現方式。文中提出了一種軟硬件協同的實現方式,其適用范圍不局限于圖形處理語言和圖形處理命令的實現方式[3]。
在圖形處理器的應用中顯示列表用于多次繪制同一場景或物體,其原理如圖1所示。

圖1 顯示列表原理
當圖形處理器收到除顯示列表外的圖形繪制應用程序時,直接將圖形處理命令發送到3D功能執行單元進行處理。當圖形處理器收到定義顯示列表命令,并且當前定義的顯示列表為僅編譯模式時,圖形處理命令發送到顯示列表存儲單元,當前顯示列表中包括的圖形繪制命令僅做存儲,對當前的圖形繪制沒有影響。當圖形處理器收到定義顯示列表命令,并且當前定義的顯示列表為編譯執行模式時,圖形處理命令會同時發送給顯示列表存儲單元進行存儲和3D功能執行單元進行命令執行。當圖形處理器收到調用顯示列表命令時,圖形處理器從顯示列表存儲單元獲取對應的顯示列表命令,并將其發送到3D功能單元執行。當圖形處理器收到刪除顯示列表命令時,圖形處理器釋放對應顯示列表的存儲空間。
1.1 傳統的顯示列表實現方式
傳統的顯示列表實現方式中,每一條圖形處理指令都在對應的功能單元執行。這樣的實現方式方便了顯示列表的存儲、調用,但卻在很大程度上增加了圖形處理器的硬件資源開銷,增大了芯片的整體功耗[4],而且浪費了主機處理器的處理性能。
例如曲線曲面功能,需要根據用戶規定的控制點信息,通過Bernstein多項式計算出繪制點信息,并按照點的處理方式進行剪裁、消隱、歸一化等處理并最終繪制出來。若采用硬件方式實現,需要實現階乘等超越函數,對硬件資源的開銷較大,浪費了主機處理器的處理性能[5]。
1.2 軟硬件協同方式
HKM9000圖形處理器是中航工業計算所自主研發的一款功能性能與ALT-M9相當的圖形處理器。文中以HKM9000圖形處理器為設計載體,設計方法的應用不局限于某款圖形處理器。
在HKM9000圖形處理器設計中,將圖形處理命令進行分類,曲線曲面功能、頂點數組功能及查詢類相關功能由主機軟件實現;其他功能由硬件電路實現,因此需要將顯示列表命令分為軟件記錄和硬件記錄。軟件記錄占用主處理器的空間,可由用戶分配,硬件記錄占用圖形處理器內的存儲空間,由顯示存儲單元分配空間。這種設計方式極大地提高了圖形指令設計的靈活性。
2.1 顯示列表數據管理
顯示列表存儲數據包括硬件數據節點和軟件數據節點。軟件數據節點需要進行軟件空閑節點池管理,記錄軟件節點函數、函數參數及后續節點號;硬件數據節點需要進行硬件空閑節點池管理,記錄硬件節點地址和數據量及后續節點號。
對軟件記錄進行數據管理如下所示:
typedef struct
{/*指向軟件實現函數的函數指針*/
GLVoid (*Func_Pointer)(Glvoid);
/*函數指針映射表的項數*/
GLin Func_Pointer_num;
/*記錄指向函數的參數*/
GLFloat Params[SW_API_PAMS_NUM];
/*指向當前軟件記錄節點的下一個節點*/
GLushort Next;
}ST_SW_NODE;
typedef struct
{/*記錄顯示列表中空閑軟件節點個數*/
Glushort SW_Idle_Cnt;
/*記錄顯示列表中空閑軟件節點頭*/
Glushort SW_Idle_Head;
/*記錄顯示列表中空閑軟件節點尾*/
Glushort SW_Idle_Tail;
/*記錄軟件實現的API在顯示列表中的信息*/
ST_SW_NODE SW_Node[SW_API_SIZE];
}ST_SW_NODE_INFO;
對硬件記錄進行數據管理如下所示:
typedef struct
{/*保存顯示列表號*/
GLuint NewList_Num;
/*保存對應的首節點號*/
Glushort Node_Num;
/*顯示列表是否可用*/
GLboolean NewList_Enable;
}ST_NEWLIST_NODE;
typedef struct
{/*當前節點中存儲的API個數*/
GLubyte Size;
/*指向當前節點的下一節點*/
GLushort Next;
}ST_CALLLIST_NODE;
2.2 顯示列表資源
經測試,ALT-M9內部能存放約200萬條OpenGL命令,所以在HKM9000圖形處理器內部分配50 MB的存儲空間,最多能夠存儲1 638 400條圖形處理指令,其處理能力與ALT-M9相當。
顯示列表可供支配的資源如圖2所示,包括51 201個可被記錄的顯示列表NewList節點、51 200個硬件記錄的頁,及2 000個軟件記錄的函數節點。
2.2.1 NewList節點
當定義顯示列表時,首先判斷當前的顯示列表號在NewList節點中是否已被占用:若已被占用但節點號不相同,則當前顯示列表定義不成功;若已被占用且節點號相同則需要先刪除之前的顯示列表釋放占用空間,再記錄當前定義的顯示列表;若節點號未被占用,則當前顯示列表可定義。

圖2 顯示列表資源
2.2.2 硬件空閑頁節點
為了方便存儲空間尋址和內存管理,采用頁式管理的方法,將50 MB的GPU存儲空間劃分為50K個1 kB大小的頁,每一頁最多可存儲32條圖形指令,且每一頁只能對應唯一的顯示列表。當多個節點對應一個顯示列表時,各節點按照定義順序依次組成節點鏈[6]。
硬件空閑節點池由頭尾指針維護,顯示列表定義時從頭指針處獲取硬件空閑節點,顯示列表刪除時從尾指針處添加已釋放的空閑節點[7]。
2.2.3 軟件空閑節點
軟件空閑節點的使用及管理方式與硬件空閑頁節點類似,用來記錄軟件方式實現的顯示列表函數,軟件節點占用主處理器的存儲空間可在使用時靈活調整。
2.3 顯示列表設計與實現
顯示列表各接口按照實現功能分為軟件實現和軟硬件協同實現。
2.3.1 glGenLists函數
GLuint glGenLists(GLsizei range)圖形命令由軟件實現,返回在0到最大整數之間range個連續的數,作為可用現實列表號的選擇。
2.3.2 glNewList/glEndList函數
void glNewList(GLuint list,GLenum mode)/ void glEndList(void)圖形指令由硬件實現,它們指定了當前要聲明的顯示列表及顯示列表內包含的圖形指令。首先在NewList節點中查找下標為list的節點中存儲的顯示列表號,若與當前定義的顯示列表號相同,則刪除之前定義的顯示列表并釋放其占用的空間節點,否則當前NewList節點被占用,顯示列表定義失敗。
顯示列表空間按照頁式管理,每個顯示列表所占用的空間可在NewList節點號對應的后續節點中查找。為方便顯示列表的數據調用與地址查找[8],更新圖形指令接口如下:void glNewList(GLuint addr,GLenum mode,GLuint size)。其中,addr表示當前使用的節點號,mode表示當前顯示列表類型,size表示當前節點號中包括的命令條數。顯示列表按照API的實現方式來分配當前的顯示列表空間。
2.3.3 glListBase函數
void glListBase(GLuint base)由軟件實現,它將顯示列表索引數組按照指定的偏移進行排序,并最終由顯示列表調用。
2.3.4 glCallList/glCallLists函數
void glCallList(GLuint list)/void glCallLists(GLsizei n,GLenum type,const GLvoid * lists)用于調用顯示列表,glCallList函數功能由硬件實現,根據調用的顯示列表號來查找NewList節點中對應的節點數據。若與調用的顯示列表號相等,查找后續鏈接的節點并依次調用,調用的函數接口更新為:void glCallList(GLuint addr,GLuint size),更方便于數據調用與地址查找。glCallLists封裝glCallList實現[9],依次按照顯示列表索引數組獲得當前調用號并查找NewList節點計算。
2.3.5 glDeleteLists函數
void glDeleteLists(GLuint list,GLsizei range)功能是刪除已定義的顯示列表。它由軟件實現,先查找顯示列表索引判斷當前的顯示列表是否存在,對于存在的顯示列表,釋放鏈接節點的地址空間,并在軟/硬件空閑節點池中存儲,以備后續調用。
2.3.6 glIsList函數
GLboolean glIsList(GLuint list)功能是查詢當前號是否為一個顯示列表號。它由軟件實現,通過遍歷NewList節點查找是否有對應的號,若有則當前號是一個顯示列表號,否則不是。
為評估以上設計中顯示列表的功能及性能,搭建HKM9000 FPGA驗證平臺與ALT-M9圖形處理器進行對比實驗。
HKM9000 FPGA原型測試平臺如圖3所示。

圖3 HKM9000 FPGA驗證平臺
將經過編譯、綜合后生成的邏輯bin文件加載到FPGA原型系統中[10],主機端運行圖形繪制軟件,圖形處理驅動程序將上層的圖形應用程序翻譯為硬件可識別的命令碼流,通過PCI總線將命令碼流傳輸給HKM9000原型系統,并在其上執行功能,最終的結果由顯控單元輸出到顯示器上[11]。
軟硬件測試環境如表1所示。

表1 軟硬件測試環境
3.1 功能測試
功能測試結果如圖4所示。

圖4 顯示列表功能測試效果圖
在HKM9000 FPGA平臺上測試了顯示列表的定義、調用、查詢及刪除操作,其繪圖結果與返回值與ALT-M9平臺一致,基本功能實現正確。
3.2 性能測試
性能測試結果如圖5所示。

圖5 顯示列表接口性能測試
測試結果為100萬次調用的平均運行時間。從結果可以看出,HKM9000圖形處理器上顯示列表接口的處理性能與ALT-M9平臺下的性能基本相當,其中某些接口的處理性能還要優于ALT-M9平臺[12]。
文中介紹了圖形處理器中的顯示列表功能,在分析ALT-M9芯片功能性能的基礎上,提出了一種軟硬件結合方式來實現顯示列表功能的方法[13]。該方法充分利用了圖形處理的顯示列表空間,靈活地適用于多種圖形處理接口實現方式[14],具有可靠性高、編程靈活、易于實現、易于維護、成本低廉等優點。
[1] 譚顯強.基于FPGA的3D圖形處理器IP核的設計與實現[D].南京:南京航空航天大學,2010.
[2] Sefraoui O,Aissaoui M,Eleuldj M.Openstack:toward an open-source solution for cloud computing[J].International Journal of Computer Applications,2012,55(3):38-42.
[3] Nvidia.Dedicated GPU technology for virtual desktops[EB/OL].[2013-11-05].http://www.nvidia.com/object/dedicated-gpus.html.
[4] Lindholm E,Nickolls J,Oberman S,et al.Nvidia tesla:a unified graphics and computing architecture[J].IEEE Micro,2008,28(2):39-55.
[5] Brodtkorb A R,Hagen T R,Stra M L.Graphics Processing Unit (GPU) programming strategies and trends in GPU computing[J].Journal of Parallel and Distributed Computing,2013,73(1):4-13.
[6] 邱 航,陳雷霆.基于點的計算機圖形學研究與進展[J].計算機科學,2009,36(6):10-15.
[7] Shreiner D.OpenGL編程指南[M].第6版.北京:機械工業出版社,2009.
[8] Shreiner D,Woo M,Neider J,et al.OpenGL編程指南[M].李 軍,徐 波,譯.第7版.北京:機械工業出版社,2010:77-79.
[9] James F,Andriesvan D,Steven K,et al.計算機圖形學導論[M].董士海,唐澤圣,李 華,等,譯.北京:機械工業出版社,2004.
[10] 武 丹,許如星.淺析《計算機圖形學》中線裁剪算法的講授方法[J].科技創新導報,2009(30):182-182.
[11] 韓俊剛,蔣 林,杜慧敏,等.一種圖形加速器和著色器的體系結構[J].計算機輔助設計與圖形學學報,2010,22(3):363-372.
[12] 楊 毅.面向移動設備的真實感圖形處理系統設計與實現[D].合肥:中國科技大學,2008.
[13] 劉 鑫,蔣 林.2D圖形加速器設計與實現[J].微電子學與計算機,2013,30(6):75-79.
[14] 盧 俊,顏 哲,田 澤.一種高效GPU存儲系統體系架構設計[J].計算機技術與發展,2015,25(4):6-9.
Design and Realization of Display List Function in Graph Process
LIU Hui1,2,TIAN Ze1,2,MA Cheng-cheng1,2,ZHANG Jun1,2,XUE Ling-yi3
(1.Aeronautical Computing Technique Research Institute,Xi’an 710068,China; 2.Key Lab of Aeronautics Science and Technology of Integrate Circuit and Micro-system Design, Xi’an 710068,China; 3.Xiangteng Micro-electronics Technology Co.,Ltd.,Xi’an 710068,China)
Display list is the core function of 3D process engine in GPU,through storing a number of graph commands to GPU to complete repeat drawing for the same object in complex scene.It reduces the amount of data between CPU and GPU in a large degree,and lows pressure of data bandwidth and draws complex scene efficiently.Based on FPGA system built by Xilinx XC7VX1140T,taking a consideration in the capability of ALT-M9 chip,a method of collaborating hardware and software in display list design and realization is proposed.This method makes full use of the ability with CPU and GPU to complie the display list flexibly based on different way in graph commands realization.Verification results show that performance of collaborating hardware and software in display list is superior,with flexible the space allocation management and high reliability.
GPU;OpenGL;display list;memory management
2015-06-16
2015-09-22
時間:2016-03-22
中國航空工業集團創新基金(2010BD63111)
劉 暉(1986-),男,碩士,研究方向為SoC設計與驗證;田 澤,研究員,研究方向為SoC設計、嵌入式系統設計、VLSI設計。
http://www.cnki.net/kcms/detail/61.1450.TP.20160322.1517.012.html
TP39
A
1673-629X(2016)04-0119-04
10.3969/j.issn.1673-629X.2016.04.026