Zaimplementuj OpenGL ES i EGL

OpenGL to wieloplatformowy interfejs API grafiki, który określa standardowy interfejs oprogramowania dla sprzętu do przetwarzania grafiki 3D. OpenGL ES jest podzbiorem specyfikacji OpenGL dla urządzeń wbudowanych.

Aby urządzenia były kompatybilne z systemem Android, muszą zapewniać sterowniki dla EGL, OpenGL ES 1.x i OpenGL ES 2.0. Obsługa OpenGL ES 3.x jest opcjonalna. Kluczowe kwestie obejmują:

  • Zapewnienie, że sterownik GL jest solidny i zgodny ze standardami OpenGL ES.
  • Zezwalanie na nieograniczoną liczbę kontekstów GL. Ponieważ Android pozwala aplikacjom działać w tle i stara się utrzymać konteksty GL przy życiu, nie powinieneś ograniczać liczby kontekstów w sterowniku.
  • Należy pamiętać o ilości pamięci przydzielonej dla każdego kontekstu, ponieważ często zdarza się, że ma się jednocześnie 20–30 aktywnych kontekstów GL.
  • Obsługa formatu obrazu YV12 i innych formatów obrazu YUV pochodzących z innych komponentów systemu, takich jak kodeki multimedialne lub kamera.
  • Obsługa obowiązkowych rozszerzeń EGL_KHR_wait_sync , GL_OES_texture_external , EGL_ANDROID_image_native_buffer i EGL_ANDROID_recordable . Ponadto Hardware Composer w wersji 1.1 i nowszych wymaga rozszerzenia EGL_ANDROID_framebuffer_target .

Zdecydowanie zaleca się również obsługę EGL_ANDROID_blob_cache , EGL_KHR_fence_sync i EGL_ANDROID_native_fence_sync .

Android 10 implementuje interfejs EGL 1.5 . Informacje na temat nowych funkcji w EGL 1.5 można znaleźć w specyfikacji Khronos Releases 1.5 .

Ładowanie sterownika

Android oczekuje, że procesory graficzne dostępne dla systemu będą znane podczas tworzenia obrazu systemu. Preferowane ścieżki dla 32-bitowych i 64-bitowych sterowników OpenGL ES to odpowiednio /vendor/lib/egl i /vendor/lib64/egl . Program ładujący wykorzystuje dwie właściwości systemu, ro.hardware.egl i ro.board.platform lub dokładną nazwę, aby wykryć i załadować sterowniki systemowe. Sterownik OpenGL ES musi być dostarczony w jednym pliku binarnym lub podzielony na trzy pliki binarne. Jeśli sterownik OpenGL ES jest dostarczany w jednym pliku binarnym, użyj jednej z następujących nazw:

libGLES_${ro.hardware.egl}.so
libGLES_${ro.board.platform}.so
libGLES.so

Jeśli sterownik OpenGL ES jest dostarczany w trzech plikach binarnych, użyj jednego z następujących zestawów nazw:

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

Warstwy OpenGL ES

Android 10 wprowadza system warstw dla GLES 2.0+. Warstwy GLES to obiekty współdzielone dostępne w aplikacjach lub udostępniane przez narzędzia. Warstwy GLES umożliwiają aplikacjom z możliwością debugowania odkrywanie i ładowanie warstw przy użyciu tych samych mechanizmów konfiguracji, co Vulkan .

GLES LayerLoader, komponent modułu ładującego EGL, identyfikuje warstwy GLES. Dla każdej warstwy znalezionej przez GLES LayerLoader, GLES LayerLoader wywołuje AndroidGLESLayer_Initialize , przegląda listy funkcji libEGL i wywołuje AndroidGLESLayer_GetProcAddress dla wszystkich znanych funkcji. Jeśli warstwa przechwyci funkcję, śledzi jej adres. Jeśli warstwa nie przechwytuje funkcji, AndroidGLESLayer_GetProcAddress zwraca ten sam adres funkcji, który został przekazany. Następnie LayerLoader aktualizuje listę haków funkcji, aby wskazywała punkt wejścia warstwy.

Włącz warstwy

Warstwy GLES można włączyć dla poszczególnych aplikacji lub globalnie. Ustawienia poszczególnych aplikacji zachowują się po ponownym uruchomieniu, natomiast właściwości globalne są czyszczone po ponownym uruchomieniu.

Aby włączyć warstwy na aplikację :

# 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

Aby wyłączyć warstwy na aplikację :

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

Aby włączyć warstwy globalnie :

# Attempts to load layers for all applications, including native executables
adb shell setprop debug.gles.layers layer1:layer2:...:layerN

Warstwy testowe

Warstwy GLES są obsługiwane przez system Android CTS i muszą przejść testy CTS dla kompatybilnych urządzeń . Aby sprawdzić, czy warstwy działają na urządzeniu, uruchom $ atest CtsGpuToolsHostTestCases .