具有MTLStorageModePrivate模式的MTLBuffer

时间:2019-08-21 08:52:28

标签: ios objective-c gpu metal mtlbuffer

我是《金属》的新手,我有一个很简单的问题。我根本无法使用MTLBuffer选项初始化MTLStorageModePrivate

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

编译器给我一个带有该文本的断言:

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

这没有多大意义。我正在创建一个只能从GPU访问的缓冲区,因此对于此特定实体,我不需要任何CPU缓存模式。我想我需要关闭该CPU缓存模式,但是如何?

我浏览了MTLCPUCacheMode,但与完全关闭CPU缓存模式无关。

有趣的提示:我绝对可以用MTLHeap创建MTLStorageModePrivate,但不能创建MTLBuffer

任何帮助将不胜感激。预先感谢!

更新:我可以使用MTLBufferMTLStorageModePrivate创建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 个答案:

答案 0 :(得分:3)

这里的问题似乎是您使用了错误的枚举来指定资源选项。在第一个代码段中,您使用了MTLStorageModePrivate,但您应该使用MTLResourceStorageModePrivate,其中包含了一个位移,以将存储模式设置为正确的位。

MTLResourceStorageModePrivate = MTLStorageModePrivate << MTLResourceStorageModeShift

在Swift中,这会导致编译时错误。