NVIDIA Nsight Visual Studio Edition 5.2 RC1を見ていく~Vulkan編

はじめに

先日の「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をします.
vulkan001
ひとまずshadowmappingサンプルを起動してみました.
vulkan002
どうもほかのグラフィックスAPIの時と違ってCtrl + ZでHUDが出てこないのでVisual StudioのNsightメニューのPause and Capture Frameします.
vulkan003
これでキャプチャはできました.
vulkan004

Vulkan向けにサポートしている機能

Nsightで見れるものというのは,基本的にはNsightのWindowsのところ以下にあるものなのでそれを見ていきます.
vulkan005
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ですね.
vulkan008
このScrubberはparallaxmappingサンプルをキャプチャしたものですが,結構Drawが多いのですが,見てみると画面に描画してるテキストが1文字単位で1Drawという感じのようですね.
vulkan007

API Inspector

API InspectorはDrawコールなどの呼び出し時のシェーダやバインドされたリソース,Pipelineなどがわかります.
たとえば,parallaxmappingのキャプチャのEventID 13のDrawが画面の石の描画をやっているのですが,そのPipelineは下記ですね.PipelineではDirect3D12でいうとRoot Signatureにあたる箇所やDescriptor Set (Direct3D12だとDescriptor Table)みたいなものが見れます.下記ではシェーダステージに割り当てるUniform BufferやSamplerがわかりますね.
vulkan009
次のRender Passも開いてみます.RenderPassはDirect3D12にはない概念ではあるのですが,レンダーターゲットのフォーマットやClear Colorなどがまとまったものですね.
vulkan010
1つ1つ見ていくと大変なので次はFS,Fragment Shaderを見てみます.FSではテクスチャColorとNormal mapがバインドされているのはわかりました.
vulkan011
あとは,RasterやPix OpsなどはRasterizerやBlendのステートがわかります.

API Statistic

API StatisticはVulkanのvkではじまるAPIの呼び出し回数や平均,合計時価などがわかります.
vulkan012

Current Target

Current Targetは現在選択しているDrawまでのRender TargetやDepthやStencilを見れます.Depth Targetも見れるのでShadow mapなどのデバッグは現状でも大丈夫そうですね.
vulkan013
vulkan014

Events

EventsはVulkanのAPIのイベントを順番に表示したものですね.Scrubberではピンポイントに選択しにくいとかにはいいかもしないですね.フィルタもあるのでDrawとかBindとかの単語で絞ったりできますし.

vulkan015

Geometry

Geometryが現在選択しているDrawの頂点データなどを見ることができます.Graphicalならメッシュの形状が見ることができますし,Memoryなら頂点データの数値を見れます.
vulkan016

vulkan017

Memory Pool

Memory Poolはテクスチャとかバッファなどリソースの値をメモリ上に配置された状態でみれるようですね.テクスチャなどは画像のような形でグラフィカルに見たい場合は,次に説明するResoucesで見ます.
FlagsなどでそのリソースがDevice LocalだったりHost VisibleだったりとかがわかるのでCPUから読み書きが可能とかGPUでの読み出しのみとかそのあたりはわかりますね.このあたりは設定を間違うと速度減につながるので遅い処理のリソースは間違いがないかチェックするのに使えますね.

vulkan019

Resources

ResourcesはImage(テクスチャなど)とかバッファ,Frame Buffer Objectなどのリソースが見れます.カテゴリ単位で絞り込んだりはできるようですね.あとフィルタ機能もあるようですね.リソースにちゃんと名前を付けていれば活用できそうですね.
vulkan018
Scrubberは最初に説明したので,以上までが現状サポートしている機能のようですね.

おわりに

ひとまずざっとNsightのVulkan向けの機能がわかりました.現状,ベンダー非依存であればRenderDocが対応していますし,AMDならCodeXLも対応していますがNVIDIA GPU向け開発者としてはRenderDoc以外の選択肢ができたのはよいですね.
あと,現状はパフォーマンス分析関連の機能はあまり強くないのでそこは課題になりそうですね.
そのあたりの機能がほかのAPI向け並みにそろってくるとVulkan開発では便利にはなりそうですね.