d3d:d3d12:descriptor
差分
このページの2つのバージョン間の差分を表示します。
次のリビジョン | 前のリビジョン次のリビジョン両方とも次のリビジョン | ||
d3d:d3d12:descriptor [2015/09/01 19:33] – 作成 oga | d3d:d3d12:descriptor [2015/09/21 17:00] – [Descriptor] oga | ||
---|---|---|---|
行 1: | 行 1: | ||
+ | ====== RootSignature と Descriptor ====== | ||
+ | ===== Descriptor ===== | ||
+ | リソースの情報を格納した構造体です。 | ||
+ | GPU メモリに確保され、GPU が直接リソースを参照するために用いられます。 | ||
+ | Descriptor を格納するメモリは DescriptorHeap から確保されます。 | ||
+ | DescriptorHeap は GPU Memory に確保すると同時に System Memory にもミラーが作られ、CPU と GPU 両方からアクセスできるようになっています。 | ||
- | ^ ^ Core i7-4790K ^^^^^ | + | |
- | ^ ^ Intel ^ GCN 1.0^ Kepler ^ Maxwell1 ^ Maxwell2 ^ | + | |
- | | const32bit | + | |
- | | root desc | + | |
- | | global handle | + | |
- | | buf shared | + | |
- | | cached | + | |
- | | Dynamic Heap | 25.66 | 35.54 | 15.96 | 15.00 | 15.18 | | ||
- | | Shared RS | + | Descriptor が必要なリソースは下記の通り |
- | | Separate RS | + | |
+ | * ConstantBufferView | ||
+ | * ShaderResourceView (Texture) | ||
+ | * UnorderedAccessView | ||
+ | * Sampler | ||
+ | * RenderTargetView | ||
+ | * DepthStencilView | ||
+ | |||
+ | Descriptor が消費する Heap のメモリ量は GPU によって異なります。下記の表の単位は byte です。 | ||
+ | |||
+ | ^ GPU ^ FeatureLevel | ||
+ | | RADEON GCN 1.1 | 12_0 | 32 | 16 | 32 | 144 | | ||
+ | | GeForce Maxwell GM2 | 12_1 | 32 | 32 | 32 | 8 | | ||
+ | | Intel HD Graphics Gen7.5 | 11_1 | 32 | 16 | 32 | 96 | | ||
+ | | Intel HD Graphcis Gen8 | 11_1 | 64 | 16 | 32 | 128 | | ||
+ | |||
+ | |||
+ | 古い D3D11 世代の GPU では Descriptor Handle が仮想的な実装になっている可能性があります。 | ||
+ | |||
+ | |||
+ | ===== ID3D12RootSignature ===== | ||
+ | |||
+ | リソースとシェーダーの対応付けを行うための API である Parameter Slot を定義します。 | ||
+ | また Slot に指定した Descriptor と Shader Register の対応付けも行います。 | ||
+ | |||
+ | パラメータのレイアウトはアプリケーション側で自由に設計することが可能です。 | ||
+ | RootSignature はいわばシェーダーに渡すパラメータ API がプログラマブルになったものと言えます。 | ||
+ | |||
+ | 初期の Shader Program と同じように、RootSignature には Slot サイズの上限があります。 | ||
+ | 現状では最大 64エントリ のみとなります。 | ||
+ | なお Descriptor 自体はテーブルとして先頭アドレスを Slot に設定するだけなので、Descriptor の最大数には上限がありません。 | ||
+ | |||
+ | RootSignature の各 Slot は下記のように Type に応じた Cost が設けられています。 | ||
+ | |||
+ | * Cost 1 : DescriptorTable | ||
+ | * Cost 2 : Root Descriptor 直接 | ||
+ | * Cost 1 : Root 32bit Constant (32bit 単位で1、float4 なら Cost4 になる) | ||
+ | |||
+ | 例えば RootSignature を ConstantBuffer の 32bit 直値だけで埋めるなら最大で 64個まで入ります。つまり float4x4 を 4つ分。 | ||
+ | |||
+ | RootSignature は PipelineState 作成時に必要で、また描画時にも CommandList に設定します。 | ||
+ | RootSignature は定義内容が一致していれば同一とみなされます。 | ||
+ | PipelineState と CommandList に異なる Object を与えても問題ありません。 | ||
+ | |||
+ | RootSignature は Shader と同じように hlsl に記述することが可能で、fxc を使ってバイナリ化できます。 | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== RootSignature と API ===== | ||
+ | |||
+ | |||
+ | Shader にパラメータを渡す方法は複数存在しています。 | ||
+ | 下記はそのまとめです。 | ||
+ | |||
+ | |||
+ | |||
+ | ^ Type ^ Descriptor Heap ^ ^ 設定 API ^ 描画時に設定する内容 | ||
+ | | CBV | CBV_SRV_UAV | ||
+ | | CBV | - | Root Descriptor | ||
+ | | CBV | - | Root Constants | ||
+ | | SRV | CBV_SRV_UAV | ||
+ | | SRV | - | Root Descriptor | ||
+ | | UAV | CBV_SRV_UAV | ||
+ | | UAV | - | Root Descriptor | ||
+ | | Sampler | ||
+ | | Sampler | ||
+ | | RTV | RTV | Descriptor Table | CommandList:: | ||
+ | | DSV | DSV | Descriptor Table | CommandList:: | ||
+ | |||
+ | |||
+ | CBV, SRV, UAV, Sampler いずれも Descriptor Table を使う方法、使わない方法両方用意されています。 | ||
+ | ただし SRV, UAV は Root Descriptor の場合 Sampler を使うことができません。 | ||
+ | よって事実上 Texture Map として用いる場合は Descriptor Table を使う必要があります。 | ||
+ | |||
+ | CBV は上記のように、DescriptorTable を使う場合、直接 Root Descriptor に設定する場合、値を RootSignature (Root 32bit Constant) に直接格納する場合の 3通りの手段があります。どの方法を用いても構いません。 | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== API による速度の違い ===== | ||
+ | |||
+ | RootSignature を使って Shader にパラメータを渡す方法は複数存在しています。 | ||
+ | 実際に RootSignature の設計によってどの程度パフォーマンスに差が生じるか調べてみました。 | ||
+ | |||
+ | |||
+ | ^ ^ Core i7-4790K | ||
+ | ^ ^ Intel ^ GCN 1.0^ Kepler ^ Maxwell1^Maxwell2^ GCN1.1 | ||
+ | | const32bit | ||
+ | | root desc | ||
+ | | global handle | ||
+ | | buf shared | ||
+ | | cached | ||
+ | | Dynamic Heap | 25.66 | 35.54 | 15.96 | 15.00 | 15.18 | 133.73 | 79.77 | | ||
+ | | Shared RS | ||
+ | | Separate RS | ||
+ | | Bundle const32bit | 18.67 | -- | 9.00 | 8.75 | 9.87 | -- | 35.50 | | ||
+ | | Bundle root desc | 20.55 | -- | 9.66 | 9.66 | 9.90 | -- | 36.96 | | ||
+ | | Bundle copy | ||
+ | | Bundle cached | ||
+ | | Bundle2 | ||
- | | Bundle const32bit | 18.67 | -- | 9.00 | 8.75 | 9.87 | | ||
- | | Bundle root desc | 20.55 | -- | 9.66 | 9.66 | 9.90 | | ||
- | | Bundle copy | ||
- | | Bundle cached | ||
- | | Bundle2 | ||
d3d/d3d12/descriptor.txt · 最終更新: 2015/09/22 17:19 by oga