流输出计数器
流输出是 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。
相关主题