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. OpenGL ES to podzbiór specyfikacji OpenGL przeznaczony do urządzeń wbudowanych.

Aby być zgodny z Androidem, urządzenia 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;
  • zezwalanie 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.
  • Pamiętaj o ilości pamięci przydzielonej do każdego kontekstu, ponieważ często zdarza się, że jednocześnie jest aktywnych 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 kamera.
  • Obsługa wymaganych rozszerzeń: EGL_KHR_wait_sync, GL_OES_texture_external, EGL_ANDROID_image_native_buffer i EGL_ANDROID_recordable. Dodatkowo w wersji 1.1 i nowszych kompozytora sprzętowego wymagane jest rozszerzenie 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 podczas tworzenia 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ć dostarczony 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 obiekty udostępniane w aplikacjach lub 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.

GLES LayerLoader, komponent w ładowarce EGL, identyfikuje warstwy GLES. Dla każdego znalezionego przez GLES LayerLoader poziomu wywołuje funkcję AndroidGLESLayer_Initialize, przechodzi po listach 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ł jej 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.