Wdrażanie OpenGL ES i EGL

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

Aby być zgodny z Androidem, urządzenia muszą mieć sterowniki dla 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;
  • Zezwolenie na nieograniczoną liczbę kontekstów GL. Ponieważ Android zezwala na działanie aplikacji w tle i próbuje utrzymywać konteksty GL, nie należy ograniczać liczby kontekstów w sterowniku.
  • Zwracanie uwagi na ilość pamięci przydzielonej dla każdego kontekstu, ponieważ zazwyczaj ma 20–30 aktywnych kontekstów GL jednocześnie.
  • 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 rozszerzeń obowiązkowych: EGL_KHR_wait_sync, GL_OES_texture_external, EGL_ANDROID_image_native_buffer i EGL_ANDROID_recordable. Dodatkowo narzędzie Hardware Composer w wersji 1.1 lub nowszej wymaga rozszerzenia EGL_ANDROID_framebuffer_target.

Zdecydowanie zalecamy też obsługę EGL_ANDROID_blob_cache, EGL_KHR_fence_syncEGL_ANDROID_native_fence_sync.

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

Wczytuję dane kierowcy

Android wymaga, aby GPU dostępne dla systemu były znane w momencie kompilacji obrazu systemu. Preferowane ścieżki dla 32- i 64-bitowych sterowników OpenGL ES to odpowiednio /vendor/lib/egl i /vendor/lib64/egl. Ładowarka używa 2 właściwości systemowych, ro.hardware.eglro.board.platform, lub dokładnej nazwy, aby wykrywać i wczytywać sterowniki systemowe. 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 i nowszych. Warstwy GLES to współdzielone obiekty dostępne w aplikacji lub udostępniane przez narzędzia. Warstwy GLES umożliwiają aplikacjom z możliwością debugowania wykrywanie i wczytywanie warstw za pomocą tych samych mechanizmów konfiguracji co Vulkan.

Komponent LayerLoader GLES, komponent w programie wczytywania EGL, identyfikuje warstwy GLES. Dla każdego znalezionego przez GLES LayerLoader poziomu 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 zwróci ten sam adres funkcji, który został przekazany. Następnie LayerLoader aktualizuje listę funkcji wywołania, aby wskazywała punkt wejścia warstwy.

Włącz warstwy

Warstwy GLES możesz włączyć w poszczególnych aplikacjach lub globalnie. Ustawienia poszczególnych aplikacji są zachowywane po ponownym uruchomieniu, podczas gdy właściwości globalne są usuwane po ponownym uruchomieniu.

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