[DirectX12] WinPixEventRuntimeを使ってPIX向けにEvent名を仕込む
PIX は DirectX で作成されたアプリケーションのパフォーマンスチューニングや描画の解析を行うためのツールです。1フレームの中でどのような順番で何が描かれたのかを観測できたり、1パスの中で描画に掛かった時間を計測できたりするので、意図しない描画結果が生成された場合や想像以上にアプリケーションが重い場合などのデバッグに役立ちます。
DirectX 12で作成されたアプリケーションであれば、そのままでも PIX 経由で Launch すれば GPU Capture などを取ることが可能ですが、ここで紹介する WinPixEventRuntime を使用することで、デバッグに役立つラベルが付いた状態でキャプチャーを取ることが可能です。
なぜラベル付けが必要か?
DirectX のアプリケーションは、非常に膨大なグラフィックスコマンドの呼び出し(記録)によって処理が行われます。
適宜、これが Shadow pass なのか G-buffer pass なのか Lighting pass なのか、ラベルが付いていると視認しやすくなります。
WinPixEventRuntime の使い方
インストール方法はこのページに記載があります。WinPixEventRuntime は NuGet パッケージ経由でインストールを行います。
PIXBeginEvent/PIXEndEvent の内部は?
pix3.h の関数はヘッダー内で実装が完結しているものが多いため、ブレークポイントで止めて Stepin して中身の実装を確認することが可能です。実は commandlist::beginevent をラップしたようなものになっています。
そのため、PIXBeginEvent はどこか特殊なバッファに情報を記録しているという訳ではなく、実際はアプリケーション側で作成した DirectX12 の commandlist/commandqueue に対して、計測用の情報を記録している形になっています。
PIXBeginEvent で仕込んだイベント名は、PIX でしか使えないと思われるかもしれませんが、NSight や RenderDoc でキャプチャーした場合でもイベント名を取得することが可能です。PIXBeginEvent で設定さえすれば他のグラフィックスデバッガーでも同様に使えるので非常に便利です。