android手機GPU顯存有必要麼?

android 的應用通過調用opengl的介面和著色器語言,來使用GPU進行畫圖,畫圖的結果如果存在顯存當中的話,那還是需要將buffer數據搬到內存中去,這樣還不如直接設計讓GPU在內存中畫圖。我做這樣的猜想是因為,GLSurfaceView到底也是會在surfaceflinger中創建一個Layer,Gralloc來幫助這個Layer分配內存,然後Vsync信號到來的時候,comsumer才會去各個Layer去拿數據進行混合,交換到FrameBuffer中去。基於上述個人理解的流程,opengl的API渲染完之後的顯存內存塊都會回歸到內存中去,這樣surfaceflinger的comsumer才能找到來混合呀。如果有獨立的顯存,豈不是會有數據搬移。或者是gralloc本來就有能力在顯存中分配呢?

希望有大神解答一下,如果個人理解有誤,還望指出,謝謝啦~~


前棒廠做graphic答一發。(補充了下)

實際上,現在android中用的是統一內存架構,GPU和CPU共享一個物理內存,通常我們有「顯存」和「內存」兩種叫法,可以認為是這塊物理內存的所有者不同,但這段映射到cpu,就是通常意義上的內存;當映射到gpu,就是通常意義上的顯存。並且同一時刻只會映射到一個device。

一個簡單的紋理創建,首先我們需要先把紋理數據載入到一段內存中A中,然後調用glTexImage2D來上傳紋理的時候,會調用gles驅動的內存分配介面來分配一段內存B(最終是調用gralloc分配),並且映射到cpu。然後會調用一個定製的memcpy來把A的數據拷貝到B。這裡,雖然都是在同一塊物理內存中,但是OpenGL的spec如此,還是需要一次拷貝。渲染的時候,B會被映射到GPU上,讓GPU可以讀取。

而GPU渲染內容從APP到SF,是不會有搬運,至少Mali和sgx PowerVR不會。廠家的opengl實現,是調用BufferQueue這個類來獲取內存來渲染的,gpu渲染完畢再丟回BuffferQueue (Queue/Dequeue)。而surfaceFlinger會去請求有沒有可以已經渲染好的東西,以及會把顯示完的一幀丟回這個queue(Aquire/Release)。只要進程還活著,還可見,這個queue中往往有3塊格式相同的buffer會循環使用。

這個類是實現在SurfaceFlinger模塊下,如上提供了兩組介面給生產者(Gpu)和消費者(SF/display),所有幀 buffer的傳遞顯然都是直接傳遞指針,也就是不會有拷貝。這部分是android公共的實現。

而底層的顯存分配,是通過gralloc實現。BufferQueue會調用的內存分配介面最終會進入平台實現差異的gralloc HAL庫。android的硬體,目前廣為支持的都是UMP的形式,如果要實現獨立顯存的方式,對硬體和軟體都有要求,眾所周知,桌面平台,display controller是在gpu中的,而移動平台

Open Source Mali GPUs Android Gralloc Module


你所理解的流程基本正確。

但,現有的android手機沒有顯存,都是內存。但surface flinger是否需要搬運,取決於gralloc。gralloc是廠商驅動提供的,所以如果需要的話,它當然有能力在顯存中分配。


顯存是GPU直接訪問的內存,在PC中是獨立的,而在手機的AP SOC晶元中CPU和GPU使用的內存是在同一個物理內存顆粒上,但GPU有邏輯上獨立的內存區間。這塊內存區間是GPU驅動來管理的,linux內核的內存管理不理會這塊內存區間。

在高通的平台上,由ION系統來管理GPU使用的內存,gralloc通過ION來分配GPU使用的內存。

之前的openGL ES規範中CPU和GPU之間的內存是不能共享的,vertex和texture的buffer是需要拷貝的,即使是在同一物理內存上。

現在有了vulkan,openGL和openGL ES可以和CPU之間共享內存了,不用象以前那樣拷貝來拷貝去了,當然vulkan還有其他很有用的特性。

在異構計算方面,之前也是需要在CPU和GPU之間拷貝kernel的輸入數據和輸出結果,在openCL 2.0之後,也和vulkan一起走上了共享內存的康庄大道了。當然了,蘋果推出的metal也是可以共享內存的。


我想就題主的描述分析兩點:

1. 題主單獨標題的這個問題是一個比較寬泛的話題。分析顯存有沒有必要可以先看顯存有什麼用。顯存(相比較於內存)最大的用處是帶寬高。那「顯存有沒有必要」就取決於「帶寬高有沒有必要」。我可以大膽猜測一下,現階段的SoC graphics帶寬暫時不是瓶頸。具體可能要移動遊戲開發者或者driver perf組的人可以有具體的數據支撐。有沒有可能出現獨立顯存的SoC呢,我覺得是有可能的,但應該還會有很長的時間。DDR4剛出來,要榨完它的極限應該還有一段時間。另外獨立顯存需要增加控制器,也許要增加新的GPU CPU互聯匯流排,這些額外的開銷也會扼制獨立顯存的出現。

2. 題主的得出此問題的邏輯鏈有一個關鍵的點。

"layer"在內存中。以及SurfaceFlinger用CPU做compose。

這是錯誤的。雖然剛才第一點說現階段沒有獨立顯存的SoC,但是邏輯意義的顯存是一定要有的。layer也好surface也好都是顯存的邏輯表示。你可以試一下要拿layer上的數據,或者surface上的數據,不是直接找到一個內存指針就用了,一定都有一個lock動作。如果是內存,需要這麼做嗎?

SurfaceFlinger做compose會調用hardware composer,詳細就不展開了。


推薦閱讀:

是什麼在影響我們的開發效率?
物理引擎有哪些實際應用,除了遊戲?
如何用GT610狂牛版完成GTX960(d52G顯存)做不到的事情?
「甜甜圈」Furmark 究竟是怎麼讓顯卡燒起來的?
如何評價Thinkpad 最新T470,570 系列採用GeForce 940mx 顯卡?

TAG:NVIDIA英偉達 | 圖形處理器GPU | Android |