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.

Por padrão, a renderização no lado do convidado (por exemplo, interface e reprodução de vídeo) no dispositivo Cuttlefish é processada pelo SwiftShader. O SwiftShader é uma implementação de software das APIs OpenGL e Vulkan. Por ser uma implementação de software, ele oferece uma solução de renderização universalmente acessível para que o Cuttlefish possa ser executado 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.

Como 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.