Wdrażanie OpenGL ES i EGL

OpenGL to interfejs API do obsługi grafiki na wielu platformach, 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 zgodne 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:

  • Sprawdź, czy sterownik GL jest stabilny i zgodny ze standardami OpenGL ES.
  • Zezwól na nieograniczoną liczbę kontekstów GL. Android umożliwia działanie aplikacji w tle i próbuje utrzymać konteksty GL, dlatego nie należy ograniczać liczby kontekstów w sterowniku.
  • Pamiętaj o ilości pamięci przydzielonej do każdego kontekstu, ponieważ często jednocześnie działa 20–30 aktywnych kontekstów GL.
  • Obsługuj format obrazu YV12 i inne formaty obrazu YUV pochodzące z innych komponentów systemu, takich jak kodeki multimediów czy aparat.
  • Obsługuj obowiązkowe rozszerzenia 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 zalecamy też obsługę rozszerzeń EGL_ANDROID_blob_cache, EGL_KHR_fence_sync i EGL_ANDROID_native_fence_sync.

Android 10 implementuje interfejs EGL 1.5. Więcej informacji o nowych funkcjach w EGL 1.5 znajdziesz w specyfikacji Khronos Releases 1.5.

Wczytywanie sterownika

Android oczekuje, że podczas tworzenia obrazu systemu będą znane procesory graficzne dostępne dla systemu. Preferowane ścieżki do 32-bitowych i 64-bitowych sterowników OpenGL ES to odpowiednio /vendor/lib/egl i /vendor/lib64/egl. Moduł wczytujący używa dwóch właściwości systemowych: ro.hardware.egl i ro.board.platform, lub dokładnej nazwy, aby wykryć i wczytać sterowniki systemowe. Sterownik OpenGL ES musi być dostarczany w postaci jednego pliku binarnego lub podzielony na 3 pliki binarne. Jeśli sterownik OpenGL ES jest dostarczany w postaci jednego pliku binarnego, 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 postaci 3 plików 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 i nowszych. Warstwy GLES to obiekty współdzielone dostępne w aplikacjach lub udostępniane przez narzędzia. Warstwy GLES umożliwiają aplikacjom, które można debugować, wykrywanie i wczytywanie warstw za pomocą tych samych mechanizmów konfiguracji co Vulkan.

Warstwy GLES są identyfikowane przez GLES LayerLoader, czyli komponent wczytywania EGL. W przypadku każdej warstwy znalezionej przez GLES LayerLoader wywołuje on funkcję AndroidGLESLayer_Initialize, przechodzi przez listy funkcji libEGL i wywołuje funkcję AndroidGLESLayer_GetProcAddress dla wszystkich znanych funkcji. Jeśli warstwa przechwytuje funkcję, śledzi jej adres. Jeśli warstwa nie przechwytuje funkcji, funkcja AndroidGLESLayer_GetProcAddress zwraca ten sam adres funkcji, 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ć globalnie lub w przypadku poszczególnych aplikacji. Ustawienia poszczególnych aplikacji są zachowywane po ponownym uruchomieniu, 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

Testowanie warstw

Warstwy GLES są obsługiwane przez Android CTS i muszą przejść testy CTS na zgodnych urządzeniach. Aby sprawdzić, czy warstwy działają na urządzeniu, uruchom polecenie $ atest CtsGpuToolsHostTestCases.