Implementar OpenGL ES e EGL

O OpenGL (link em inglês) é um sistema gráfico multiplataforma que especifica um software padrão para o 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. Suporte para 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.
  • Permitir um número ilimitado de contextos de 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 driver.
  • Estar atento à quantidade de memória alocada para cada contexto, porque é comum ter de 20 a 30 contextos GL ativos ao mesmo tempo.
  • 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 e EGL_ANDROID_recordable. Além disso, o Hardware Composer v1.1 e versões mais recentes exigem o EGL_ANDROID_framebuffer_target .

É altamente recomendável também 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 informações sobre novos recursos no EGL 1.5, consulte a Especificação de versões 1.5 do Khronos.

Driver carregando

O Android espera que as GPUs disponíveis para o sistema sejam conhecidas quando ele é criada. Os caminhos preferidos para drivers OpenGL ES de 32 e 64 bits são /vendor/lib/egl e /vendor/lib64/egl, respectivamente. O loader usa duas propriedades do sistema, ro.hardware.egl e ro.board.platform ou a exata para descobrir e carregar os drivers do sistema. O driver do OpenGL ES precisa ser enviados em um binário ou divididos em três. Se o OpenGL ES é 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 do OpenGL ES

O Android 10 introduz um sistema de camadas para o GLES 2.0 ou superior. As camadas do GLES são objetos compartilhados disponíveis nos apps ou fornecidos por ferramentas de visualização. As camadas GLES permitem que apps depuráveis descubram e carreguem camadas usando o com os mesmos mecanismos de configuração Vulkan.

O LayerLoader do GLES, um componente dentro do carregador do EGL, identifica camadas do GLES. Para cada camada encontrada pelo GLES LayerLoader, 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 retorna a mesma função e o endereço em que ele foi transmitido. Em seguida, o LayerLoader atualiza a lista de ganchos de função para para o ponto de entrada da camada.

Ativar camadas

Você pode ativar as camadas GLES por app ou de forma global. Configurações por app persistem entre as reinicializações, enquanto as propriedades globais são apagadas na reinicialização.

Para ativar as camadas por app, faça o seguinte:

# 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

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 usam o Android CTS e precisam passar em testes de CTS para dispositivos compatíveis. Para identificar se as camadas estão trabalhando em um dispositivo, execute $ atest CtsGpuToolsHostTestCases.