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

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

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

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

ข้อกำหนด

โหมดกราฟิกแบบเร่งกำหนดให้โฮสต์ต้องมีสิ่งต่อไปนี้

  • ไดรเวอร์ที่รองรับ EGL ซึ่งรองรับส่วนขยาย GL_KHR_surfaceless_context
  • ไดรเวอร์ที่รองรับ OpenGL ES
  • ไดรเวอร์ที่รองรับ Vulkan

ใช้โหมดกราฟิกแบบเร่ง

GfxStream

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

launch_cvd --gpu_mode=gfxstream

Virgl

หากต้องการใช้โหมดกราฟิกแบบเร่ง Virgl ให้เปิดใช้อุปกรณ์ Cuttlefish ในเครื่องด้วยแฟล็ก --gpu_mode=drm_virgl

launch_cvd --gpu_mode=drm_virgl

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