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