レンダリング ハードウェア インターフェース (RHI) は、Xbox One の非同期演算 (AsyncCompute) をサポートするようになりました。 これは、dispatch() 呼び出しをレンダリングと非同期に実行することで、未使用の GPU リソース (演算ユニット (CU)、レジスター、帯域幅) を活用する優れた方法です。 非同期演算では別のコンテキストが使用されるため、レンダリング コンテキストとコンピューティング コンテキストを同期するための RHI 関数が用意されています。 Dr PIX は、非同期演算の効果が得られる領域を特定するのに役立ちます。 たとえば、特定のレンダリング パスで CU の半分が使用されていない場合、それらの CU は非同期演算ジョブで使用できる可能性があります。
非同期演算には次の制限事項があります。
UAV カウンターを備えたバッファーはサポートされていません (これは XDK の制限事項であり、D3D 警告を生成します)。
非同期演算ジョブは、(タイミング キャプチャには表示されますが) PIX GPU キャプチャには表示されません。PIX では、グラフィックの即時コンテキストのみがキャプチャされます (これはプラットフォームの制限です)。
自動パイプライン フラッシュは、ドライバーによって提供されません。 フラッシュが必要な場合、明示的に RHICSManualGpuFlush を呼び出す必要があります (例: あるディスパッチがそのディスパッチに依存している場合)。
API
RHIBeginAsyncComputeJob_DrawThread (EAsyncComputePriority Priority)
レンダリング スレッドから非同期演算ジョブを開始します。 この優先度は、ジョブに割り当てるシェーダー リソース数の決定に使用されます (ID3D11XComputeContext::SetLimits を使用)。 現時点では、AsyncComputePriority_High と AsyncComputePriority_Default の 2 つの優先度を使用できます。
RHIEndAsyncComputeJob_DrawThread
非同期演算ジョブを終了します。 同期に使用できる 32 ビット フェンス インデックスを返します。演算が無効であるか、アクティブな演算ジョブがない場合は -1 を返します。
RHIGraphicsWaitOnAsyncComputeJob
グラフィックの即時コンテキストに n コマンドを挿入し、非同期ジョブが完了するまでブロックします。 -1 を指定すると、早期に出力されます。
RHIBeginAsyncComputeJob_DrawThread と RHIEndAsyncComputeJob_DrawThread の呼び出しの間、RHI は非同期演算状態になります。 この間、サポートされる RHI コマンドが非同期演算コンテキストで実行されます。 サポートされていない RHI 関数はアサートします。
無効化/有効化
非同期演算は、コンパイル時に #define USE_ASYNC_COMPUTE_CONTEXT を使用して有効または無効にすることができます。 実行時には r.rdg.asynccompute コンソール変数で無効にできます。 非同期演算が無効になっている場合、非同期演算ブロック内のディスパッチはグラフィック コマンド バッファーで同期的に実行されます。 USE_ASYNC_COMPUTE_CONTEXT は、D3D11.1 ではサポートされていないため、PC では 0 に定義されています。
PIX
非同期演算コンテキスト ジョブは GPU キャプチャではキャプチャされないため、非同期演算が有効な場合、これらのキャプチャによって GPU パフォーマンスに関する誤解を招くおそれがあります。 グラフィック デバッグ目的の場合は、上記の CVar を使用して非同期演算を無効にする必要があります 非同期演算は、PIX タイミング キャプチャでサポートされています。 これらはタイムラインに次のように表示されます。
クレジット
この機能は Lionhead Studios によって実装されました。 当社ではこれを統合し、XboxOne のレンダリングを最適化するツールとして活用する予定です。