Cuttlefish: akceleracja grafiki przez GPU

Tryb przyspieszonej grafiki Cuttlefish używa fizycznego procesora graficznego (GPU) maszyny hosta do renderowania, przekazując polecenia renderowania gościa do maszyny hosta, wykonując wywołania poleceń renderowania na maszynie hosta i przekazując wyniki renderowania z powrotem do gościa.

Urządzenie Cuttlefish z Androidem 11 lub nowszym wykrywa i wykorzystuje przyspieszoną grafikę. Jeśli maszyna hosta nie obsługuje przyspieszonej grafiki lub wersja Androida to Android 10 lub starszy, renderowanie po stronie gościa (np. interfejsu i odtwarzania wideo) na urządzeniu Cuttlefish jest obsługiwane przez SwiftShader. SwiftShader to programowa implementacja interfejsów API OpenGL i Vulkan. SwiftShader to implementacja programowa, która zapewnia uniwersalne rozwiązanie do renderowania dla Cuttlefish, które może działać na dowolnym komputerze hosta.

Jednak korzystanie z SwiftShader nie jest tak wydajne jak w przypadku normalnego urządzenia. Renderowanie jest problemem równoległym, który można w znacznym stopniu zrównoleglić, ponieważ wartości pikseli można obliczać niezależnie. Procesory graficzne (GPU) to jednostki sprzętowe, które rozwiązują ten problem, przyspieszając renderowanie.

Wymagania

Tryb przyspieszonej grafiki wymaga, aby host miał:

  • Sterownik obsługujący EGL i rozszerzenie GL_KHR_surfaceless_context
  • Sterownik obsługujący OpenGL ES
  • Sterownik obsługujący interfejs Vulkan

Korzystanie z trybów akceleracji grafiki

GfxStream

Aby używać trybu akcelerowanej grafiki GfxStream, uruchom lokalne urządzenie Cuttlefish z flagą --gpu_mode=gfxstream. W tym trybie wywołania interfejsów OpenGL i Vulkan są przekazywane bezpośrednio do hosta.

launch_cvd --gpu_mode=gfxstream

Virgl

Aby używać trybu akceleracji grafiki Virgl, uruchom lokalne urządzenie Cuttlefish z flagą --gpu_mode=drm_virgl.

launch_cvd --gpu_mode=drm_virgl

W trybie akcelerowanej grafiki Virgl wywołania interfejsu OpenGL API są tłumaczone na reprezentację pośrednią (patrz Gallium3D). Reprezentacja pośrednia jest przekazywana do hosta, a biblioteka virglrenderer na hoście tłumaczy ją z powrotem na wywołania interfejsu OpenGL API.