O OpenGL é uma API gráfica multiplataforma que especifica uma interface de software padrão para hardware de processamento de gráficos 3D. O OpenGL ES é um subconjunto da especificação OpenGL para dispositivos incorporados.
Para serem compatíveis com o Android, os dispositivos precisam fornecer drivers para EGL, OpenGL ES 1.x e OpenGL ES 2.0. O suporte ao OpenGL ES 3.x é opcional. As principais considerações incluem:
- Garantir que o driver do GL seja robusto e esteja em conformidade com os padrões do OpenGL ES.
- Permite um número ilimitado de contextos GL. Como o Android permite apps em segundo plano e tenta manter os contextos GL ativos, não limite o número de contextos no driver.
- Tenha cuidado com a quantidade de memória alocada para cada contexto, porque é comum ter de 20 a 30 contextos GL ativos de uma só vez.
- Suporte ao formato de imagem YV12 e outros formatos de imagem YUV que vêm de outros componentes do sistema, como codecs de mídia ou a câmera.
- Compatibilidade com as extensões obrigatórias
EGL_KHR_wait_sync
,GL_OES_texture_external
,EGL_ANDROID_image_native_buffer
eEGL_ANDROID_recordable
. Além disso, o Hardware Composer v1.1 e versões mais recentes exigem a extensãoEGL_ANDROID_framebuffer_target
.
É altamente recomendável oferecer suporte a EGL_ANDROID_blob_cache
,
EGL_KHR_fence_sync
e
EGL_ANDROID_native_fence_sync
.
O Android 10 implementa a interface EGL 1.5 (link em inglês). Para ver informações sobre novos recursos no EGL 1.5, consulte a Especificação de versões 1.5 do Khronos (link em inglês).
Carregamento do driver
O Android espera que as GPUs disponíveis para o sistema sejam conhecidas quando a imagem
do sistema for criada. Os caminhos preferidos para drivers OpenGL ES de 32 e 64 bits são
/vendor/lib/egl
e /vendor/lib64/egl
, respectivamente.
O carregador usa duas propriedades do sistema,
ro.hardware.egl
e ro.board.platform
, ou o nome
exato para descobrir e carregar os drivers do sistema. O driver do OpenGL ES precisa ser
enviado em um binário ou dividido em três. Se o driver OpenGL ES
for enviado em um binário, use um dos seguintes nomes:
libGLES_${ro.hardware.egl}.so libGLES_${ro.board.platform}.so libGLES.so
Se o driver do OpenGL ES for enviado em três binários, use um dos seguintes conjuntos de nomes:
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
Camadas do OpenGL ES
O Android 10 introduz um sistema de camadas para o GLES 2.0 e versões mais recentes. As camadas do GLES são objetos compartilhados disponíveis nos apps ou fornecidos por ferramentas. As camadas GLES permitem que apps depuráveis detectem e carreguem camadas usando os mesmos mecanismos de configuração do Vulkan.
O GLES LayerLoader, um componente no carregador EGL, identifica as camadas GLES.
Para cada camada que o LayerLoader do GLES encontra, o LayerLoader do GLES
chama AndroidGLESLayer_Initialize
, percorre as listas de funções do libEGL
e chama AndroidGLESLayer_GetProcAddress
para todas as funções conhecidas.
Se a camada interceptar uma função, ela rastreará o endereço da função.
Se a camada não interceptar uma função, AndroidGLESLayer_GetProcAddress
retornará o mesmo endereço da função que foi transmitida. O LayerLoader atualiza a lista de ganchos de função para
apontar para o ponto de entrada da camada.
Ativar camadas
Você pode ativar as camadas GLES por app ou de forma global. As configurações por app persistem em reinicializações, enquanto as propriedades globais são apagadas na reinicialização.
Para ativar as camadas por app, faça o seguinte:
# 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
Para desativar as camadas por app:
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
Para ativar camadas globalmente:
# Attempts to load layers for all applications, including native executables
adb shell setprop debug.gles.layers layer1:layer2:...:layerN
Camadas de teste
As camadas GLES são compatíveis com o CTS do Android e precisam ser aprovadas nos testes do CTS para
dispositivos compatíveis. Para identificar se as camadas
estão funcionando em um dispositivo, execute $ atest CtsGpuToolsHostTestCases
.