實施 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 v1.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 版本 1.5 規格

驅動載入

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