平铺资源 API

本节中所述的 API 适用于平铺资源和磁贴池。

将磁贴池中的磁贴分配到资源

ID3D11DeviceContext2::UpdateTileMappingsID3D11DeviceContext2::CopyTileMappings API作和查询磁贴映射。 更新调用仅影响调用中标识的磁贴,而其他人则保留为前面定义的磁贴。

磁贴池中的任何给定磁贴都可以映射到资源中的多个位置,甚至多个资源。 此映射包括具有实现选择布局的资源中的磁贴(Mipmap 打包),其中多个 mipmap 打包到单个磁贴中。 捕获是,如果数据通过一个映射写入磁贴,但通过不同配置的映射进行读取,则结果是未定义的。 不过,请谨慎使用此灵活性对应用程序很有用,例如在资源之间共享不会同时使用的磁贴,其中磁贴的内容始终通过与随后读取的相同资源映射进行初始化。 同样,映射到保存具有相同图面维度的多个不同资源的打包 mipmap 的磁贴将正常工作 - 这两个映射中的数据将相同。

可以随时在即时或延迟的上下文中更改资源磁贴分配。

查询资源平铺和支持

若要查询资源平铺,请使用 ID3D11Device2::GetResourceTiling

对于其他资源平铺支持,请使用 ID3D11Device2::CheckMultisampleQualityLevels1

复制平铺数据

Direct3D 中用于移动数据的任何方法都与平铺资源一样使用平铺资源,只是删除对未映射区域的写入,并从未映射区域读取会生成 0。 如果复制作涉及多次写入同一内存位置,因为目标资源中的多个位置映射到同一个磁贴内存,则对多映射磁贴的写入是不可确定的且不可重复的。 也就是说,访问按硬件执行副本的顺序发生。

Direct3D 11.2 引入了以下其他复制方法的方法:

这些方法根据需要重排/重排,并在调用方承诺目标内存未由正在进行的 GPU 工作引用时允许D3D11_TILE_COPY_NO_OVERWRITE标志。

复制中涉及的磁贴不能包含包含已打包的 mipmap 或具有未定义结果的磁贴。 若要将数据传输到硬件包的 mipmap 或从 mipmap 传输到一个磁贴,必须使用标准(非磁贴特定)复制/更新 API 或 ID3D11DeviceContext::GenerateMips 整个 mip 链。

GenerateMips上注意: 对具有部分映射磁贴的资源使用 ID3D11DeviceContext::GenerateMips 将生成结果,这些结果只遵循应用于硬件和显示驱动程序 GenerateMips的任何算法 NULL。 因此,应用程序这样做并不特别有用,除非有某种方式,具有 NULL 映射的区域(以及它们在生成阶段对其他 mip 的影响)不会对应用程序所关心的图面部分产生任何影响。

例如,从过渡图面或应用程序内存复制磁贴数据是上传可能已从磁盘流式传输的磁贴的方式。 流式传输磁盘时的变化是将某种压缩的数据上传到 GPU 内存,然后在 GPU 上解码。 解码目标可以是 GPU 内存中的缓冲区资源,CopyTiles 然后复制到实际平铺资源。 此复制步骤允许 GPU 在重排模式未知时重排。 如果平铺资源本身是缓冲区资源(例如,而不是纹理),则不需要重排。

副本的非平铺缓冲区资源端磁贴的内存布局在 64KB 磁贴中的内存中只是线性的,硬件和显示驱动程序在从平铺资源传输到/从平铺资源转移时,会按磁贴重排/重排。 对于多重采样抗锯齿(MSAA)表面,在移动到下一个像素之前,将按样本索引顺序遍历每个像素的样本。 对于在右侧部分填充的磁贴(对于宽度不是多个图块宽度(以像素为单位)的图块,下移行的间距/步幅是如果磁贴已满,则适合在磁贴中容纳的数字像素的完整大小(以字节为单位)。 因此,内存中每一行像素之间可能存在差距。 为简单起见,小于磁贴的 mipmap 不会在线性布局中打包在一起。 这似乎是内存空间的浪费,但如前所述,通过 CopyTilesUpdateTiles不允许将硬件包复制到 mips。 应用程序只能使用泛型 UpdateSubresource*() 或 CopySubresource*() API 单独复制小 mips,不过在 CopySubresource*() 的情况下,这意味着线性内存必须与平铺资源相同的维度 - CopySubresource*() 无法从缓冲区资源复制到 Texture2D(例如)。

如果定义了硬件标准重排,可以添加标志以指示缓冲区中的数据将采用该格式进行解释(传输时不需要重排),但上传数据的替代方法在这种情况下也可能有意义,例如允许应用程序直接访问磁贴池内存。

可以在即时或延迟的上下文上执行复制作。

调整磁贴池的大小

若要调整磁贴池的大小,请使用 ID3D11DeviceContext2::ResizeTilePool

平铺资源屏障

若要在多个平铺资源之间指定数据访问排序约束,请使用 ID3D11DeviceContext2::TiledResourceBarrier

平铺资源