タイルベース(遅延)レンダリングのデータ構造


18

タイルレンダリングは、最新のモバイルGPUアーキテクチャで使用され、画像スペースを小さな(たとえば32x32ピクセル)タイルの規則的なグリッドに分割することにより、メモリアクセスの一貫性を高めます。任意の多くのプリミティブが任意のタイルとオーバーラップする可能性があることを考慮して、各タイルに関連付けられているプリミティブを追跡するために使用されるデータ構造のタイプに関する情報はほとんどありません。

ドライバー開発者の観点から、タイルに属するプリミティブセットを表すために一般的に使用されるデータ構造はどれですか。そのような構造は、特定のタイルと重複するジオメトリに従って動的に割り当て/サイズ変更されますか?


3
本当に興味深い質問です。重要な詳細のほとんどは秘密のソースであると思われますが、これは調査を行い、要約を書きたい人にとっては良い出発点になるかもしれません:blog.imgtec.com/powervr/…
ジョンカルスビーク

回答:


11

ジョンが言及しているそのブログ投稿は、かなり良い出発点です(私がそう言うなら)!

PowerVRアーキテクチャの場合、すべての頂点シェーディングとタイリングプロセスが完了した後、タイルごとのデータを格納する中間データ構造(プリミティブリストまたはパラメーターバッファー(PB)と呼ばれる)は、実際にほとんどが生成および管理されますドライバーではなく、ハードウェア。

PBのメモリ内構造は物理的に2つに分割されます。まず、頂点属性を含む、変換された頂点データのブロック。ブロックは圧縮されており、ご想像のとおり、ほとんどの部分が圧縮された浮動小数点データです。2番目のメモリ内構造は、タイルデータです。これは、事実上リストのリストです。

そのデータ構造の最上位リストはリージョンと呼ばれ、特定のプリミティブブロックに対して、一度に1つのタイルではなく、タイルのセットをエンコードできます。したがって、リージョンは、スクリーンタイル、タイル状態、およびそのリージョン内のジオメトリを保持する圧縮ブロックのリストの場所のセットです。リージョンはラスタライザーが機能するものであり、空のタイルが自動的にスキップされることが想像できますが、場合によっては、ラスタライザーが空のリージョンにアクセスする十分な理由があります。

GPUがPBに使用するメモリは、最新のすべてのPowerVR実装で動的に割り当てられます。そのメモリへのポインターはドライバーによって提供され、ドライバーはGPUの助けを借りて、必要に応じてサイズを調整します。このメカニズムは、頻繁に再割り当てする必要があることと、割り当てられたPBスペースの量を最小化することとのトレードオフです。

最新のGPUは、メモリの間接化を最小限に抑えるように一生懸命努力していますが、PBを歩いてラスタライズステージをフィードすることは、本当に難しく、他に選択肢がないケースの1つです。ありがたいことに、ポインタ追跡は、キャッシュに適した大きなブロックをラップし、コアにストリーミングされます。

他のアーキテクチャはPowerVRとまったく同じように機能しません。これは、PBが私たちのアーキテクチャにある理由の一部は、実装する完全な遅延ピクセルシェーディングコンセプトを支援するためですが、一般的なコンセプトは、私が知っているモバイルスペース。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.