OpenGL to wieloplatformowy interfejs API grafiki, który określa standardowy interfejs oprogramowania dla sprzętu do przetwarzania grafiki 3D. OpenGL ES jest podzbiorem specyfikacji OpenGL dla urządzeń wbudowanych.
Aby urządzenia były kompatybilne z systemem Android, muszą zapewniać sterowniki dla EGL, OpenGL ES 1.x i OpenGL ES 2.0. Obsługa OpenGL ES 3.x jest opcjonalna. Kluczowe kwestie obejmują:
- Zapewnienie, że sterownik GL jest solidny i zgodny ze standardami OpenGL ES.
- Zezwalanie na nieograniczoną liczbę kontekstów GL. Ponieważ Android pozwala aplikacjom działać w tle i stara się utrzymać konteksty GL przy życiu, nie powinieneś ograniczać liczby kontekstów w sterowniku.
- Należy pamiętać o ilości pamięci przydzielonej dla każdego kontekstu, ponieważ często zdarza się, że ma się jednocześnie 20–30 aktywnych 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 obowiązkowych rozszerzeń
EGL_KHR_wait_sync
,GL_OES_texture_external
,EGL_ANDROID_image_native_buffer
iEGL_ANDROID_recordable
. Ponadto Hardware Composer w wersji 1.1 i nowszych wymaga rozszerzeniaEGL_ANDROID_framebuffer_target
.
Zdecydowanie zaleca się również obsługę EGL_ANDROID_blob_cache
, EGL_KHR_fence_sync
i EGL_ANDROID_native_fence_sync
.
Android 10 implementuje interfejs EGL 1.5 . Informacje na temat nowych funkcji w EGL 1.5 można znaleźć w specyfikacji Khronos Releases 1.5 .
Ładowanie sterownika
Android oczekuje, że procesory graficzne dostępne dla systemu będą znane podczas tworzenia obrazu systemu. Preferowane ścieżki dla 32-bitowych i 64-bitowych sterowników OpenGL ES to odpowiednio /vendor/lib/egl
i /vendor/lib64/egl
. Program ładujący wykorzystuje dwie właściwości systemu, ro.hardware.egl
i ro.board.platform
lub dokładną nazwę, aby wykryć i załadować sterowniki systemowe. Sterownik OpenGL ES musi być dostarczony w jednym pliku binarnym lub podzielony na trzy pliki binarne. Jeśli sterownik OpenGL ES 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 dostarczany w trzech plikach binarnych, użyj jednego z następujących 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+. Warstwy GLES to obiekty współdzielone dostępne w aplikacjach lub udostępniane przez narzędzia. Warstwy GLES umożliwiają aplikacjom z możliwością debugowania odkrywanie i ładowanie warstw przy użyciu tych samych mechanizmów konfiguracji, co Vulkan .
GLES LayerLoader, komponent modułu ładującego EGL, identyfikuje warstwy GLES. Dla każdej warstwy znalezionej przez GLES LayerLoader, GLES LayerLoader wywołuje AndroidGLESLayer_Initialize
, przegląda listy funkcji libEGL i wywołuje AndroidGLESLayer_GetProcAddress
dla wszystkich znanych funkcji. Jeśli warstwa przechwyci funkcję, śledzi jej adres. Jeśli warstwa nie przechwytuje funkcji, AndroidGLESLayer_GetProcAddress
zwraca ten sam adres funkcji, który został przekazany. Następnie LayerLoader aktualizuje listę haków funkcji, aby wskazywała punkt wejścia warstwy.
Włącz warstwy
Warstwy GLES można włączyć dla poszczególnych aplikacji lub globalnie. Ustawienia poszczególnych aplikacji zachowują się po ponownym uruchomieniu, natomiast właściwości globalne są czyszczone po ponownym uruchomieniu.
Aby włączyć warstwy na aplikację :
# Enable layersadb shell settings put global enable_gpu_debug_layers 1
# Specify target appadb 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 layersadb shell settings put global gpu_debug_layer_app package1:package2:...:packageN
Aby wyłączyć warstwy na aplikację :
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 i muszą przejść testy CTS dla kompatybilnych urządzeń . Aby sprawdzić, czy warstwy działają na urządzeniu, uruchom $ atest CtsGpuToolsHostTestCases
.