實作 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 圖片格式,以及日後 例如媒體轉碼器或相機等。
  • 支援必要擴充功能 EGL_KHR_wait_sync, GL_OES_texture_external, EGL_ANDROID_image_native_bufferEGL_ANDROID_recordable。此外,Hardware Composer 1.1 版 以上版本則需要 EGL_ANDROID_framebuffer_target

強烈建議同時支援 EGL_ANDROID_blob_cache EGL_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