何时使用设备,何时使用金属着色语言中的常量地址空间限定符



我知道在索引缓冲区时会使用设备地址空间,而当函数的多次调用将访问缓冲区的同一部分时,会使用恒定地址空间。但我还是不太清楚。非常感谢。

基于此金属着色语言规范

设备地址空间

设备地址空间名称指缓冲区内存对象从设备内存池中分配的可读和可写。缓冲区内存对象可以声明为指针或对标量、向量或用户定义结构的引用。在应用程序中,Metal API调用为缓冲区对象分配内存确定缓冲存储器的实际大小。例如:

// An array of a float vector with four components.
device float4 *color;
struct Foo {
float a[3];
int b[2];
}
// An array of Foo elements.
device Foo *my_info;

由于您总是从设备地址分配纹理对象空间,纹理类型不需要设备地址属性。

常量地址空间

常量地址空间名称指缓冲区内存对象从设备内存池中分配,但为只读。中的变量程序作用域必须在常量地址空间中声明,并且在声明语句期间初始化。初始值设定项表达式必须是核心常量表达式。程序中的变量作用域与程序具有相同的生存期,并且它们的值保持不变在对程序

constant float samples[] = { 1.0f, 2.0f, 3.0f, 4.0f };

允许对常量地址空间的指针或引用作为函数的参数。写入常量中声明的变量地址空间是编译时的错误。声明这样一个变量没有初始化也是编译时错误。决定地址空间(设备或常量(传递给图形或内核函数使用,看看缓冲区是如何访问的在图形或内核函数内部。恒定地址空间为针对执行图形或内核的多个实例进行优化函数访问缓冲区中的相同位置。以下示例此访问模式正在访问的灯光或材质属性照明/着色,用于蒙皮的矩阵阵列的矩阵,过滤器从用于卷积的滤波器权重阵列访问的权重。如果图形或内核函数的多个执行实例使用诸如顶点ID、片段之类的索引来访问缓冲器坐标,或网格中的线程位置,缓冲区必须分配在设备地址空间中。

最新更新