Wdrażanie OpenGL ES i EGL

OpenGL to grafika wieloplatformowa Interfejs API określający standardowe oprogramowanie interfejsu procesora graficznego 3D. OpenGL ES jest podzbiorem Specyfikacja OpenGL dla urządzeń umieszczonych na stronie.

Urządzenia muszą być zgodne z Androidem muszą pobrać sterowniki EGL, OpenGL ES 1.x i OpenGL ES 2.0. Wsparcie dla trybu OpenGL ES 3.x jest opcjonalna. Najważniejsze kwestie:

  • Gwarantowanie, że sterownik GL jest solidny i zgodny ze standardami OpenGL ES.
  • Zezwolenie na nieograniczoną liczbę kontekstów GL. Android pozwala aplikacji w tle i stara się utrzymywać konteksty GL, nie należy ogranicz liczbę kontekstów w sterowniku.
  • Zwracanie uwagi na ilość pamięci przydzielonej do każdego kontekstu, ponieważ często ma 20–30 aktywnych kontekstów GL jednocześnie.
  • obsługa formatu obrazu YV12 i innych formatów obrazów YUV, z innych komponentów systemu, takich jak kodeki multimedialne czy aparat.
  • Obsługa obowiązkowych rozszerzeń EGL_KHR_wait_sync, GL_OES_texture_external, EGL_ANDROID_image_native_buffer i EGL_ANDROID_recordable Dodatkowo Hardware Composer w wersji 1.1 i wyższe wymagają EGL_ANDROID_framebuffer_target .

Zdecydowanie zalecamy też obsługę tych komponentów: EGL_ANDROID_blob_cache, EGL_KHR_fence_sync i EGL_ANDROID_native_fence_sync

W Androidzie 10 zaimplementowano interfejs ELL 1.5. Informacje o nowych funkcjach w EGL 1.5, zobacz specyfikację Khronos Releases 1.5.

Wczytuję sterownik

Android oczekuje, że procesory graficzne dostępne dla systemu będą znane, gdy system gdy tworzony jest obraz. Preferowane ścieżki 32- i 64-bitowych sterowników OpenGL ES to /vendor/lib/egl i /vendor/lib64/egl. Moduł ładowania wykorzystuje 2 właściwości systemowe: ro.hardware.egl i ro.board.platform lub dokładnie by wykryć i wczytać sterowniki systemu. Sterownik OpenGL ES musi być mogą być wysyłane w jednym pliku binarnym lub podzielone na trzy pliki binarne. Jeśli interfejs OpenGL ES sterownik 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 przesłany do trzech plików binarnych, użyj jednego z następujące zestawy 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 w GLES 2.0 lub nowszy. Warstwy GLES to obiekty udostępnione z poziomu aplikacji lub dostarczane przez narzędzi. Warstwy GLES umożliwiają aplikacjom z możliwością debugowania wykrywanie i wczytywanie warstw za pomocą te same mechanizmy konfiguracji co Vulkan.

Komponent LayerLoader GLES, komponent w programie wczytywania EGL, identyfikuje warstwy GLES. W przypadku każdej warstwy znalezionej przez komponent GLES LayerLoader klasa GLES LayerLoader wywołuje AndroidGLESLayer_Initialize, pokazuje listy funkcji libEGL, i wywołuje AndroidGLESLayer_GetProcAddress, by pobrać wszystkie znane funkcje. Jeśli warstwa przechwytuje funkcję, śledzi jej adres. Jeśli warstwa nie przechwytuje funkcji, AndroidGLESLayer_GetProcAddress zwraca tę samą funkcję czy adres został przekazany. Następnie komponent LayerLoader aktualizuje listę punktów zaczepienia funkcji do i wskaż punkt wejścia warstwy.

Włącz warstwy

Warstwy GLES możesz włączyć dla poszczególnych aplikacji lub globalnie. Ustawienia dla poszczególnych aplikacji pozostają aktywne po ponownym uruchomieniu, podczas gdy właściwości globalne są czyszczone przy ponownym uruchomieniu.

Aby włączyć warstwy dla danej 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 system Android CTS w Androidzie i są wymagane do zaliczenia testów CTS zgodnych urządzeń. Aby określić, czy warstwy pracują na urządzeniu, uruchom $ atest CtsGpuToolsHostTestCases.