GFXReconstructとは
GFXReconstructは、Vulkanアプリケーションの動作を記録(キャプチャ)し、後で正確に再生するためのツールです。現在のVulkan SDKに含まれています。記録されたデータには、Vulkan APIコールとその引数、メモリ内容など状態が保存されます。これにより、開発環境やハードウェアが異なっていても、バグの再現やデバッグ調査が可能になります。
GFXReconstructによるキャプチャ操作
GFXReconstructでVulkanアプリケーションのAPIコールをキャプチャするには、アプリケーションを実行する前に、そのプロセスにキャプチャ用ライブラリをロードさせる必要があります。
今回は Windows の環境を使って実行します。Vulkan SDKには、GFXReconstructによるキャプチャ用のPythonスクリプトが用意されているので、これを使います。スクリプトは、 %VULKAN_SDK%/bin/gfxrecon-capture-vulkan.py
の場所に配置されています。ここでは一旦環境変数にいれて使ってみます。
$Env:GfxReconstruct="${Env:Vulkan_SDK}\bin\gfxrecon-capture-vulkan.py"
引数オプションは現在このような種類が用意されているようです。いくつかのパラメータは環境変数を経由しても設定ができ、これが便利な場面もありそうです。
usage: usage gfxrecon-capture-vulkan.py [-h]
[-w dir]
[-o capture_file]
[-f capture_frames]
[--no-file-timestamp]
[--trigger {F1-F12,TAB,CTRL}]
[--trigger-frames frame_count]
[--compression-type {LZ4,ZLIB,ZSTD,NONE}]
[--file-flush]
[--log-level {debug,info,warn,error,fatal}]
[--log-file <file>]
[--memory-tracking-mode {page_guard,assisted,unassisted}]
[--capture-layer <capture_layer_path>
[--log-debugview]
<program> [<program_args>]
アプリケーション起動してキャプチャする例は次のようになります。ここでは、キャプチャファイルを capture_triangle.gfxr として、カレントフォルダに出力します。キャプチャするフレームは10、今回タイムスタンプをファイル名に含めない、としています。
python $Env:GfxReconstruct -f 10 --no-file-timestamp -w . -o capture_triangle.gfxr .\01.Triangle.exe
フレームの指定は、 1,5,7,100-150 のように、個別指定、範囲指定ができるようになっています。
キャプチャを終了したタイミングで、アプリケーションも終了したい場合には、環境変数 GFXRECON_QUIT_AFTER_CAPTURE_FRAMES
を使います。この変数はBOOLとなっており、1を設定するとキャプチャ終了と同時にアプリも終了します。
set GFXRECON_QUIT_AFTER_CAPTURE_FRAMES=1
注意事項
私が使用した Vulkan SDK 1.4.321.1 時点では、 GFXRECON_QUIT_AFTER_CAPTURE_FRAMES に関する不具合があります。Pull Requestがでており、既に処理済みとなっているので、次のリリースなどでは解決していると思われます。
不具合とは、この環境変数が設定されていると gfxrecon-capture-vulkan の引数で設定したフレームをキャプチャできず、起動後の初回 1フレームが終わったら即座に終了してしまうというもの、です。そのため、 -f 0
の指定時にはキャプチャできるのに -f 10 などではキャプチャできない、と悩まされました。
キャプチャした内容でスクリーンショット撮影
キャプチャしたデータの使い道は色々あると思いますが、ここではスクリーンショットをキャプチャ内容から撮る、という方法を紹介します。
キャプチャファイルを再生し、スクリーンショットを撮影するには、gfxrecon-replayコマンドに引数を渡します。このツールもまたVulkan SDKに含まれています。またキャプチャファイル名末尾にフレーム番号が付いていたので、ここでは下記のようなコマンドで実行します。
gfxrecon-replay.exe --screenshot-format png --screenshots 1 .\capture_triangle_1.gfxr
コマンドが実行されると、スクリーンショットを撮影し、保存されています。なお、ファイル名を自由に選ぶことはできず、今回の場合では “screenshot_frame_1.png” という名前で保存されました。

参考情報
公式ページ https://vulkan.lunarg.com/doc/view/latest/linux/capture_tools.html には GFXReconstruct の説明、各ツールのオプション説明があるので、1度チェックしてみると便利そうなものが発見できるかもしれません。実は Vulkan専用ツールというわけではなく、 Direct3D12 にも対応しているようなので、そちら方面でも出番があるかもしれません。
コメント