d3d:d3d12
文書の過去の版を表示しています。
Direct3D 12 (DirectX 12)
GPU の対応
| RADEON R3 8400 | GeForce 750 ti | HD 4600 | |
|---|---|---|---|
| GCN | Maxwell | (Haswell) | |
| D3D12_FEATURE_LEVELS | 12_0 | 11_0 | 11_0 |
| DoublePrecisionFloatShaderOps | true | true | true |
| OutputMergerLogicOp | true | true | false |
| MinPrecisionSupport | NONE | NONE | NONE |
| TiledResourcesTier | Tier 2 | Tier 1 | 0 |
| ResourceBindingTier | Tier 3 | Tier 2 | Tier 1 |
| PSSpecifiedStencilRefSupported | true | false | false |
| TypedUAVLoadAdditionalFormats | true | true | true |
| ROVsSupported | false | false | false |
| ConservativeRasterizationTier | 0 | 0 | 0 |
| MaxGPUVirtualAddressBitsPerResource | 38 | 31 | 31 |
| StandardSwizzle64KBSupported | false | false | false |
| CrossNodeSharingTier | 0 | 0 | 0 |
| CrossAdapterRowMajorTextureSupported | false | false | false |
| VPAndRTArrayIndexFromAnyShaderFeedingRaster.. | false | false | true |
| ResourceHeapTier | Tier 2 | Tier 1 | Tier 1 |
API
Descriptor
リソースの情報を格納した構造体。 GPU メモリに確保され、GPU がリソースを参照するために用いられます。
Descriptor を格納するメモリは DescriptorHeap から確保されます。 DescriptorHeap は連続領域で、GPU にテーブルとして渡します。
Descriptor が必要なリソースは下記の通り
- ConstantBufferView
- ShaderResourceView (Texture)
- UnorderedAccessView
- Sampler
ID3D12RootSignature
リソースとシェーダーの対応付けを行うためのテーブルを定義します。 C言語の struct のようなもので、レジスタとのバインド状態を指定します。 あくまで対応付けのテンプレートであり、実際のバインド状態そのものは CommandList に入ります。
RootSignature のサイズは固定で、最大 16エントリ (DWORD) のみ。
- 1 DWORD : DescriptorTable
- 4 DWORD : Descriptor 直接
- 1 DWORD : Constant (int 32bit)
直接 Descriptor を格納すると 4個しか入らないので DescriptorTable と組み合わせて使う。
Descriptor/DescriptorTable で指定したリソースは任意のレジスタにバインドできます。
- b0~ CBV ConstantBufferView
- t0~ SRV ShaderResourceView
- u0~ UAV UnorderedAccessView
- s0~ Sampler
Texture の転送
Buffer, Texture の転送もアプリケーション側で管理する必要があります。
GPU 側の VRAM を直接 Map することはできません。 一旦 Map 可能な Buffer (Shared) に書き込み、GPU の Copy 命令 (DMA) で転送を行います。 本来 UMA 環境では Copy しなくても良いはずですが、Texture はメモリアクセス最適化のためにタイリング (swizzle) が必要なのでやはり Copy を行います。
- Texture (または GPU 側 Buffer) 作成 (COPY_DEST)
- Buffer 作成 (COPY_SRC)
- レイアウト取得 (GetCopyableFootprints())
- レイアウトにそって Buffer にデータを書き込み
- 転送用 CommandList を作成
- CommandBuffer で CopyTextureRegion() 等の Copy 命令作成
- 転送用 CommandQueue で CommandList を実行
- CommandQueue に転送完了 Sginal (Fence) を設定
- Fence で転送完了を確認したら不要な Buffer を Release
d3d/d3d12.1434803813.txt.gz · 最終更新: by oga
