ユーザ用ツール

サイト用ツール


d3d:d3d12:descriptor

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
次のリビジョン両方とも次のリビジョン
d3d:d3d12:descriptor [2015/09/20 16:15] – [RootSignature と Descriptor] ogad3d:d3d12:descriptor [2015/09/22 02:07] – [Descriptor] oga
行 4: 行 4:
  
 リソースの情報を格納した構造体です。 リソースの情報を格納した構造体です。
-GPU メモリに確保され、GPU がリソースを参照するために用いられます。+GPU メモリに確保され、GPU が直接リソースを参照するために用いられます。
  
 Descriptor を格納するメモリは DescriptorHeap から確保されます。 Descriptor を格納するメモリは DescriptorHeap から確保されます。
-DescriptorHeap は連続領域で、GPU にブル渡します。+DescriptorHeap は GPU Memory 確保すると同時に System Memory にもミラが作られ、CPU と GPU 両方からアクセスできるようになっます。 
 + 
 +  - Descriptor の作成時 :  CreateShaderResourceView 等 (CPU の Descriptor Address) 
 +  - 描画時 : SetGraphicsRootDescriptorTable (GPU の Descriptor Address) 
  
 Descriptor が必要なリソースは下記の通り Descriptor が必要なリソースは下記の通り
行 22: 行 26:
 ^ GPU                      ^ FeatureLevel  ^ CBV_SRV_UAV ^ SAMPLER ^ RTV  ^ DSV  ^ ^ GPU                      ^ FeatureLevel  ^ CBV_SRV_UAV ^ SAMPLER ^ RTV  ^ DSV  ^
 | RADEON GCN 1.1           | 12_0          | 32          | 16      | 32   | 144  | | RADEON GCN 1.1           | 12_0          | 32          | 16      | 32   | 144  |
-| GeForce Maxwell 2        | 12_1          | 32          | 32      | 32   | 8    |+| GeForce Maxwell GM1      | 11_0          | 32          | 32      | 32   | 8    | 
 +| 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  | | Intel HD Graphcis Gen8   | 11_1          | 64          | 16      | 32   | 128  |
  
 +
 +古い D3D11 世代の GPU では Descriptor Handle が仮想的な実装になっている可能性があります。
  
  
 ===== ID3D12RootSignature ===== ===== ID3D12RootSignature =====
  
-リソースとシェーダーの対応付けを行うための API Slot を定義します。また Slot と Shader Register の対応付けも行います。 +リソースとシェーダーの対応付けを行うための API である Parameter Slot を定義します。 
-D3D12 の API Slot と Register との対応付けはプログラマブルで自由に設計できます。+また Slot に指定した Descriptor と Shader Register の対応付けも行います。
  
-RootSignature ズは固定で、最大 64エントリ (DWORD) +パラメータアウはアプケーション側で自由に設計することが可能です。 
 +RootSignature はいわばシェーダーに渡すパラメータ API がプログラマブルになったもと言えます
  
-  * Cost 1  : DescriptorTable +初期の Shader Program と同じように、RootSignature には Slot サイズの上限があります。 
-  * Cost 2  : Descriptor 直接 +現状は最大 64エントリ のみとります。 
-  * Cost 1  : Constant (32bit 単位1、例えば float4 ら Cost4 になる)+お Descriptor 自体はテーブルとして先頭アドレスを Slot に設定すだけなので、Descriptor の最大数には上限がありません。
  
-例えば RootSignature を ConstantBuffer の 32bit 直値だで埋めるな最大で 64個まで入ります。float4x4 を 4つ分+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 を使ってバイナリ化できます。
  
  
行 49: 行 67:
 ===== RootSignature と API ===== ===== RootSignature と API =====
  
-Shader にパラメータを渡す方法のまとめ。+ 
 +Shader にパラメータを渡す方法は複数存在しています。 
 +下記はそのまとめです 
  
  
行 65: 行 86:
 | DSV      | DSV             | Descriptor Table  | CommandList::OMSetRenderTargets()                 | CPU Descriptor Handle        |     | 1         | -        |     | | DSV      | DSV             | Descriptor Table  | CommandList::OMSetRenderTargets()                 | CPU Descriptor Handle        |     | 1         | -        |     |
  
-  * CBV, SRV, UAV, Sampler いずれも Descriptor Table を使う方法、使わない方法両方用意されています。 + 
-    ただし SRV, UAV は Descriptor Table 以外機能制限があります。 +CBV, SRV, UAV, Sampler いずれも Descriptor Table を使う方法、使わない方法両方用意されています。 
-  CBV は、DescriptorTable を使う場合、直接 Root Descriptor に設定する場合、値を RootSignature に直接格納する場合の 3通りの方法があります。+ただし SRV, UAV は Root Descriptor の場合 Sampler を使うことができません。 
 +よって事実上 Texture Map として用いる場合は Descriptor Table を使う必要があります。 
 + 
 +CBV は上記のように、DescriptorTable を使う場合、直接 Root Descriptor に設定する場合、値を RootSignature (Root 32bit Constant) に直接格納する場合の 3通りの手段があります。どの方法を用いても構いません
  
  
行 77: 行 101:
 ===== API による速度の違い ===== ===== API による速度の違い =====
  
-度差調+RootSignature を使って Shader にパラメータを渡す方法は複数存在しています。 
 +実際に RootSignature の設計によってどの程パフォーマンスにが生じるか調べてみました。
  
  
行 95: 行 120:
 | Bundle cached      20.35 |     -- |   8.23 |   8.41 |    9.90 |      -- |  35.22 | | Bundle cached      20.35 |     -- |   8.23 |   8.41 |    9.90 |      -- |  35.22 |
 | Bundle2            21.26 |  28.28 |  15.36 |  15.28 |   15.50 |   90.24 |  66.38 | | Bundle2            21.26 |  28.28 |  15.36 |  15.28 |   15.50 |   90.24 |  66.38 |
 +
 +
  
  
  
d3d/d3d12/descriptor.txt · 最終更新: 2015/09/22 17:19 by oga

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki