Передача нескольких буферов как ArgumentBuffers в металле - PullRequest
1 голос
/ 17 мая 2019

Я должен передать несколько буферов в мое вычислительное ядро ​​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]])
{

}

Я получаю сообщение об ошибке компиляции

Тип 'Аргументы устройства &' недопустим для атрибута 'buffer'

Как я могу передавать буферы ядрам в ArgumentBuffers? Можно ли передавать подобные буферы в ArgumentBuffer для металлических ядер?

Спасибо

1 Ответ

1 голос
/ 19 мая 2019

Итак, оказалось, что вы можете иметь буферы только в ArgumentBuffers, если цель развертывания вашего приложения 10.13. У вас не может быть буферов в приложениях с целями развертывания менее 10,13.

...