流输出计数器

流输出是 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 属于{OffsetInBytes 、SizeInBytes} 指示的范围(如果指定了非 NULL 资源)
  • 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

计数器和查询