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....