源码

具有MTLStorageModePrivate模式的MTLBuffer

我对Metal不太熟悉/uff0c我有一个非常直截了当的问题。 我根本无法使用MTLStorageModePrivate选项初始化MTLBuffer/uff1a

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

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

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

它没有多大意义。 我正在创建一个只能从GPU访问的缓冲区/uff0c所以我不需要这个特定实体的cpu缓存模式。 我想我需要关闭那个cpu缓存模式/uff0c但是怎么样/uff1f
我查看了MTLCPUCacheMode/uff0c但它没有关于完全关闭cpu缓存模式。
有趣的说明/uff1a我绝对可以使用MTLStorageModePrivate创建MTLHeap/uff0c但不能创建MTLBuffer。
更新/uff1a我可以使用MTLHeap使用MTLStorageModePrivate创建MTLBuffer。 它看起来像这样/uff1a

   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!

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

MTLResourceStorageModePrivate = MTLStorageModePrivate << MTLResourceStorageModeShift

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

(0)

本文由 投稿者 创作,文章地址:https://blog.isoyu.com/archives/juyoumtlstoragemodeprivatemoshidemtlbuffer.html
采用知识共享署名4.0 国际许可协议进行许可。除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为:8 月 25, 2019 at 10:27 下午

热评文章