Android是怎樣呼叫硬體加速的

2021-05-27 00:41:20 字數 2249 閱讀 1059

android是怎樣呼叫硬體加速的

[描述]

如果處理器只有2d硬體加速而沒有3d硬體加速,則可以利用opengl中的libagl,

實現封裝在libagl裡的copybit,因為相對3d api來說,這個模組的封裝google

基本是做好的,只要去實現乙個copybit hal即可;

如果處理器2d/3d硬體加速均有,那麼可以丟開 copybit,去實現opengl es

2d/3d api 的加速功能。

[android是怎樣載入軟體/硬體加速庫的]

1. 全域性變數geglimpl: 定義egl&gles的api的指標

egl_connection_t geglimpl[impl_num_implementations];

enum ;

具體資料結構參看附錄。

2. 初始化全域性變數geglimpl

code:egl_init_drivers_locked()

egl_init_drivers_locked()函式主要的工作就是填充geglimp陣列變數

該函式呼叫loader.cpp中的loader::open()載入對應的硬體和軟體加速的驅動(動態鏈結庫).

a. 載入libgles_android.so填充geglimpl[impl_software];

b. 載入libgles_hw***xx.so填充geglimpl[impl_hardware];

注:配置檔案/system/lib/egl/egl.cfg中列出了系統中的軟體/硬體減速庫

格式: dpy  impl  tag

0    0     android    

0    1     hw***xx

[2d硬體加速]

frameworks/base/opengl/libagl/egl.cpp 檔案中利用hardware/libhardware/hardware.c

檔案中定義的hw_get_module()函式,該函式判斷獲得的系統屬性是否在variant_keys陣列中定義

通過load()函式載入相應的硬體模組;否則載入default硬體模組。

因此需要研究libagl,根據需要實現相應的copybit硬體模組。

注:libgles_android.so為編譯frameworks/base/opengl/libagl/目錄而生成的,其專門有乙個

copybit.cpp檔案對copybit模組進一步封裝。

libagl中通過在frameworks/base/opengl/libagl/android.mk檔案中定義:

libagl_use_gralloc_copybits := 1

來載入copybit模組;如果未定義libagl_use_gralloc_copybits,則通過軟體的方式而不使用

copybit 模組來達到 2d 硬體加速。

[2d/3d硬體加速]

需研究opengles, 並實現

/system/lib/egl/libgles_hw***xx.so

或者/system/lib/egl/libegl_hw***xx.so

/system/lib/egl/libglesv1_cm_hw***xx.so

/system/lib/egl/libglesv2_hw***xx.so

來提供 opengl es 2d/3d 硬體加速 api 。

[應用是怎樣使用opengles硬體加速的]

1.應用呼叫eglchooseconfig時,libs/egl/egl.cpp::eglchooseconfig根據引數選擇config時,

呼叫順序為:

geglimpl[impl_hardware].egl.eglchooseconfig(...)

geglimpl[impl_software].egl.eglchooseconfig(...)

原因: impl_hardware=0; impl_software=1

參看:enum ;

2. 建立su***ce和context時, libs/egl/egl.cpp是根據傳入引數config來判斷是呼叫軟體還是

硬體加速api的, 而根據步驟1優先選擇的緝硬體的config, 故建立su***ce和context是使用的

也是硬體加速的api。

[附錄]:

struct egl_connection_t

;struct egl_t ;

struct gl_hooks_t gl;

struct gl_ext_t ext;

};

jvm是怎樣呼叫方法的

jvm內部有五種呼叫方法的指令 invokeinte ce 用以呼叫介面方法,在執行時搜尋乙個實現了這個介面方法的物件,找出適合的方法進行呼叫。invoke inte ce method invokevirtual 指令用於呼叫物件的例項方法,根據物件的實際型別進行分派 invoke instanc...

程式是怎樣跑起來的(11) 硬體控制方法

熱身 1.在組合語言中,是用什麼指令來同外圍是裝置進行輸入輸出操作的?2.i o是什麼的縮寫?3.用來識別外圍裝置的編號稱為什麼?4.irq是什麼的縮寫?5.dma是什麼的縮寫?6.用來識別具有dma功能的外圍裝置的編號稱為什麼?答案 1.in指令和out指令 在x86系列cpu用的組合語言中,通過...

交易中 你的加倉策略是怎樣的?背後的邏輯是什麼?

建倉是賭,加倉也是賭。建倉是賭自己是對的,加倉,是證明自己賭對了以後,賭自己這次是大大地對了。如果是乙個不加倉的系統,那麼做完一百筆單子,統計一下,歸類一下,假設說有70筆是虧的,但是經過止損,都只虧1.有30筆是賺的,其中有5筆賺了10,有10筆賺了5,有15筆賺了2.一共賺了130.平均獲利4....