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 это вызвало бы ошибку времени компиляции.