旧设备上的 Metal 2 API 功能

Metal 2 API features on older devices

根据文档(https://developer.apple.com/documentation/metal/gpu_features/understanding_gpu_family_4)“在基于 A7 到 A10 的设备上,Metal 没有明确描述这种基于图块的架构”。在同一篇文章中,我看到 “A11 GPU 上的 Metal 2” 并感到困惑,因为在金属着色语言规范中没有找到有关 Metal 2 支持的更多信息。例如,我发现 table“片段函数 tile 输入参数的属性”并注意“iOS:自 Metal 2.0 起支持 Table 5.5 中的属性。” Metal 2 支持是否特定于 gpu 系列?

并非所有设备都支持所有功能。较新的设备通常支持更多的功能,较旧的设备可能不支持较新的功能。

这种支持有几个因素。

首先,每个MTLDevice都有一组MTLGPUFamily支持,可以用supportsFamily method. Some documentation articles mention what kind of family the device needs to support to use this or that feature, but generally, you can find that info in the Metal Feature Set Tables查询。对系列的支持可能会有所不同,具体取决于芯片本身、可用的内存量或其他一些单元。并根据这些将芯片分组到系列中。

不过 MTLDevice 上还有其他 supports* 查询,它们不依赖于设备系列,而是依赖于设备本身。例如,supportsRaytracing 查询。它们也基于 GPU 本身,但可能是分开的,因为它们不完全属于任何“系列”。

第三种支持基于 OS 版本。 OS 的较新版本可能会发布新的 API 或对现有 API 的扩展。这些在 headers 中标有 API_AVAILABLE macroses,并且只能在相同版本或更高版本的 OSes 上使用。要查询对这些的支持,您需要使用 macroses 或 Objective-C 中的 if #available 语法或 Swift 中的类似语法。在这里,API 可用性并没有受到 GPU 本身的太大影响,而是受到更新的 OS 和驱动程序的影响。

限制某些功能的最后一种“支持”是金属着色语言版本。它与 OS 版本相关联,它指的是您在问题中提到的 Metal Shading Language specification 中的那些注释。在这里,功能的可用性是编译器版本限制的混合(不是每个人都会使用最新和最好的规范,我认为大多数生产游戏引擎都使用类似 Metal 2.1 的东西,至少没有使用的游戏最新和最好的游戏引擎版本)和设备限制。例如,瓦片着色器仅限于某个版本的编译器,但也仅限于 Apple Silicon GPU。

因此,当您在应用程序中使用 Metal 时,有不同类型的支持在起作用,很容易混淆它们,但了解每一种支持很重要。