次の方法で共有


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

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

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

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

BufferFilledSize

アプリケーションは、BufferFilledSizeと呼ばれる 32 ビットの量にストレージを割り当てる役割を担います。 これには、ストリーム出力バッファー内のデータのバイト数が含まれます。 このストレージは、ストリーム出力データを含むリソースと同じリソースまたは別のリソースに配置できます。 この値は、バッファー内の新しい頂点データを追加する場所を決定するために、ストリーム出力ステージの GPU によってアクセスされます。 さらに、この値は、オーバーフローが発生したタイミングを判断するために GPU によってアクセスされます。

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

デバッグ レイヤーは、ID3D12GraphicsCommandList::SOSetTargetsで次を検証します。

  • BufferFilledSize は、NULL 以外のリソースが指定されている場合、{OffsetInBytesSizeInBytes} で示される範囲に収まります。
  • 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 の両方に適用されます (同じリソースまたは個別のリソース内にある場合があります)。

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

カウンターとクエリの