MTLBuffer 与 MTLStorageModePrivate 模式
MTLBuffer with MTLStorageModePrivate mode
我对 Metal 比较陌生,我有一个非常直截了当的问题。我根本无法使用 MTLStorageModePrivate
选项初始化 MTLBuffer
:
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 缓存模式无关。
有趣的注意事项:我绝对可以用 MTLStorageModePrivate
创建 MTLHeap
,但不能 MTLBuffer
。
如有任何帮助,我们将不胜感激。提前致谢!
更新: 我可以通过使用 MTLHeap
创建 MTLBuffer
和 MTLStorageModePrivate
。它看起来像这样:
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!
但还是离不开堆。
这里的问题似乎是您使用了不正确的枚举来指定您的资源选项。在您的第一个代码段中,您使用 MTLStorageModePrivate
,但您应该使用 MTLResourceStorageModePrivate
,其中包含一个位移位以将存储模式置于正确的位中。
MTLResourceStorageModePrivate = MTLStorageModePrivate << MTLResourceStorageModeShift
在 Swift 中,这会导致编译时错误。
我对 Metal 比较陌生,我有一个非常直截了当的问题。我根本无法使用 MTLStorageModePrivate
选项初始化 MTLBuffer
:
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 缓存模式无关。
有趣的注意事项:我绝对可以用 MTLStorageModePrivate
创建 MTLHeap
,但不能 MTLBuffer
。
如有任何帮助,我们将不胜感激。提前致谢!
更新: 我可以通过使用 MTLHeap
创建 MTLBuffer
和 MTLStorageModePrivate
。它看起来像这样:
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!
但还是离不开堆。
这里的问题似乎是您使用了不正确的枚举来指定您的资源选项。在您的第一个代码段中,您使用 MTLStorageModePrivate
,但您应该使用 MTLResourceStorageModePrivate
,其中包含一个位移位以将存储模式置于正确的位中。
MTLResourceStorageModePrivate = MTLStorageModePrivate << MTLResourceStorageModeShift
在 Swift 中,这会导致编译时错误。