Cuttlefish: GPU グラフィック アクセラレーション

Cuttlefish のアクセラレーテッド グラフィック モードでは、ホストマシンの物理的な画像処理装置(GPU)を使用してレンダリングを行います。ゲストのレンダリング コマンドをホストマシンに渡し、ホストマシン上でレンダリング コマンド呼び出しを実行して、その結果をゲストに返します。

Android 11 以降を搭載した Cuttlefish デバイスは、アクセラレーテッド グラフィックを検出して使用します。ホストマシンがアクセラレーテッド グラフィックをサポートしていない場合、または Android のバージョンが Android 10 以前の場合、Cuttlefish デバイスでのゲスト側のレンダリング(UI や動画再生など)は、SwiftShader によって処理されます。SwiftShader は、OpenGL API と Vulkan API のソフトウェア実装です。ソフトウェア実装であるため、どのホストマシンでも実行できる Cuttlefish に、汎用的にアクセス可能なレンダリング ソリューションを提供します。

ただし、仮想デバイスでの SwiftShader の使用は、通常のデバイスに比べてパフォーマンスの面で劣ります。レンダリングは、ピクセル値の計算が独立して行われると超並列化が発生する可能性がある並列問題です。この問題に対処するために、ハードウェア ユニットである画像処理装置(GPU)を使用して処理を高速化することができます。

要件

アクセラレーテッド グラフィック モードを使用する場合、ホストに以下が必要です。

  • GL_KHR_surfaceless_context 拡張機能をサポートする EGL 対応ドライバ
  • OpenGL ES 対応ドライバ
  • Vulkan 対応ドライバ

アクセラレーテッド グラフィック モードの使用

GfxStream

GfxStream アクセラレーテッド グラフィック モードを使用するには、--gpu_mode=gfxstream フラグを指定してローカルの Cuttlefish デバイスを起動します。このモードを使用すると、OpenGL API と Vulkan API の呼び出しがホストに直接転送されます。

launch_cvd --gpu_mode=gfxstream

Virgl

Virgl アクセラレーテッド グラフィック モードを使用するには、--gpu_mode=drm_virgl フラグを指定してローカルの Cuttlefish デバイスを起動します。

launch_cvd --gpu_mode=drm_virgl

Virgl アクセラレーテッド グラフィック モードを使用すると、OpenGL API の呼び出しが中間表現に変換されます(Gallium3D を参照)。この中間表現がホストに伝送され、ホストの virglrenderer ライブラリによって OpenGL API の呼び出しに再び変換されます。