From 9ee29ce749f73bfc11810e07bf9a3d7fdc127da2 Mon Sep 17 00:00:00 2001 From: Marius Horga Date: Tue, 29 Nov 2016 22:46:21 +0200 Subject: [PATCH] updated to Swift 3 --- .../Sources/MetalView.swift | 24 +++++++++--------- .../UserInterfaceState.xcuserstate | Bin 20504 -> 20805 bytes 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/ch13/chapter13.playground/Sources/MetalView.swift b/ch13/chapter13.playground/Sources/MetalView.swift index 2a6bdcb..e41a720 100755 --- a/ch13/chapter13.playground/Sources/MetalView.swift +++ b/ch13/chapter13.playground/Sources/MetalView.swift @@ -10,7 +10,7 @@ public class MetalView: MTKView, NSWindowDelegate { var mouseBuffer: MTLBuffer! var pos: NSPoint! - override public func mouseDown(_ event: NSEvent) { + override public func mouseDown(with event: NSEvent) { pos = convertToLayer(convert(event.locationInWindow, from: nil)) let scale = layer!.contentsScale pos.x *= scale @@ -28,8 +28,8 @@ public class MetalView: MTKView, NSWindowDelegate { override public func draw(_ dirtyRect: NSRect) { if let drawable = currentDrawable { - let commandBuffer = queue.commandBuffer() - let commandEncoder = commandBuffer.computeCommandEncoder() + let commandBuffer = queue.makeCommandBuffer() + let commandEncoder = commandBuffer.makeComputeCommandEncoder() commandEncoder.setComputePipelineState(cps) commandEncoder.setTexture(drawable.texture, at: 0) commandEncoder.setBuffer(mouseBuffer, offset: 0, at: 2) @@ -48,23 +48,23 @@ public class MetalView: MTKView, NSWindowDelegate { func update() { timer += 0.01 var bufferPointer = timerBuffer.contents() - memcpy(bufferPointer, &timer, sizeof(Float.self)) + memcpy(bufferPointer, &timer, MemoryLayout.size) bufferPointer = mouseBuffer.contents() - memcpy(bufferPointer, &pos, sizeof(NSPoint.self)) + memcpy(bufferPointer, &pos, MemoryLayout.size) } func registerShaders() { - queue = device!.newCommandQueue() - let path = Bundle.main.pathForResource("Shaders", ofType: "metal") + queue = device!.makeCommandQueue() + let path = Bundle.main.path(forResource: "Shaders", ofType: "metal") do { let input = try String(contentsOfFile: path!, encoding: String.Encoding.utf8) - let library = try device!.newLibrary(withSource: input, options: nil) - let kernel = library.newFunction(withName: "compute")! - cps = try device!.newComputePipelineState(with: kernel) + let library = try device!.makeLibrary(source: input, options: nil) + let kernel = library.makeFunction(name: "compute")! + cps = try device!.makeComputePipelineState(function: kernel) } catch let e { Swift.print("\(e)") } - timerBuffer = device!.newBuffer(withLength: sizeof(Float.self), options: []) - mouseBuffer = device!.newBuffer(withLength: sizeof(NSPoint.self), options: []) + timerBuffer = device!.makeBuffer(length: MemoryLayout.size, options: []) + mouseBuffer = device!.makeBuffer(length: MemoryLayout.size, options: []) } } diff --git a/ch13/chapter13.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch13/chapter13.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index 4c407cd41a5826e0cbbe29c8acbad230d77c6d54..a500de3e739d23c2d8a3439f9c0cbc033a10e892 100755 GIT binary patch literal 20805 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 literal 20504 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