Skip to content
Go back

Modern Mobile Rendering @ hypehype

· Updated:

slides video web

拙訳

  • よくあるモバイルGPU
    • ユニフォームバッファが16KBに制限されたり、SSBOが遅かったり
    • グループ共有メモリが小さかったりエミュレーションだったり
    • wave命令がサポートされていなかったり
    • 複雑なシェーダが苦手だったり
    • 64ビット整数が使えなかったり
    • push constantがエミュレーションだったり
  • 共有オブジェクトの寿命管理
    • スマートポインタでは問題がある
      • メモリが個々に乱立するので効率良くない
      • RAIIなので良からぬところで破棄されるかもしれない
    • 大きな配列で一括管理して、番号と世代をハンドルとして参照する
      • 世代は解放時にインクリメントされるので、前世代のオブジェクトに誤ってアクセスできなくなる
      • 割当はFree Listからハンドルをもらう
    • 配列はホットデータとコールドデータで分ける
      • インデックスは共通
      • レンダリングに必要なものをホットデータに置く
  • GPUメモリの割当
  • バインディング
    • 使うリソースをまとめてバインドグループを事前に作る
    • ドローコールは3つのバインドグループをセットできる
      • それぞれがデスクリプタセットのスロットに対応する
    • 描画データのため、動的バッファをセットできる
  • ソフトウェア・コマンドバッファ
    • 最初は、64Bのドローコール構造体を使っていた
      • シェーダ、バインドグループx3、動的バッファ、インデックスバッファ、頂点バッファx3、インデックスのオフセット、頂点のオフセット、インスタンスのオフセット、動的バッファのオフセットx3、トライアングル数(それぞれ4B幅)
      • ハンドラと値のみで構成される
    • 多くのデータは描画間で変化しないので、変化するフィールドのみを記録したストリームを使う
      • 変化するフィールドのビットセット4Bの後ろに、対応するデータを4Bで格納する