OpenGL 是跨平台圖形 API,可為 3D 圖形處理硬體指定標準軟體介面。OpenGL ES 是嵌入式裝置 OpenGL 規格的子集。
裝置必須提供 EGL、OpenGL ES 1.x 和 OpenGL ES 2.0 的驅動程式,才能相容 Android。支援 OpenGL ES 3.x 為選用功能。重要考量事項包括:
- 確保 GL 驅動程式穩定且符合 OpenGL ES 標準。
- 允許不限數量的 GL 情境。由於 Android 允許應用程式在背景執行,並嘗試讓 GL 內容保持運作,因此您不應限制驅動程式中的內容數量。
- 請留意分配給各個結構定義的記憶體量,因為一次有 20 到 30 個使用中的 GL 情境是很常見的情況。
- 支援 YV12 圖片格式和其他 YUV 圖片格式,這些格式來自系統中的其他元件,例如媒體轉碼器或相機。
- 支援必要擴充功能
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 package_name
# Specify layer list (from top to bottom)adb shell settings put global gpu_debug_layers_gles layer1:layer2:...:layerN
# Specify packages to search for layersadb 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
。