根据文档(https://developer.apple.com/documentation/metal/gpu_features/understanding_gpu_family_4)“在基于 A7 到 A10 的设备上,Metal 没有明确描述这种基于图块的架构”。在同一篇文章中,我看到“A11 GPU 上的 Metal 2”并感到困惑,因为在金属着色语言规范中没有找到有关 Metal 2 支持的更多信息。例如,我找到了表“片段函数图块输入参数的属性”并注释“iOS:自 Metal 2.0 起支持表 5.5 中的属性”。Metal 2 支持特定于 GPU 系列吗?
并非所有设备都支持所有功能。较新的设备通常支持更多功能,较旧的设备可能不支持较新的功能。
这种支持有几个因素。
首先,每个MTLDevice都有一组MTLGPUFamily它支持,你可以用supportsFamily方法查询。一些文档文章提到设备需要支持哪种系列才能使用这个或那个功能,但通常,您可以在金属功能集表中找到该信息。对系列的支持可能会有所不同,具体取决于芯片本身、可用的内存量或其他一些单元。芯片根据这些被分为不同的系列。
不过,还有其他supports*查询MTLDevice,这些查询不依赖于设备系列,而是依赖于设备本身。例如,supportsRaytracing查询。它们也基于 GPU 本身,但它们是独立的,可能是因为它们不完全属于任何“家族”。
第三种支持基于操作系统版本。较新版本的操作系统可能会提供新的 API 或现有 API 的扩展。它们API_AVAILABLE在标头中标有宏,并且只能在相同版本或更高版本的操作系统上使用。要查询对这些的支持,您需要使用宏或if #availableObjective-C 中的宏或语法或 Swift 中的类似语法。在这里,API 可用性并不太受 GPU 本身的影响,而是受到更新的操作系统和驱动程序的影响。
最后一种限制某些功能的“支持”是 Metal Shading Language 版本。它与操作系统版本相关,并且引用了您在问题中提到的金属着色语言规范中的那些注释。在这里,功能的可用性是编译器版本的限制的组合(不是每个人都会使用最新和最好的规格,我认为大多数生产游戏引擎都使用类似 Metal 2.1 的东西,至少那些不使用的游戏)最新和最好的游戏引擎版本确实如此)和设备限制。例如,图块着色器仅限于编译器的某个版本,但也仅限于 Apple Silicon GPU。
因此,当您在应用程序中使用 Metal 时,有不同类型的支持在发挥作用,很容易将它们混淆,但了解每一种都很重要。