OpenGL 是跨平台的圖形 指定標準軟體的 API 3D 圖形處理硬體的介面OpenGL ES 是嵌入式裝置 OpenGL 規格的子集。
需與 Android 相容的裝置 需要為 EGL、OpenGL ES 1.x 和 OpenGL ES 2.0 的驅動程式。支援 OpenGL ES 3.x 為選用功能。重要考量事項包括:
- 確保 GL 驅動程式穩健且符合 OpenGL ES 標準。
- 允許無限數量的 GL 結構定義。由於 Android 允許應用程式在背景執行,並嘗試讓 GL 情境保持運作,因此您不應限制驅動程式中的情境數量。
- 請留意分配給每個結構定義的記憶體量 一般而言,同時有 20 到 30 個使用中的 GL 情境。
- 支援 YV12 圖片格式,以及日後 例如媒體轉碼器或相機等。
- 支援
EGL_KHR_wait_sync
、GL_OES_texture_external
、EGL_ANDROID_image_native_buffer
和EGL_ANDROID_recordable
等必填擴充功能。此外,Hardware Composer 1.1 版 以上版本則需要EGL_ANDROID_framebuffer_target
。
強烈建議您也支援 EGL_ANDROID_blob_cache
、EGL_KHR_fence_sync
和 EGL_ANDROID_native_fence_sync
。
Android 10 實作 EGL 1.5 介面。如要瞭解 EGL 1.5 的新功能,請參閱 Khronos 1.5 版本規格。
正在載入驅動程式
Android 會在建構系統映像檔時,將可供系統使用的 GPU 納入考量。32 位元和 64 位元 OpenGL ES 驅動程式的首選路徑分別為 /vendor/lib/egl
和 /vendor/lib64/egl
。載入器使用兩種系統屬性
ro.hardware.egl
和 ro.board.platform
,也可以是
來探索並載入系統驅動程式。OpenGL ES 驅動程式必須以單一二進位檔或三個二進位檔形式提供。如果 OpenGL ES 驅動程式是透過單一二進位檔提供,請使用下列其中一個名稱:
libGLES_${ro.hardware.egl}.so libGLES_${ro.board.platform}.so libGLES.so
如果 OpenGL ES 驅動程式已提供三個二進位檔,請使用下列其中一個名稱組合:
libEGL_${ro.hardware.egl}.so libGLESv1_CM_${ro.hardware.egl}.so libGLESv2_${ro.hardware.egl}.so libEGL_${ro.board.platform}.so libGLESv1_CM_${ro.board.platform}.so libGLESv2_${ro.board.platform}.so libEGL.so libGLESv1_CM.so libGLESv2.so
OpenGL ES 層
Android 10 為 GLES 2.0 以上版本推出了分層系統。GLES 圖層是可在應用程式中使用的共用物件,或由工具提供的共用物件。GLES 層可讓可進行偵錯的應用程式使用 採用與 Vulkan:
GLES LayerLoader 是 EGL 載入器中的元件,可識別 GLES 圖層。對於 GLES LayerLoader 找到的各圖層,GLES LayerLoader
會呼叫 AndroidGLESLayer_Initialize
、步行 libEGL 的函式清單,
並對所有已知函式呼叫 AndroidGLESLayer_GetProcAddress
如果圖層攔截了某個函式,則會追蹤該函式的位址。如果圖層未攔截函式
AndroidGLESLayer_GetProcAddress
會傳回相同的函式
傳回位址接著,LayerLoader 會將函式掛鉤清單更新為
指向圖層的進入點
啟用圖層
您可以為個別應用程式啟用 GLES 圖層,也可以全域啟用。個別應用程式設定 會在每次重新啟動時保留,而全域屬性則會在重新啟動時清除。
如何啟用「個別應用程式」的圖層:
# Enable layersadb shell settings put global enable_gpu_debug_layers 1
# Specify target appadb shell settings put global gpu_debug_app
# Specify layer list (from top to bottom)package_name adb shell settings put global gpu_debug_layers_gles
# Specify packages to search for layerslayer1 :layer2 :... :layerN adb shell settings put global gpu_debug_layer_app
package1 :package2 :... :packageN
如要「按應用程式」停用圖層:
adb shell settings delete global enable_gpu_debug_layers
adb shell settings delete global gpu_debug_app
adb shell settings delete global gpu_debug_layer_app
如何「全域」啟用圖層:
# Attempts to load layers for all applications, including native executables
adb shell setprop debug.gles.layers layer1 :layer2 :... :layerN
測試圖層
GLES 層由 Android CTS 支援,且必須通過相容裝置的 CTS 測試。如要判斷圖層是否在裝置上運作,請執行 $ atest CtsGpuToolsHostTestCases
。