1

我对金属比较陌生,我有一个非常直截了当的问题。我根本无法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

任何帮助,将不胜感激。提前致谢!

更新:我可以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!

但是没有堆仍然是不可能的。

4

1 回答 1

4

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

MTLResourceStorageModePrivate = MTLStorageModePrivate << MTLResourceStorageModeShift

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

于 2019-08-21T17:47:32.690 回答