Direct3D 12 GPU 毎の Descriptor Size, 問題点等

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 の場合は世代間でも差が生じています。外部からはあまり違いがわかりませんが、ハードウエアの差は思ったよりも大きいようです。

この表は下記ページにも掲載しています。

RootSignature と Descriptor

●気がついた問題点など

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