技術(shù)關(guān)鍵詞:mesa 調(diào)試、mesa調(diào)用棧
創(chuàng)新互聯(lián)是一家專業(yè)提供樂平企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計、成都網(wǎng)站設(shè)計、HTML5、小程序制作等業(yè)務(wù)。10年已為樂平眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進行中。
目錄
前言
一、Linux圖形軟件棧的再討論
二、glClear的調(diào)用棧分析
2.1 _mesa_開頭的函數(shù)
2.2?st_開頭的函數(shù)
2.3 pipe層字樣的函數(shù)
2.4?GPU-specific層的函數(shù)
三、gl api 典型調(diào)用棧
總結(jié)
前文總結(jié)了mesa的主要模塊和模塊間的靜態(tài)關(guān)系,本文從一個OpenGL應(yīng)用程序的典型api入手,分析gl api 調(diào)用到用戶態(tài)驅(qū)動后端的過程,進而總結(jié)出一個典型的調(diào)用棧。理解了這個典型調(diào)用棧,對后續(xù)任何一個API的調(diào)用過程分析,都是a piece of cake。
? 前文給出了一個頂層的linux圖形棧的關(guān)系圖。這里把原圖中的xserver拿掉,把mesa剖開,把linux系統(tǒng)和硬件層加入,形成了如下linux的mesa圖形軟件棧。
下圖的左側(cè)調(diào)用棧是在gallium 架構(gòu)之前采用的模式,右側(cè)是gallium架構(gòu)下的模式。可以看出gallium架構(gòu)有比較明顯的三個分層(夾心餅干):
1、state_tracker層:負責(zé)收集OpenGL狀態(tài);
2、GPU-specific層:廠商的用戶態(tài)驅(qū)動核心部分;
3、OS WinSys層:操作系統(tǒng)對接層。
這里的圖形調(diào)用棧的不妥之處是把libdrm放入了mesa中,實際上libdrm是linux系統(tǒng)提供的使用drm內(nèi)核功能的一個用戶態(tài)庫,可以單獨作為一層來看待(有時間再修改下該圖,該圖出處見圖下的文字鏈接)。
圖形棧中的mesa位置圖
二、glClear的調(diào)用棧分析? 接下來以glClear的函數(shù)實現(xiàn),來分析從應(yīng)用程序到GPU-specific的調(diào)用棧。先把關(guān)鍵調(diào)用棧組織如下(省略了不相關(guān)的調(diào)用)。
glClear(GL_COLOR_BUFFER_BIT);
_mesa_Clear(GL_COLOR_BUFFER_BIT);
st_Clear(ctx, GL_COLOR_BUFFER_BIT);
st->pipe->Clear(...);
gpu_specific_Clear(...);
2.1 _mesa_開頭的函數(shù)gl_打頭的函數(shù)是OpenGL API,首先這些函數(shù)都是函數(shù)指針,這些函數(shù)掛載的函數(shù)就是mesa里以_mesa_打頭的對應(yīng)函數(shù)。這里有個調(diào)試技巧,把函數(shù)名gl_前綴換成_mesa_前綴即可。例如glGenBuffers的mesa入口函數(shù)是_mesa_GenBuffers。 _mesa_打頭函數(shù)在前文的libmesa.a靜態(tài)庫中,而libmesa.a又被libgallium_dri.so包含,因此這些代碼都是后端驅(qū)動的一部分,可以隨意修改。
2.2?st_開頭的函數(shù)? _mesa_打頭的函數(shù)會調(diào)用st_開頭的函數(shù)。這些st函數(shù)就是上圖中的state tracker層。
2.3 pipe層字樣的函數(shù)? pipe層,是接近于硬件的模塊,GPU-specific 層是從pipe層繼承的??梢园裵ipe層看成接口層,各家驅(qū)動實現(xiàn)該接口。
2.4?GPU-specific層的函數(shù)? 把pipe層的OpenGL狀態(tài)轉(zhuǎn)換為廠商支持的狀態(tài)字段。該層一般會封裝和處理硬件相關(guān)的狀態(tài),即硬件命令字。這些封裝數(shù)據(jù)一般要由kmd交給硬件配置相關(guān)寄存器。
三、gl api 典型調(diào)用棧? 通過以上分析,這里給出一個典型的gl函數(shù)的調(diào)用棧。即:mesa層、st層、pipe層、gpu-spec層。
mesa典型調(diào)用棧
這里并沒有給出winsys層,因為不同的OS有不同實現(xiàn),這里關(guān)注linux。就是上圖中的與libdrm交互的那一層,這層會使用ioctl將gpu-spec層組織的數(shù)據(jù)交給kmd,再由kmd把數(shù)據(jù)下發(fā)到gpu硬件。
總結(jié)? 本文從glClear的函數(shù)的調(diào)用棧分析了mesa實現(xiàn)OpenGL的一個典型流程。對于任何一個gl api可以套用該流程,熟悉mesa代碼的調(diào)用脈絡(luò)。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧