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
iEGL_ANDROID_recordable
. Dodatkowo w wersji 1.1 i nowszych kompozytora sprzętowego wymagane jest rozszerzenieEGL_ANDROID_framebuffer_target
.
Zdecydowanie zalecamy też obsługę 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 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.egl
i ro.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 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 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
.