Reputation: 385
I have a renderer class in my Metal Swift (iOS/MacOS) project that is an MTKViewDelegate. I extract the MTLDevice using MTLCreateSystemDefaultDevice(), however after init, it becomes nil? I wonder if I've missed a quirk of Swift or Metal here. This is roughly how the code goes,
class Renderer: NSObject, MTKViewDelegate {
var device: MTLDevice!
init(metalView: MTKView) {
guard let device = MTLCreateSystemDefaultDevice() else
{
fatalError("GPU not available")
}
metalView.device = device
if device != nil {
print (“device not nil”)
}
}
func draw(in view: MTKView) {
if device == nil {
print (“device is nil here”)
}
}
}
In my ViewController I do
guard let metalView = view as? MTKView else {
fatalError("Metal View not setup")
}
renderer = Renderer(metalView: metalView)
What I see happen is:
device not nil
device is nil here
device is nil here
device is nil here
device is nil here
at 60hz on every draw call
EDIT: Edited code to make it clear that the device actually is being assigned to a variable in the global scope (metalView).
Upvotes: 0
Views: 1533
Reputation: 3157
As per your code you are not assigning local device to implicitly unwrapped global device variable. Assign local device to global one to fix the issue.
guard let device = MTLCreateSystemDefaultDevice() else
{
fatalError("GPU not available")
}
self.device = device
Upvotes: 3