Swift
1class ViewController: NSViewController, MTKViewDelegate { 2 3 private let device: MTLDevice! = MTLCreateSystemDefaultDevice()! 4 private var commandQueue: MTLCommandQueue! 5 private var texture: MTLTexture! 6 private let theScreen = NSScreen.main 7 8 @IBOutlet private var mtkView: MTKView! 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 print("viewDidLoad\n") 13 mtkView = MTKView(frame: CGRect(x: 0, y: 0, width: 727, height: 1024), device: device) 14 self.view.addSubview(mtkView) 15 16 setupMetal() 17 loadTexture() 18 19 mtkView.enableSetNeedsDisplay = true 20 mtkView.setNeedsDisplay(NSRect(x: 0, y: 0, width: 727, height: 1024)) 21 } 22 23 private func setupMetal() { 24 print("setupMetal") 25 commandQueue = device.makeCommandQueue() 26 mtkView.device = device 27 mtkView.delegate = self 28 } 29 private func loadTexture() { 30 print("loadTexture") 31 // MTKTextureの初期化 32 let textureLoader = MTKTextureLoader(device: device) 33 34 // textureをロードする関数を呼ぶ 35 texture = try! textureLoader.newTexture(name: "sample", scaleFactor: theScreen!.backingScaleFactor, bundle: nil) 36 37 38 } 39 40 func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) { 41 print("(self.classForCoder)") 42 } 43 44 func draw(in view: MTKView) { 45 print("draw") 46 let drawable = view.currentDrawable! 47 48 // コマンドバッファを作成 49 let commandBuffer = commandQueue.makeCommandBuffer()! 50 51 // MTLBlitCommandEncoderを作成 52 53 let w = min(texture.width, drawable.texture.width) 54 let h = min(texture.height, drawable.texture.height) 55 56 // MTLBlitCommandEncoderを作成 57 let blitEncoder = commandBuffer.makeBlitCommandEncoder()! 58 59 // コピーコマンドをエンコード 60 blitEncoder.copy(from: texture, //------ ここでエラー -------- 61 sourceSlice: 0, 62 sourceLevel: 0, 63 sourceOrigin: MTLOrigin(x: 0, y: 0, z: 0), 64 sourceSize: MTLSizeMake(w, h, texture.depth), 65 to: drawable.texture, // コピー先テクスチャ 66 destinationSlice: 0, 67 destinationLevel: 0, 68 destinationOrigin: MTLOrigin(x: 0, y: 0, z: 0)) 69 70 // エンコード完了 71 blitEncoder.endEncoding() 72 73 // 表示するドローアブルを登録 74 commandBuffer.present(drawable) 75 76 // コマンドバッファをコミット(エンキュー) 77 commandBuffer.commit() 78 79 // 完了まで待つ 80 commandBuffer.waitUntilCompleted() 81 } 82 83} 84
Swift
1import Cocoa 2 3 4class WindowController: NSWindowController { 5 6 7 override func windowDidLoad() { 8 super.windowDidLoad() 9 print("WindowDidLoad") 10// Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. 11 12 13 14 window?.isOpaque = false 15 window?.backgroundColor = NSColor(white: 1, alpha: 0.8) 16 17 window?.isMovableByWindowBackground = true 18 window?.titleVisibility = .hidden 19 window?.titlebarAppearsTransparent = true 20 window?.hasShadow = false 21 22 window?.styleMask.remove(NSWindow.StyleMask.titled) 23 24 print("windowDidLoad End") 25 } 26} 27
https://github.com/shu223/MetalBook/blob/master/01_MetalImageRender/MetalImageRender/ViewController.swift
このurl先のコードはiOS向けなのでこれをMac用に
見よう見まねで書いてみました。
ですがblitEncoderのところでエラーが出てしまい困ってます。
実行するとThread 1: signal SIGABRTというエラーが出て
そこでstep outするとThread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
というエラーが出ます。
調べてみたところ@IBOutlet関連のエラーらしいですが
@IBOutletしたのはコード上のmtkViewだけです。
原因わかりますでしょうか?
あなたの回答
tips
プレビュー