はじめに
先日の「NVIDIA Nsight Visual Studio Edition 5.2 RC1を見ていく~Direct3D12編」の記事に続いてVulkan編です.Vulkanへの対応に関してはまだ開発途上のようなので一部の機能に限られるようですが,現状サポートされているものを見ていきます.
今回キャプチャ対象のVulkanのプロジェクトは定番のサンプルを使っていきましょう.
https://github.com/SaschaWillems/Vulkan
Vulkanのプログラムのキャプチャ
まずはキャプチャ対象のプログラムをビルドしておきます.
VulkanのプログラムのキャプチャもDirect3D12の時と同じくVisual StudioからNsightメニューStart Graphics Debuggingをします.
ひとまずshadowmappingサンプルを起動してみました.
どうもほかのグラフィックスAPIの時と違ってCtrl + ZでHUDが出てこないのでVisual StudioのNsightメニューのPause and Capture Frameします.
これでキャプチャはできました.
Vulkan向けにサポートしている機能
Nsightで見れるものというのは,基本的にはNsightのWindowsのところ以下にあるものなのでそれを見ていきます.
Gprahics Debug FoucusやShader ListはほかのグラフィックスAPIにもあるようなものですね(System InfoはVulkanのデバッグに関連しないので割愛).以下がサポートしているものですね.
- API Inspector
- API Statics
- Current Target
- Events
- Geometry
- Memory Pool
- Resources
- Scrubber
上から順に説明をしていきたいところですが,Scrubberは何かと単語として出てくるのでこれだけ先に説明します.
Scrubber
Scrubberは前回の記事でも紹介しましたが,Command QueueやCommnad Lists,Draw CallやClearなどをタイムラインで並べたものです.青いのがDrawですね.
このScrubberはparallaxmappingサンプルをキャプチャしたものですが,結構Drawが多いのですが,見てみると画面に描画してるテキストが1文字単位で1Drawという感じのようですね.
API Inspector
API InspectorはDrawコールなどの呼び出し時のシェーダやバインドされたリソース,Pipelineなどがわかります.
たとえば,parallaxmappingのキャプチャのEventID 13のDrawが画面の石の描画をやっているのですが,そのPipelineは下記ですね.PipelineではDirect3D12でいうとRoot Signatureにあたる箇所やDescriptor Set (Direct3D12だとDescriptor Table)みたいなものが見れます.下記ではシェーダステージに割り当てるUniform BufferやSamplerがわかりますね.
次のRender Passも開いてみます.RenderPassはDirect3D12にはない概念ではあるのですが,レンダーターゲットのフォーマットやClear Colorなどがまとまったものですね.
1つ1つ見ていくと大変なので次はFS,Fragment Shaderを見てみます.FSではテクスチャColorとNormal mapがバインドされているのはわかりました.
あとは,RasterやPix OpsなどはRasterizerやBlendのステートがわかります.
API Statistic
API StatisticはVulkanのvkではじまるAPIの呼び出し回数や平均,合計時価などがわかります.
Current Target
Current Targetは現在選択しているDrawまでのRender TargetやDepthやStencilを見れます.Depth Targetも見れるのでShadow mapなどのデバッグは現状でも大丈夫そうですね.
Events
EventsはVulkanのAPIのイベントを順番に表示したものですね.Scrubberではピンポイントに選択しにくいとかにはいいかもしないですね.フィルタもあるのでDrawとかBindとかの単語で絞ったりできますし.
Geometry
Geometryが現在選択しているDrawの頂点データなどを見ることができます.Graphicalならメッシュの形状が見ることができますし,Memoryなら頂点データの数値を見れます.
Memory Pool
Memory Poolはテクスチャとかバッファなどリソースの値をメモリ上に配置された状態でみれるようですね.テクスチャなどは画像のような形でグラフィカルに見たい場合は,次に説明するResoucesで見ます.
FlagsなどでそのリソースがDevice LocalだったりHost VisibleだったりとかがわかるのでCPUから読み書きが可能とかGPUでの読み出しのみとかそのあたりはわかりますね.このあたりは設定を間違うと速度減につながるので遅い処理のリソースは間違いがないかチェックするのに使えますね.
Resources
ResourcesはImage(テクスチャなど)とかバッファ,Frame Buffer Objectなどのリソースが見れます.カテゴリ単位で絞り込んだりはできるようですね.あとフィルタ機能もあるようですね.リソースにちゃんと名前を付けていれば活用できそうですね.
Scrubberは最初に説明したので,以上までが現状サポートしている機能のようですね.
おわりに
ひとまずざっとNsightのVulkan向けの機能がわかりました.現状,ベンダー非依存であればRenderDocが対応していますし,AMDならCodeXLも対応していますがNVIDIA GPU向け開発者としてはRenderDoc以外の選択肢ができたのはよいですね.
あと,現状はパフォーマンス分析関連の機能はあまり強くないのでそこは課題になりそうですね.
そのあたりの機能がほかのAPI向け並みにそろってくるとVulkan開発では便利にはなりそうですね.