皆様初めまして。
株式会社ヘキサドライブでプログラマをしております。
ヒジカタと申します。
さて、私、個人でDirectX12の基礎研究などを行っており、
今回はそこで得られた知見などをこの場を借りてご共有出来ればと思います。
■DirectX11とDirectX12の違い
・グラフィックコマンドが遅延実行型になっている。
・非同期Computeや非同期Copyコマンドの実行。(※HVやグラフィックボードの性能に依存)
・リソースバリア、同期の明示的な実行。
・シェーダーへのリソースバインド方法の変更。
大まかにはこんな所でしょうか。
今回は、グラフィックコマンドと、デバッグとパフォーマンスに関して簡単に解説させて頂こうかと思います。
■グラフィックコマンドの種類
グラフィックコマンドには、大きく分けて四種類のコマンドリストが存在します。
・D3D12_COMMAND_LIST_TYPE_DIRECT
レンダリングに関係するコマンドを実行する為のコマンドリストで、
グラフィックコマンドの他に、D3D12_COMMAND_LIST_TYPE_COPYで実行可能なリソースのコピーの他、バンドルと呼ばれる別コマンドを記録させて実行する事が出来ます。
尚、DirectX11の時のように、Compute用のコマンドを積み込んだりする事は出来なくなっているので、
ComputeShaderを実行する場合は、D3D12_COMMAND_LIST_TYPE_COMPUTEを利用するようにしましょう。
・D3D12_COMMAND_LIST_TYPE_BUNDLE
通称バンドルと呼ばれるもので、グラフィックコマンドを各HVのネイティブ型に変換して事前記録しておけるコマンドリストであり、実行はD3D12_COMMAND_LIST_TYPE_DIRECTなどの別コマンドから実行します。
記録可能なコマンドには制限がありますが、
保存されたコマンドはネイティブに変換済みなので、
D3D12_COMMAND_LIST_TYPE_DIRECTで事前記録したものと、バンドルで記録したものを含めたコマンドリストを実行する場合には、
バンドルを利用したものの方が高速に実行可能です。
・D3D12_COMMAND_LIST_TYPE_COMPUTE
ComputeShader実行用コマンドリストであり、
グラフィックボードによってはグラフィックコマンドと非同期実行可能です。
・D3D12_COMMAND_LIST_TYPE_COPY
バッファやテクスチャーなどのリソースコピーを行う為のコマンドリストであり、
グラフィックボードによってはグラフィックコマンドと非同期実行可能です。
■デバッグとパフォーマンス分析方法
Visual Stdioのグラフィックス診断でも良いのですが、
GPUがタイムライン上でどのように動作しているかは、
各HVが提供しているツール類を使用すると便利です。
NVIDIAだとNsight。AMDの場合はGPU Perf Studio等ですね。
AMDがMicrosoftのnBodyサンプルを非同期Compute対応させたものがあるので、
これをGPU Perf Stdio 3で非同期に動作しているか確認してみたいと思います。
http://gpuopen.com/gaming-product/nbody-directx-12-async-compute-edition/
※グラフィックボードはRadeonRX480搭載しています。
ComputeQueueと、DirectQueueが非同期で動作しているのが確認出来るかと思います。
GPU使用率の確認やパフォーマンス分析に役立ちそうですね。