實作 OpenGL ES 和 EGL

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 圖像格式,以及系統中其他元件 (例如媒體轉碼器或相機) 提供的其他 YUV 圖像格式。
  • 支援必要擴充功能: EGL_KHR_wait_syncGL_OES_texture_externalEGL_ANDROID_image_native_bufferEGL_ANDROID_recordable。此外,Hardware Composer 1.1 以上版本需要 EGL_ANDROID_framebuffer_target 擴充功能。

強烈建議您也支援 EGL_ANDROID_blob_cacheEGL_KHR_fence_syncEGL_ANDROID_native_fence_sync

Android 10 會實作 EGL 1.5 介面。如要瞭解 EGL 1.5 的新功能,請參閱 Khronos Releases 1.5 Specification

正在載入驅動程式

Android 希望系統建構映像檔時,能瞭解系統可用的 GPU。32 位元和 64 位元 OpenGL ES 驅動程式的偏好路徑分別為 /vendor/lib/egl/vendor/lib64/egl載入器會使用兩個系統屬性 (ro.hardware.eglro.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 layers
adb shell settings put global enable_gpu_debug_layers 1

# Specify target app
adb 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 layers
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