UAV カウンター
unordered-access-view (UAV) カウンターを使用して、32 ビットアトミック カウンターを順序なしアクセス ビュー (UAV) に関連付けることができます。
Direct3D 11 から Direct3D 12 への UAV カウンターの違い
Direct3D 12 アプリと Direct3D 11 アプリはどちらも、同じハイレベル シェーダー言語 (HLSL) シェーダー関数を使用して UAV カウンターにアクセスします。
- IncrementCounter
- DecrementCounter
- Append
- 使用
Direct3D 12
Direct3D 12では、32 ビット値はアプリケーションによって割り当てられるため、他のDirect3D 12 リソースと同様に、CPU または GPU によって 32 ビット値を読み取りおよび書き込むことができます。
Direct3D 11
シェーダーの外部では、Direct3D 11 では、カウンター ( ID3D11DeviceContext::CopyStructureCount など) にアクセスするために API メソッドを呼び出す必要があります。
UAV カウンターの使用
アプリは、UAV カウンターに 32 ビットのストレージを割り当てる役割を担います。 この記憶域は、別のリソースで、UAV からアクセス可能なデータを格納するものとして割り当てることができます。
CreateUnorderedAccessView、D3D12_BUFFER_UAV_FLAGS、D3D12_BUFFER_UAVを参照してください。
CreateUnorderedAccessView の呼び出しで pCounterResource を指定すると、UAV にカウンターが関連付けられます。 この場合、次のようになります。
- StructureByteStride は 0 より大きくなければなりません。
- 形式はDXGI_FORMAT_UNKNOWNする必要があります
- RAW フラグは設定しないようにする必要があります。
- 両方のリソースがバッファーであることが必要です。
- CounterOffsetInBytes は 4 の倍数のバイト数でなければなりません。
- CounterOffsetInBytes は、カウンター リソースの範囲内でなければなりません。
- pDesc は NULL にできません。
- pResource は NULL にできません。
また、次のユース ケースに注意してください。
- pCounterResource を指定しない場合は、CounterOffsetInBytes を 0 にする必要があります。
- RAW フラグが設定されている場合は、形式をDXGI_FORMAT_R32_TYPELESSし、UAV リソースをバッファーにする必要があります。
- pCounterResource を設定しない場合は、CounterOffsetInBytes を 0 にする必要があります。
- RAW フラグを設定せず、かつ StructureByteStride を 0 にする場合は、フォーマットが有効な UAV フォーマットであることが必要です。
Direct3D 12 では、追加 UAV とカウンター UAV が区別されなくなりました (ただし HLSL バイトコードでは引き続き区別されます)。
これらの制限は、CreateUnorderedAccessView 内部でコア ランタイムによって検証されます。
描画/ディスパッチ中、カウンター リソースは D3D12_RESOURCE_STATE_UNORDERED_ACCESS状態である必要があります。 また、1 つの描画/ディスパッチ呼び出しで、アプリケーションが同じ 32 ビット メモリの場所に 2 つの UAV カウンターからアクセスすることは無効です。 このいずれかが検出されると、デバッグ レイヤーがエラーを発行します。
アプリはカウンター値との間でデータを直接コピーできるため、"SetUnorderedAccessViewCounterValue" メソッドと "CopyStructureCount" メソッドは存在しません。
カウンターによる UAV の動的インデックス作成がサポートされています。
カウンターが関連付けられていない UAV のカウンターにシェーダーがアクセスしようとすると、デバッグ レイヤーから警告が発行され、GPU ページ フォールトが発生してアプリのデバイスが削除されます。
UAV カウンターは、すべての種類のヒープ (既定、アップロード、リードバック) でサポートされます。