OpenGL é uma API gráfica multiplataforma que especifica uma interface de software padrão para hardware de processamento gráfico 3D. OpenGL ES é um subconjunto da especificação OpenGL para dispositivos embarcados.
Para serem compatíveis com Android, os dispositivos precisam fornecer drivers para EGL, OpenGL ES 1.xe OpenGL ES 2.0. O suporte para OpenGL ES 3.x é opcional. As principais considerações incluem:
- Garantir que o driver GL seja robusto e esteja em conformidade com os padrões OpenGL ES.
- Permitindo um número ilimitado de contextos GL. Como o Android permite aplicativos em segundo plano e tenta manter os contextos GL ativos, você não deve limitar o número de contextos no seu driver.
- Estar atento à quantidade de memória alocada para cada contexto, pois é comum ter de 20 a 30 contextos GL ativos ao mesmo tempo.
- Suporta o formato de imagem YV12 e outros formatos de imagem YUV provenientes de outros componentes do sistema, como codecs de mídia ou a câmera.
- Suportando 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 superior requerem a extensãoEGL_ANDROID_framebuffer_target
.
É altamente recomendado também oferecer suporte EGL_ANDROID_blob_cache
, EGL_KHR_fence_sync
e EGL_ANDROID_native_fence_sync
.
O Android 10 implementa a interface EGL 1.5 . Para obter informações sobre novos recursos no EGL 1.5, consulte a Especificação Khronos Releases 1.5 .
Carregamento do driver
O Android espera que as GPUs disponíveis para o sistema sejam conhecidas quando a imagem do sistema for construída. 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 OpenGL ES deve ser enviado em um binário ou dividido em três binários. 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 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 OpenGL ES
O Android 10 apresenta um sistema de camadas para GLES 2.0+. As camadas GLES são objetos compartilhados disponíveis em aplicativos ou fornecidos por ferramentas. As camadas GLES permitem que aplicativos depuráveis descubram e carreguem camadas usando os mesmos mecanismos de configuração do Vulkan .
GLES LayerLoader, um componente do carregador EGL, identifica camadas GLES. Para cada camada que o GLES LayerLoader encontra, o GLES LayerLoader chama AndroidGLESLayer_Initialize
, percorre as listas de funções da 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 de função que foi passado. O LayerLoader então atualiza a lista de ganchos de função para apontar para o ponto de entrada da camada.
Habilitar camadas
Você pode ativar camadas GLES por aplicativo ou globalmente. As configurações por aplicativo persistem durante as reinicializações, enquanto as propriedades globais são limpas na reinicialização.
Para ativar camadas por aplicativo :
# 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 camadas por aplicativo :
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 habilitar 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 suportadas pelo Android CTS e são obrigadas a passar nos testes CTS para dispositivos compatíveis . Para identificar se as camadas estão funcionando em um dispositivo, execute $ atest CtsGpuToolsHostTestCases
.