在金属中将多个缓冲区作为ArgumentBuffers传递

时间:2019-05-17 08:18:56

标签: macos metal

我必须将多个缓冲区传递给我的Metal计算内核。像这样:

const device uint32_t *a [[buffer(0)]];
const device uint32_t *b [[buffer(1)]];
const device uint32_t *c [[buffer(2)]];
const device uint8_t *d [[buffer(3)]];
const device uint8_t *e [[buffer(4)]];

这些数组可以具有可变大小,因此,我不能使用<array>。因此,我试图使用ArgumentBuffers将所有这些缓冲区作为一个ArgumentBuffer传递给计算内核。

类似这样的东西:

typedef struct Arguments 
{
    const device uint32_t *a [[buffer(0)]];
    const device uint32_t *b [[buffer(1)]];
    const device uint32_t *c [[buffer(2)]];
    const device uint8_t *d [[buffer(3)]];
    const device uint8_t *e [[buffer(4)]];
} Arguments;

kernel void
myKernel(device Arguments &arguments [[ buffer(ComputeBufferInput) ]],
                texture2d<half, access::write> outTexture [[texture(ComputeBufferOutput)]],
                uint2                          gid         [[thread_position_in_grid]])
{

}

我告诉我编译失败

  

类型'device Arguments&'对属性'buffer'无效

如何将缓冲区传递给ArgumentBuffers中的内核? 可以在ArgumentBuffer中为金属内核传递这样的缓冲区吗?

谢谢

1 个答案:

答案 0 :(得分:0)

因此,事实证明,如果应用程序的部署目标为10.13,则只能在ArgumentBuffers中具有缓冲区。在部署目标小于10.13的应用程序中不能有缓冲区。