import SwiftUI import MetalKit struct MetalView: NSViewRepresentable { func makeCoordinator() -> Coordinator { Coordinator(self) } func makeNSView(context: NSViewRepresentableContext) -> MTKView { let mtkView = MTKView() mtkView.delegate = context.coordinator mtkView.preferredFramesPerSecond = 60 mtkView.enableSetNeedsDisplay = true if let metalDevice = MTLCreateSystemDefaultDevice() { mtkView.device = metalDevice } mtkView.framebufferOnly = false mtkView.clearColor = MTLClearColor(red: 0, green: 0, blue: 0, alpha: 0) mtkView.drawableSize = mtkView.frame.size mtkView.enableSetNeedsDisplay = true mtkView.isPaused = false return mtkView } func updateNSView(_ nsView: MTKView, context: NSViewRepresentableContext) { } class Coordinator : NSObject, MTKViewDelegate { var parent: MetalView var metalDevice: MTLDevice! var metalCommandQueue: MTLCommandQueue! init(_ parent: MetalView) { self.parent = parent if let metalDevice = MTLCreateSystemDefaultDevice() { self.metalDevice = metalDevice } self.metalCommandQueue = metalDevice.makeCommandQueue()! super.init() } func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) { } func draw(in view: MTKView) { guard let drawable = view.currentDrawable else { return } let commandBuffer = metalCommandQueue.makeCommandBuffer() let rpd = view.currentRenderPassDescriptor rpd?.colorAttachments[0].clearColor = MTLClearColorMake(0, 0, 0, 1) rpd?.colorAttachments[0].loadAction = .clear rpd?.colorAttachments[0].storeAction = .store let re = commandBuffer?.makeRenderCommandEncoder(descriptor: rpd!) re?.endEncoding() commandBuffer?.present(drawable) commandBuffer?.commit() } } }