Direct3D 12 ではリソースバインドの方法が大きく変わっています。Shader の種類も渡すリソースの数も増えており、Bind のコストが無視できなくなっているからです。リソースは Descriptor Heap 上に確保した一連の Descriptor に登録します。この Heap 上の先頭アドレスを指定するだけで描画時のバインドが完了する仕組みです。
Descriptor は GPU がアクセスする領域なので、ハードウエアによってサイズが異なっています。実際にどれくらい違いがあるのか調べてみました。数値の単位は byte です。
GPU | FeatureLevel | CBV_SRV_UAV | SAMPLER | RTV | DSV |
---|---|---|---|---|---|
RADEON GCN 1.0 | 11_1 | 32 | 16 | 32 | 144 |
RADEON GCN 1.1 | 12_0 | 32 | 16 | 32 | 144 |
GeForce Kepler | 11_0 | 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 |
このように GPU によってサイズが異なるため、Descriptor のアドレス計算を行う場合は必ず GetDescriptorHandleIncrementSize() を参照しなければなりません。Descriptor とはいわば Resource を参照するためのポインターですが、View に相当するアクセスに必要な情報も含まれます。サイズ的に単純なアドレスだけではないことがわかります。
全体的に DSV が大きいのは、Depth の他に Stencil Surface が必要なこと、高速化のための (PreZ 等) の追加 Resource が含まれているためと考えられます。そういう意味では DSV が 8byte しかない GeForce はまさにアドレスだけ。更に他の情報構造体を間接的に参照しているのではないでしょうか。
Intel HD Graphics の場合は世代間でも差が生じています。外部からはあまり違いがわかりませんが、ハードウエアの差は思ったよりも大きいようです。
この表は下記ページにも掲載しています。
●気がついた問題点など
DirectX12 は現在も頻繁にドライバの更新が行われています。まだ安定していない機能があるようです。以下使っていて気がついたもの。(2015/09/22現在)
GeForce Maxwell/Kepler (355.82)
・Indirect Draw の CommandSignature で RootDescriptor が反映されない問題が生じていたが Driver 355.82 で修正された。
RADEON GCN 1.0/1.1 (15.8Beta)
・CommandSignature で Rooto 32bit Consnta/Root Descriptor が反映されない
・Bundle で RootSignature のパラメータが継承されない
Intel HD Graphcis Gen7.5/8 (10.18.15.4256)
・RootSignature に Root 32bitConstant が複数存在する場合、CommandSignature で最初の 32bit Constant しか更新できない。
下記ページも更新しています。
・Direct3D 12 (DirectX 12) Windows 詳細
他にも問題ではありませんが API の挙動で GPU による細かい違いは結構あります。
関連エントリ
・Direct3D12 ROV を試してみる (3) 半透明ソートと Intel HD Graphics
・Direct3D12 ROV を試してみる (2) Depth Test と半透明ソート
・Direct3D12 ROV (Rasterizer Order View) を試してみる
・3D 低レベル API の違い Direct3D 12/Metal
・Direct3D 12 GeForce GTX970 は FeatureLevel 12_1 対応、Resource Bind/Heap Tier は低い
・3D 低レベル API の現状 Direct3D 12/Metal