具有重复映射的磁贴访问限制

本部分介绍具有重复映射的磁贴访问限制。

复制具有重叠源和目标的平铺资源

如果复制*作的源区域和目标区域中的磁贴在复制区域中具有重复的映射,即使这两个资源都没有平铺资源,并且 Copy*作支持重叠副本,则 Copy*作将表现良好(好像源在转到目标之前复制到临时位置)。 但是,如果重叠并不明显(如源资源和目标资源不同,但共享映射或映射在给定图面上重复),则共享磁贴上的复制作的结果未定义。

复制到目标区域中具有重复磁贴的平铺资源

复制到目标区域中具有重复磁贴的平铺资源会产生未定义的结果,除非数据本身相同;不同的磁贴可以按不同的顺序写入磁贴。

UAV 访问重复的磁贴映射

假设平铺资源上的无序访问视图(UAV)在其区域中或绑定到管道的其他资源具有重复的磁贴映射。 如果由不同的线程执行访问,则对这些重复磁贴的访问进行排序是未定义的,就像对 UAV 的任何内存访问顺序一般是无序的。

磁贴映射更改或外部映射的内容更新后呈现

如果平铺资源的图块映射已更改,或者映射的平铺池磁贴中的内容通过另一个平铺资源的映射更改,并且磁贴资源将通过呈现目标视图或深度模具视图呈现,则应用程序必须清除(使用固定函数 Clear API)或使用 Copy*/Update* API 完全复制,这些磁贴在正在呈现的区域内已更改(映射或不映射)。 在这些情况下,应用程序无法清除或复制会导致给定的呈现目标视图或深度模具视图的硬件优化结构过时,并会导致某些硬件上的垃圾呈现结果,并且在不同硬件上不一致。 硬件使用的这些隐藏优化数据结构可能是单个映射的本地结构,对其他映射到同一内存的映射不可见。

ID3D11DeviceContext1::ClearView作支持使用矩形清除呈现目标视图。 对于支持平铺资源的硬件,ClearView 还必须支持清除带有矩形的深度模具视图(仅深度图面(没有模具)。 此作允许应用程序仅清除图面的必要区域。

如果应用程序需要保留已更改映射的平铺资源中区域的现有内存内容,则该应用程序必须解决明确的要求。 应用程序可以首先保存磁贴映射已更改的内容(例如,通过使用 ID3D11DeviceContext2::CopyTiles),发出所需的明文命令,然后将内容复制回。 虽然这将完成为增量呈现保留图面内容的任务,但缺点是,由于呈现优化可能会丢失,因此表面上的后续呈现性能可能会受到影响。

如果磁贴同时映射到多个平铺资源,并且磁贴内容是通过某个平铺资源(呈现、复制等)作的,如果同一磁贴是通过任何其他平铺资源呈现的,则必须首先清除磁贴。

呈现到呈现区域外部共享的磁贴

假设正在呈现平铺资源中的区域,并且呈现区域引用的图块池磁贴也映射到呈现区域外部(包括同时通过其他平铺资源)。 即使基础内存布局兼容,也不能保证通过其他映射查看时,呈现到这些磁贴的数据无法正确显示。 这一事实是由于优化数据结构,一些硬件使用,这些结构可以是单个映射的本地,用于呈现图面,对其他映射到同一内存位置的映射不可见。 可以通过从呈现的映射复制到可能访问的同一内存(或者清除该内存或复制其他数据(如果不再需要旧内容)来解决此问题。 虽然这种解决方法似乎冗余,但它使所有其他映射都正确理解如何访问其内容,至少只节省单个物理内存的内存仍然完好无损。 此外,在使用共享映射的不同平铺资源(除非仅读取)之间进行切换时,必须在开关之间调用 ID3D11DeviceContext2::TiledResourceBarrier API。

呈现到呈现区域中共享的磁贴

如果将平铺资源中的某个区域呈现到呈现区域并在呈现区域内将多个磁贴映射到同一个磁贴池位置,则呈现结果在这些磁贴上是未定义的。

跨平铺资源共享磁贴的数据兼容性

假设多个平铺资源具有到同一磁贴池位置的映射,并且每个资源用于访问相同的数据。 仅当避免了有关避免硬件优化结构问题的其他规则时,才会使用此方案,对 ID3D11DeviceContext2::TiledResourceBarrier 进行相应的调用,并且平铺资源彼此兼容。 此处介绍了后者对于共享磁贴的平铺资源不兼容的含义。 跨重复磁贴映射访问相同数据的不兼容条件是使用不同的图面尺寸或格式,或者在资源上存在呈现目标或深度模具绑定标志时存在差异。 如果随后通过不兼容资源的映射读取或呈现,使用一种类型的映射写入内存会产生未定义的结果。 如果第一次使用新数据初始化其他资源共享映射(出于其他目的回收内存),则后续读取或呈现作是正常的,因为数据不会在不兼容的解释中流血。 但是,在访问不兼容的映射之间切换时,必须调用 TiledResourceBarrier API。

如果未对彼此共享映射的任何资源设置呈现目标或深度模具绑定标志,则限制要少得多。 只要格式和图面类型(例如 Texture2D)相同,就可以共享磁贴。 兼容的格式不同,例如 BC* 图面和等效大小的未压缩 32 位或每个组件格式 16 位,例如 BC6H 和 R32G32B32A32。 每个元素格式的许多 32 位都可以使用 R32_* 以及 (R10G10B10A2_*、 R8G8B8A8_*、 B8G8R8A8_*、B8G8R8X8_*、R16G16_*)对于非平铺资源,始终允许此作。

如果格式兼容且磁贴填充纯色,则打包磁贴和非打包磁贴之间的共享是正常的。

最后,如果共享磁贴映射的资源没有任何常见之处,除非没有呈现目标或深度模具绑定标志,则只能安全地共享填充 0 的内存;对于给定资源格式的定义,映射将显示为任何 0 解码(通常只有 0)。

管道访问平铺资源