【翻译】Metal 着色语言规范--介绍

这份文档介绍了 Metal 统一图形和计算语言。Metal 是一种基于 C++ 的编程语言,开发者可以用它来编写在 GPU 上执行的图形和通用数据并行计算代码。这是第一章:介绍。

August 18, 2017 -
ios metal 翻译

这份文档翻译自 Metal 的官方文档:Metal 着色语言规范(Metal Shading Language Specification)

Metal 着色语言规范

版本 2.0

1 介绍

这份文档介绍了 Metal 统一图形和计算语言。Metal 是一种基于 C++ 的编程语言,开发者可以用它来编写在 GPU 上执行的图形和通用数据并行计算代码。既然 Metal 是基于 C++ 的,开发者会发现对它有些熟悉并易于使用。使用 Metal,图形和计算程序都可以用单独的、统一的语言来编写,从而使两者的集成更加紧密。

Metal 被设计为和 Metal 框架一起工作,Metal 框架管理 Metal 代码的执行和可选的编译。Metal 使用 clang 和 LLVM,于是开发者得到了一个能提供 Metal 性能接近于在 GPU 上执行代码的编译器。

1.1 受众

编写 Metal 框架代码的开发者会想要阅读这份文档,因为他们需要使用 Metal 着色器语言来编写在 GPU 上执行的图形和计算程序。

1.2 规范的组织方式

这份文档包含以下几章:

  • 本章,“介绍”,是对这份文档的介绍,并覆盖 Metal 和 C++14 的相似与差异。
  • “数据类型”列出了 Metal 的数据类型,包括表示矢量、矩阵、缓冲、纹理和取样器的类型。还讨论了类型对齐和类型转换。
  • “算子”列出了 Metal 的算子。
  • “函数、变量和限定符”详细说明了如何声明函数和变量,有时使用限定符来限制它们的用途。
  • “Metal 标准库”定义了内置的 Metal 函数集。
  • “编译选项”详细说明了 Metal 编译器的选项,包括预处理指令、数学固有选项和控制优化选项。
  • “数值合规”解释了表示浮点数的要求,包括数学精度的选项。

1.3 参考

C++ 14

  • Stroustrup, Bjarne. The C++ Programming Language. Harlow: Addison-Wesley, 2013.

Metal

  • The Metal Programming Guide 提供了使用 Metal 框架编写 App 的详细介绍。
  • The Metal Framework Reference 详细介绍了 Metal 框架中的个别类。

1.4 Metal 和 C++14

Metal 编程语言是基于 C++14 规范(又称为,ISO/IEC JTC1/SC22/WG21 N4431 语言规范),并有特定的扩展和限制。语言语法的详细解释,请参考 C++14 规范。

1.4.1 重载

Metal 支持 C++14 规范里第 13 节定义的重载。函数重载规则扩展到包含参数的地址空间限定符。Metal 图形和内核函数不能被重载。(图形和内核函数的定义,见当前文档的 4.1 节。)

1.4.2 模版

Metal 支持 C++14 规范里第 14 节定义的模版。

1.4.3 预处理指令

Metal 支持 C++14 规范里第 16 节定义的预处理指令。

1.4.4 限制

Metal 不支持以下 C++14 的功能(列表里的节编号指的是 C++14 规范)

  • lambda 表达式(5.1.2 节)
  • dynamic_cast 运算符(5.2.7 节)
  • 类型识别(5.2.8 节)
  • 递归函数调用(5.2.2 节,第 9 项)
  • 新增和删除操作符(5.3.4 和 5.3.5 节)
  • noexcept 操作符(5.3.7 节)
  • goto 声明(6.6 节)
  • 注册,thread_local 存储限定符(7.1.1 节)
  • 虚拟函数限定符(7.1.2 节)
  • 派生类(10 节,11 节)
  • 异常处理(15 节)

Metal 代码里绝对不能使用 C++ 标准库。作为 C++ 标准库的替代,Metal 有自己的标准库,这将在这份文档的第 5 章里讨论。

Metal 限制指针的使用:

  • 必须使用 Metal 设备、线程组或常量地址空间限定符来声明,作为指针在程序中声明的 Metal 图形和内核函数的参数。
  • 不支持函数指针。

Metal 函数不能调用 main。

1.5 Metal 像素坐标系统

在 Metal 里,帧缓冲附件的像素坐标系统的原点定义在左上角。同样的,帧缓冲附件的像素坐标系统的原点就是左上角。