Изменение значений MTLBuffer после создания

Я хотел бы иметь возможность определить MTLBuffer и заполнить данные непосредственно в буфер (или максимально эффективно).

Если я сделаю следующее, значения, используемые в шейдере, равны 1,0 и 2,0 (для X и Y соответственно), а не 3,0 и 4,0, которые устанавливаются после MTLBuffer создано.

int bufferLength = 128 * 128;

float pointBuffer[bufferLength * 2]; // 2 for X and Y

//Populate array with test values
for (int i = 0; i < (bufferLength * 2); i += 2) {
    pointBuffer[i] = 1.0;       //X
    pointBuffer[i + 1] = 2.0;   //Y
}

id<MTLBuffer> pointDataBuffer = [device newBufferWithBytes:&pointBuffer length:sizeof(pointBuffer) options:MTLResourceOptionCPUCacheModeDefault];

//Populate array with updated test values       
for (int i = 0; i < (bufferLength * 2); i += 2) {
    pointBuffer[i] = 3.0;       //X
    pointBuffer[i + 1] = 4.0;   //Y
}

//In the (Swift) class with the pipeline:
commandEncoder!.setBuffer(pointDataBuffer, offset: 0, index: 4)

Исходя из документов, кажется, мне нужно позвонить didModifyRange: но pointDataBuffer похоже не распознает селектор.

Есть ли способ обновить массив без необходимости воссоздать MTLBuffer?

1 ответ

Решение

-newBufferWithBytes:... делает копию переданного в байтах. Это не продолжает ссылаться на них. Итак, последующие изменения pointBuffer не влияет на это.

Однако такие буферы (чей режим хранения не является частным) предоставляют доступ к их хранилищу через -contents метод. Итак, вы можете сделать что-то вроде этого:

float *points = pointDataBuffer.contents;
for (int i = 0; i < (bufferLength * 2); i += 2) {
    points[i] = 3.0;       //X
    points[i + 1] = 4.0;   //Y
}

Будьте осторожны, хотя. CPU и GPU работают асинхронно относительно друг друга. Если могут быть команды, обрабатываемые GPU, которые ссылаются на буфер, то изменение его из CPU может помешать работе этих команд. Итак, вы захотите предпринять шаги для синхронизации доступа к буферу или иным образом избежать одновременного доступа к процессору и графическому процессору.

Другие вопросы по тегам