MTLBuffer с режимом MTLStorageModePrivate

Я относительно новичок в металле, и у меня довольно простой вопрос. Я просто не могу инициировать MTLBuffer с участием MTLStorageModePrivate опция:

id<MTLBuffer> privateBuff = [device newBufferWithLength:dataLength options:MTLStorageModePrivate];

Компилятор дает мне утверждение с этим текстом:

-[MTLDebugDevice validateResourceOptions:isTexture:isIOSurface:]:437: failed assertion `options 0x2 conveys invalid cpuCacheMode of 0x2'

И это не имеет особого смысла. Я создаю буфер, к которому можно получить доступ только из графического процессора, поэтому мне не нужны никакие режимы кэша процессора для этого конкретного объекта. Я полагаю, мне нужно отключить режим кэширования процессора, но как?

Я просмотрела MTLCPUCacheMode, но это не имеет ничего общего с полным отключением режима кэширования процессора.

Интересная заметка: я абсолютно могу создать MTLHeap с участием MTLStorageModePrivate, но нет MTLBuffer,

Любая помощь будет оценена. Заранее спасибо!

ОБНОВЛЕНИЕ: я могу создать MTLBuffer с участием MTLStorageModePrivate используя MTLHeap, Это выглядит примерно так:

    MTLHeapDescriptor *heapDescriptor = [MTLHeapDescriptor new];
    heapDescriptor.storageMode = MTLStorageModePrivate;
    heapDescriptor.size = 0;

    MTLSizeAndAlign sizeAndAlign = [device heapBufferSizeAndAlignWithLength:lutSharedBuffer.length options:MTLResourceStorageModePrivate];
    sizeAndAlign.size += (sizeAndAlign.size & (sizeAndAlign.align - 1)) + sizeAndAlign.align;
    heapDescriptor.size += sizeAndAlign.size;

    privateHeap = [device newHeapWithDescriptor:heapDescriptor];

    privateBuff = [privateHeap newBufferWithLength:lutSharedBuffer.length options:MTLResourceStorageModePrivate]; //now it works!

Но все равно невозможно обойтись без кучи.

1 ответ

Решение

Проблема здесь заключается в том, что вы используете неправильное перечисление для указания параметров вашего ресурса. В своем первом фрагменте вы используете MTLStorageModePrivate, но вы должны использовать MTLResourceStorageModePrivate, который содержит битовый сдвиг для помещения режима хранения в правильные биты.

MTLResourceStorageModePrivate = MTLStorageModePrivate << MTLResourceStorageModeShift

В Swift это вызвало бы ошибку времени компиляции.

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