Browsed by
Month: 2024年1月

[DirectX12] WinPixEventRuntimeを使ってPIX向けにEvent名を仕込む

[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 に対して、計測用の情報を記録している形になっています。

https://learn.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12graphicscommandlist-beginevent

PIXBeginEvent で仕込んだイベント名は、PIX でしか使えないと思われるかもしれませんが、NSight や RenderDoc でキャプチャーした場合でもイベント名を取得することが可能です。PIXBeginEvent で設定さえすれば他のグラフィックスデバッガーでも同様に使えるので非常に便利です。