From dfc0532882d7767a26666ddac8da22a48b39c1df Mon Sep 17 00:00:00 2001 From: Marius Horga Date: Tue, 29 Nov 2016 23:05:57 +0200 Subject: [PATCH] updated to Swift 3 --- .../Resources/Shaders.metal | 3 +- .../Sources/MetalView.swift | 35 ++++++------------ .../contents.xcplayground | 2 +- .../UserInterfaceState.xcuserstate | Bin 22481 -> 25264 bytes ch14/chapter14.playground/timeline.xctimeline | 6 --- 5 files changed, 13 insertions(+), 33 deletions(-) delete mode 100644 ch14/chapter14.playground/timeline.xctimeline diff --git a/ch14/chapter14.playground/Resources/Shaders.metal b/ch14/chapter14.playground/Resources/Shaders.metal index 946c689..cddf12f 100755 --- a/ch14/chapter14.playground/Resources/Shaders.metal +++ b/ch14/chapter14.playground/Resources/Shaders.metal @@ -33,8 +33,7 @@ float fbm(float2 uv) } kernel void compute(texture2d output [[texture(0)]], - constant float2 &mouse [[buffer(0)]], - constant float &timer [[buffer(1)]], + constant float &timer [[buffer(0)]], uint2 gid [[thread_position_in_grid]]) { int width = output.get_width(); diff --git a/ch14/chapter14.playground/Sources/MetalView.swift b/ch14/chapter14.playground/Sources/MetalView.swift index 2a6bdcb..c53b382 100755 --- a/ch14/chapter14.playground/Sources/MetalView.swift +++ b/ch14/chapter14.playground/Sources/MetalView.swift @@ -7,15 +7,6 @@ public class MetalView: MTKView, NSWindowDelegate { var cps: MTLComputePipelineState! = nil var timer: Float = 0 var timerBuffer: MTLBuffer! - var mouseBuffer: MTLBuffer! - var pos: NSPoint! - - override public func mouseDown(_ event: NSEvent) { - pos = convertToLayer(convert(event.locationInWindow, from: nil)) - let scale = layer!.contentsScale - pos.x *= scale - pos.y *= scale - } required public init(coder: NSCoder) { super.init(coder: coder) @@ -28,12 +19,11 @@ 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) - commandEncoder.setBuffer(timerBuffer, offset: 0, at: 1) + commandEncoder.setBuffer(timerBuffer, offset: 0, at: 0) update() let threadGroupCount = MTLSizeMake(8, 8, 1) let threadGroups = MTLSizeMake(drawable.texture.width / threadGroupCount.width, drawable.texture.height / threadGroupCount.height, 1) @@ -47,24 +37,21 @@ public class MetalView: MTKView, NSWindowDelegate { func update() { timer += 0.01 - var bufferPointer = timerBuffer.contents() - memcpy(bufferPointer, &timer, sizeof(Float.self)) - bufferPointer = mouseBuffer.contents() - memcpy(bufferPointer, &pos, sizeof(NSPoint.self)) + let bufferPointer = timerBuffer.contents() + memcpy(bufferPointer, &timer, 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: []) } } diff --git a/ch14/chapter14.playground/contents.xcplayground b/ch14/chapter14.playground/contents.xcplayground index 06828af..9f9eecc 100644 --- a/ch14/chapter14.playground/contents.xcplayground +++ b/ch14/chapter14.playground/contents.xcplayground @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/ch14/chapter14.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch14/chapter14.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index bbb890a256454901db20e18468c9392999305a99..dfb49fdd817393ecfcd44b4ef56adea10d68bebd 100755 GIT binary patch literal 25264 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 literal 22481 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 Z;;7=d;uJ?J3kZUL7Z~_==l|l={|DypZRr32 diff --git a/ch14/chapter14.playground/timeline.xctimeline b/ch14/chapter14.playground/timeline.xctimeline deleted file mode 100644 index bf468af..0000000 --- a/ch14/chapter14.playground/timeline.xctimeline +++ /dev/null @@ -1,6 +0,0 @@ - - - - -