本文档描述了Metal Unified Graphics和Compute Language。 Metal是一种基于C ++的编程语言,开发人员可以使用它编写在GPU上执行的代码,用于图形和通用数据并行计算。由于Metal基于C ++,开发人员会发现它很熟悉且易于使用。使用Metal,图形和计算程序都可以使用统一的单一语言编写,从而实现两者之间更紧密的集成。
Metal着色语言和Metal框架配合使用,Metal框架管理Metal着色语言的运行和可选编译选项。Metal着色语言使用clang 和 LLVM,编译器对于在GPU上的代码执行效率有更好的控制。
1.1 适合的读者
希望阅读本文档后,期望能够编写 metal shader 程序的开发者
1.2 文档组织
本文档分为以下章节:
•本章“简介”是对本文档的介绍,介绍了Metal和C ++ 14之间的异同。
•“数据类型”列出了Metal数据类型,包括表示向量,矩阵,缓冲区,纹理和采样器的类型。它还讨论了类型对齐和类型转换。
•“运算符”列出了Metal运算符。
•“函数和变量声明”详细说明了如何声明函数和变量,有时使用限制它们使用方式的属性。
•“Metal Standard Library”定义了一系列内置Metal函数。
•“编译器”详细介绍了Metal编译器的选项,包括预处理器指令,数学内在函数选项和控制优化的选项。
•“数值规则” 描述了表示浮点数的要求,包括数学运算的准确性。
除非另有说明,自Metal 1.0以来,本文档中描述的特性(例如,函数,枚举,类型或操作)均支持 os。
1.3 参考
C++14
Stroustrup, Bjarne. The C++ Programming Language (Fourth Edition). Harlow: Addison-Wesley, 2013.
Metal
Metal 官方文档: https://developer.apple.com/documentation/metal
1.4 Metal 和 c++
Metal编程语言基于C ++ 14规范(a.k.a.,ISO / IEC JTC1 / SC22 / WG21 N4431语言规范),具有特定的扩展和限制。有关语言语法的详细说明,请参阅C ++ 14规范。
本节及其小节描述了对Metal支持的C ++ 14语言的修改和限制。除非另有说明,否则所有OS(即iOS和macOS)都支持类型,运算符,属性和函数。
对于本文档的其余部分,缩写vX.Y代表Metal版本X.Y;例如,v2.1表示Metal版本2.1。
有关Metal预处理指令和编译器选项的更多信息,请参阅本文档的第6部分。
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 限制
如下的C++14特性在Metal着色语言中不支持:
• lambda expressions (section 5.1.2) lambda表达式
• dynamic_cast operator (section 5.2.7) 动态转换操作符
• type identification (section 5.2.8) 类型识别
• recursive function calls (section 5.2.2, item 9) 递归函数调用
• new and delete operators (sections 5.3.4 and 5.3.5) 对象创建(new)和销毁(delete)操作符
• noexcept operator (section 5.3.7) 异常处理 noexcept操作符
• goto statement (section 6.6) goto 语句
• register,thread_local storage attributes (section 7.1.1) 变量存储操修饰符(regsiter、tread_local)
• virtual function attribute (section 7.1.2) 虚函数修饰符
• derived classes (section 10, section 11) 派生类
• exception handling (section 15) 异常处理
C++标准库不可以在Metal着色语言中使用,Metal着色语言使用自己的标准库,后面专门有一个章节述。
Metal着色语言中对于指针的使用的限制
- Arguments to Metal graphics and kernel functions declared in a program that are pointers must be declared with the Metal device, threadgroup, threadgroup_imageblock, or constant address space attribute. (See section 4.2 of this document for more about Metal address space attribute.)
- Function pointers are not supported.
- A Metal function cannot be called main.
Metal图形和并行计算函数用到的入参如果是指针必须使用地址空间修饰符(device,threadgroup,constant)。
不支持函数指针。
Metal函数名不能叫main。
1.5
Metal像素坐标系统
在Metal中,纹理 或是 帧缓存attachment 中的像素 使用的坐标系统的原点定义在左上角。