From 189b8b986c1ad7f7f24ef49a1c117a38e9490d9a Mon Sep 17 00:00:00 2001 From: Marius Horga Date: Wed, 30 Nov 2016 00:25:19 +0200 Subject: [PATCH] updated to Swift 3 --- .../Sources/MetalView.swift | 20 +++++++++--------- .../UserInterfaceState.xcuserstate | Bin 23897 -> 24229 bytes 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ch15/chapter15.playground/Sources/MetalView.swift b/ch15/chapter15.playground/Sources/MetalView.swift index 39c41e9..a451e4d 100755 --- a/ch15/chapter15.playground/Sources/MetalView.swift +++ b/ch15/chapter15.playground/Sources/MetalView.swift @@ -13,42 +13,42 @@ public class MetalView: NSObject, MTKViewDelegate { override public init() { super.init() device = MTLCreateSystemDefaultDevice()! - queue = device!.newCommandQueue() + queue = device!.makeCommandQueue() setUpTexture() registerShaders() } func setUpTexture() { - let path = Bundle.main.pathForResource("texture", ofType: "jpg") + let path = Bundle.main.path(forResource: "texture", ofType: "jpg") let textureLoader = MTKTextureLoader(device: device!) texture = try! textureLoader.newTexture(withContentsOf: URL(fileURLWithPath: path!), options: nil) } func registerShaders() { - let path = Bundle.main.pathForResource("Shaders", ofType: "metal") + 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: []) + timerBuffer = device!.makeBuffer(length: MemoryLayout.size, options: []) } func update() { timer += 0.01 let bufferPointer = timerBuffer.contents() - memcpy(bufferPointer, &timer, sizeof(Float.self)) + memcpy(bufferPointer, &timer, MemoryLayout.size) } public func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {} public func draw(in view: MTKView) { if let drawable = view.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.setTexture(texture, at: 1) diff --git a/ch15/chapter15.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch15/chapter15.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index c4d17f04d1a4732723f46785516cecd21363cf71..e3db174bd8be02dcdd003d1e24b59f211923a3d0 100755 GIT binary patch literal 24229 zcmd742Ygf2`#*lpot-pIo3`mnI_YlHm2{^~(m|V0D3on2ZGb`-Y0Izz=Q3o7h>D1S zKnGh<6cJ^EsGzbzmLN`KgG^EUotxXVDS}o%-`C%N^Ln-Ez305obDrlp&pPMcp|zD2 zb@eeZM*#!`AOQtvz_4Gk`}+ruF`DWsYO4DO)(jnKEUT{@5Ljv|8&QET_X(`8sTBkG z+_JZwi9)~v8{h(5fdq61As`flfp8E3B0&_;0v*T(IUpD0fgT_q6aYOifS#ZNj0B@V zC8z?`pa#@}(ZB@iKs^`-CV^?-IWQZ%0A2$N!0TWkSOVSw>%qI=J+J}14>p1iz$Wks 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 literal 23897 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