Cuttlefish: การเร่งกราฟิกด้วย GPU

โหมดกราฟิกแบบเร่งของ Cuttlefish จะใช้หน่วยประมวลผลกราฟิก (GPU) จริงของเครื่องโฮสต์ในการเรนเดอร์โดยส่งคำสั่งการเรนเดอร์ของผู้ใช้ชั่วคราวไปยังเครื่องโฮสต์ เรียกใช้คำสั่งการเรนเดอร์บนเครื่องโฮสต์ และส่งผลลัพธ์ที่ผ่านการจัดการไปยังผู้ใช้ชั่วคราว

อุปกรณ์ Cuttlefish ที่ใช้ Android 11 ขึ้นไปจะตรวจหาและใช้กราฟิกแบบเร่ง หากเครื่องโฮสต์ไม่รองรับกราฟิกเร่งความเร็วหรือ Android เป็นเวอร์ชัน 10 หรือต่ำกว่า ระบบจะจัดการการแสดงผลฝั่งผู้มาเยือน (เช่น UI และการเล่นวิดีโอ) ในอุปกรณ์ Cuttlefish ด้วย SwiftShader SwiftShader คือการใช้งานซอฟต์แวร์ของ OpenGL และ Vulkan API เนื่องจาก SwiftShader เป็นการใช้งานซอฟต์แวร์ จึงมีโซลูชันการแสดงผลที่เข้าถึงได้ทั่วโลกสำหรับ Cuttlefish ซึ่งสามารถทำงานบนเครื่องโฮสต์เครื่องใดก็ได้

อย่างไรก็ตาม การใช้ SwiftShader จะไม่มีประสิทธิภาพเท่ากับอุปกรณ์ปกติ การแสดงผลเป็นปัญหาแบบขนานที่สามารถทำงานแบบขนานได้จำนวนมาก เนื่องจากสามารถคํานวณค่าพิกเซลแยกกันได้ หน่วยประมวลผลกราฟิก (GPU) คือหน่วยฮาร์ดแวร์ที่แก้ปัญหานี้โดยการเร่งการแสดงผล

ข้อกำหนด

โหมดกราฟิกแบบเร่งกำหนดให้โฮสต์มีคุณสมบัติดังนี้

  • ไดรเวอร์ที่พร้อมใช้งาน EGL ซึ่งรองรับส่วนขยาย GL_KHR_surfaceless_context
  • ไดรเวอร์ที่รองรับ OpenGL ES
  • โปรแกรมควบคุมที่ใช้ Vulkan ได้

ใช้โหมดกราฟิกที่เร่ง

GfxStream

หากต้องการใช้โหมดกราฟิกที่เร่งด้วย GfxStream ให้เปิดอุปกรณ์ Cuttlefish ในพื้นที่ด้วย Flag --gpu_mode=gfxstream เมื่อใช้โหมดนี้ ระบบจะส่งต่อการเรียก OpenGL และ Vulkan API ไปยังโฮสต์โดยตรง

launch_cvd --gpu_mode=gfxstream

Virgl

หากต้องการใช้โหมดกราฟิกที่เร่งด้วย Virgl ให้เปิดอุปกรณ์ Cuttlefish ในพื้นที่ด้วย Flag --gpu_mode=drm_virgl

launch_cvd --gpu_mode=drm_virgl

เมื่อใช้โหมดกราฟิกแบบเร่งด้วย Virgl การเรียก OpenGL API จะได้รับการแปลเป็นการแสดงผลระดับกลาง (ดู Gallium3D) ระบบจะสื่อสารการแสดงผลระดับกลางไปยังโฮสต์ และไลบรารี virglrenderer ในโฮสต์จะแปลการแสดงผลระดับกลางกลับเป็นการเรียก OpenGL API