Wdrażanie 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 to podzbiór specyfikacji OpenGL dla urządzeń wbudowanych.

Aby urządzenia były kompatybilne z Androidem, muszą mieć sterowniki EGL, OpenGL ES 1.x i OpenGL ES 2.0. Obsługa OpenGL ES 3.x jest opcjonalna. Najważniejsze kwestie:

  • Zapewnienie, że sterownik GL jest niezawodny i zgodny ze standardami OpenGL ES.
  • umożliwia nieograniczoną liczbę kontekstów GL; Ponieważ Android zezwala na działanie aplikacji w tle i próbuje utrzymać konteksty GL, nie należy ograniczać liczby kontekstów w sterowniku.
  • Pamiętaj o ilości pamięci przydzielonej do każdego kontekstu, ponieważ zwykle jednocześnie aktywnych jest 20–30 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 aparat.
  • Obsługa obowiązkowych rozszerzeń:EGL_KHR_wait_sync,GL_OES_texture_external,EGL_ANDROID_image_native_bufferEGL_ANDROID_recordable. Dodatkowo Hardware Composer w wersji 1.1 i nowszej wymaga rozszerzenia EGL_ANDROID_framebuffer_target.

Zdecydowanie zalecamy też obsługę formatów EGL_ANDROID_blob_cache, EGL_KHR_fence_sync i EGL_ANDROID_native_fence_sync.

Android 10 implementuje interfejs EGL 1.5. Informacje o nowych funkcjach w EGL 1.5 znajdziesz w specyfikacji Khronos w wersji 1.5.

Wczytuję sterownik

Android oczekuje, że GPU dostępne dla systemu będą znane podczas tworzenia obrazu systemu. Preferowane ścieżki sterowników OpenGL ES w wersji 32-bitowej i 64-bitowej to odpowiednio /vendor/lib/egl/vendor/lib64/egl. Program ładujący używa 2 właściwości systemu, ro.hardware.eglro.board.platform, lub dokładnej nazwy, aby wykryć i wczytać sterowniki systemu. Sterownik OpenGL ES musi być dostarczany w jednym pliku binarnym lub podzielony na 3 pliki binarne. Jeśli sterownik OpenGL ES jest dostarczany w jednym pliku binarnym, użyj jednej z tych nazw:

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

Jeśli sterownik OpenGL ES jest dostarczany w 3 plikach binarnych, użyj jednego z tych 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 lub nowszego. Warstwy GLES to obiekty udostępniane w aplikacjach lub dostarczane przez narzędzia. Warstwy GLES umożliwiają aplikacjom, które można debugować, wykrywanie i wczytywanie warstw przy użyciu tych samych mechanizmów konfiguracji co w przypadku Vulkana.

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

Włączanie warstw

Warstwy GLES możesz włączyć dla poszczególnych aplikacji lub globalnie. Ustawienia poszczególnych aplikacji są zachowywane po ponownym uruchomieniu urządzenia, a właściwości globalne są czyszczone.

Aby włączyć warstwy w przypadku poszczególnych aplikacji:

# 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 w przypadku poszczególnych aplikacji:

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 pakiet CTS na Androida i muszą przejść testy CTS na zgodnych urządzeniach. Aby sprawdzić, czy warstwy działają na urządzeniu, uruchom polecenie $ atest CtsGpuToolsHostTestCases.