ios - MTLBuffer 与 MTLStorageModePrivate 模式

标签 ios objective-c gpu metal mtlbuffer

我对 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通过MTLStorageModePrivate创建MTLBuffer。它看起来像这样:

    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 中,这会导致编译时错误。

关于ios - MTLBuffer 与 MTLStorageModePrivate 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57587879/

相关文章:

ios - 使用 NSJSONSerialization 序列化一个 unsigned long long

c++ - 无法使用 cuda 进入 __global__ 函数

tensorflow - Keras 在具有 python 3.5 和 Tensorflow 1.4 的 Pycharm 上不使用 GPU

ios - 自定义 UITableViewCell 圆角、padding、bgImage

ios - IBM Worklight - iOS 7 状态栏与应用程序的 HTML 重叠

ios - NSString 的逗号分隔天数到 NSDate 计算与当前日期最接近的日期

ios - 在日期选择器中显示时间设置最长时间和最短时间

objective-c - 如何获得动画 CAEmitterLayer/Cell 的发射器位置?

objective-c - 模型设计工作室和 UX 设计师、iOS、流程

cuda - 需要在多个 GPU 上分配数据的指导