d3d:d3d12:descriptor
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
d3d:d3d12:descriptor [2015/09/20 16:20] – [Descriptor] oga | d3d:d3d12:descriptor [2015/09/22 17:19] (現在) – [Descriptor] oga | ||
---|---|---|---|
行 25: | 行 25: | ||
^ GPU ^ FeatureLevel | ^ GPU ^ FeatureLevel | ||
+ | | RADEON GCN 1.0 | 11_1 | 32 | 16 | 32 | 144 | | ||
| RADEON GCN 1.1 | 12_0 | 32 | 16 | 32 | 144 | | | RADEON GCN 1.1 | 12_0 | 32 | 16 | 32 | 144 | | ||
- | | GeForce Maxwell | + | | GeForce Kepler |
+ | | GeForce Maxwell | ||
+ | | GeForce Maxwell GM2 | ||
+ | | Intel HD Graphics Gen7.5 | 11_1 | 32 | 16 | 32 | 96 | | ||
| Intel HD Graphcis Gen8 | 11_1 | 64 | 16 | 32 | 128 | | | Intel HD Graphcis Gen8 | 11_1 | 64 | 16 | 32 | 128 | | ||
+ | |||
+ | |||
+ | 古い D3D11 世代の GPU では Descriptor Handle が仮想的な実装になっている可能性があります。 | ||
+ | |||
+ | |||
+ | ===== Descriptor Heap ===== | ||
+ | |||
+ | CBV, SRV, UAV の Descriptor Heap は共有されています。 | ||
+ | |||
+ | ^ Descriptor HeapType | ||
+ | | D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV | ||
+ | | D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER | ||
+ | | D3D12_DESCRIPTOR_HEAP_TYPE_RTV | ||
+ | | D3D12_DESCRIPTOR_HEAP_TYPE_DSV | ||
+ | |||
+ | つまり Shader に渡すパラメータ CBV, SRV, UAV は同じ Heap (Table) 上に並べてまとめて管理することができます。描画時に API に渡す場合一度に設定することができます。 | ||
+ | 一度の描画で参照できる DescriptorHeap は、HeapType 毎に 1 つだけなので注意が必要です。 | ||
+ | |||
行 33: | 行 55: | ||
===== ID3D12RootSignature ===== | ===== ID3D12RootSignature ===== | ||
- | リソースとシェーダーの対応付けを行うための API Slot を定義します。また Slot と Shader Register の対応付けも行います。 | + | リソースとシェーダーの対応付けを行うための API である Parameter |
- | D3D12 の API Slot と Register との対応付けはプログラマブルで自由に設計できます。 | + | また Slot に指定した Descriptor |
- | RootSignature | + | パラメータのレイアウトはアプリケーション側で自由に設計することが可能です。 |
+ | RootSignature はいわばシェーダーに渡すパラメータ API がプログラマブルになったものと言えます。 | ||
- | * Cost 1 : DescriptorTable | + | 初期の Shader Program と同じように、RootSignature には Slot サイズの上限があります。 |
- | * Cost 2 : Descriptor 直接 | + | 現状では最大 64エントリ のみとなります。 |
- | * Cost 1 : Constant (32bit 単位で1、例えば float4 | + | なお 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 を使ってバイナリ化できます。 | ||
行 53: | 行 85: | ||
===== RootSignature と API ===== | ===== RootSignature と API ===== | ||
- | Shader にパラメータを渡す方法のまとめ。 | + | |
+ | Shader にパラメータを渡す方法は複数存在しています。 | ||
+ | 下記はそのまとめです。 | ||
行 69: | 行 104: | ||
| DSV | DSV | Descriptor Table | CommandList:: | | DSV | DSV | Descriptor Table | CommandList:: | ||
- | * CBV, SRV, UAV, Sampler いずれも Descriptor Table を使う方法、使わない方法両方用意されています。 | + | |
- | | + | CBV, SRV, UAV, Sampler いずれも Descriptor Table を使う方法、使わない方法両方用意されています。 |
- | | + | ただし SRV, UAV は Root Descriptor |
+ | よって事実上 Texture Map として用いる場合は Descriptor Table を使う必要があります。 | ||
+ | |||
+ | CBV は上記のように、DescriptorTable を使う場合、直接 Root Descriptor に設定する場合、値を RootSignature | ||
行 81: | 行 119: | ||
===== API による速度の違い ===== | ===== API による速度の違い ===== | ||
- | 速度差の調査 | + | RootSignature を使って Shader にパラメータを渡す方法は複数存在しています。 |
+ | 実際に RootSignature の設計によってどの程度パフォーマンスに差が生じるか調べてみました。 | ||
行 99: | 行 138: | ||
| Bundle cached | | Bundle cached | ||
| Bundle2 | | Bundle2 | ||
+ | |||
+ | |||
d3d/d3d12/descriptor.txt · 最終更新: 2015/09/22 17:19 by oga