🐡

PIXのAPIを使ってPIXを見やすくして調査しやすい環境を作ろう

2024/05/20に公開

概要

  • PIXとは、簡単に言うとDirectX12に渡しているコマンドの一覧が見れるツールがあります。

  • このツールはとても便利ですが、C++側でPIXのAPIを呼ばない状態だと、同じ描画コマンド(DrawIndexedDispatch)だと、ただの板ポリ描画でもUI描画なのか、ポストエフェクト描画なのかは一目では判断が付かない状態になっています。

  • 添付した画像はmicrosoft/DirectX-Graphics-Samplesの「D3D12FullScreen」プロジェクトを何もPIXのAPIを呼ばない状態のものです。コマンドリストの数が少ないからまだ見やすいですが、コマンドが増え続けるとどこからがどの描画なのかがわかりにくくなります。

  • そこで、ここからここまでは不透明描画グループ、ここからここまではポストエフェクトのグループなど、まとまった単位で見やすくなる機能がPIXのAPI側で備えられており、それを使ったほうが調査もしやすくなります

  • 添付した画像のように、PIXのAPIを使うことでフォルダみたくグループかしたり、文字の色を変えたりなどができるようになり、調査しやすい環境を自分で作るようになります。

この記事で達成したいこと

  • たくさんの描画コマンドを特定のグループで分けるようにして見やすくする。
  • 文字に色をつけて重要な所は◯◯色にするなど、ルールを決めて見やすくする。

基本的な流れ

  • 描画コマンドをまとめたい場所にPIXBeginEventを呼び出したあとに登録したい描画コマンドを呼び出し、PIXEndEventを呼んでグループ化させる。
  • 色情報を付ける場合は上記のPIXBeginEventの引数にPIX_COLORを入れる。

PIX_COLOR

UINT PIX_COLOR(  
         BYTE r,  
         BYTE g,  
         BYTE b  d
)  

ドキュメント

  • PIXBeginEventやPIXScopedEventで色を変えたいときに使う。
  • BYTEには0~255の値を入れる。
  • 例として赤を入れる場合は以下のコードになる。
  • 色情報は不変なので、constであらかじめ定義しておいた方が使い勝手は良さそうな気がしてます。

サンプルコード

const UINT red = PIX_COLOR(255,0,0);

PIXBeginEvent

void PIXBeginEvent(  
         void* context,  
         UINT64 color,  
         PCWSTR formatString,
         ...  
)  

ドキュメント

  • contextにはID3D12CommandQueueID3D12CommandListを入れる。
  • colorには先述したPIX_COLORなどで返ってきたUINTの値を使う。

サンプルコード

UINT red = PIX_COLOR(255,0,0);
PIXBeginEvent(m_commandQueue.Get(), red, L"Render");

PIXEndEvent

void PIXEndEvent(  
)  

ドキュメント

  • PIXBeginEventとセットで使うもの。
  • これを呼び出した段階で直前に呼び出したPIXBeginEventまでをグループ化をしてカテゴリ分けしてくれる
    サンプルコード
PIXBeginEvent(m_commandQueue.Get(), red, L"Render");

//グループ化したいコマンドを随時呼び出す(DrawInstancedなど)

PIXEndEvent(m_commandQueue.Get());

参考資料

https://github.com/microsoft/DirectX-Graphics-Samples

Discussion