次の方法で共有


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 からアクセス可能なデータを格納するものとして割り当てることができます。

CreateUnorderedAccessViewD3D12_BUFFER_UAV_FLAGSD3D12_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 カウンターは、すべての種類のヒープ (既定、アップロード、リードバック) でサポートされます。