Wdrażanie OpenGL ES i EGL

OpenGL to wieloplatformowy interfejs API do obsługi grafiki, który określa standardowy interfejs oprogramowania do obsługi sprzętu do przetwarzania grafiki 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:

  • zapewnienie, że sterownik GL jest niezawodny i zgodny ze standardami OpenGL ES;
  • zezwalanie 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 obrazu YUV pochodzących z innych komponentów systemu, takich jak kodeki multimedialne lub kamera.
  • Obsługa obowiązkowych 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 rozszerzenia kompozytora sprzętowego wymagane jest rozszerzenie 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

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 oczekuje, że procesory graficzne dostępne dla systemu będą znane, gdy system gdy tworzony jest obraz. Preferowane ścieżki dla 32- i 64-bitowych sterowników OpenGL ES to odpowiednio /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 dla GLES 2.0 i nowszych. Warstwy GLES to współdzielone obiekty dostępne w aplikacjach 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.

GLES LayerLoader, komponent w ładowarce 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 przechwyci funkcji, AndroidGLESLayer_GetProcAddress zwróci ten sam adres funkcji, który 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ć na poziomie aplikacji 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 w poszczególnych aplikacjach:

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 określić, czy warstwy pracują na urządzeniu, uruchom $ atest CtsGpuToolsHostTestCases.