Gecko の gfx の簡易メモ

最近(2012年1月現在)、Gecko の gfx が Azure とか Thebes とか ややこしくして仕方なかったので、色々調べて、Twitter にいくつか投げたのでメモる。
メモなので随時更新。割合てきとー
makoto_kato さんから Twitter で補足をいただいたので追記


cairo 採用の経緯

  1. 昔(Gecko 1.8くらいまで)は、Gecko は gfx というグラフィック抽象レイヤを構築し使っていた
    • プラットフォーム・出力デバイスごとにゴリゴリ実装してた
  2. その抽象レイヤが問題ありまくり
    • プラットフォームごとに分けてるのでバグの元
    • アンチエイリアスとかベクトル描画などの機能が無かった
      • そういう機能が必要な SVG とか canvas では、独自にプラットフォームの描画APIを呼び出していたりと、またバグの元
  3. 諸々の問題解決のために cairo 導入
    • cairo は比較的モダンなベクトルベースのグラフィックライブラリ
    • グラフィック抽象レイヤを一本化(バグの減少)
    • cairo を wrap する API レイヤーとして Thebes の導入
    • 各種バックエンドによるハードウェアアクセラレーションも期待

Azure 導入の経緯

  1. ハードウェアアクセラレーションをFirefox 4(Gecko 2.0)で導入
  2. cairo を使用するにあたっての問題が顕著になってきた
    • cairo はステートフルな API のため、API 呼び出しコストの発生
    • cairo は固定小数点数を使用している一方で、Direct2D のバックエンドでは浮動小数点数を使用するので、変換コストが発生
  3. Azure を構築する
    • ステートレス且つハードウェア・プラットフォームにより近い API
    • バックエンドとして Direct2D や Core Graphics、Skia、cairo(フォールバック用途)、etc を持つ
  4. 当面は Azure を Thebes 向けに wrap したものを使う
  5. 段階的にコードを Thebes 向けから Azure 向けに置き換えていく

GeckoGPU アクセラレーション

GPU アクセラレーション稼働の条件
  • バックエンドが実装され有効になっている
    • パフォーマンスetcの問題で使われていないバックエンドはある
  • プラットフォーム側でバックエンドの使用する API が用意されている(Win XP では Direct2D が無い為、content のアクセラレーションは動かない)
  • ドライバがブラックリスト入りしていない(Blocklisting/Blocked Graphics Drivers - MozillaWiki
    • ドライバの安定性に問題がある場合はブラックリスト入り
    • WebGL もこのブラックリストに左右される
    • ドライバがブラックリスト入りしていても、強制的に有効にすること自体は可能
GPU を使うケース
  • composition: 要素 layer の合成(配置)処理
    • 色空間変換
    • CSS transition(別の layer で動かす)
    • layer の合成処理
    • layer の種類によっては Matrix 処理もハードウェアアクセラレーション使う
  • content: 要素のボーダーなど、要素自体の描画。
  • WebGL: WebGL
各プラットフォームの対応状況
  • Windows
    • composition: Direct3D 10 or 9
    • content: Direct2D(XPでは無し)
    • WebGL: ANGLE(Direct3D 9のラッパー)をバックエンドにして実装
      • 強制的に OpenGL をバックエンドにすることも可能ではある
    • Gecko 7.0 から HTML5 canvas の描画に Azure(Direct2Dバックエンド) 使ってる
  • Mac OS X
    • composition: OpenGL(10.6.3以降)
    • content: cairo(Core Graphics ベース)
    • WebGL: OpenGL(10.6以降で有効)
    • Azure の Core Graphics バックエンドは10.6以降のサポートを予定
  • LinuxX11
    • composition: OpenGL(無効。強制有効可)
    • content: cairo(XRender ベース)
    • WebGL: OpenGL(有効)
    • ドライバの問題でまともに動く環境は少ない
  • Android

関連事項

イマイチわからなかったところ