Share via


ストリーム出力カウンター

ストリーム出力とは、頂点をバッファーに書き込む GPU の機能です。 ストリーム出力カウンターでは、進行状況がモニターされます。

Direct3D 11 と Direct3D 12 のストリーム カウンターの違い

GPU は、ストリーム出力プロセスの一部として、書き込む先のバッファー内の現在の場所を認識する必要があります。 Direct3D 11 では、この場所を保存するためのメモリはドライバーによって割り当てられます。アプリケーションでこの値を操作する唯一の方法は、SOSetTargets メソッドの使用です。 Direct3D 12 では、この現在の場所を保存するためのメモリをアプリで割り当てます。 この値を操作するための特別な方法はなく、アプリで CPU または GPU を使用して値の読み取り/書き込みを自由に行うことができます。

BufferFilledSize

アプリケーションは、BufferFilledSize と呼ばれる 32 ビット数量の記憶域の割り当てを担当します。 これには、ストリーム出力バッファー内のデータのバイト数が含まれます。 この記憶域は、ストリーム出力データを格納するリソースと同じか、または異なるリソースに配置できます。 GPU は、ストリーム出力ステージでこの値にアクセスし、新しい頂点データを追加するバッファー内の場所を特定します。 また、GPU はこの値にアクセスして、オーバーフローがいつ発生したか特定します。

構造 D3D12_STREAM_OUTPUT_DESCを参照してください。

デバッグ層により、ID3D12GraphicsCommandList::SOSetTargets で以下が検証されます。

  • 非 NULL リソースが指定されている場合、BufferFilledSize が {OffsetInBytes, SizeInBytes} で示される範囲内にあるか。
  • BufferFilledSizeOffsetInBytes が 4 の倍数であるか。
  • BufferFilledSizeOffsetInBytes が親のリソースの範囲内にあるか。
  • 指定されたリソースがバッファーであるか。

ストリーム出力はすべてのヒープの種類でサポートされているため、ランタイムでは、ストリーム出力バッファーに関連付けられているヒープの種類は検証されません。

ルート署名では、 D3D12_ROOT_SIGNATURE_FLAGS フラグを使用してストリーム出力を使用するかどうかを指定する必要があります。

HLSL で作成されたルート署名には、他のフラグの指定方法と同様の方法で、D3D12_ROOT_SIGNATURE_FLAG_ALLOW_STREAM_OUTPUTを指定できます。

ジオメトリ シェーダーにストリーム出力が含まれているが、ルート署名に D3D12_ROOT_SIGNATURE_FLAG_ALLOW_STREAM_OUTPUT フラグが設定されていない場合、CreateGraphicsPipelineState は失敗します。

リソースがストリーム出力ターゲットとして使用される場合、使用されるリソースはD3D12_RESOURCE_STATE_STREAM_OUT状態である必要があります。 これは、頂点データと BufferFilledSize の両方に適用されます (これは同じリソース内または個別のリソース内にある場合があります)。

ストリーム出力バッファーのオフセットを設定するための特別な API はありません。これは、アプリケーションで CPU または GPU を直接使用して BufferFilledSize に書き込みを行うことができるためです。

カウンターとクエリ