MetalKit - Drawable.texture 断言错误
Posted
技术标签:
【中文标题】MetalKit - Drawable.texture 断言错误【英文标题】:MetalKit - Drawable.texture assertion error 【发布时间】:2017-01-05 12:36:16 【问题描述】:我是 MetalKit
的新手,正在尝试将 this tutorial 从 playground
转换回 OSX
应用程序:
import MetalKit
public class MetalView: MTKView
var queue: MTLCommandQueue! = nil
var cps: MTLComputePipelineState! = nil
required public init(coder: NSCoder)
super.init(coder: coder)
device = MTLCreateSystemDefaultDevice()
registerShaders()
override public func drawRect(dirtyRect: NSRect)
super.drawRect(dirtyRect)
if let drawable = currentDrawable
let command_buffer = queue.commandBuffer()
let command_encoder = command_buffer.computeCommandEncoder()
command_encoder.setComputePipelineState(cps)
command_encoder.setTexture(drawable.texture, atIndex: 0)
let threadGroupCount = MTLSizeMake(8, 8, 1)
let threadGroups = MTLSizeMake(drawable.texture.width / threadGroupCount.width, drawable.texture.height / threadGroupCount.height, 1)
command_encoder.dispatchThreadgroups(threadGroups, threadsPerThreadgroup: threadGroupCount)
command_encoder.endEncoding()
command_buffer.presentDrawable(drawable)
command_buffer.commit()
func registerShaders()
queue = device!.newCommandQueue()
do
let library = device!.newDefaultLibrary()!
let kernel = library.newFunctionWithName("compute")!
cps = try device!.newComputePipelineStateWithFunction(kernel)
catch let e
Swift.print("\(e)")
我在线路上遇到错误:
command_encoder.setTexture(drawable.texture, atIndex: 0)
失败的断言`frameBufferOnly 纹理不支持计算。'
我该如何解决这个问题?
【问题讨论】:
【参考方案1】:如果你想从一个计算函数写入一个drawable的纹理,你需要告诉MTKView
它应该将它的层配置为不是framebuffer-only:
metalView.framebufferOnly = false
将此值设置为 false 时,您的可绘制对象将为您提供一个设置了 shaderWrite
使用标志的纹理,这是从着色器函数写入纹理时所必需的。
【讨论】:
我们应该在哪里设置这个?在MetalView
类中?
好的,我明白了。我设置了self.frameBufferOnly = false
,它可以工作。
这很奇怪,我发现如果我在操场上运行代码,我不需要设置这一行,但是如果我将代码应用到一个应用程序中,我需要添加这个。跨度>
我必须将self.framebufferOnly = false
放入init
。在绘图调用中设置它为时已晚,无法避免断言。【参考方案2】:
即使我将 frameBufferOnly 设置为 false
并在使用可绘制对象之前打印布尔值以进行仔细检查,我也遇到了同样的问题。
但是当我关闭GPU frame capture
时,不会再出现断言(至少现在是这样)。还是不知道为什么。
Menu > Scheme > Edit Scheme > Run > Options > GPU Frame Capture
:已禁用
【讨论】:
以上是关于MetalKit - Drawable.texture 断言错误的主要内容,如果未能解决你的问题,请参考以下文章
Metalkit:MTLBuffer和swift 3中的指针