Cuttlefish: aceleração gráfica de GPU

O modo de aceleração gráfica do Cuttlefish usa a unidade de processamento gráfico (GPU) física da sua máquina host para renderização transmitindo os comandos de renderização de convidado para a máquina host, executando as chamadas de comandos na máquina host e transmitindo os resultados renderizados de volta para o convidado.

Um dispositivo Cuttlefish em execução no Android 11 ou versões mais recentes detecta e usa gráficos acelerados. Se a máquina host não oferecer suporte a gráficos acelerados ou se a versão do Android for o Android 10 ou anterior, a renderização do lado do convidado (por exemplo, reprodução de vídeo e interface) no dispositivo Cuttlefish será processada pelo SwiftShader. O SwiftShader é uma implementação de software das APIs OpenGL e Vulkan. Como o SwiftShader é uma implementação de software, ele fornece uma solução de renderização universalmente acessível para o Cuttlefish, capaz de ser executada em qualquer máquina host.

No entanto, o uso do SwiftShader não é tão eficiente quanto um dispositivo normal. A renderização é um problema paralelo que pode ser carregado em paralelo de modo massivo, já que os valores de pixel podem ser calculados de forma independente. As GPUs são unidades de hardware que resolvem esse problema acelerando a renderização.

Requisitos

O modo gráfico acelerado exige que o host tenha um driver:

  • compatível com EGL e com a extensão GL_KHR_surfaceless_context;
  • compatível com OpenGL ES;
  • compatível com Vulkan.

Usar os modos gráficos acelerados

GfxStream

Para usar o modo gráfico acelerado do GfxStream, inicie o dispositivo Cuttlefish local com a sinalização --gpu_mode=gfxstream. Ao usar esse modo, as chamadas de API OpenGL e Vulkan são encaminhadas diretamente para o host.

launch_cvd --gpu_mode=gfxstream

Virgl

Para usar o modo gráfico acelerado do Virgl, inicie o dispositivo Cuttlefish local com a sinalização --gpu_mode=drm_virgl.

launch_cvd --gpu_mode=drm_virgl

Ao usar o modo gráfico acelerado do Virgl, as chamadas da API OpenGL são convertidas em uma representação intermediária. Consulte Gallium3D (link em inglês). A representação intermediária é comunicada ao host, e a biblioteca virglrenderer (link em inglês) no host converte essa representação novamente em chamadas da API OpenGL.