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

Sau*_*mya 5 3d swift metal

我知道在索引缓冲区时使用设备地址空间,当函数的许多调用将访问缓冲区的同一部分时使用常量地址空间。但是我还不是很清楚。谢谢!

0xB*_*1A8 7

基于此金属着色语言规范

设备地址空间

设备地址空间名称是指从设备内存池中分配的可读可写的缓冲内存对象。缓冲存储器对象可以声明为指向标量、向量或用户定义结构的指针或引用。在应用程序中,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;
Run Code Online (Sandbox Code Playgroud)

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

常量地址空间

常量地址空间名称是指从设备内存池分配的缓冲内存对象,但它是只读的。程序范围内的变量必须在常量地址空间中声明并在声明语句期间初始化。初始值设定项表达式必须是核心常量表达式。程序范围内的变量与程序具有相同的生命周期,并且它们的值在对程序中任何计算或图形函数的调用之间保持不变。

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

指向常量地址空间的指针或引用被允许作为函数的参数。写入在常量地址空间中声明的变量是编译时错误。在没有初始化的情况下声明这样的变量也是编译时错误。要确定传递给图形或内核函数的只读缓冲区使用哪个地址空间(设备或常量),请查看在图形或内核函数内部如何访问缓冲区。常量地址空间针对执行图形或内核函数访问缓冲区中相同位置的多个实例进行了优化。此访问模式的一些示例是访问用于照明/着色的光或材料属性、用于蒙皮的矩阵阵列的矩阵、从用于卷积的滤波器权重数组访问的滤波器权重。

  • 但这并没有真正涵盖“const device”的情况。如果“const”足以定义着色器的“只读”,那么为什么我们需要“constant”,因为它看起来与“const device”相同。 (5认同)