gpt4 book ai didi

swift - 如何将纹理存储模式设置为 `private` 到从 `CVMetalTextureCacheCreateTextureFromImage` 创建的纹理?

转载 作者:行者123 更新时间:2023-12-03 20:50:50 33 4
gpt4 key购买 nike

Xcode 的 GPU frame capture 将多个表达式高亮显示为紫色,并说我应该将纹理存储模式设置为 private 因为只有 GPU 才能访问它。我正在尝试修复紫色建议。

Memory Usage'Texture:0x10499ae00 "CoreVideo 0x6000017f2bc0"' has storage mode 'Managed' but is accessed exclusively by a GPU


当使用 device.makeBuffer(bytes:length:options:) 创建 MTLTexture 时,我可以在参数 storageMode 中将 private 设置为 options
但是当通过 MTLTextureCVPixelBuffer 创建 CVMetalTextureCacheCreateTextureFromImage() 时,我不知道如何为创建的纹理配置存储模式。
我试过的方法:
  • 将纹理属性字典传递给 textureAttributes 中的 CVMetalTextureCacheCreateTextureFromImage(..., _ textureAttributes: CFDictionary?, ...) 参数
  • var textureAttrs: [String: Any] = [:]
    if #available(macOS 10.15, *) {
    textureAttrs[kCVMetalTextureStorageMode as String] = MTLStorageMode.private
    }
    CVMetalTextureCacheCreateTextureFromImage(,,,textureAttrs as CFDictionary,..., &texture)

    if let texture = texture,
    let metalTexture = CVMetalTextureGetTexture(texture) {
    print(metalTexture.storageMode.rawValue)
    }
    }

    我的操作系统已经是 10.15.4,但是创建的 MTLTexture 仍然有 storageMode 作为 managed/rawValue: 1
  • 将相同的属性传递给 CVMetalTextureCacheCreate() ,它为 CVMetalTextureCacheCreateTextureFromImagecacheAttributes 中的 textureAttributes 创建缓存。

  • 结果是一样的。
    问题:
  • 是不是我的属性字典设置了错误的键值?苹果文档没有描述需要设置哪个键和值。
  • 或者有正确的配置方法
  • 还是目前还不支持?

  • 引用:
  • makeBuffer(bytes:length:options:)
  • CVMetalTextureCacheCreateTextureFromImage(::::::::_:)
  • CVMetalTextureCacheCreate(::::_:)
  • maxOS 10.15+ kCVMetalTextureStorageMode
  • 最佳答案

    我有使用 Metal 的经验,也遇到过同样的问题。没有办法改变纹理storageMode一只苍蝇。您必须创建另一个 MTLTexture与期望 storageMode并使用 MTLBlitCommandEncoder将数据复制到它。
    这是我项目中的一段代码:

        MTLTextureDescriptor* descriptor = [[MTLTextureDescriptor alloc] init];
    descriptor.storageMode = MTLStorageModePrivate;
    descriptor.pixelFormat = MTLPixelFormatRGBA8Unorm;
    descriptor.width = width;
    descriptor.height = height;

    id<MTLTexture> texture = [__metal_device newTextureWithDescriptor: descriptor];

    if ((data != NULL) && (size > 0)) {
    id<MTLCommandQueue> command_queue = [__metal_device newCommandQueue];
    id<MTLCommandBuffer> command_buffer = [command_queue commandBuffer];
    id<MTLBlitCommandEncoder> command_encoder = [command_buffer blitCommandEncoder];
    id<MTLBuffer> buffer = [__metal_device newBufferWithBytes: data
    length: size
    options: MTLResourceStorageModeShared];
    [command_encoder copyFromBuffer: buffer
    sourceOffset: 0
    sourceBytesPerRow: (width * 4)
    sourceBytesPerImage: (width * height * 4)
    sourceSize: (MTLSize){ width, height, 1 }
    toTexture: texture
    destinationSlice: 0
    destinationLevel: 0
    destinationOrigin: (MTLOrigin){ 0, 0, 0 }];

    [command_encoder endEncoding];
    [command_buffer commit];
    [command_buffer waitUntilCompleted];
    }

    关于swift - 如何将纹理存储模式设置为 `private` 到从 `CVMetalTextureCacheCreateTextureFromImage` 创建的纹理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62946964/

    33 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com