實現 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 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