From 1b040d7fb2d4046be81752baf8de26b9f550efc3 Mon Sep 17 00:00:00 2001 From: Marius Horga Date: Mon, 2 Oct 2017 15:16:35 -0500 Subject: [PATCH] updated to Swift 4 --- .../UserInterfaceState.xcuserstate | Bin 23527 -> 24439 bytes README.md | 1 + .../ao.playground/Sources/MetalView.swift | 10 ++--- .../UserInterfaceState.xcuserstate | Bin 16111 -> 16980 bytes ch01/chapter01.xcodeproj/project.pbxproj | 22 ++++++++-- .../UserInterfaceState.xcuserstate | Bin 0 -> 18144 bytes .../xcschemes/xcschememanagement.plist | 14 ++++++ ch01/chapter01/ViewController.swift | 2 +- ch02/chapter02.xcodeproj/project.pbxproj | 22 ++++++++-- .../UserInterfaceState.xcuserstate | Bin 0 -> 15368 bytes .../xcschemes/xcschememanagement.plist | 14 ++++++ ch02/chapter02/MetalView.swift | 10 ++--- ch03/chapter03.xcodeproj/project.pbxproj | 22 ++++++++-- .../UserInterfaceState.xcuserstate | Bin 0 -> 15298 bytes .../xcschemes/xcschememanagement.plist | 14 ++++++ ch03/chapter03/MetalView.swift | 18 ++++---- ch04/chapter04.xcodeproj/project.pbxproj | 22 ++++++++-- .../UserInterfaceState.xcuserstate | Bin 0 -> 15308 bytes .../xcschemes/xcschememanagement.plist | 14 ++++++ ch04/chapter04/MetalView.swift | 16 +++---- ch05/chapter05.xcodeproj/project.pbxproj | 22 ++++++++-- .../UserInterfaceState.xcuserstate | Bin 0 -> 15372 bytes .../xcschemes/xcschememanagement.plist | 14 ++++++ ch05/chapter05/MetalView.swift | 22 +++++----- ch06/chapter06.xcodeproj/project.pbxproj | 25 ++++++++--- .../UserInterfaceState.xcuserstate | Bin 0 -> 17144 bytes .../xcschemes/xcschememanagement.plist | 14 ++++++ ch06/chapter06/MetalView.swift | 8 ++-- ch07/chapter07.xcodeproj/project.pbxproj | 22 ++++++++-- .../UserInterfaceState.xcuserstate | Bin 0 -> 15197 bytes .../xcschemes/xcschememanagement.plist | 14 ++++++ ch07/chapter07/MetalView.swift | 22 +++++----- .../Sources/MetalView.swift | 11 ++--- .../UserInterfaceState.xcuserstate | Bin 0 -> 14019 bytes .../Sources/MetalView.swift | 15 ++++--- .../UserInterfaceState.xcuserstate | Bin 0 -> 12639 bytes .../Sources/MetalView.swift | 8 ++-- .../UserInterfaceState.xcuserstate | Bin 0 -> 12369 bytes .../Sources/MetalView.swift | 8 ++-- .../UserInterfaceState.xcuserstate | Bin 0 -> 12924 bytes .../Sources/MetalView.swift | 12 ++--- .../UserInterfaceState.xcuserstate | Bin 0 -> 12851 bytes .../Sources/MetalView.swift | 12 ++--- .../UserInterfaceState.xcuserstate | Bin 0 -> 12388 bytes .../Sources/MetalView.swift | 10 ++--- .../UserInterfaceState.xcuserstate | Bin 0 -> 12304 bytes .../Resources/Shaders.metal | 6 +-- .../Sources/MetalView.swift | 14 +++--- .../UserInterfaceState.xcuserstate | Bin 0 -> 13775 bytes .../chapter17.playground/Sources/Render.swift | 41 +++++++++--------- .../UserInterfaceState.xcuserstate | Bin 0 -> 13607 bytes .../Sources/MetalView.swift | 29 +++++++------ .../UserInterfaceState.xcuserstate | Bin 0 -> 12368 bytes memory/memory_1.playground/Contents.swift | 18 ++++---- .../memory_1.playground/contents.xcplayground | 2 +- .../UserInterfaceState.xcuserstate | Bin 7404 -> 13481 bytes .../memory_1.playground/timeline.xctimeline | 2 +- memory/memory_2.playground/Contents.swift | 19 ++++---- .../memory_2.playground/contents.xcplayground | 2 +- .../UserInterfaceState.xcuserstate | Bin 7518 -> 10425 bytes metal2/metal2.playground/Contents.swift | 4 +- .../UserInterfaceState.xcuserstate | Bin 0 -> 8878 bytes metal2/metal2.playground/timeline.xctimeline | 2 +- .../Resources/Shaders.metal | 2 +- .../Sources/MetalView.swift | 1 + .../UserInterfaceState.xcuserstate | Bin 0 -> 13076 bytes .../Sources/MetalView.swift | 10 ++--- .../UserInterfaceState.xcuserstate | Bin 0 -> 13151 bytes .../Sources/MetalView.swift | 10 ++--- .../UserInterfaceState.xcuserstate | Bin 11463 -> 12387 bytes .../Sources/MetalView.swift | 10 ++--- .../UserInterfaceState.xcuserstate | Bin 16111 -> 16984 bytes 72 files changed, 408 insertions(+), 204 deletions(-) create mode 100644 ch01/chapter01.xcodeproj/project.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ch01/chapter01.xcodeproj/xcuserdata/mhorga.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ch02/chapter02.xcodeproj/project.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ch02/chapter02.xcodeproj/xcuserdata/mhorga.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ch03/chapter03.xcodeproj/project.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ch03/chapter03.xcodeproj/xcuserdata/mhorga.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ch04/chapter04.xcodeproj/project.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ch04/chapter04.xcodeproj/xcuserdata/mhorga.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ch05/chapter05.xcodeproj/project.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ch05/chapter05.xcodeproj/xcuserdata/mhorga.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ch06/chapter06.xcodeproj/project.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ch06/chapter06.xcodeproj/xcuserdata/mhorga.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ch07/chapter07.xcodeproj/project.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ch07/chapter07.xcodeproj/xcuserdata/mhorga.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ch08/chapter08.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ch09/chapter09.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ch10/chapter10.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ch11/chapter11.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ch12/chapter12.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ch13/chapter13.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ch14/chapter14.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ch15/chapter15.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ch17/chapter17.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ch18/chapter18.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 metal2/metal2.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 particles/particle.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 raymarching/raymarching.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/ARKit/arkitdemo.xcodeproj/project.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate b/ARKit/arkitdemo.xcodeproj/project.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate index ce58460f160081eccba6bd516f1b932a992636d5..10da66eb451d2bc54178d258ffaf0b16c411cdc4 100644 GIT binary patch delta 11339 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 DG7Ya1 diff --git a/README.md b/README.md index 5241289..b5b05f6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Metal Repository to accompany the following blog posts: + - [Introducing the Metal framework](http://metalkit.org/2016/01/04/introducing-the-metal-framework.html) - [Using MetalKit part 1](http://metalkit.org/2016/01/11/using-metalkit-part-1.html) - [Using MetalKit part 2](http://metalkit.org/2016/01/18/using-metalkit-part-2.html) diff --git a/ambient_occlusion/ao.playground/Sources/MetalView.swift b/ambient_occlusion/ao.playground/Sources/MetalView.swift index bf69602..d4bd02e 100644 --- a/ambient_occlusion/ao.playground/Sources/MetalView.swift +++ b/ambient_occlusion/ao.playground/Sources/MetalView.swift @@ -38,12 +38,12 @@ public class MetalView: NSObject, MTKViewDelegate { public func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {} public func draw(in view: MTKView) { - if let drawable = view.currentDrawable { - let commandBuffer = queue.makeCommandBuffer() - let commandEncoder = commandBuffer.makeComputeCommandEncoder() + if let drawable = view.currentDrawable, + let commandBuffer = queue.makeCommandBuffer(), + let commandEncoder = commandBuffer.makeComputeCommandEncoder() { commandEncoder.setComputePipelineState(cps) - commandEncoder.setTexture(drawable.texture, at: 0) - commandEncoder.setBuffer(timerBuffer, offset: 0, at: 0) + commandEncoder.setTexture(drawable.texture, index: 0) + commandEncoder.setBuffer(timerBuffer, offset: 0, index: 0) update() let threadGroupCount = MTLSizeMake(8, 8, 1) let threadGroups = MTLSizeMake(drawable.texture.width / threadGroupCount.width, drawable.texture.height / threadGroupCount.height, 1) diff --git a/ambient_occlusion/ao.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate b/ambient_occlusion/ao.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate index 501a0aa435842d0c86aea6ba4307aa987ba3ece8..ecd30a0ac23b4951f34cf7511c2703ba5023f79f 100644 GIT binary patch literal 16980 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 literal 16111 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 diff --git a/ch01/chapter01.xcodeproj/project.pbxproj b/ch01/chapter01.xcodeproj/project.pbxproj index 2d19679..b1fbd4e 100644 --- a/ch01/chapter01.xcodeproj/project.pbxproj +++ b/ch01/chapter01.xcodeproj/project.pbxproj @@ -93,12 +93,12 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0810; + LastUpgradeCheck = 0900; ORGANIZATIONNAME = "Marius Horga"; TargetAttributes = { 29400C781C3AEE1300345568 = { CreatedOnToolsVersion = 7.2; - LastSwiftMigration = 0800; + LastSwiftMigration = 0900; }; }; }; @@ -163,14 +163,20 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -209,14 +215,20 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -247,7 +259,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = org.mhorga.chapter01; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -260,7 +273,8 @@ PRODUCT_BUNDLE_IDENTIFIER = org.mhorga.chapter01; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; }; name = Release; }; diff --git a/ch01/chapter01.xcodeproj/project.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate b/ch01/chapter01.xcodeproj/project.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..d52983f5f75ec22416de51d6d12f8f1f8e6aa395 GIT binary patch literal 18144 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 literal 0 HcmV?d00001 diff --git a/ch01/chapter01.xcodeproj/xcuserdata/mhorga.xcuserdatad/xcschemes/xcschememanagement.plist b/ch01/chapter01.xcodeproj/xcuserdata/mhorga.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..7b928cf --- /dev/null +++ b/ch01/chapter01.xcodeproj/xcuserdata/mhorga.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + chapter01.xcscheme + + orderHint + 0 + + + + diff --git a/ch01/chapter01/ViewController.swift b/ch01/chapter01/ViewController.swift index 994db6f..129eef5 100644 --- a/ch01/chapter01/ViewController.swift +++ b/ch01/chapter01/ViewController.swift @@ -23,7 +23,7 @@ class ViewController: NSViewController { } label.stringValue = "Your system has the following GPU(s):\n" for device in devices { - label.stringValue += "\(device.name!)\n" + label.stringValue += "\(device.name)\n" } } } diff --git a/ch02/chapter02.xcodeproj/project.pbxproj b/ch02/chapter02.xcodeproj/project.pbxproj index 98f74a4..10e92f9 100644 --- a/ch02/chapter02.xcodeproj/project.pbxproj +++ b/ch02/chapter02.xcodeproj/project.pbxproj @@ -93,12 +93,12 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0810; + LastUpgradeCheck = 0900; ORGANIZATIONNAME = "Marius Horga"; TargetAttributes = { 29E74ACC1C4159D60023A39A = { CreatedOnToolsVersion = 7.2; - LastSwiftMigration = 0800; + LastSwiftMigration = 0900; }; }; }; @@ -163,14 +163,20 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -209,14 +215,20 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -247,7 +259,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = org.mhorga.chapter02; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -260,7 +273,8 @@ PRODUCT_BUNDLE_IDENTIFIER = org.mhorga.chapter02; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; }; name = Release; }; diff --git a/ch02/chapter02.xcodeproj/project.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate b/ch02/chapter02.xcodeproj/project.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..49e5814a33fa009afe39a219ae0d955b1c0da50f GIT binary patch literal 15368 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�FpA=?QQSr6-Fce15+r;i>TX;8Yf<=qu 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 h8?x7Ahq5 + + + + SchemeUserState + + chapter02.xcscheme + + orderHint + 0 + + + + diff --git a/ch02/chapter02/MetalView.swift b/ch02/chapter02/MetalView.swift index 48617b0..5451f30 100644 --- a/ch02/chapter02/MetalView.swift +++ b/ch02/chapter02/MetalView.swift @@ -20,11 +20,11 @@ class MetalView: MTKView { rpd.colorAttachments[0].texture = currentDrawable!.texture rpd.colorAttachments[0].clearColor = MTLClearColor(red: 0, green: 0.5, blue: 0.5, alpha: 1) rpd.colorAttachments[0].loadAction = .clear - let commandBuffer = device!.makeCommandQueue().makeCommandBuffer() - let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: rpd) - commandEncoder.endEncoding() - commandBuffer.present(drawable) - commandBuffer.commit() + let commandBuffer = device!.makeCommandQueue()?.makeCommandBuffer() + let commandEncoder = commandBuffer?.makeRenderCommandEncoder(descriptor: rpd) + commandEncoder?.endEncoding() + commandBuffer?.present(drawable) + commandBuffer?.commit() } } } diff --git a/ch03/chapter03.xcodeproj/project.pbxproj b/ch03/chapter03.xcodeproj/project.pbxproj index dc830fa..80f7018 100644 --- a/ch03/chapter03.xcodeproj/project.pbxproj +++ b/ch03/chapter03.xcodeproj/project.pbxproj @@ -96,12 +96,12 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0810; + LastUpgradeCheck = 0900; ORGANIZATIONNAME = "Marius Horga"; TargetAttributes = { 29CB598B1C4461E90004DB55 = { CreatedOnToolsVersion = 7.2; - LastSwiftMigration = 0800; + LastSwiftMigration = 0900; }; }; }; @@ -167,14 +167,20 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -213,14 +219,20 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -251,7 +263,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = org.mhorga.chapter03; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -264,7 +277,8 @@ PRODUCT_BUNDLE_IDENTIFIER = org.mhorga.chapter03; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; }; name = Release; }; diff --git a/ch03/chapter03.xcodeproj/project.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate b/ch03/chapter03.xcodeproj/project.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..206d02a35fdfddffd4aea789a747d544b178ea6c GIT binary patch literal 15298 zcmb_@2V9fa`u`bk)eOj+0107)mn=3WD1uw2qJoqFZexImsX%BFR2=O|t!?dIcHG`p zfmW-nU3T2w?mceX+p1l+d+%xY{68lz2}Esg@8|ayfj94Y&U2n~&U3!cI1g>TUA|z* z;W&gaB8VaZ9f!sUrwUsaS=V|4L7%^8k=5UJg10>sTx|6O+E@GFb+a|(@6{oE+Rhub zxE75?<4_VxMk&aK>?jB2qCAw33eb2o3C&0Kr~xfNjp%sPgj}c@wV+nC5G_Y5P&?{I zJ;;xG(TOO4`q0UUp;OW6=mK;hx(Hp2Za_Dpo6ybZ7PKGTif%)Ec5BB3eycRPY#;4#d_;h?Z{u{mm{~ce6 zufjX0~;c&Y;b-g|^a# zbP-)lm(Znj8C_1>sgG`?o9Jd5rl--<=>_ycdJ(;p?xy?c?etE1H@%NONFSk((|^%t z=mGjXeTBYCU!z~qujyg>4gHpWN57{(&>!hf^k@1D{gwVEj1v@sQcwv=LZ)C6vII%U z7R-W0C=!Z=@q$B`B1{#g3Dbqy!W^Mam@h07mJ2Hcx3E&^5ITj`f=}ocg2FmsgK)C2 zrN!FQ*VT0pDUcGWkQ!-_ZefF~c#XF|xCDL=YjUf#y~`5}4x$8<$Oxl@NJLsDu#cJ9 zEn3SaI!a0>lvNZ>EGwB*G_kzYSyWN$EH5f6nOI%nD5hcEM zHI+5hwN+JVmDl zpbtiIi&@ZC(H?^19-C#{5G!JRYXhEc=#UzF0d$q4cpX56uop$BnD0afNWMTTgxaFG zg9#Om8#8^zU&I?RdF(iaQl(BvOwngp^9u^cmrg31B5ykgT{fv)nmD;sa!zzOq{$^E zk^{a*)1luulDqYyaC6A;`QzR4sUP3e}Y@o@fk$7ba?4SYiX6E zrgUR<(1_n6Urx)SC^GkxWyFc8`Xl5eK@EQwYsF_VSQV) zF0$5j)u27S99)AT(3!dp_~BdS^9Gng%w^+Rxr~!09x$XD)0W7J+5-!`NPhGN-J+?% z)fnsEQdiT%r_j;lUF8jUd)mE&#`HxEt_2a$KA36JWMx~9aRvq?rW!Ca4NE#`vukp4 z^I!)XT(0(j*V{AS)9>#KwY1b#yFvk9PbVx*e3Q$!!OPU3xQTFHoK=;z<+U}nMH9*^ zYKkUT*VYtOO`cF%nrwrnHcghJSbiH^-MwW8t`@f-(>(hoYEnvw}z zEgM|&>dSJ-&%;`l72h^m-UtN~nU?8*$HtAI3x(3e(z4Bk(nhWih0^3nj?J6hqJHB> z_~790qf$A`HgmDcCxcj{#~v(Chu2f5Eo*R9``|SAdpv>u!KvwPQPbd>=k51)R1Dk1 zS7*+usI024shvHiZtlGK^$iOej&E``x3n&ga*W6aJJIY5@dKuXeU^uk54Se}ZFNCl z+S=f1sjI7oO{@#ndwe}^QEYJ4`U1faQ1<$JI=q3U4X!EC6jScH>exIR`nuad^)RDsjDisbfRwM}{ z#1G>~@#FXl{0o>uktBf$oCF4L37EJQWCIwo%gAoB7mV25hy zCY?uD&=V-5=Yiq5h;FBs(97uM^a^?<-9ZQF5Q_XGSpE%8M%+KTi>VJF2XewxCLHTv z!A8~hg*e7?cpU<=iKrCzf`1x0P{XFB3{@cO9#oDdqbX=AnueyM8E7V&#S-C2MRbrQ zv1FFQ^m|YxV0|^JLA7W$ngh>snE?>r$a2^M*2I>=^9qjq`idZj1W!+>ro#tlACxx} zb|0|Cwc5X~!L!!a>46rvSTq`{;&8boW<`YQrnj|(t1)avuDlUc;N^ES|mdT+Ns z&_6ri>0MpzZR_jo1iK*?{vqRPZ_wA-6UTQMXFk$5DyJ-h&l_A0%;dT7ZX!}d?c*Y} z1X%~rVwN_5ma=p{du?@Vb4=j6kheQ{AY#MasBI9fL>`vGEX)>V(1BJX-4ODkRj89? zG84-hLOxj9HB5r#%x320z-|Otm+?;{woQbOT=aTRXOAz`*Wqon%sQ1tv_;mCAPU8w zcoamX(XrQ}4aXdNb7X8QGh1f$?i|G|j81{mHmq6|fq^N5 zRHHf=gPS3=b@cFOptF&62yH`WqO({o%VYUN=p1wwI*%2wd^Vl0W#%Go5sG2;=lMd# zv3)PD3kLhR0nxg=UEtAsJ7P_4QTl^EU;+BtLwx~nbo$%T0J2_(EoP(*V>EQ>s zLpI3q(}edh_YB~{4^x%DyEots2E85NQMIp$fOBL3-WaUxZ|?8qAPv-2;8J;dfe;3X ztlsE%oQ$vNFjwf<)CcCAJ4D>O0x`k5A1xhsHDY{c2mF1#!|MJ|bk|N+E^EX+=-w6p za&Kr5-GfTOX&7a<%AAE#`GiTEH;)#RGO{IA_1v@V3&z@FJE;L~(VgTSqH}u%y@qrH=v7udfL>=c z+;``st)4DW@`~VS(znsO9BYw~x@L$U2BVMxU@btd2i?3=ead zz42(;!|2=C$ltMf%p7I%Bl-zhckYZV-;tX&sdV$^DBW*hqlQJtm^H*0U;!T|GZ?1C zYwlRtnqeKcKO@afG%b&YKpaRSClJYz~3D+ z{!!LCoE!yVoWfkp9?>M6irR*-5$t(7Yi6x%Q4Dmk37d}szNtvUHgLI8Sqlfg6C=2X zqC@22qN94uf*ua0haL-gkF%smmuQcPxctZ-crx^u$`(V9C47^)nTeSgZdd?sXT>p@ zg{%0YRp3gtj4dAoyTGkND&Lm$*wPFG3AY2o@B&L0YpsKI19%7lq>Q47N;wxdgZ0Pr z@O)g48}I_$h>yoj*u~szCG)U0*3LSZm#t!*dqDP95TFuO;w9i3EyK$}kk#;QfUo=6 zA@)3bjSD97p`*4`w$OT*sBAtt2)f~X^mKRv9o(vNVz~(pYO9>6kw3fo+PZ;y$*7KE z67;C{uJZJCg(4%!?4{vXBe6si1VY{*=!=JYx*XP`0>v!zlCDT>FzRq&A6^4`gim0; z0o=t-;FGb*qYpbUe>6aJHG6S@GdPj08Nfl-#q7=8>y5Uq!y7>(@Os>jH?VHj!~8>d z6RhS*tQS`BUak>&al>&O@w&iQ>gkL;#vFI>NZ{1O(+(TLBj3;V`n$cMK)-w>PQ|AU z;H~ULwl6Bw8Tfo;-3^ZInc&)qK`zL(e#qMVIWq@-LKa(4frLs&BX~C$;AqBT%@f!mBA)_j^a731!e`6GfkI|MM zZL3)iFu=2UBRf8()X72Pgjqd?UUI-^@;7TiB`WEOs_Khuz3`sVL%MOlXuD z%TsO)c-Q*;eZjbwk;uj^794}#9rv!TXO&;(19_9U7Wr*)(BBtm_s$2ex;V(4;k6NG zxbPUHQ9+tLfllwR13oOrvE&|>qq5J})d2>Y!$dGD$+6f+?N@Zo=lk2EXUu*KX@=R4 z76!H`j&Nk|(Ji_g-xF^;?#Bbb&O0?K;J5fk@Xhge_mq+8uG^rGvb;=R)h$!BIG!BSq!MiIHCaukSK_fsEC>*kVJMl`y0E0{heLO zuG$4bxR%={l1!4>4z@R9m9A&ka}c-098@W?ClVY|NLz*ar78f}PJbYRr^cvi#}h@` ztbaJWY9E|OPk+R&iI!1h(J>-kTpX1g)J!;rddOTxFJ+VqN61l3 ziG^5+jo3*J+sOvm5WAXP!*;RV>{_;m*$yBT$tMM*a4}>qgOOAi8-R0wtG&Hl{(heE z-L$D{L49RiLydb*U3FufyRN=sc8x3IzmsAzK9VOIj_BlE+7P^Upi)RE$e*KQOyHc2 zah&TQS5z^7zPquac}|pU5+}39k-3_i>Kfg{#5L9K#-;_;Emh6Y9+PE}=lgor07`Az zG{4&2)Y8Ctx?MFDO;vLu{6S=SuG2Vq8g7J`$kQ3=P}fkqpmBbktJz&!H@_xIH#l5RsGeWr2A`v$xvsXZrYYK`l6OfxR+ol~`WWLHPBq=N&bKNg@gNP3XFw`~ z#}2PF+uP#}M1XVCCfCBc+Gcm;=LGkH%DGjr1hq9yH4RlUR&zM3+@n~{_w;o3c{;sO z9<4P^uDS&cvUbcxZ3AQ;yKZFn7yRD^60sc7Z6QsAJo1}GbmTO1!b+B_2x=bcphIlJOmND@mj z$a}Dw!WOQ~b;MHxTK@ie=BuF4Lz+=i0KT1Aokv@$c zUto~*@iqNZnxvDXp>)Kqe2Tv${bU2!jDIkQmiaiF2;`EFweExDB+mX=O>$30!tzB= z+@g$#8}IfFl2bT4elhfy=ttJWEtbjaF9Ynb^0@kXd;Nh>v22Q>`&S%CbC8?{tA0A< zWVhij`RzfQC+LN&a&f@h1?O+Ammzi!J5Qd@+2kC^Q-D<+BxiHohO0Mn9^b|g9@_6)Nx zn(ti|$!0EY@^!9`JS~v}3>p9V4NS}}iG?}QGjKK8!-u(s?1BvQwd_&$7<-&OaW$kq zD#`T_9!>#GdU7~KZ1n_u-1~-vp?6&*B5d-klhX$c}f?uym2HE?mPsLSM64~QXjG1caS^5e?IiQWoBLs8!qdxW!ARxxRHM*zaQC`A|z45UV*-^a%YyOilWi2oJ3f5 ze}u;&I+l*33Z$Y+vVp2;0^EKD{Qi)vYdr96;L*5f==ApZ`i8y!NSSz)SqNIA#NDZiE5!6?7b-*oNYp(}>hL*O=`5QSI zDRm4xuz!RUOSw-r9KFLx@39Zq8>29v8fhBGe45GLWp73x`kjd0(JVNvRAO(%0GIM} z(aYYB$Jal@#JD-pBAAsPwU7;{g}o1=e852yaDkTak<_pV`y$vuC($yum;-wevjuUt z8S#rgNXt1A{#9~$gei0?__BXtgh4uubN?%(VE+E_esTCX!gW<0BQ}!AAoPEK*WM8qb*i+S3gek! zJS&VV!?=orKyoD{z1H;leLbOI16pMWU2w0Aa;#-RBq8R-xCaRm#fPQ3`epya<@vb03DHzaJ>W;3V;nxQPh0MH<^HM zY4Q`l*y!nm(R$>R6AxE`JQ^&-$W!GEdAu#+B1e~T1zic4fiGcq4NwpJmf52X9ds3M zxRl*JKs(uYBMm1|NGJVys)7c2s)DY?H`4Wxs`x&Vs`vp?6+c3%0#^8sLhU~bQf2)< ziR<^t?59yNDLsX5;V~)uh5gK9PD>b8tGY)sPWe!dJg`Xp2vQJ zsPT6$(CFYMKHu<{;zU`ti@9vu!x+U(4BVgY__Oek?xbLP016;H3}d*@RRJIvAUuQs zQRaCq1XFYm-Ak{d*VBFU26`jCiQXK>B#dbo3t@a*7>^0#v0*$ej1^%>W7~$q0eTzv ztN%(Y6$wn}KREe+4Up(voa}!Ikm$X#9DgxDq7QKL{~jRGhdJH<6d=*Zc$fbcAkil| z)&G|Oi9XF){ciyh{Wky7AoC%-Ji$jr2psRY`5?`>U%hxHFMd{_&)sVJq z_tpg$`oJNETSUOr(GAf<39f_uI%2UykWYn+)YwazNv)^b*VPXR=+O+gXV=9;UT_#k zzpo2|I{`I1A@9;|PrE<3-svcIP5^x9SR3ky$W+t?sl~1$NayzU!4<}o$j8s z3@)o(gogDXJQFu*Qe3u2i!&eLZawEPeQWq0J6+w;Kt`QQ1L_s5n z0_>wDjPt{|IE+iecv8$o6q1EhE_sTe7hr3xVQdRy`;cH1(gfJaoG{J}<2)|9{iwm> zBy9}%z;g=0CKUWRVI^cmTwd_aqzkCDgo1HiD$1v{MNGfc27X_zKdaVAFgfgK#jK_zuBaEHAzwD!nNW9&GMn3kSl z&nbYKzU=a8kz%Tbrk2Ia+PuSsopR}4EO|CuSO>Kl6(LB^wSmS5p`bIJ(Z#O5_I9tg z!`pFCt5YWFjXa1wq6~B}IfV)AxIqIizcjLBsP(A@e;X(v^XU&fpJ~dHl-XvB)dnrR z$&k&)`b1X}Rvs+xjuT)(9Q0dp*QpdSh`nx&~ zD0B1j!HCG?jc^(@2?JAb!3!M|hl+~FGbNOXs)w8+d%1Dcd#4!hWMclDUuHuVq=GDi_tf0q&#v`j{793w6E19XA z3;9T1*>-ffjB8#!bZ=bfqvqzLgFnQkDii+B>3pGT6??TP0UX##R){N_aiW;A$8Vswa{2+lsbHc ze!v)N3C2MAfD&7v=)DGt-Rt0%x*50PMQ{$Zyc*-upNRowx!Xnu{&0*Jv@zgM$F8ilo6#pEa<)He% z5JB-D*kB%U#v7|R`@xAK^_KsYvKcO;B9sRN4^jzjLOWog^iW+jSu^gaq3eWe2agAH7_@D2~#@F*p zG@cAA4)U!2F;rhTO*p+J60t_K-w1{A1*jA%D`%2_L*nUes096%{6aCM@J9B}IjSMmUez6{dsX+V9#lQ7`j_fy)xTBGsSc_RtH-MI)n)1ib)&jT z-K=g^FH$d2FH^5juT;0GJJcK1o7E?)!|E;St?JX&+tg>N&rzSJzCeAEdY}4k^^58+ z5)uY@T$8Xj;emt)6aJO(RKha}FDAU3@KwU$gl`kR zPxvw6=Y(Gqm5J)a#6&SsmzbQWPfSf5pXf?FC2=5ef8za#4<$a5_;})ziBBcIp7=@P z=ZRk?9!~r=@p}!{Bx;g0DH?+&Lu1lN8nectDbh^QOxMiRRBEa%~^FT|7bT5_`m6ah=#NZWK3*CyQr@+r__& zSBX2tL2-|Gow!fDQM_4vSbSRikNAf8miUhNq4=@*srb28tu5A0)i!7wwN2V)ZL4;X zc8PYGc7=AOHmL2>uG98wH)=O)Pu7ODTeMrXr)&SF-LHK>`;zt@?T@+)okKTOH%B*5 zSFdZ-HR+mln{?ZBXY0<@U7)*2w_W!)-EQ3tx|?*j=x){BrMpLWpY8$OL%J`L#wKMY z8Io|$x?Dr^0ed`$+MCxldF?!ljkJQO+? z)AeS(Rd3hl>htvt`i1%q{Th9@-mgDVzh1vVze#_Rp6R#guhHM4-><(_f4lxZ{e$|4 z^^fXb)W4b0ql zr+$|Dol#*_854{eqt=*YOfedaMq|1$(`Yw3j3vfaquY3*alJ8YJkxl#@mk}}#{I_s z7~e6zm!?S5r6s31)25_NOY2DMPV=XonRZdy_O$2IUQc^7U6r1kZb&z#r>9%f?dhx1 zSErwtzBc{j^d0HD(jQHKHT|RXkJCR%|15)Kq-0n#$}(ITEg1_l7H2HYSe|iS#$_2- zWL%lCBjfsvJ2LLcxG&>@jE6Fw&Uhi?+l-$wjhW`m@tMxd37MstGcubq7iao2*Jlo8 zUYmI^^EH#fWHl9<%1u*D(@Zl=vrYA;Ceu>W3e!qco2lP)n&~{#1*VHk+fA36cA5rF zSDSX3t~Kp7?Kj3V6ubenXCbfIs29D*RtQpek=RC>>sj!%Kjz$ zH#0IT%xZI@Su|&wv&`VTn~Tho%vI(Z^K5gSxy{^RUS(cwKEWI`uQjhXZ!m8$?=#tog@tpBpUWc|SU zk@XYnXVx#QUs(@ZzqJXrF}86wrA=*1w23yIE!kFVn`?8~T5XGLOKfXw-8R4NL|f3d z$+pdQzU@NW#kNaqSK4;i25dvNYiv*2-nV^W``Y%c?R&dm*V>cpDRzV1Xiv9i+Vky2 zc89&hKG8nOUT&Xaud=t=7u%QF-S#%S*S^}m#@=H;(H^vKvY%uhv|nf6XMe(ez<$X7 zbB>TRCMQ2VbHFtV$ZSI`h zGjg}*UY2`B?p3)1xkI@(=iZh3c<#%&ujamy`*!YoxgX|!lKXk?S9v7wxV*7>iad3m zCQp}_l4r;>=2`NJ^JeF*$P4D3k+(DN&b&wRKF<3p@9Vsu^T*|D@^$$s`KkF?`R06E zeolT~{<8da`RC_fo_}@z?)<&^`|@wf-=BY5{)72Xp0(WrDLyS zpW`OSe#h;OI~{jBo^U+nc*gOZFZ#&;}e(3zzdD!`#^9ScoCA35+8B?MuNiH#z7)#Pia!c|{ e3QNY91WUG-oLO@Iu+L27-@+MjE;A~*@c#jUV$>o4 literal 0 HcmV?d00001 diff --git a/ch03/chapter03.xcodeproj/xcuserdata/mhorga.xcuserdatad/xcschemes/xcschememanagement.plist b/ch03/chapter03.xcodeproj/xcuserdata/mhorga.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..026cf9f --- /dev/null +++ b/ch03/chapter03.xcodeproj/xcuserdata/mhorga.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + chapter03.xcscheme + + orderHint + 0 + + + + diff --git a/ch03/chapter03/MetalView.swift b/ch03/chapter03/MetalView.swift index e7512d2..72b37f4 100644 --- a/ch03/chapter03/MetalView.swift +++ b/ch03/chapter03/MetalView.swift @@ -28,7 +28,7 @@ class MetalView: MTKView { 0.0, 1.0, 0.0, 1.0] let dataSize = vertexData!.count * MemoryLayout.size vertexBuffer = device!.makeBuffer(bytes: vertexData!, length: dataSize, options: []) - let library = device!.newDefaultLibrary()! + let library = device!.makeDefaultLibrary()! let vertex_func = library.makeFunction(name: "vertex_func") let frag_func = library.makeFunction(name: "fragment_func") let rpld = MTLRenderPipelineDescriptor() @@ -38,7 +38,7 @@ class MetalView: MTKView { do { try rps = device!.makeRenderPipelineState(descriptor: rpld) } catch let error { - self.print("\(error)") + self.printView("\(error)") } } @@ -46,13 +46,13 @@ class MetalView: MTKView { if let drawable = currentDrawable, let rpd = currentRenderPassDescriptor { rpd.colorAttachments[0].clearColor = MTLClearColorMake(0, 0.5, 0.5, 1.0) let commandBuffer = commandQueue!.makeCommandBuffer() - let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: rpd) - commandEncoder.setRenderPipelineState(rps!) - commandEncoder.setVertexBuffer(vertexBuffer, offset: 0, at: 0) - commandEncoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) - commandEncoder.endEncoding() - commandBuffer.present(drawable) - commandBuffer.commit() + let commandEncoder = commandBuffer?.makeRenderCommandEncoder(descriptor: rpd) + commandEncoder?.setRenderPipelineState(rps!) + commandEncoder?.setVertexBuffer(vertexBuffer, offset: 0, index: 0) + commandEncoder?.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) + commandEncoder?.endEncoding() + commandBuffer?.present(drawable) + commandBuffer?.commit() } } } diff --git a/ch04/chapter04.xcodeproj/project.pbxproj b/ch04/chapter04.xcodeproj/project.pbxproj index 758c724..6a06372 100644 --- a/ch04/chapter04.xcodeproj/project.pbxproj +++ b/ch04/chapter04.xcodeproj/project.pbxproj @@ -96,12 +96,12 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0810; + LastUpgradeCheck = 0900; ORGANIZATIONNAME = "Marius Horga"; TargetAttributes = { 29C87D3C1C56E93A005F4615 = { CreatedOnToolsVersion = 7.2; - LastSwiftMigration = 0800; + LastSwiftMigration = 0900; }; }; }; @@ -167,14 +167,20 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -213,14 +219,20 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -251,7 +263,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = org.mhorga.chapter04; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -264,7 +277,8 @@ PRODUCT_BUNDLE_IDENTIFIER = org.mhorga.chapter04; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; }; name = Release; }; diff --git a/ch04/chapter04.xcodeproj/project.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate b/ch04/chapter04.xcodeproj/project.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..54cb2eec97504110c46b45d30da44c136238f0c0 GIT binary patch literal 15308 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 + + + + SchemeUserState + + chapter04.xcscheme + + orderHint + 0 + + + + diff --git a/ch04/chapter04/MetalView.swift b/ch04/chapter04/MetalView.swift index 13712ee..34927a8 100644 --- a/ch04/chapter04/MetalView.swift +++ b/ch04/chapter04/MetalView.swift @@ -35,7 +35,7 @@ class MetalView: MTKView { } func registerShaders() { - let library = device!.newDefaultLibrary()! + let library = device!.makeDefaultLibrary()! let vertex_func = library.makeFunction(name: "vertex_func") let frag_func = library.makeFunction(name: "fragment_func") let rpld = MTLRenderPipelineDescriptor() @@ -49,13 +49,13 @@ class MetalView: MTKView { if let drawable = currentDrawable, let rpd = currentRenderPassDescriptor { rpd.colorAttachments[0].clearColor = MTLClearColorMake(0.5, 0.5, 0.5, 1.0) let commandBuffer = commandQueue!.makeCommandBuffer() - let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: rpd) - commandEncoder.setRenderPipelineState(rps!) - commandEncoder.setVertexBuffer(vertexBuffer, offset: 0, at: 0) - commandEncoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) - commandEncoder.endEncoding() - commandBuffer.present(drawable) - commandBuffer.commit() + let commandEncoder = commandBuffer?.makeRenderCommandEncoder(descriptor: rpd) + commandEncoder?.setRenderPipelineState(rps!) + commandEncoder?.setVertexBuffer(vertexBuffer, offset: 0, index: 0) + commandEncoder?.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) + commandEncoder?.endEncoding() + commandBuffer?.present(drawable) + commandBuffer?.commit() } } } diff --git a/ch05/chapter05.xcodeproj/project.pbxproj b/ch05/chapter05.xcodeproj/project.pbxproj index f1362b3..164439c 100644 --- a/ch05/chapter05.xcodeproj/project.pbxproj +++ b/ch05/chapter05.xcodeproj/project.pbxproj @@ -96,12 +96,12 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0810; + LastUpgradeCheck = 0900; ORGANIZATIONNAME = "Marius Horga"; TargetAttributes = { 2980371E1C62437900FBBC6A = { CreatedOnToolsVersion = 7.2.1; - LastSwiftMigration = 0800; + LastSwiftMigration = 0900; }; }; }; @@ -167,14 +167,20 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -213,14 +219,20 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -253,7 +265,8 @@ PRODUCT_BUNDLE_IDENTIFIER = org.mhorga.chapter05; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -267,7 +280,8 @@ PRODUCT_BUNDLE_IDENTIFIER = org.mhorga.chapter05; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; }; name = Release; }; diff --git a/ch05/chapter05.xcodeproj/project.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate b/ch05/chapter05.xcodeproj/project.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..50c7ce8360052e4674f1828af68c91d3bbcf3339 GIT binary patch literal 15372 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 + + + + SchemeUserState + + chapter05.xcscheme + + orderHint + 0 + + + + diff --git a/ch05/chapter05/MetalView.swift b/ch05/chapter05/MetalView.swift index 73ad3bf..44ff391 100644 --- a/ch05/chapter05/MetalView.swift +++ b/ch05/chapter05/MetalView.swift @@ -87,7 +87,7 @@ class MetalView: MTKView { } func registerShaders() { - let library = device!.newDefaultLibrary()! + let library = device!.makeDefaultLibrary()! let vertex_func = library.makeFunction(name: "vertex_func") let frag_func = library.makeFunction(name: "fragment_func") let rpld = MTLRenderPipelineDescriptor() @@ -97,22 +97,22 @@ class MetalView: MTKView { do { try rps = device!.makeRenderPipelineState(descriptor: rpld) } catch let error { - self.print("\(error)") + self.printView("\(error)") } } override func draw(_ dirtyRect: NSRect) { if let rpd = currentRenderPassDescriptor, let drawable = currentDrawable { rpd.colorAttachments[0].clearColor = MTLClearColorMake(0.5, 0.5, 0.5, 1.0) - let commandBuffer = device!.makeCommandQueue().makeCommandBuffer() - let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: rpd) - commandEncoder.setRenderPipelineState(rps!) - commandEncoder.setVertexBuffer(vertexBuffer, offset: 0, at: 0) - commandEncoder.setVertexBuffer(uniformBuffer, offset: 0, at: 1) - commandEncoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) - commandEncoder.endEncoding() - commandBuffer.present(drawable) - commandBuffer.commit() + let commandBuffer = device!.makeCommandQueue()?.makeCommandBuffer() + let commandEncoder = commandBuffer?.makeRenderCommandEncoder(descriptor: rpd) + commandEncoder?.setRenderPipelineState(rps!) + commandEncoder?.setVertexBuffer(vertexBuffer, offset: 0, index: 0) + commandEncoder?.setVertexBuffer(uniformBuffer, offset: 0, index: 1) + commandEncoder?.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) + commandEncoder?.endEncoding() + commandBuffer?.present(drawable) + commandBuffer?.commit() } } } diff --git a/ch06/chapter06.xcodeproj/project.pbxproj b/ch06/chapter06.xcodeproj/project.pbxproj index d317b25..b2cb9ce 100644 --- a/ch06/chapter06.xcodeproj/project.pbxproj +++ b/ch06/chapter06.xcodeproj/project.pbxproj @@ -93,13 +93,14 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0800; - LastUpgradeCheck = 0810; + LastUpgradeCheck = 0900; ORGANIZATIONNAME = Marius; TargetAttributes = { 2984512B1D47EF08008D81B9 = { CreatedOnToolsVersion = 8.0; DevelopmentTeam = C2X9Q6VFVJ; DevelopmentTeamName = "Marius Horga"; + LastSwiftMigration = 0900; ProvisioningStyle = Automatic; }; }; @@ -166,7 +167,9 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; @@ -174,7 +177,11 @@ CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -197,7 +204,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -216,7 +223,9 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; @@ -224,7 +233,11 @@ CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -241,7 +254,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -260,7 +273,8 @@ PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -272,7 +286,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = org.metalkit.chapter06; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; }; name = Release; }; diff --git a/ch06/chapter06.xcodeproj/project.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate b/ch06/chapter06.xcodeproj/project.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..7e84e1f141998be7e376b12f0d99784112664ced GIT binary patch literal 17144 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 + + + + SchemeUserState + + chapter06.xcscheme + + orderHint + 0 + + + + diff --git a/ch06/chapter06/MetalView.swift b/ch06/chapter06/MetalView.swift index 7570bd4..6f44d71 100755 --- a/ch06/chapter06/MetalView.swift +++ b/ch06/chapter06/MetalView.swift @@ -29,9 +29,9 @@ class MetalView: UIView { descriptor.colorAttachments[0].clearColor = MTLClearColorMake(0, 0.5, 0.5, 1) descriptor.colorAttachments[0].texture = drawable.texture let commandBuffer = commandQueue.makeCommandBuffer() - let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: descriptor) - commandEncoder.endEncoding() - commandBuffer.present(drawable) - commandBuffer.commit() + let commandEncoder = commandBuffer?.makeRenderCommandEncoder(descriptor: descriptor) + commandEncoder?.endEncoding() + commandBuffer?.present(drawable) + commandBuffer?.commit() } } diff --git a/ch07/chapter07.xcodeproj/project.pbxproj b/ch07/chapter07.xcodeproj/project.pbxproj index 0d1d83c..4dc85b4 100644 --- a/ch07/chapter07.xcodeproj/project.pbxproj +++ b/ch07/chapter07.xcodeproj/project.pbxproj @@ -99,12 +99,12 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0810; + LastUpgradeCheck = 0900; ORGANIZATIONNAME = "Marius Horga"; TargetAttributes = { 29D878251C84D2B0007B5F17 = { CreatedOnToolsVersion = 7.2.1; - LastSwiftMigration = 0800; + LastSwiftMigration = 0900; }; }; }; @@ -171,14 +171,20 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -217,14 +223,20 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -255,7 +267,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = org.mhorga.chapter07; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -268,7 +281,8 @@ PRODUCT_BUNDLE_IDENTIFIER = org.mhorga.chapter07; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; }; name = Release; }; diff --git a/ch07/chapter07.xcodeproj/project.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate b/ch07/chapter07.xcodeproj/project.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..dbc5bd500951e782c19904d43e18ee6408df49c1 GIT binary patch literal 15197 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 + + + + SchemeUserState + + chapter07.xcscheme + + orderHint + 0 + + + + diff --git a/ch07/chapter07/MetalView.swift b/ch07/chapter07/MetalView.swift index b20b49c..d8f0e84 100644 --- a/ch07/chapter07/MetalView.swift +++ b/ch07/chapter07/MetalView.swift @@ -35,7 +35,7 @@ class MetalView: MTKView { } func registerShaders() { - let library = device!.newDefaultLibrary()! + let library = device!.makeDefaultLibrary()! let vertex_func = library.makeFunction(name: "vertex_func") let frag_func = library.makeFunction(name: "fragment_func") let rpld = MTLRenderPipelineDescriptor() @@ -45,7 +45,7 @@ class MetalView: MTKView { do { try rps = device!.makeRenderPipelineState(descriptor: rpld) } catch let error { - self.print("\(error)") + self.printView("\(error)") } } @@ -53,15 +53,15 @@ class MetalView: MTKView { super.draw(dirtyRect) if let rpd = currentRenderPassDescriptor, let drawable = currentDrawable { rpd.colorAttachments[0].clearColor = MTLClearColorMake(0.5, 0.5, 0.5, 1.0) - let commandBuffer = device!.makeCommandQueue().makeCommandBuffer() - let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: rpd) - commandEncoder.setRenderPipelineState(rps!) - commandEncoder.setVertexBuffer(vertexBuffer, offset: 0, at: 0) - commandEncoder.setVertexBuffer(uniformBuffer, offset: 0, at: 1) - commandEncoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) - commandEncoder.endEncoding() - commandBuffer.present(drawable) - commandBuffer.commit() + let commandBuffer = device!.makeCommandQueue()?.makeCommandBuffer() + let commandEncoder = commandBuffer?.makeRenderCommandEncoder(descriptor: rpd) + commandEncoder?.setRenderPipelineState(rps!) + commandEncoder?.setVertexBuffer(vertexBuffer, offset: 0, index: 0) + commandEncoder?.setVertexBuffer(uniformBuffer, offset: 0, index: 1) + commandEncoder?.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) + commandEncoder?.endEncoding() + commandBuffer?.present(drawable) + commandBuffer?.commit() } } } diff --git a/ch08/chapter08.playground/Sources/MetalView.swift b/ch08/chapter08.playground/Sources/MetalView.swift index a425315..0423b27 100644 --- a/ch08/chapter08.playground/Sources/MetalView.swift +++ b/ch08/chapter08.playground/Sources/MetalView.swift @@ -52,13 +52,14 @@ public class MetalView: NSObject, MTKViewDelegate { public func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {} public func draw(in view: MTKView) { - if let rpd = view.currentRenderPassDescriptor, let drawable = view.currentDrawable { + if let rpd = view.currentRenderPassDescriptor, + let drawable = view.currentDrawable, + let commandBuffer = queue.makeCommandBuffer(), + let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: rpd) { rpd.colorAttachments[0].clearColor = MTLClearColorMake(0.5, 0.5, 0.5, 1.0) - let commandBuffer = queue.makeCommandBuffer() - let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: rpd) commandEncoder.setRenderPipelineState(rps) - commandEncoder.setVertexBuffer(vertexBuffer, offset: 0, at: 0) - commandEncoder.setVertexBuffer(uniformBuffer, offset: 0, at: 1) + commandEncoder.setVertexBuffer(vertexBuffer, offset: 0, index: 0) + commandEncoder.setVertexBuffer(uniformBuffer, offset: 0, index: 1) commandEncoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) commandEncoder.endEncoding() commandBuffer.present(drawable) diff --git a/ch08/chapter08.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate b/ch08/chapter08.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..8870a8371bff0772defc865e18546a7f2bf5ddb5 GIT binary patch literal 14019 zcmeHN33O9cw?4yVNYbP?O`9|{O>U+RNz=KsW$X+US_&PQ32B>_K%3Mg70MtdD9)lH zqKF7B2#7O|C?bf6{D{h+IH01xiX);Th$6mobDOjk{AK;`UvIs))@xQX+;h%8`<%V^ zx4*ORt#4~_`TXhWM*su}V8DQWpg-ecW=}F*<@EYo9`_`Zr+&7x!S9=Fa(EkNx#;B@ zli$-81>kk-9+Sf{U;r2h6d)SJ05eDci699i0}HT%G%y&92Ib%iFb0eT6`&G~165!= zm7W_R0xmEc%mFRH13JKba5V^k8^KNBX0RIE2iAc5!CJ5mbb?J_Gk6p{2DX9c z!3$tJcoFOdd%3+KTOI3F&63*jPoHCzk{48SGu zCU`Tv1>OelfXm^1a1HE)o8V^nFnk0)37>+`!R_!xxC6cd_rm?~b$A564c~zu!H?lr z@H_Yi0w@Y8P&A4`N~A)uNR0-eIHW=G$cz$DB1%H3C<_fm!_aUv0*yqas0@ulqtRGY zfhy5BRE;L0NvIw*p?T;QbSqkhZbP@DJJ51;Ct88-LMzeT=pM8Rb)qh`9zBR2K~JEq z=t=Y}dI4=mFQQ%O0D1$xiQYm7(TC_G^f5Y)K0%+MuhBQ?2XqDl46y`9U=}NJ95&+w zoQN}UCeFe`aVZ{y$Kh&RgKP0*JOel2S-1sz@jSc;FU2?GTk!381-=VEfH&ezcr$(w zZ@~}YC-BpF8{UQY;t%jK{2~4be~gdgPw=PspZGKUE&dLl#NXpn_y>Fr|Bf#(h`~$@ zqhwS}ETd)yF>#EBiD%4A0+YxjG0BXDu`eIqeok?5nQd@>dWkJNGc(Utm{po-%grk(DakKPFU!m-wzJXY zC8ZNR-Z{QDM}xD()6m}Pbo)ayD?vOkZ3HS13)El`hyxnZkMt)4$Uq_@;*CHHbbzCc z24Ex-A|*=FKL9bwB_=zY)LZaGm%Gt3*IrpY!RhmRypH-7XSLtqca}K(4m&%dch?$6 zeX+;w_j+1doL+lwetuDIX?nVCa9K%~EjuG8-&UAYRAd{Rky)0TTa=eun4M#1)x3b< z6g3`COTEKe?yGb8Tyz#YtD|j&4SpK>;br!jVn%punb*-u2gHUi(0)a|WE}!2)EYLB z%G;umYCcZRwAY6)2qMh%>py(NWnvE-Jz$_nEQyfHVw4(_#hQ|qGdOpMV0fx@?%+Hw zJ3oiZ$WBk^@-s8Jbo$E78Jte9WaM(SbSsDCQ|mR%aLUYEO>ZcX2&YS(-xiJ-14 zqY;x)TvV1N!uki?*V)Dkr= zKObRoYG+|8A-bJj+E(tPLhCB4YsK7})XM5& z9>pqyvB!o*2|MPa&DH*n7H5USH^;NG&{cuPJoj%2Va0OPzBX6j%MCOm82w z9;dl$Cptv4)H#}=VsJb*VH+;MW3e62!2z0imebs`65owi;d}9Y_m4T)b58tC3RiI(n}j&Red zxE`3C#{cTcR4o0;FS^3f>~{Iv8=Y0gf@?|8^n$rtfxB<`f>w|dn!647FFE(z;M@kn z84KFh^%AxKETo~+?I(p^ucKoHHhl%JQUHl_30 z92906gQlyYDZ$R_>E#K|2AZovX|BxGLUSlh52bECXc`3<3oF$}Mv=40<8_8d2qHC9 zWOZ=`PifkH;kIsRJi+K@BXn9n1zf&&_m=SELrd)f8$eViSWnVB!2=|NCvkk&I!8;p z(^u&0-St865bvp5NM!+Hd~2@Zxe=T$LGkpTMv$b55Y%dBq=1tJ;C+~`1~S= zA4-GmOPV*8q=0w$Ib6`;LsNVUPF*x&1Re1ciKZip_z}w&_8D;&{C3fZ^VHiekP_-= zrM!uFj0-~x4=6Ow3VI8H7)AoqLy&>}V1GCO4um2oh7uS7rBFsjk27p*sc#3vB8bz$hEYzpt38N`ybNIk?NlcmpoQPn?e(ox z$dq34SVdJ!h;Rlc7G_n@SxcNvj`kLRud7`5r5>_3!P(|@`e+O~cq&4vpgg2~7;UFe z`INl%a(kErE!0O~GO6x_R#L;S+$`wSopJtZf^H9hX)uEqkWOklVJ4{~rW&4>gjxr~ zA=KJ17v{lyGLcLolh?zc)C9xH6uRX%@YYW5GhOfuQ%#ebyE*tZ%&cgZp-j4O-|mS2 z^Yu|qPpi}K?FhO%EQY0>u!Kw{b3;mvg5zj@hNEFQyaJAaV_^lXB-6-rGK1L3OyVH* zn_v|j4=2EC`l^L>q=7V&4stDhEhX0x(=-Z5K_XDo(dL{g=oHkJ@??SY@u1h&Ak-cL z{LvO3It6y74guyR+TucOrSs@nfUmvu_;_oX1&AxAzALOd)fcn^)h^ZNcX<7&EiN}r35I{s&*^SVZSb_v!^*{-T#Zh8 z*i4=4YV^;tv&M@%H1NmR;AW?Knwor0ivIe4*-Oyp5|YAt^ZE$AOczTE_YzhY)LU~= zH$L^2d0HB&+g4GI(YP)MSH_*e4*;sFLZ-L|UI(JODED1T{G`1LUJq{|SCM&yt8Jpg zeKQ)n>jh(-?q>fi!GmvwrR&ICfjlgNw|DWBg8k)fN}E>z3A_uggm=Sx;3{}8TupH+ zVZtG3e?K38Yso?yf3OR#ry6gd4z_Vh&m6VE*~ud6XIJ-R-QarRgK&$T<;g%# zTnXpS;Fv0h%i9GX0<>W9FZ(DK{~`PxhL2JO9)pj=C*anpq0Od2G}-TJrG*qnYa0oW zB?Q>nVNEp1hoq&Y)%qxKr?t-Vc$*z*ln>9L)y^~uFpieAhFR%(^zGt;fuQ`;@EOYV zC1L8-UFno#b-%hv{z6>AdD+l!spOc;_Q@zd>>TOp!2_V;#fUt-?@YPy+ zT%9ns3+@3qf;YUzd&53*BcTV8m>#;5k&%~0`A&XTnD4*?@GVMz;TtqJ-At;x;6ZqZ z+(K?8rs=_aR^{=z_(W$I89V8UP;?!I@AG5crRiuHsqKOvz+>b#@-!uLg*+d1)B0Gb z>v8zmMVaYy>X;|U?bHvSB%Gk{*I-&F{D#~SCQ0xlJoC5N<1G9Io`b*A*LnCmSx)XG z>&b)k^#s|3 zhpZy^ZbD)t;XxY7P$Xi>YI0u?qSui7$yy$wFAI7v7soGwoBsz8IE=SQi}Vz4kq&WW z9qFWai;NU+yZ!=iuT}~S*YAiJ-dmPn(b^{1&>Pnfj8C1ci@u3jmaSgD?mk*uc1QnP$w!T4-?ZASGdSX zeW%aN0+B7IQPb@4cBEDW*YIa7Mdk1bG=@AzQS))T9FCZ0o5wq}EvSL5+r?cWCI4MO zO%oRDOZ(FjN47ZJ&Fzk6=Ws!Dp&L(6#&$QP(p5OUbPbKcO$+ZxLbqx>%n$#!K>n|E zO6XpCV&)*_q6}l36d-3V#$i5yv9rDc%w1o0hG@q9H7NSMyYP1*;6d>Ek z^W+7xoxDhPkeA5L&FC6*Em|6cz#Gtw=q9p@yi9fnLGTr_hrIg#Jk>Ao>%Zlx#R5O= zfy;Z*8XhiJqx;BS^4j0g)81IQ0X@J|P_&u6LH-eBj0Xh&+rsTEjmd%2MfCBd-6$lO$q%-i?`?}beeoh zJ_}PNbQWDy>p{B#hc3|lSCW77)uE-wgD%)D9wXfU&($IH3gEDa+Dl13=SN)4^%)_> zG7v1Eg+$1)BBUXXCSP`Ih*eZW9E;WDEAnkvL#)BvpXbARI-ikzP3QZDaFfF|A7g=Q zW}lgpaLPqvZNP}r$amDvCwUa&i;bZwj8Mp$wlgT>2+qbicrcLQT%3pV@eoQ1y&jKW z@HDRh2y(O;c5rh2@tP??D)nzI22 z$q&7t0GHuWJQUz7$Qklu5DI<{`W+riBN$hZpTbaptAbE)`tqTm&!X@Yx~yU_4sHeG z$S(x&ngC%cJ7s8eU-QT*x*K!*j%wt$f**yplV1h>yGOZr1!t4r{xpKll81|N8@`gx z1IRf#4~xk8UTa3l*w0f%JeN|%-+8JSfZZ}XcunTx1>^$xBb+nw)i`izt{8IT>+lWK zjeGI5FhB+mSNK-E%+4lK{|cYG``r5J>quSrHvWKkx!r{s?!e1w1?Dnl=)!mM(l4j$ zzqaM2>;S{Vd`N}+A zdU&Ock)eAF;qI}*?T)_3WubF)5v^FyY4cFZ>kB?5!BfxB+8)M_QmXT_@fX zfNW38Yxp2AZN~fXKk$D1IzE8kz;EKW0#F`+Q30q3z~}&s2|#54ssb=}Gd_e5<0Cx5 z!bkDDXlVed18`6P#`7F20JQ5YC_zz9h_vG5`^$f#A(4z&@kLk}0U$OofI|XsXaEk|#N;r8nOr81$*14w_2B_HA^?j5us8rqfK>Dn`RU$=kkGZB_&R9LBmp=o0Lv+;@PsT}*k$U4*dA?XOG3pQzo(<#GjGVhRVL{zx>*o? z#s5U1s4sZ^?`)4vt*IvTFD)fm6CfT_e$1EIwk8R4@kC2j!C|foRRz@`BidWav=gl zpoqu_d4wV&CPEdVj);qhkI0Ug6mfmT#)zjQ_C_3uI2!R@#IcBvB92G=81aV`Ng3$? zsYoi3#z+m)WT{nZlcq@rOY@{dq{E~mq-D}k((%#>QoFQX+9++7x}!lA!H%qrjAC_*DZkO(m?vn17?vWmnzAZf}eP4P^`jPa6^rZBZ^hfDw=@}W8 ziDeNonT(aGWNKNQEMBIQCCPGR!(=051+pSpxonKALN-n|UN%M6EOX1+WL}wHwm`N> zwpbRBT_am5TPu55wp+GGwpX@KwqJHY_NMHh?6B-@*-_bhvQx4jWv69lWWUIMm7SMe zhy;-+l8NjeIWRIVGCOii=1Ss zJCZGAi`mg^Ejx{!!OmpsSr|mFyb!Y4!m74*MSa0sA5QHG7Wzjs2bdLk{Iw z-cLS2u9U~h2gx;Zt(=n^R+K186_tvKib;ye ziYCPzMXSQ2@GGuT%u~!)5XEhZdlah_s}&m*4=Nr~>{J|9e5&|4S{|*4j)_)9tE1zh zE28V7Cr3|>o*q3rx;=V9^rGm+(ShijqgO;f8U0-J(dgsR-$kE`!7=?}2E>SBM#qeg zX^v@$SrT(|%rh}B#C#ERO35j0${b~(vRGNF9Hp#M)+whd8C%pH;r1+^5{HJfJ+JJfeI@`L6O)<@d@n%3qYfD$lF1s-J3rN~Dsg zqE#xDS{0{CQst`hRYO(7RU=h}s$x~Cszz0(nxvYdnx>kenyIQ+HL5yP*QxGO-K|=s zTCG~6TC3_*tygVTJ*9d^^_=Q?)ppem)lSvRsuQu1u{p7mV;9G6jNKFaYV6+F*JAg@ zz7zXF?1!-*$9@+3MeLWcU&o$`{X>n^Dz#c2r;b zm3o4@MqQ`&sIOITSHG`5q5fL^t@?ZQ59*)P7X}#zr3}g+G<4ALK_lY=aW}<1AGbGd zU)=t<199)fy%+aE+=p?eHBd89Bi2M{WSSU_N~6}qY2q~rnq-YtW77=LlxxOlDm3FX z<2BWqTFpdFlV+A?wx&hn*0gE78o%Z$%{7`8nw6S+H1}%m)7-CFr|Hsc&^)bqR zg62idOPXDp-I_g`y_)aiqvLbpr^YXie<1$#_;2FBjsGtGO#IpSU$p(SVr_(0rd4QT zv?{GytJ9`xi?yZNQQC6t7;S~NPCHpURXbffTic>_YumK*wby8G*Dlwt(5}?3)plt& zXg6wiXm@H4Xy4GjsXeIuNP9y2mG&F$ciQi@zi5Bep4VQ`0UgpwbTK+km!~V$RqCpA z6LdAYI-OnT&^73sx@MhAcfD?dZm;gR?knBbx^H#obmw&!ILKkHAE)LLxMa@CrE>Jy zb#5qEz!h;NTp3r*P2r|-Gq{;tGw0&waIKt&o5wBXZsC@3w{y$6RorTB4Y!u-UC;wP(u?#Gy;L8mm+Ry7CVhrJ zPd`LIOg}3&!BAtUGfXl#42^~+!z@F)VXmRWu)wg?u*|U9u*R^~&}n$yu-&l3u*rqMr7<~9AFd~4MvkO!I*5c8g0fRV~MfMINErHvBFqq zoNAnIv>P2px6x;8H_kOKG+u2a#wEtvjLVHHjCUJX8CM%O7#}enH6AndH$|FqOhZgF zO$$vonpT=tneH>KHFcRDFl{zHZF%*O z+uUkyGkeVo%vYO@LnAn^+JJFMPWuh;!J#j(eO^G)r-jaB0;=PG$6T1>0NZgY6NaEv(TN7VO z+?BXH@ztdGBui3CQfg90(hW&>C2dIBl(Z%3k)+3yo=kcsXho^$qKr)`QmfttYHsS--KKwEkc{Z9Qu}m(o9F oV2U_Jno^VENNGrMrp&T!v2C~Qvh5XkE<(a5(<*$1-fjE-3+CEuwg3PC literal 0 HcmV?d00001 diff --git a/ch09/chapter09.playground/Sources/MetalView.swift b/ch09/chapter09.playground/Sources/MetalView.swift index 795b1ae..b4b69ac 100755 --- a/ch09/chapter09.playground/Sources/MetalView.swift +++ b/ch09/chapter09.playground/Sources/MetalView.swift @@ -65,9 +65,9 @@ public class MetalView: NSObject, MTKViewDelegate { func update() { let scaled = scalingMatrix(scale: 0.5) - rotation += 1 / 100 * Float(M_PI) / 4 + rotation += 1 / 100 * Float.pi / 4 let rotatedY = rotationMatrix(angle: rotation, axis: float3(0, 1, 0)) - let rotatedX = rotationMatrix(angle: Float(M_PI) / 4, axis: float3(1, 0, 0)) + let rotatedX = rotationMatrix(angle: Float.pi / 4, axis: float3(1, 0, 0)) let modelMatrix = matrix_multiply(matrix_multiply(rotatedX, rotatedY), scaled) let cameraPosition = vector_float3(0, 0, -3) let viewMatrix = translationMatrix(position: cameraPosition) @@ -82,15 +82,16 @@ public class MetalView: NSObject, MTKViewDelegate { public func draw(in view: MTKView) { update() - if let rpd = view.currentRenderPassDescriptor, let drawable = view.currentDrawable { + if let rpd = view.currentRenderPassDescriptor, + let drawable = view.currentDrawable, + let commandBuffer = queue.makeCommandBuffer(), + let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: rpd) { rpd.colorAttachments[0].clearColor = MTLClearColorMake(0.5, 0.5, 0.5, 1.0) - let commandBuffer = queue.makeCommandBuffer() - let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: rpd) commandEncoder.setRenderPipelineState(rps) commandEncoder.setFrontFacing(.counterClockwise) commandEncoder.setCullMode(.back) - commandEncoder.setVertexBuffer(vertexBuffer, offset: 0, at: 0) - commandEncoder.setVertexBuffer(uniformBuffer, offset: 0, at: 1) + commandEncoder.setVertexBuffer(vertexBuffer, offset: 0, index: 0) + commandEncoder.setVertexBuffer(uniformBuffer, offset: 0, index: 1) commandEncoder.drawIndexedPrimitives(type: .triangle, indexCount: indexBuffer.length / MemoryLayout.size, indexType: MTLIndexType.uint16, indexBuffer: indexBuffer, indexBufferOffset: 0) commandEncoder.endEncoding() commandBuffer.present(drawable) diff --git a/ch09/chapter09.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate b/ch09/chapter09.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..eedabe66b8a1ee820557dfd4d37558c9f6e669f7 GIT binary patch literal 12639 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 CkCtBm literal 0 HcmV?d00001 diff --git a/ch10/chapter10.playground/Sources/MetalView.swift b/ch10/chapter10.playground/Sources/MetalView.swift index 879e690..082a3f9 100755 --- a/ch10/chapter10.playground/Sources/MetalView.swift +++ b/ch10/chapter10.playground/Sources/MetalView.swift @@ -29,11 +29,11 @@ public class MetalView: NSObject, MTKViewDelegate { public func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {} public func draw(in view: MTKView) { - if let drawable = view.currentDrawable { - let commandBuffer = queue.makeCommandBuffer() - let commandEncoder = commandBuffer.makeComputeCommandEncoder() + if let drawable = view.currentDrawable, + let commandBuffer = queue.makeCommandBuffer(), + let commandEncoder = commandBuffer.makeComputeCommandEncoder() { commandEncoder.setComputePipelineState(cps) - commandEncoder.setTexture(drawable.texture, at: 0) + commandEncoder.setTexture(drawable.texture, index: 0) let threadGroupCount = MTLSizeMake(8, 8, 1) let threadGroups = MTLSizeMake(drawable.texture.width / threadGroupCount.width, drawable.texture.height / threadGroupCount.height, 1) commandEncoder.dispatchThreadgroups(threadGroups, threadsPerThreadgroup: threadGroupCount) diff --git a/ch10/chapter10.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate b/ch10/chapter10.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..7c005c2e796db239a3cfa22501d17b806cee0d7e GIT binary patch literal 12369 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 literal 0 HcmV?d00001 diff --git a/ch11/chapter11.playground/Sources/MetalView.swift b/ch11/chapter11.playground/Sources/MetalView.swift index 24c4256..411a03e 100755 --- a/ch11/chapter11.playground/Sources/MetalView.swift +++ b/ch11/chapter11.playground/Sources/MetalView.swift @@ -29,11 +29,11 @@ public class MetalView: NSObject, MTKViewDelegate { public func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {} public func draw(in view: MTKView) { - if let drawable = view.currentDrawable { - let commandBuffer = queue.makeCommandBuffer() - let commandEncoder = commandBuffer.makeComputeCommandEncoder() + if let drawable = view.currentDrawable, + let commandBuffer = queue.makeCommandBuffer(), + let commandEncoder = commandBuffer.makeComputeCommandEncoder() { commandEncoder.setComputePipelineState(cps) - commandEncoder.setTexture(drawable.texture, at: 0) + commandEncoder.setTexture(drawable.texture, index: 0) let threadGroupCount = MTLSizeMake(8, 8, 1) let threadGroups = MTLSizeMake(drawable.texture.width / threadGroupCount.width, drawable.texture.height / threadGroupCount.height, 1) commandEncoder.dispatchThreadgroups(threadGroups, threadsPerThreadgroup: threadGroupCount) diff --git a/ch11/chapter11.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate b/ch11/chapter11.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..8fbbd0f1a6449cbf355632f16cdfd78e8b61cfea GIT binary patch literal 12924 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 g-tnU2;84ZT literal 0 HcmV?d00001 diff --git a/ch12/chapter12.playground/Sources/MetalView.swift b/ch12/chapter12.playground/Sources/MetalView.swift index e84b3f7..dfdae7d 100755 --- a/ch12/chapter12.playground/Sources/MetalView.swift +++ b/ch12/chapter12.playground/Sources/MetalView.swift @@ -28,13 +28,13 @@ public class MetalView: MTKView, NSWindowDelegate { override public func draw(_ dirtyRect: NSRect) { super.draw(dirtyRect) - if let drawable = currentDrawable { - let commandBuffer = queue.makeCommandBuffer() - let commandEncoder = commandBuffer.makeComputeCommandEncoder() + if let drawable = currentDrawable, + 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.setTexture(drawable.texture, index: 0) + commandEncoder.setBuffer(mouseBuffer, offset: 0, index: 2) + commandEncoder.setBuffer(timerBuffer, offset: 0, index: 1) update() let threadGroupCount = MTLSizeMake(8, 8, 1) let threadGroups = MTLSizeMake(drawable.texture.width / threadGroupCount.width, drawable.texture.height / threadGroupCount.height, 1) diff --git a/ch12/chapter12.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate b/ch12/chapter12.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..c7ed9f1e66a92d5da080791526c3c6b45cb1a3e9 GIT binary patch literal 12851 zcmeHtd3aOR*8Uy>q)9V2ZPGMjle9%>=}23kKu0J;8CvEcq-|OvZBvs}DB}(a7exdS z8I-AI78Pf3KtT~f5D^d@5EMle2XFx4;_$7L)1)oPy*~GMf6w#%@wHEzle70;d+oi} zUhlisIpy^=F0U^+`2@my?05lK{LW5BW8iIzR zVQ4rSjmDsfXfkr4JJA$WgKAMdnvQ0mIcP3=04+ifqQz(%dK_&>PoO8!Q)mZz8a;!a zMbDw<(N6R-dIi0TUPpV-QS?4KhK{2X=mYc#I*rbuFVMH>JM=yJ8U2c`p+B$yi?AGP zaSXQMIGl`Aa4H^z2jdbv1P{f-@Nis;%kT(15|6?Y@I+jRo!E`*@m<)1@5T%8efWO7 z5I=wy;Ro?zyaaE=oA7451#iXM@Z)$pegZ#Frr z-^Zu$hxj!96n}xg#9!m@@b~x!{0sgS-@v~S0qH>{s{J!CI=gX|~A$Z>Lld_Yc;bL0#1B{@&NBHxfplCzRC(-YGQit-cFQ?t_&vog|B z5(|n_QVP;DyXR%*=Go<{;)23aZqF2Ny`#ce;I3$>b=LWUGe;pkvTjCdq(RY0i(-(D zbzmJ?CnjWJOtcvpkP(@X8Ja9i%p^?8WYCn&Y<77|xGy?XqM>bflVzQ&&=k%nc zCe_zC8mm3-hPq0-T-kPuS~gy8&B#wK%*f77NlZ;oPfbkE&dp8CE6mJF%*xA3P0LEl zD#%RDwaX)6Y|sZGvRm7JfRIerGW7hPd9(vxQ$Gnr#8WBG$n2ktYPzjS&hwx6Xr);hYRbVwkqACHSy zBy_$5JguaZ-ymMec3x;~-_~|90YBxv9c0Xy0ru)@O3%og)zvhEvsqVDcK762v+VMy z88hHZGIu|ya!TebPUoa>*A z0CXTgrWZA$C1?{mjJ^bb`x$_(1MY;wuoz3Q3`YU172*DP06?1;GdvG~Y861#cKkd5 z(kXl$;O2MyCy4=o$tL~DK!BAA045%?5CEi!yg+u7edJy88TpR^t`@ zlV}l^+df;4(g5ipuSAb6imq?n2JTRs4XZDqHzH#L`ATZ{h1o# zv4+L55{Ss7xR@N3>-7Tlan$(=D_szWy}T8{>~QW&C%dPXIPP{;JD|lbPiz}T+J(pw zK39#)*O=>ZI!Yn>`9`{&Q+W}g;arnR7) z!{cEo8iA}$sEkE7p^;3>txQocvMi)bvCmoSJr;n@v1mdw8i&TS7#7Q{K>>DDfs`B2 zB;-KlOvm)humM%V)>SbhY?+CfCxE!(N&rGvmCNZF&wXpfAUS;H);!ozUFY&OR62)R z`rgX|Zo#`k9dfrn#;6Wu1n0gBHT>n=(*ko_nAy^|etjEZGtn$KLM=X&>+v`mH=vnl zHp+lQ9Qex5$&f#A{({aHiXj^iYdift=pV?s0o{w{q4_MHC9uvL&;m3c-Ouh|omnq# zFZH7<+?CEG*!+PmUsA}XNyT1ogVPIpUFxg>a_p=OHQD8++l+yj-%#Oe@Hm6ZUxHR6 z>vr@IT8bV<%g`feIa+~MqE+Zo^cd^Hy0S!;#JaI$mcmk58cSyx+tC`d7W{cV{58Y% z8u+xJHLN?!0>AD7e?8&4JA7utf6!mexy`hC2ZXQ6!LX7VKI(fpqR~PmhJ*fqQCvrl z$L%R{)c}qHI2G1$Clx@H1H$&pg!`~|9d{pmG~ZoY?{Rv)&Pw1h6;lEcH!uO$=*?>^ zYpi#|PC@T{U?+}x=m?VpcCYO{t{b+2+M=*FNVK?Y!GJzj#dVZ5IB!z zKnCn`Gu-A^6{H!ru8s>EA=hdrBhOjo_BcZ$c##2<-<7P6!aqy;U>4G6C7 zB>E63o6sqi--JG51sr4Mx{h?zfRpEX+jjjFo#o=q8CKYYK4V49HYUWpg3`W37m&3X zokw4>eyl%taUL%EG275lrS1k#h0`1C`2)Hfn)gRGfSH30zo09~x_*6N^KLd(_l#My zg8iCO5mSWdw(t!FY*F}CijP=< zBX5aOImm=HfHYDzjEhlIOo12`oI;09w~XiuBP=WmMwD_RmdKb zHj&xcB<5h{+hK}a%;97nE(8YA4>&|I9spBTu*X1EH9NxIV@KH+>`V3?XA3!Zq6?hm z4b|07507h6pcjuzTzIjA=ham@JPt7^jKteV-%I7S(4 zt-^PLwQ)6`j9qLpbFn)&;3;5&S~dl?d=+Qy&h4h-jpC8&1AE-;>Yl6yaulY`>e-JxS7pna~NZO zu+&_354)GMmW>Z<`QW?!x|6&CD}Z)MUZ2C`OR90zLBNmw7yX=dl}Q!u8oS(ZYbRHw z6Egp#sjf=jWV_sQYljLh?GJ2rlDn$P>jXSE|I1#yK7S!8q&KGz-^+Tdq);z@bpgF~ zw{+u}Q<1x-65Mtu(89{~fpBHn6Zk-A=+K}kp2II9WiuozFR*!Rely;Qcd>u4`o406_0`zG@qyc;*HXA5|ApN;o4b1YDP@dNxO-iO5aExaGUjSt|1_#J!* z;#SZz2DvK&kziu0*9>)Vn+iQ@;fS{0=1MO>nx+k@3XW}UV-K+h*fO?|EwRhHg~(nz zZ{@`$g>t_T_v5uc!kxeO*djQ8_!vG88lM0MJ2|#>juC;`*@NI`i(4T!uwMKT{+MT9 zt>=obCj`a}b+|mu_!ExiaCG3deIn)r84f-J3Y^8C;m`58aly@oLo|kCUtr?edbX53 z%#dB)s|pTzk8a(%jqpN@?N&S4?WuNjgA8U0RD`=hfN|7xtC*aU3jb~`$MDLZ$6o&^Ngihnc-!4h$nICNrTikU;H$ty zVRM`D6_mky!!^zuuCqtk0*KnJbSEVxD-Eb=c3Oz<;NJ-XYK8v*Y+B7Kn+Ya_tzm1K zZ9)LghPu5j4(MY0pqS@cP8aD!L@w z%OPw;yLjz$Hx_u>(!$Aj{0uE1V*v?k#xXILi=RlZ|Ml!t({n*9!x6+TGRs7_B zfORsL+(Ygq^T>Si53+#V$6jJDvsc)wY&Uz2z0US*B@02TMI5XLu9mXBpx+w-Sm&6_2Pd2s*Nk!HYhvYs@teeA7&hvjY0^EUE0hu7puc8I+lfY*0; z@7uw7%hT*Y2rS8S99Xi0V5m0Oc=K`M@r*|=--FPHcp-=@DE=jrLmJJ_w`fRppdr;$1N(}76VecB<+hvWqj4}_0=oe7 zea*~cLJ6{^uWM4fnG`~rXYj79Wxu}_PBy6 zIiSoh><{)sn?OJZ(m`AxphMWt>{1{Q{1osyItW_xub7&a50;>GM;B^9c%1kSPLcpfxz&2cE3)&BIaT~!6B751d0qt7`)p6>%*|nPn zz#KWWKW(6Q!z>8o{UImpdYc844BE&s89Eb~%s&H6=67C=*_;}4C}TI+Zy~It_t1IV zacgBVLEpcRF60_o8A&K42Dm3(LLair0txEh zn4y_2=cNCguEEu0@*?T|?LUF%%?-A5%XT_;Ck6?zow*r%kk(ZlD{H z$&WkvahM;A{J5(hC&F=rz@+7${&7zW>Z+aG^Zmf_Dz2+?!)XhWe7+MzL2XM(i9aNP z6x&|y8tSg$>$&aO72jEv2SvLn^=?<4&l`B?4rH)0xVES0(_lFyVWf#Z zTjef{b7ueT^;mV{tRxL-+b|xF1JztNlBPOl#gA zl=&8Y8?=EE&x$5`z>g)N>M1=$Pax}7dYHaTkI?t%QTjeTMvwck)Q@F;EcauDA1nPh z!jDyc9Jv+c(UW9hh-EEeYCnzws>M}Lc)|rb{x|9if4>Iv7d4OnuhoipIxuK!&PuOyRNs$d?DDezm-N0H??~Qm zgSj#Q$0?G$Q(aZT_h;yD0s&Bb`aAuD{wY8LEFc0nxOzV}__5KC;kcUpIM$CXTLc{h z9R-~PLO~c@!2!1VvCWS=`|%xq+$Hd}3+LSb9mn}!=@5UfqA1U4v9KUY5DlIoPzyAE z9OuXJ;2DA#_76W!xJ?mFA$rXc;1Tdou93$E!i&Hfc=W|z$K!^LBoWW2KMA@(hQ0!v z$B&aZ=nYjn1j)STbh9gP?_jzbuz8|4@SrCVf}PV-1us+mr!}M7IaQw;2;U8kYG)3g zXSW8iK`jkQkaIgdT#zm0ys$W^NnDF+oU7;jM@jYVbc$5g3(-Q-A>BQDvsQ@N7z1s4=AYG6#B7isy!z&@tC>C`=8Su_SAF_dL zgLnL1gH+@wyw!IKa)mSS^2QhBJPoH7czGj-_5tpePYY>3T1-d6`+H;QczAzr5-q2d z@Xp>^`ZBzIrx#=ias|c065&wc7-6NbRyadAS9qUrsqiV`4&kf9L&A53?+M=*9v6Nf zJSF@{__gq&@H^oT!pp*+gue){3a^DJ!mMFsVbx*F!?uO(40|bTf7rpWLt#h4j)olz z`zq{G*e_vM!>)z>Q`AW$70E?PkxCRJ(u<5Dv&bS!5%m@g6Ac%Q6IF`t65TDjM|8jF z0nvk^C88CgRiej4YeefrTSd=^_K4mVy(jum^n>V%n25u~VzERl6Gw?PVy##wHi&zR zhl?A;bH%H~kBQfa*NL0N8^oK$Tg2PM+r>|ccZm0k4~X9p9~K`G9~B=HpAerEe<=P~ zd|G@)d@a0Fcx-r&@G;?&!)Jys3EvpLC;Wr(GvQ~$KM%hcemVS#BwQkqL`l?=Xi2Q3 zo1~Ydx1_HmPf{Q$lJu91kc^Uyk&Kf}kk};-Nrhy(WUb^~$#;@Jq++R5Dwjq`Bc*C- zXK8n7wzQ|Tx3sS`PdZ3CMmkYCNm?$gmb#=D|(Mr1PZH7irE8>X zrR$|TrTe6BOAks9OOHs8N2r%a;w3jgd`~mCGt+RkB){TXvVsD{GL=mMxSml`WGkm#vho zlQqdU$TrEg$X=GcDLX2=Ap1u4t?YZ*CE1U%pJi8Mzsj!5ZpeO@tK?A-CbV*$+#ol} zW93$PoIF8(hrFx2k9@S;EuSS{CSNCiL4HX7gMug|3avt~Fe+jdRz;kmL@`b=Q87tT zp>Qgy6*Y=R1yjsb+^d+cSfp62cu4WE;t|DO#Yc)C75`NHuJ}`ll~Sc%X;hk(7Nt!Y zuk5VsqU@pUrR=TjtISgtD2tT+l>?NcloiU^%B9Mul!uicDt}V`86l5QMyMj9A~X@& z2wj9B!W5Abkrt5=kr|O4(K8|^qEAF_M1I7Sh$RuvM4XDap)#xbtEyF#RW6lBHA6L1 zHA{8BYO(4e)x)Zlsz+6;RclonRnMtjRqa;2t~#K4SM{FiOVzKD9V4S7Ga@r1vm<*( z=0x_1yeo2gf@-hYLQx{E>I6sk5N0-)oPb|irS~1uAZY_pkAn6q+YDvqJCce zlKK_(ZuJ}Led_({1L~9NPt;$lzgJ&U|ERvIzNY@C`ZrBSO@v0P(P<1ClO|r%S<^+6 zsOhH3()85iX!>XdX~tvf7Jf0y`ud!Mi?WC36GJ+$YYc-s+g!4O^h}sFQz(XLCjMz$6~JO zjJn>szPe)FNZmNy1f5-1sjJdW*4?SA*Uix_(=FGn)IF+Oty`l(#Pt%>9h1b^u6@G^?mil`hohv z`XTyZ`cnOPeU<(${eAl7`gQsy{RaIe{TBVx`e*ge>tEFG(!Z?#P=CdsF{BuJ7w(&Kf>9d||j~_|EWy;j-Z;!wsX*7-ke1!;R5KozY-48!bkgG0B)_ z%rIsevyDZ@!NwuRVa8J9SmSu(MB^l5xv|FBV4Q2b&$!UI$hg?J+_=*CsByJ%t?_B& zOU8GMXN}iQDpQn6W73**rVLYWQ=w^?$!B7wxu$zf^Gyp(YfS4*O{NW|O{OiTr%lh9 zUNG%6?KAB+9WcFPI$`?MbkX#k=?BwgbC_9dmY8K`g;{Ghn$2d5*=Fu-?rY977nqC8 zL(Id?W#*A)xA`u!*W6&9YHl=8_hL`S zo{c>hdp`E-*l%OMkG*6Gw-_uvErTtSEpsdnSQc9zvMjT#u&lB)TQ*s?ShiW7wY*^2 zX?e-A-*U+EuH~rZ1Ive&Pb{BWC04CfZ#7zDtu|}CHQich?Qb1uEwK)>mRUzx$66;? z>#X%wueHHC)!JyCVVz~2WA$6NTHm%_vPIgmZFbwewoSHYZ98o*+jiUDu;@(bK>U4&5K(Qw=nL(xQF7F#chb&9Jej* ziMSnc&&ItFw=3@DxXa)A{Xk5`l0@40Lnl)=pr-%6{E3e94bduXeye9W}*NJq7Z69 zbJ09BAGM+dXdzmLmZK}sRp@H83av)hqBZC`bUj*&)}fowt!NXv2kk-kqWjSO=mE4B zJ&5+91Lz6#Bsz!=p(E%8bR3;PC(&!@b@VCv44pw|(K+-vI*-0a-(xB6i4$=z+#4t1 zK3Ik|Sc_Az6T5I<+z@qhOfle;I;S`d@J68cj9~TefWO-0)7#{gpc9l_ym3#zk*-IC-H0eb^H!~7k`XT z<1g`7_-p(P{(3CW}C(wzslGf1abOx=ZvuS_^>0-KsUQVx~tLY8&MtT$7 zLbuXw^iKL9eT+Uq57VdU5&A5BiM~SLpl{O;>1Xsj{g(bre-R;(sG9S&G&Y_JamgfqU{0{v zQ_C0oYg?LlU&t-v3Q9`yvPb5Xq~;bD7o}#G6c(ix=4TY8=4I!k7iH$;l@#QSj4{?A zBjUCrEz%)9N=62h!o;ixlduFPWj(he6EY(UvLYL@vqaX1$=Glbq@=!i1m>Sis&(p+Dj(+8XGs`Q-wS+vg8hK$`ty^H;U^D~_ z6Ztv0ymEXbIz(v~VZSxE<4O6>i z7u9b0A<2YT`ql#zD2SGqT{#(;VUh8Chw~adD$6 zoQ`Hxmsf&W+tGA1Bqov@%|_f#bP4jHS*RA(As*GE2Bu?rmdp$+g&CQNnRg;Dx)jYp zji?FvkRLTO3$wDmtRL&o2C#uFRnQ^Vx#6e+(}EFC14E?+L!Lk=t=8Y@mZe-UO;CNQ zzp>8iYjDdP7YzTAN~71uyJhwZ=hX)Mjg1j+PxIH;2YEQ4)_*$dFDb?4=6!W((OI?& zDRr9_*_-LYN!~hsmM4%l&s!IoT@lmzBD55N11?5On2p)n5kq0dF(-3X*MlB{GwV7c z%vj#n5SktJ=PS{Q&CC(CxsBr3L4C>q9XSZbLf|w*zfP zZKxe>L0i!_w4G(LESAl3ST4(B`8&`~v@7CiyW!hzR=@^F{A?I}8}^^`v;UL+^Y@%z z7EdV;p+^NjdKf*zhOmnSKYASeXy{+~k-X<-nLX-Ehf(%sAwCNU@hDoc6+MkA(6itf zg-pdpvO&zzH8dTIxJHp%Ry;p-zHnMoL;luT{`rIdt#H(p@~aWb#cnws79$;Tm(*Y+ zc&0+$;RE%MbN}7g_gDTnyb&^Ki>HAf8jbv&2X}18K-$H;j}Hj>u2OK|vX~^!4$*{D zGW6e4z+cJa?AUtUoS{vgT7PhUMtWLCR>xHcpbdOz==}U#cW!p7r@6V2PwkwQDUBVl zH_&?m%6Jo!c)6%$R;)C^go?yHh7S9iC5cQW zNs#tT?A1F-tx4hf4;VNoCpT|!6kUSQdAa$P?1CIiMs|9-r64oYk`AxToZNJ{l96Yr z22~C&04VuqDcUVl2wR9D%nselxSWycB{>C!8L64s*_o-?1%-vFMJ0Lpsrg0unOXT+ z`Neseg>IP|*2ZvKry)-Ck;xTGRR^w}JTIc`vSN^+St!7QA;5fPb@1k`_woTImCa=d zHG+^?S;w_Hee$1yHn+@FURe=eUR_q=6XHSLM82L6@V;8UU2lj(w-ZKFAG6i|Cs@19 z!V=qTfN_;49L_$jzWu<2<&~AS0iO4b^|bn1Le@PIaZM{+^N z$fDBx(vs5Dto*`~)PmwtaJz!6oYZu1!i?g){PdC8dD9mPRu~9o$WC7jTT4v??AeuB zd#d3?dPbkjtZeYh^2(_8qjE&Qcet6k`&d^Jkr@El0ayZ!g$uzM23oRn@)i%YEEF7K zprs%;eeq(qOtWwy{74tB$E3>0TP%o`UjSlt<=vidfXhQJ>IQDxhZq3EmsgJATlu=e zj=K5O@DYVYBa2H)FCJAkdd%2y<>SjIOsuS`u9*>|7?BSwQRNK@Crl1@je~W&@YACt&*nn+NbZ6orP*}V1Y$&Mb;mh%ID5tN&S3^m? z4&Q|j;=}j|ej0y)e@oL5KFh9Z_syW2enSjowgeA=H7D5H~{tq>GY>FBit#vVng|0?HI`gYQo$2tq{Zd->oDSRbt$ zgqa!uEMnRi zgMm2xPZ?xI7Lw&m)7vYh(7?V?YIp5WDNX|!{w|Iyd(tw zbJ;wBuh8EpncwVz<6Rd~X%&QGD4*bRv^fwOMC(%fKphndt9h)G>Z6o ze}Ip#h>}c!>6IhL2~eUX7$57PCM5O_6aZ|Ye(NL5?&wzt>tjlvgr^`y8=lOX+VE87 z6IwLF)EZA?3m+^DcAYvCUm|#roB7+Yhc&aLDe(jxqsC(>g4=ODZeW+OfbgXrzFfwV zDkgQ5GYPS&%{UNe9Aqub6&sj~=OJ$M=7=)8g!qiyftLK-oW+Y{^A_U8aRN)&{7wR4 zyeuxKz#f_dk%kpsfmaFxkt1+5ThP&F!K+dB7JMyUgRf%?*;|hEi_|`p)fmekEg9u?J ze!7J-4F_RFHzE(_Kz+299ZEz+W=aBR4{nIZtNn(LM5aaUqj?;ygvuA9w2M?xgAIRkJm5e z{m|PAv_=E`w`fHh{*K)s6sOUn@gu>ICGk)AXZ#EP75|2RCy3q1ZeknR&FmI-E8DaK zay=y?A|_&J{8g~q*k-neJpwN|RJuviAp-G2-mPkF=BGtvibxB9GzzYSDA(N}V2^0L zgApNCMq!XX79sy+%n%zZnGc{_xcAYSaHhq^pfl%|X>0vWX_4YCtuEB1h1aoRq9iFu zu@kV1nrMiY=!l*q69a2w?Q9F%%C@oXYzN!9lNgDKn1v<^u@O7r*e-TEyCc#@+0E`` zcL~<|d%Xs?>_5@?`rmKY{U@4{LIuh2)T2b~n36Xu15e*4-;) z7#WTd$p}(NipWS(OiBn8zp|Lo$NFm{hkRzILsWP|vm-N_;PiD~7Aj`Q&hy9D$JTa^ zv3=}5_AtAbJ?NGVilc>Yj#%s$$fdIirC037zcof$NOX-O5ShQ2ODx6UIIt=%GPDm>mmJE=iK{>2>S(%++hC&&~KU@DqI zrlU#I>Nlk>S2rWSB=52y5m;{C<*M-wp-MB6g6y z3UH@TKx{r}WW}a3viy&soLm9sUcnB5bzf$#s83uCH&Dnbb~p|!$h8Fe$NwVS-au}I zLTV$tZb478r`Qp8lsyNp6VO_Ol%(ty;G%8Bm|SfHPzXRMSJzXsjcg~yXcF1QjL6U7|5gHm+gM+CDRWv{T_fJ8doD5n70 z3f;WuIr7p4W`iuxy~W;U@342-dppT@w*Iu`EF2VvL0LcIau#Zco3 zcmzFtXeqfLr^)+JLti`Z9o%HQlB} zs0&avYLlwSEy0+~ljszPRCF@?y$v;id?1?~y1_wzV@C}xY&dV_h=5X(`K+iNf=Y1M7-kN2v&-*2+{c$EXjo>3&Cix zL@X>>V(GSIDP`U5y^LM~dy3S)^vW5vU5c6ufDvYIJ487nO&ui)03wW*rp8p8r zo&wWE=9&_({p=%F=67Sik#4$R^=;@hZ42YxEEvW~LL?IU46%AFTGdX85J4}~?Q{p- z2`;{i-cIkJyCL-i{QgkX>x5FRTqrhW+J;C~84dA5yPlsPijL@-1KuWhsNsU4FxG~# zK8$5yY_uxP!!uNkbS=t-#S5#_}$?nC_zwMS{blVXO&*Q2=s=u{!FDj|<0oe;6w}1H_X; zfCxj|t{Y_hXAz>?-sp3%y9eNbtx0H280!R?tODi}g2*vQ{-EO9BP!7|NB4!V3Q7?c z(zGy6j&3Ek@=Za`Q(u z9)21C5BCj5!^tXgJ=p}{Zx7iA9r^v_33$xxC_HHP9QgnqC(}Y#-bwq?{&XOCe>xos z50MqZ17sx-ugmBdcx-F|bm(`{L-bAh2|Yv435KBG&|l$!Fd`C(dW&=-t0-NRCmJpq zC7K{=5cxz4MaxAiL@PzBL^q0V72PIk6Kxmm6x}Y`EjlIcCDw~m#3r#-Y!^Gknc~6X zQt>G9Xz^I_D)D;pM)7Up-Qvf@`^8U)4~h?qkBFZZKP!G-{I>XA@%!Qr#UG155q~B= zEB;*kMGtL{+#WM~Ebpow|l4~S4Np6vBlC(*-NVZAtmE14cE7_OOCm|(aKtgK5poENs ztc09|yo7>;Q3<0H#wL^}R3uDHs7k0wn4GXQVN=4PgioYN(k$sT=?v+mQor;vX;3;} zxK(gV`xr7ud4Nl)}l?&<2;ujhcC zsfqr?=ETK`S0`SRcx~c!iE9(rCvHgGlDI8#N8+x;I}-0oyeIMA#J75xdJXP1z1N&x zSN2-d>jpX8l9U_d{p9KLJbAIaQeG{eB%dOmCZ8d9%RTaDc|abL&y~-YFOV;iFOf6( zP4eCHQ}Xi)lOjVgTrpNLUNJ#YrKnL%Rx~PF6blrK6iXCLv0AZSu|aX8Vxyu>u|=^> zu|u&-@u1?6;-um=#e0g+72hhpSNy2>SxJ;4We;V7vZqq1v?v`)m$IKSO_{FDRAwtj zDd#BXE3Z(lP_9(2Qm$66QC_dyq};4*S8i2qSMF5auH3CWs64IGsB%=rsv1?Ts$Ml) zHAmH?@~gtCYgN~))~PnAZd7elZB^}2?N#klJ*?WVdO~$jby)S3>IKz{s#B_WRPU)i zRDG=aMD?xeJJt89AJsCoQEgG%)DE>v-A|pXE>I6q4^xj&7pcdqC#tK|lhjkx)6{k9 zIqD|0UwxT6sAlRF>XqtM>ecG?>J91})f?5fsJE%_RX?PDME#h0zxpZlQS~$G=hQE# zPpUsupHZJvpI3jW{z3hd`WN+Y8l+KbQZ)TEBQ!;tVoj-LlxDPMtfpL3p_!YYXZr0qdc~ytV?Wfu^+H>0T+AnoRU5;*?u0}US zH%&J~cd4#bw@|lOw^SF_Ez@10TcO*ayHU4McZ+V5ZnLgkw^g@Ycb{&*?hW1N`kwl} z`fPo}6CNb;e|4iZR<*Xe>33GLANmH%>5C8mo=9#@WUe z;{xL%;}YXC;}ymg#+Al(#?8hZ#$CocjCUIEH|{m=Gd^s5)Ogr<)cB0?IpgcbPmG@# z&l*2BeqsE|_>J*9lh`CNNll5S-lje#xk+hKn+BNjO$DaGri)AyOqHf;(%%=eiOm|rv>GoLWOVm@hp z-TbEcE%RCP=jJcWUzxu#e`o%|{FC_?i`0^ANwJtL7K_coS)7)>mj0F@mZ6s6mO{%& zONr%TOPOViWt^qOveEL00*7dYLs~4O&Ci7VG8K71ov3Ro3gQYpv_88?3ij z@30=QK50E&`i%92^;PR@);FxDt)E)YSkGC%w;@|^TOXU;rnIHl%r>jdZX047 zY8!1EV;gHLw@tIv+3IbxZI{{_Z7sHWwpQCh+Y%eIt+cJPZL;mP9ke}Xd%^aS?YQk_ z+grAGZ134Vuzh4ZZ5P{Z_7eL{dxL$p{Zjip`vUtS`%-(@zRZ4ueXD(keV2W={cign z`@{DA_9yL!?MLh{+uyXmWq-&1p8XU1XZEx9^Y$<8KXDQ+iIZ^(PQ@8GBWLDp9LJ?{ zgSjExMcgoM3|G!oaFtvQH<|Nr^_-V$~TEi*zb7K zaoBOx@s{IV#|Ms&9H$+hIlgv$=lId_vopb&=PIIniDc3$UP>%7^y$=T-I;(XNkxbq3;A?H)hr=4#*-*tZA{K$FQ z`I+-;=MT=Goxiz|tG7$$Qn=JEtxNB6y85{WxYAtdu1wbuSFy|I3c7A}ZFfEAI_CPm aud=VBZ~wmOQCv+(^iw2_e#YMWX8spjp>*;9 literal 0 HcmV?d00001 diff --git a/ch14/chapter14.playground/Sources/MetalView.swift b/ch14/chapter14.playground/Sources/MetalView.swift index c53b382..e66e923 100755 --- a/ch14/chapter14.playground/Sources/MetalView.swift +++ b/ch14/chapter14.playground/Sources/MetalView.swift @@ -18,12 +18,12 @@ public class MetalView: MTKView, NSWindowDelegate { } override public func draw(_ dirtyRect: NSRect) { - if let drawable = currentDrawable { - let commandBuffer = queue.makeCommandBuffer() - let commandEncoder = commandBuffer.makeComputeCommandEncoder() + if let drawable = currentDrawable, + let commandBuffer = queue.makeCommandBuffer(), + let commandEncoder = commandBuffer.makeComputeCommandEncoder() { commandEncoder.setComputePipelineState(cps) - commandEncoder.setTexture(drawable.texture, at: 0) - commandEncoder.setBuffer(timerBuffer, offset: 0, at: 0) + commandEncoder.setTexture(drawable.texture, index: 0) + commandEncoder.setBuffer(timerBuffer, offset: 0, index: 0) update() let threadGroupCount = MTLSizeMake(8, 8, 1) let threadGroups = MTLSizeMake(drawable.texture.width / threadGroupCount.width, drawable.texture.height / threadGroupCount.height, 1) diff --git a/ch14/chapter14.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate b/ch14/chapter14.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..bf0431f4aab1aad6dbafa11a640d8a58a1912d8b GIT binary patch literal 12304 zcmeHNd3aORw%-FoGoK92&?L>!G>FjBmX6FFu|Nw_$_z2IX^FH=Nm6JTWET+y6cNM; z5n2!sP(k!LpyGrBB3wWPMG!|&E((GOityISY0?((%6H#=-}nA_&DRWP@4eRAd;QjU z&ZOEZZy=bI^fAJSAc{Jmj;Is8NPi#gnC9^ZyuO;z4&S8PJ!Qeb7>CvAM zS{1_cS3j%7dej+3AvMyVXcUi}s0+FYbwxL$Zm0)JN4KCtGzbkwLr@VaMnlmsbSoN# zMxzO+5=};4bUT`Ys*n#gpc&{6)QA?Kg=i64fgVRI(GzGDT8)~}db9yOgPuh%qL
  • ER-{9l;BK{p; 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 output [[texture(0)]], int width = input.get_width(); int height = input.get_height(); float2 uv = float2(gid) / float2(width, height); - uv = uv * 2.0 - 1.0; - uv = uv * 2; + uv = uv * 2.0 - 0.5; + uv = uv * 4; float radius = 1; float distance = length(uv) - radius; constexpr sampler textureSampler(coord::normalized, address::repeat, min_filter::linear, mag_filter::linear, - mip_filter::linear ); + mip_filter::linear); float3 norm = float3(uv, sqrt(1.0 - dot(uv, uv))); float pi = 3.14; float s = atan2( norm.z, norm.x ) / (2 * pi); diff --git a/ch15/chapter15.playground/Sources/MetalView.swift b/ch15/chapter15.playground/Sources/MetalView.swift index a451e4d..b2081e0 100755 --- a/ch15/chapter15.playground/Sources/MetalView.swift +++ b/ch15/chapter15.playground/Sources/MetalView.swift @@ -21,7 +21,7 @@ public class MetalView: NSObject, MTKViewDelegate { func setUpTexture() { let path = Bundle.main.path(forResource: "texture", ofType: "jpg") let textureLoader = MTKTextureLoader(device: device!) - texture = try! textureLoader.newTexture(withContentsOf: URL(fileURLWithPath: path!), options: nil) + texture = try! textureLoader.newTexture(URL: URL(fileURLWithPath: path!), options: nil) } func registerShaders() { @@ -46,13 +46,13 @@ public class MetalView: NSObject, MTKViewDelegate { public func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {} public func draw(in view: MTKView) { - if let drawable = view.currentDrawable { - let commandBuffer = queue.makeCommandBuffer() - let commandEncoder = commandBuffer.makeComputeCommandEncoder() + if let drawable = view.currentDrawable, + let commandBuffer = queue.makeCommandBuffer(), + let commandEncoder = commandBuffer.makeComputeCommandEncoder() { commandEncoder.setComputePipelineState(cps) - commandEncoder.setTexture(drawable.texture, at: 0) - commandEncoder.setTexture(texture, at: 1) - commandEncoder.setBuffer(timerBuffer, offset: 0, at: 0) + commandEncoder.setTexture(drawable.texture, index: 0) + commandEncoder.setTexture(texture, index: 1) + commandEncoder.setBuffer(timerBuffer, offset: 0, index: 0) update() let threadGroupCount = MTLSizeMake(8, 8, 1) let threadGroups = MTLSizeMake(drawable.texture.width / threadGroupCount.width, drawable.texture.height / threadGroupCount.height, 1) diff --git a/ch15/chapter15.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate b/ch15/chapter15.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..e071f216dfde1b9e36c67bf1dd211f53fcd66eee GIT binary patch literal 13775 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 n%E- MTLRenderPipelineState { - let path = Bundle.main.path(forResource: "Shaders", ofType: "metal")! - let input = try! String(contentsOfFile: path, encoding: String.Encoding.utf8) - let library = try! device.makeLibrary(source: input, options: nil) + guard let path = Bundle.main.path(forResource: "Shaders", ofType: "metal") else { fatalError() } + let input = try String(contentsOfFile: path, encoding: String.Encoding.utf8) + let library = try device.makeLibrary(source: input, options: nil) let vertexFunction = library.makeFunction(name: "vertex_transform") let fragmentFunction = library.makeFunction(name: "fragment_lighting") let pipelineDescriptor = MTLRenderPipelineDescriptor() @@ -58,16 +58,17 @@ public class Render : NSObject, MTKViewDelegate { public func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {} public func draw(in view: MTKView) { - let commandBuffer = commandQueue.makeCommandBuffer() - let renderPassDescriptor = view.currentRenderPassDescriptor! - let renderEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: renderPassDescriptor) - renderEncoder.setVertexBuffer(vertexBuffer, offset:0, at:0) - renderEncoder.setRenderPipelineState(renderPipelineState) - renderEncoder.setTriangleFillMode(.lines) - renderEncoder.drawIndexedPrimitives(type: .triangle, indexCount: 3, indexType: .uint16, indexBuffer: indexBuffer,indexBufferOffset: 0) - renderEncoder.endEncoding() - commandBuffer.present(view.currentDrawable!) - commandBuffer.commit() + if let commandBuffer = commandQueue.makeCommandBuffer(), + let renderPassDescriptor = view.currentRenderPassDescriptor, + let renderEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: renderPassDescriptor) { + renderEncoder.setVertexBuffer(vertexBuffer, offset:0, index:0) + renderEncoder.setRenderPipelineState(renderPipelineState) + renderEncoder.setTriangleFillMode(.lines) + renderEncoder.drawIndexedPrimitives(type: .triangle, indexCount: 3, indexType: .uint16, indexBuffer: indexBuffer,indexBufferOffset: 0) + renderEncoder.endEncoding() + commandBuffer.present(view.currentDrawable!) + commandBuffer.commit() + } } } diff --git a/ch17/chapter17.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate b/ch17/chapter17.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..8b2faa3be970f08e8bbf80c61f4cae2ad2a41978 GIT binary patch literal 13607 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 ZW%|_gS?O*O;~+w$Uv8508~#pj_&*VNGQI!+ literal 0 HcmV?d00001 diff --git a/ch18/chapter18.playground/Sources/MetalView.swift b/ch18/chapter18.playground/Sources/MetalView.swift index b8c4802..8c8373b 100644 --- a/ch18/chapter18.playground/Sources/MetalView.swift +++ b/ch18/chapter18.playground/Sources/MetalView.swift @@ -3,9 +3,9 @@ import MetalKit public class MetalView: NSObject, MTKViewDelegate { weak var view: MTKView! - let commandQueue: MTLCommandQueue - let device: MTLDevice - let cps: MTLComputePipelineState + let commandQueue: MTLCommandQueue! + let device: MTLDevice! + let cps: MTLComputePipelineState! public init?(mtkView: MTKView, shader: String) { view = mtkView @@ -25,16 +25,17 @@ public class MetalView: NSObject, MTKViewDelegate { public func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {} public func draw(in view: MTKView) { - let drawable = view.currentDrawable! - let commandBuffer = commandQueue.makeCommandBuffer() - let commandEncoder = commandBuffer.makeComputeCommandEncoder() - commandEncoder.setComputePipelineState(cps) - commandEncoder.setTexture(drawable.texture, at: 0) - let groups = MTLSize(width: Int(view.frame.width)/4, height: Int(view.frame.height)/4, depth: 1) - let threads = MTLSize(width: 8, height: 8,depth: 1) - commandEncoder.dispatchThreadgroups(groups,threadsPerThreadgroup: threads) - commandEncoder.endEncoding() - commandBuffer.present(drawable) - commandBuffer.commit() + if let drawable = view.currentDrawable, + let commandBuffer = commandQueue.makeCommandBuffer(), + let commandEncoder = commandBuffer.makeComputeCommandEncoder() { + commandEncoder.setComputePipelineState(cps) + commandEncoder.setTexture(drawable.texture, index: 0) + let groups = MTLSize(width: Int(view.frame.width)/4, height: Int(view.frame.height)/4, depth: 1) + let threads = MTLSize(width: 8, height: 8,depth: 1) + commandEncoder.dispatchThreadgroups(groups,threadsPerThreadgroup: threads) + commandEncoder.endEncoding() + commandBuffer.present(drawable) + commandBuffer.commit() + } } } diff --git a/ch18/chapter18.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate b/ch18/chapter18.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..372a154c0072aceb88f5801b2efb5615cc4ea2e6 GIT binary patch literal 12368 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 literal 0 HcmV?d00001 diff --git a/memory/memory_1.playground/Contents.swift b/memory/memory_1.playground/Contents.swift index 1ca6bd2..5096ea6 100644 --- a/memory/memory_1.playground/Contents.swift +++ b/memory/memory_1.playground/Contents.swift @@ -1,14 +1,14 @@ import MetalKit -let device = MTLCreateSystemDefaultDevice()! -let queue = device.makeCommandQueue() +guard let device = MTLCreateSystemDefaultDevice() else { fatalError() } +guard let queue = device.makeCommandQueue() else { fatalError() } let count = 1500 var myVector = [Float](repeating: 0, count: count) var length = count * MemoryLayout.size -//print(length) -var outBuffer = device.makeBuffer(bytes: myVector, length: length, options: []) -for (index, value) in myVector.enumerated() { myVector[index] = Float(index) } +print(length) +guard let outBuffer = device.makeBuffer(bytes: myVector, length: length, options: []) else { fatalError() } +for (index, _) in myVector.enumerated() { myVector[index] = Float(index) } var inBuffer = device.makeBuffer(bytes: myVector, length: length, options: []) let path = Bundle.main.path(forResource: "memory", ofType: "metal") @@ -17,11 +17,11 @@ let library = try device.makeLibrary(source: input, options: nil) let function = library.makeFunction(name: "compute")! let computePipelineState = try! device.makeComputePipelineState(function: function) -let commandBuffer = queue.makeCommandBuffer() -let encoder = commandBuffer.makeComputeCommandEncoder() +guard let commandBuffer = queue.makeCommandBuffer() else { fatalError() } +guard let encoder = commandBuffer.makeComputeCommandEncoder() else { fatalError() } encoder.setComputePipelineState(computePipelineState) -encoder.setBuffer(inBuffer, offset: 0, at: 0) -encoder.setBuffer(outBuffer, offset: 0, at: 1) +encoder.setBuffer(inBuffer, offset: 0, index: 0) +encoder.setBuffer(outBuffer, offset: 0, index: 1) let size = MTLSize(width: count, height: 1, depth: 1) encoder.dispatchThreadgroups(size, threadsPerThreadgroup: size) encoder.endEncoding() diff --git a/memory/memory_1.playground/contents.xcplayground b/memory/memory_1.playground/contents.xcplayground index 63b6dd8..a93d484 100644 --- a/memory/memory_1.playground/contents.xcplayground +++ b/memory/memory_1.playground/contents.xcplayground @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/memory/memory_1.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate b/memory/memory_1.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate index 33c67a2dc1348ddab95c11ff8a1a46454ea2d4ae..99816366ed2596d47bdd2a20f6fd69b3749bc14e 100644 GIT binary patch literal 13481 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 JmQVNM{{t3{F!BHZ diff --git a/memory/memory_1.playground/timeline.xctimeline b/memory/memory_1.playground/timeline.xctimeline index 648e929..8a9c7b3 100644 --- a/memory/memory_1.playground/timeline.xctimeline +++ b/memory/memory_1.playground/timeline.xctimeline @@ -3,7 +3,7 @@ version = "3.0"> diff --git a/memory/memory_2.playground/Contents.swift b/memory/memory_2.playground/Contents.swift index 8c3ecbb..6c71b58 100644 --- a/memory/memory_2.playground/Contents.swift +++ b/memory/memory_2.playground/Contents.swift @@ -5,16 +5,17 @@ guard let device = MTLCreateSystemDefaultDevice() else { fatalError() } let count = 2000 let length = count * MemoryLayout< Float >.stride +var myBuffer: MTLBuffer! // 1. makeBuffer(length:) // -//let myBuffer = device.makeBuffer(length: length, options: []) +//myBuffer = device.makeBuffer(length: length, options: []) //print(myBuffer.contents()) // 2. makeBuffer(bytes:) // //var myVector = [Float](repeating: 0, count: count) -//let myBuffer = device.makeBuffer(bytes: myVector, length: length, options: []) +//myBuffer = device.makeBuffer(bytes: myVector, length: length, options: []) //withUnsafePointer(to: &myVector) { print($0) } //print(myBuffer.contents()) @@ -24,11 +25,11 @@ var memory: UnsafeMutableRawPointer? = nil let alignment = 0x1000 let allocationSize = (length + alignment - 1) & (~(alignment - 1)) posix_memalign(&memory, alignment, allocationSize) -let myBuffer = device.makeBuffer(bytesNoCopy: memory!, - length: allocationSize, - options: [], - deallocator: { (pointer: UnsafeMutableRawPointer, _: Int) in - free(pointer) - }) +myBuffer = device.makeBuffer(bytesNoCopy: memory!, + length: allocationSize, + options: [], + deallocator: { (pointer: UnsafeMutableRawPointer, _: Int) in + free(pointer) + }) print(memory!) -print(myBuffer.contents()) +print(myBuffer!.contents()) diff --git a/memory/memory_2.playground/contents.xcplayground b/memory/memory_2.playground/contents.xcplayground index 63b6dd8..a93d484 100644 --- a/memory/memory_2.playground/contents.xcplayground +++ b/memory/memory_2.playground/contents.xcplayground @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/memory/memory_2.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate b/memory/memory_2.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate index 3835f78a560b900752454864e58a8bc6c7f28254..6f8b01027d54f6aceb3d9e368797e15164985963 100644 GIT binary patch literal 10425 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 diff --git a/metal2/metal2.playground/Contents.swift b/metal2/metal2.playground/Contents.swift index f270ef8..3eb207c 100644 --- a/metal2/metal2.playground/Contents.swift +++ b/metal2/metal2.playground/Contents.swift @@ -3,7 +3,7 @@ import Metal let devices = MTLCopyAllDevices() -devices[0].name! +devices[0].name devices[0].areRasterOrderGroupsSupported devices[0].isDepth24Stencil8PixelFormatSupported devices[0].isLowPower @@ -12,7 +12,7 @@ devices[0].maxThreadgroupMemoryLength devices[0].supportsFeatureSet(MTLFeatureSet.macOS_GPUFamily1_v3) devices[0].supportsFeatureSet(MTLFeatureSet.macOS_ReadWriteTextureTier2) -devices[1].name! +devices[1].name devices[1].areRasterOrderGroupsSupported devices[1].isDepth24Stencil8PixelFormatSupported devices[1].isLowPower diff --git a/metal2/metal2.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate b/metal2/metal2.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..b0da128ef6b00433b723f4ad9aee44fd8289e23f GIT binary patch literal 8878 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 diff --git a/particles/particle.playground/Resources/Shaders.metal b/particles/particle.playground/Resources/Shaders.metal index dda48b9..0da8ea0 100644 --- a/particles/particle.playground/Resources/Shaders.metal +++ b/particles/particle.playground/Resources/Shaders.metal @@ -27,4 +27,4 @@ kernel void compute(texture2d output [[texture(0)]], float4 color = float4(1, 0.7, 0, 1); if (distance > 0) { color = float4(0.2, 0.5, 0.7, 1); } output.write(float4(color), gid); -} +} diff --git a/particles/particle.playground/Sources/MetalView.swift b/particles/particle.playground/Sources/MetalView.swift index dde5ba7..4c786f5 100644 --- a/particles/particle.playground/Sources/MetalView.swift +++ b/particles/particle.playground/Sources/MetalView.swift @@ -55,3 +55,4 @@ public class MetalView: NSObject, MTKViewDelegate { } } } + diff --git a/particles/particle.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate b/particles/particle.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..b1d57fa83bfaef6045b0b670fbbbf0dbd5ecc180 GIT binary patch literal 13076 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 literal 0 HcmV?d00001 diff --git a/raymarching/raymarching.playground/Sources/MetalView.swift b/raymarching/raymarching.playground/Sources/MetalView.swift index 19203f9..4e93127 100755 --- a/raymarching/raymarching.playground/Sources/MetalView.swift +++ b/raymarching/raymarching.playground/Sources/MetalView.swift @@ -32,12 +32,12 @@ public class MetalView: NSObject, MTKViewDelegate { public func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {} public func draw(in view: MTKView) { - if let drawable = view.currentDrawable { - let commandBuffer = queue.makeCommandBuffer() - let commandEncoder = commandBuffer.makeComputeCommandEncoder() + if let drawable = view.currentDrawable, + let commandBuffer = queue.makeCommandBuffer(), + let commandEncoder = commandBuffer.makeComputeCommandEncoder() { commandEncoder.setComputePipelineState(cps) - commandEncoder.setTexture(drawable.texture, at: 0) - commandEncoder.setBuffer(timeBuffer, offset: 0, at: 0) + commandEncoder.setTexture(drawable.texture, index: 0) + commandEncoder.setBuffer(timeBuffer, offset: 0, index: 0) time += 0.01 let bufferPointer = timeBuffer.contents() memcpy(bufferPointer, &time, MemoryLayout.size) diff --git a/raymarching/raymarching.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate b/raymarching/raymarching.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..464daf45f062b7a6f75aa8abde67ad2cd7b3cc51 GIT binary patch literal 13151 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 z z+FTb{+|EsO`R7p-FFa91xvMK8>#XVOXySYX5=^3`1W9RenTW(N3L;ic$_3FtN$bw+ zARXk;vMj#9asjv$+zjpoJ82o@&)_!*=*?Xsy|ptzmKHna!BRK}y5J>nKE2Dhk`^+q zphb+=(gMbtX~E)av`q00_!c}0&ma*}(_%yuDn>KWY~(~P)Q#5CqQZO8{pb<&0xcoj zgML7N&_Y2iHsfR(Tb9!zKo{=7SKu}HCcHLO@JA1JdZMqVWq%v-rjWy-5S;K$VX8rY zcxwtRb->P(pO5x-<)iquk4_N3cl~|_+Mzx*&Dx8lp-3^5V~+7kP0jj*uXGa zmpUAb3{^zFPAehz(OSquG)X&xenv-W9(ICOKIY*vx}aJ-h1NAr#nbQ%+=kt>vXRDO zcs{Ld?4rxuNGlh2;~%LTSBc_9T3VlIq`ovolqyOSWrzwz<)ZPT86ua+E%J$$if$0y zD!NDXfaqb-qoT(}FN=1F-VnVddSA3lv`6%zI7(a~9xbjCj}?y>PZUoQ&l0zYJHhR(QBe_ihd^g6Dg3g(s5F+^cLwl=_cuY()*}^ zUHYQ*J?Sp#9_fDRXVL@G!_uSDW6~4SlhRYt(=qh$h>^u8Vw^GUF`k&t7+>r^V|T>v ziTxt>%h<1D55*piJresv?5Wt(v1j679FB{Mi;jzl8y~kIZcW@{aj(RE7I!4>RNU#f zzhpp$WFlFVELx_OCCUu4B$-vl%93S6WT~$q#Wbexk%TCB;a)n$eSIgt& zT6v<}AUDa)a;w}fA1=R0K0-c9UM{bYSINi9$H^ziC&?$v>*Q^6BELqyPX3Vm8Tn56 zxAMOfRz;qoOi`hzQdBF(D<&#jic1t;#e9Wd(WSUtakb(a#VW;W#ahL!irW--DDF~h zQ#`GBTk)adbH(?HUlqp{zbSra0D~A26U9U`dd9%8Og59p6fnh12~)~&jF0JJ7BWki zOPR}l|QM(DwWErva1}b6xC4GFjcxL zQ#C?0N>#3^P*thMs>Z1%sA^PQs+&~XRiCLv>Y?h%>M3fcx<%cpo~!Oqd)4#Re)VGY z3iS=@HR_wxx2U(NUr@iR{zCny`iur@utuzrXo@xEnrh8>%|y*4&1B6Sja%c@%-8re zU7F>Z>opH*9@FgB9MBxpe5LtD^P}bu&7Ybx@i1N%ua8fT&x+59&xM0;&gHyqf_Y&x+I-NXVaDFN_8W3WxCP2 zO5F_IEZrR4#kwY4i>^cG(*<-3bc=NV(5=v|)UDF3*4?1nqvej)-l(_g?Rtkk zMW3%9t{KpWp`sw8dwqan#)G1v^OA=i*^C^QrsN(`ljk%ltEXhW@GmSLgc8pCG8YlfYM zLxy99bql8)q74 z8(WRn7;iG(Vq9mu-S~*{1>--BuN&VqzHQuX{J{8;aj$Wo@hjsY<6+|w<4KdmBsImF zWG014X;PcwO{^)|G{lr@N;74cvP?OqJX4Knrm5ZJF?E`JrhsXIX_0A(=~B}w(`wTV zrW;K+n{F|!Gu>{w({#6Khw1wySyFCNV^Vk0#-vx0UQK!}>7PkElJ+F+P1={VKj~o7 zS4rO_eVg=S(w}CPSz}Hx>&$wy(d;k}F{hf-%*EysbE$cxdAzya>@qi-IdhxYZ{A?u zW`5B8u=!E*Tjr0=Uzoo%e{DWwK5RZ}K4$*S{JZ(I`7evaVz#7O@+@VRah3^|8cVHZ zie;u{w#8|2S(+`JoEr%`NTYj<}wH&wnW{tIKtcg~m)ois|Gpza6LTjy_5!)~l^ITJNxKwQjRMXnn-`nDq(k zo7Ru4A6xfY_gTNS9_Ir~EU?e;hAhwUfqzuQmS&#;IUu?ei5O=gF( zX>2B&&6cv`*vV`?+sMvfU2F^6#$LjwgY3iX^XyCPtLzT; zP4;beFZ(I`IeU=(nmxoGV~?{Z*pm*iBia$`kUNwPwZrJJJCYqk9chjXM~S1{QQ@d^ zjCD+MOmWmZ8XeOe?T#+T<&LWz*Em)=Ry)=@);Vr>+~rvBc);t<8 literal 0 HcmV?d00001 diff --git a/shadows/shadows.playground/Sources/MetalView.swift b/shadows/shadows.playground/Sources/MetalView.swift index a3a47b1..6ffd9d2 100755 --- a/shadows/shadows.playground/Sources/MetalView.swift +++ b/shadows/shadows.playground/Sources/MetalView.swift @@ -38,12 +38,12 @@ public class MetalView: NSObject, MTKViewDelegate { public func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {} public func draw(in view: MTKView) { - if let drawable = view.currentDrawable { - let commandBuffer = queue.makeCommandBuffer() - let commandEncoder = commandBuffer.makeComputeCommandEncoder() + if let drawable = view.currentDrawable, + let commandBuffer = queue.makeCommandBuffer(), + let commandEncoder = commandBuffer.makeComputeCommandEncoder() { commandEncoder.setComputePipelineState(cps) - commandEncoder.setTexture(drawable.texture, at: 0) - commandEncoder.setBuffer(timerBuffer, offset: 0, at: 0) + commandEncoder.setTexture(drawable.texture, index: 0) + commandEncoder.setBuffer(timerBuffer, offset: 0, index: 0) update() let threadGroupCount = MTLSizeMake(8, 8, 1) let threadGroups = MTLSizeMake(drawable.texture.width / threadGroupCount.width, drawable.texture.height / threadGroupCount.height, 1) diff --git a/shadows/shadows.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate b/shadows/shadows.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate index 8c757442317b0d09f964c4b2a82be606b714b7e7..7e9e1c7aee3ecd7408bfcfc5293a4fdd73d7d3c7 100644 GIT binary patch literal 12387 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 DzRPP~ diff --git a/shadows/shadows2.playground/Sources/MetalView.swift b/shadows/shadows2.playground/Sources/MetalView.swift index bf69602..d4bd02e 100644 --- a/shadows/shadows2.playground/Sources/MetalView.swift +++ b/shadows/shadows2.playground/Sources/MetalView.swift @@ -38,12 +38,12 @@ public class MetalView: NSObject, MTKViewDelegate { public func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {} public func draw(in view: MTKView) { - if let drawable = view.currentDrawable { - let commandBuffer = queue.makeCommandBuffer() - let commandEncoder = commandBuffer.makeComputeCommandEncoder() + if let drawable = view.currentDrawable, + let commandBuffer = queue.makeCommandBuffer(), + let commandEncoder = commandBuffer.makeComputeCommandEncoder() { commandEncoder.setComputePipelineState(cps) - commandEncoder.setTexture(drawable.texture, at: 0) - commandEncoder.setBuffer(timerBuffer, offset: 0, at: 0) + commandEncoder.setTexture(drawable.texture, index: 0) + commandEncoder.setBuffer(timerBuffer, offset: 0, index: 0) update() let threadGroupCount = MTLSizeMake(8, 8, 1) let threadGroups = MTLSizeMake(drawable.texture.width / threadGroupCount.width, drawable.texture.height / threadGroupCount.height, 1) diff --git a/shadows/shadows2.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate b/shadows/shadows2.playground/playground.xcworkspace/xcuserdata/mhorga.xcuserdatad/UserInterfaceState.xcuserstate index 501a0aa435842d0c86aea6ba4307aa987ba3ece8..876a411245540c42d4c3e07fadd31cccd19b889f 100644 GIT binary patch literal 16984 zcmeHud3;kv*Z<6&8-#92(=^S}CTWtUO`D}jy0SK1DN8AIVW*^RS^{lSk`$K{7hI4>5l|2n^>IZ-+;`)HZybXnKS2n z&v(wut!-&?`TXhWrvL;LK!653(2F;Smp4W`!|C<8Jnk`CPwiA^o!>WB>+sf1agnbp zwSG^F5WofNc1FXy!A+nyhyfxH3-llrqyYmk0uwNUbYKBiU<27;0I-81Pz=U_@n8a& z2qu9VFc~;NEvN&x0Sp*07u*i!f%#woSO^w@#b60o3RZx7!F^yQcnCZU)`3UBHn1J+ z0FQy^!3*FBcoDn=UIwp#qu^EWIyeE|1s{UXz~|sR_zHXnz6U>mAHnb75AY|1kOzCg z2*`&*7z5*=1gfD9=D=Jy9G1ZmupEwrqhJNBgjKK_j)r64SU3)jhjp+XI^h)Pf*#lc z{qSZu8{P&noCoK_1#lr;3h#!?;7Yg(u7R82X1E1zg^$2(a1Y!I_rWLOVR#fCho|5f z_%=KX&%ux2=kNmj7XA$Xq$sL46-Du>7%GmEQ%Wj{N~1EVEGnDIq54y0)Cj7a8cB_! zDyT}TimImSDJRuHHBwV37d4fdMm15*l#iN8&8BXl=1>eZm%5!=NG+xApq5cY3e=d9Q84Ep8B5pf%=iUgaGP| z`k*irj^rpFB_IV-A{9zR$tVSxkQwEozNjDSj|QLuREkER3N#kgAQzg7rlD3e1IL&cqcOdRzJtD#zK32;Z=g5Qo9NB-7J4iF2)&Ko zPVc7o(0l29^po^{`T%{5{s;XU{W^V|euF+ipQKOG@6zwl=jiw859kl+f6`yjU(*-q z@97`tKj=T{zvxRm!0XNH!;9p_@ZxwHUNSF*XW$um7M_)t#mnaPRmslf6xl&+F zS;Z))&+qX%h?W(8hu>M~@H=V*Qno8M6OX57jH@c6OGnFg>%tXwNCK zvCENb%(q&zjRiTDOnZ?%y&&D1-J3|CJv%!q$Dqo{vCJ{3W?O8T=>}D=)HH)RGb_6<=eoq?WEQGS zORkEYfhs3AN0m-K*37JQl_kTHt*RpC?VDR8i1AHv5U222O)X81wnnd~)m>jB5O%jC zXKdopnFZ-ZnYnh0(VCG#JUZ8IH|7^*=NNPHbF8);TTWrNl{kJZ85?xuE~hxj7eotV zM4d4+W@cakOAAQ=w6H15=O^CM!ja_qywx9a4G7_9qh*d}X5MDskMd!r|>|5->3*lXU##6g`QSvWkj2uhZ!s z=4kV@`m3r+3oHCym%EXere{-y>t-kM1`=_^K$e31;+*25Vxuj`US!NIEG{w@##t+ou}jb#;_^*KGb-#g<} z*|V*?zJVTCK%!rGJ&&#th-c3xs-&}?9@NT`Oi+DG969;AU;hbZ6@@Mm z%O1DG+t$%fUL)X_RSb2uIqU76Oyk`_dG`E*!lL4m!KFin4jW!JqHN@-ipr|$i9v}0 z{m4pGy8KN9aiYmObC2Qz-svT6r9L9Gx~!tAw6u^cVySPq!{x3K2+AsoU0$D`^lb6C z2}+GGt0-V$xGVr(f{-ZAVm{Jb;cshl4tMyb5pNGZD1<|$g`s(twKmr}y%=JId-cIo zAA+$o4ioS(FM31~p-a&Of;EIDSqV8R1C?L~xCJZ+o55?~Q*eP$mp`EhiV0DX!9+q; zEU+)3Ba>hwbi)~tfwvO^vJfsN1Y|kf0iS~}z!%}m@FM(!f|P(z3K=01W2kY|1Zom> zGqr-cpV~}4LTJE2LIB>NzMy^~sa`}zsrx~+7CnsG z(RvX0kAmD!FuL<+=MS_A3pw=42L)tNhPV1zjAh|u@qo!Frs!9e9Bc z_(3Ze17;Fiwt<_$Y+}hdI1S&5m*Azuh7S{)uEXv4MPkvH*woHa2u`!%1pR7CoNiYu zQ9HWOS=-v!==6r{Gp?)GxTXNGRT7LN0;;)P1J_*9THDOZ5vU5C4UX0(e;2}za<+J# zK7!N^HvWC=YO%KB#u0mz6RBJZ2|Sxy0C7+CNG5mJJG>;xunkuoAz+0DwdaJykiMPj zghU5TeFwN3q;!Bg!ClyZjU8YaxCfiC8JA29%)H#=bFu2y2$DEOJD2ZT(^3zLd#gDp zdlgvC%Dx{wfYY(113U=UU@IPjOUBxp{7$c%u#!p^n1cP=!A2ll4?4hlumRg}2F_d$ zHj%~Lg0sldRkOrU-$RQ4v8f>b?`{nI8p76q>&5o$>ue%>Iwvt*&+ki|o@S@t+r}}J zN5QUkuoGwF%Ait@g99LCGk5~*27AC>un#;5_TwC!i~Hh!xIZ3%2W|#WfrH>_aEN>k zgJV0^HxYSb{|Xmy@ulcS}j$!V(hoBW=(TFbO-4bFmh2zmq`GR#vK@bF1p3Y0tiQvyAj z$!d3f&C*elg=URt2#)P)!^3a^F2?{5o zk$vjdxU?O7gNNXfajtHBT|I{7Q6>^|LtTCo2Pg%^)f+wDHdAH5+%dOZ;{H1cej=9q z8TuH52~sXl}v7@d#X2BPgC_oW%+@ax2!?T;(IcV{V?}@iscl z1dgYX5`~$#vZKk|IosgR?(|e+e`fBRPdt>O<)-`>xJ0I0SX~)hf#B+Oko4F8>P>-> zkb;QYdGv6`YdLfWq*-z7PUVLB*9dx=kqeuklAUHe32y@7us1jh!@w^rH?4K}oP@KO zyv`=#f-{`NeJb#9PTxovRYeHVs9_y267=W36ToOfU^ z4qz-EjVlSzchS8JmV@SG<<6PY=@L*16E24?r~qT23XdhwbqgC%tUL|b06{Gt7xG}3 z49$NBFEE|(AuF_zPbSR5ed$)0O1zc5B7%x;6OMC z=0Q8m#}n}+T!SZL2d>3+xPA*Pghj9zmJqE=;Se|!J8=VU#8Zg=E<6=aW8pWc!qe)l za~2RkQo_r>UOgq4IJ~ zUI9lHHHSMXV|jUSDJH-gAnbq>;UwIIn>*lS=)i95!S<>KGTb*QhycT!?neI<&Sx4x z);cT@{L&3~;Z!&cybYV78_&dE0+ZA6j2eMC1Ux-LtkA=vt|`O>$zH6r&fn^Fa^k16 zF6qTS;*zix&LB=YlXyVexGpHJ3V<~B6Gvzr69iH&fNp_vY6S5lsJr5x+v){|lsjDB z4tOgY_}A@oIUGWUz~NauivS-WWr+roKl_@^|0dvtG$w>NWFQuqFN2hFXQRW{>g(cE z-OvRx0VJ8lS?mthVt3*>SU|W$7bsXPHrr*Wa1UHT5(Qk2Z)=D5V$23>G{M>sr({#R zj}v-7*wq0afU7Zs7lz0OTnpO?tiXrh!*Cs*i*LvC*24~@KZB`d{ETa)LS9PrMdXKshPu6WX8Kn0(`iwIR-%mzQ7 zjP6b>HF>wK3&;?VlJ90e;Qtz}7dM zv;16(q{ZuMCY$0bn(zvIAHD-W^cH*;K1Uw#JlXsmA&`HNYykJcSD#{!}DI$nO*Y$G_k^c zSkQCO`G6hRLHqE^fbyM#zGk(%h*w=UfOLGCJmp9D6L|_C^41C{e1Et3g46IWjB@t?vM;i0~6?AT@}}qwG{ZRX`Qut@shV4R6Og@S}L=W~!Jfp$1c>#|PL|k(6`T6{M$?LGDhfnwK?oo*NWQad;hMH|ibba5p+94kox~pf@-b1Yf zDI2Keq=tAebsv5izk-kAS2s|rsQZDRT8)q46Qq*#4lWrp%-PUcH)Ct|p_Cpfu#Dpn zjIAn-9p!4A66hR6i*{-g`{Ax8%VKg47C;Lh-+2hH%Nvjgh5{I z@VeLv0m#H_9=y+R+qn6LPH(8F^8|8VkH)}okJnGOigjLB3n>$_<+&bR z0@B&M$=UI-0P_s$yqnrfaEsc5PqtJ0@Tu#N8R{uQW=QSzY5XQW6CyLzVd{m;DF$@} z=%|zj$=FeZ^gi`rXp;ZL=Wq#UiBH%GeM)_X-^c&#n$Q>2 z*H>tDk!bZT{(xxpA-0pfz`QX%l=+GJ?W#lm3=H`Q+ckOa9#cmU(WHomD1`7Q_|p!= zL%r~4`18Otg3-_MeX^p2@AQbBP=hJN`fs31r!i0jiUBE`P$Y^%d?Y~8NQlqlFYuT6 zD|`Wey@^!RW04rBkOZjkMf@}Vh4}4njNy8<$&yIX(s@VBDFY< zQ3mJ0Ra4pXQ_@BVSrAOQH6lB!A~zcaq<+U1r9%@d>i&>?XM@MvxvFFYCz9QIR1^$n zH;t{n%cTXUszzEMY)2aWO*=}$-v;R}7iM-JD=FAjkJ5;Xpj7-_J2K$!2^0iTEZ8F* zWq_3R$bziMhJV06;-A<*$cOyFeoD$mb6ZH?SaK2**in;E>{ef}TC&JaBEu4@FQ9=a zFQlIx|BCIwXBDF2kT$IRAR$3R(6G>m;rREi5#?xP56nZAs5b`Dik#zub+H6X;MQzJy~K2w3~E=M$l2VhholylJZL!GM}j%N0_l z6Dd9hQmhz6_BTWbw1!y5!gchSEXek4GGq4W>!x$LOzz7BsaZ#Izc6X6;qh;jeXgONJD#>S{pMjWx z3^}G^;9UXl&nMHJ*5Yxw{l37_Jt_YY$CY&!;kgL~su;dvkC)V>$nq!jXbc?kvB#sK zc78A*xWhg&LdN~Z)~yJMV6Q#|l256-!9zF%7e(Bofylnv-1 zn2FY*b_NRY%?ylYpl}0Pk2au7)bU7>HjJ(=`Q9ePD~uBx!j1DZtNzg z@gejANMTv#_yEsjS>~Pq&)mBa9ibfPCBidn87Rg387L!=dH|QOq;B<3>poc@B6UGw zuc1>!7i|8BlEd!GnsAFI< z15+5NXJ9G=(->&jg1$#TpdZ;fC;A2b3X2(NWT1(G7Pi#MKq~`nr0hw&`#(_*yz!Fh zRZ5iqt;Np&M2R+7*Q9&VeMnuCzKJH7X=Y&h-&HotLnToSp74}s#v>hZI)ZRF;eEhEP^XYA|@avzPon$wAp zbSYiNrnc9+;bSK_ZlFidhxgj~D=?T}AGm)z0GC=)8og-2Db6(S(cC@UV7#=CC#GSh@ECL za2NxJvvw*A*r{f{7LVLNes*S-h1kiO!P?1|nVH+&P7FPdBvN`VO_)qM14nhx^XUZ) ztYlz)&v0AHt^UXwLG^Wg>u=8^L*a29S6jwCtm41^u)p!V74(CI2h#V__t7iqRrLMz z1N3SJlB7`0z|jmG!@#i&9LK=%o9Q+5TKXaSVR{|;Z5;zAFmNIR9SkH%yDso&-G45H z{I5(6H+B>#$PfDd4tf`xA|9o8GH?E{^eWMBgW8yPr-fi4D4W#F{U^b7P6HqX;9)34A+8Q8?Y zW-iH3XP}pXzW-Yya#|Zo;&0Mt*cEz)z z^b`Fv1IgBCb_e|{{Tl;sVc;BMp}?Va^%N&t>(k^d;Oah_yn7|xx0*c2qc4}i>lKi3 z8(aLjj~f=KI`P8T%Se&rDthoT5-*A;AS9UmuALXnz`31!bsl?9f$PbQlz^=2`Kzw9<7>zkb?)W=EaJH_MW4ve-JmCD$Gro&Eu{a~(MR1Pe>us9AS$>72O5HG=GaMcg%{WpdJ%l4aKh#r=!ReieFp4JP^D zy3RMQ##I;A`mZl+U(R-S65Hwi^R~Nu=kPyeyvz0YuUL=6sR3ZuI`(eW<+tG9;MsZk zRe=f_hUE6R6sXB-cA4aA)*$3SjmVE~A(gtj0=KtUkr%EWV()FEqvWNkugS|)ki1C6 zBb(7abU1mLicemmQj^!HbaV=Njmkh?q)Ml)^l*9tc~NR7dF|;Bo`g4+H;y-hcN=dm zZys*}?{3~|-g@3P-Y(vL-gCU8VfkT&VZ+15ht-C;!ls7J3|kboBadn)Xuu(M&GhfBiK!pDU-hc5_U6TUV4x$qal zUkraa{Al>G@YlkRho1;P75-NEneemW--rJg{&V=R;lGFf8Gb1OMxY2@#7z->BFHN$ z5!#5Hh=Pc+2xr8ih?NoBBaTFzi}*J3rbtnwG*TX!5UGyTM(QF{BC{eVMb<^OM7BoG zjBJa%H4;b8jhq*GSLBMwb&;DRw?=M@+!47ua&P35kq06VMt&Xzq9jp?QQ9b7R7zB4 zRAE$c)ZnNgQNyCjqROL2MLDACqMT8UQLd@#Urb%h zqL{5Qug82Zl8W*~HKNHPhiIzEC-RG0MRP?9MTiFS+ji1vy0 zi(V5Q7o8BD61^ol6B`yA6Dy9D#L8lmW390{v3+Cv#}14wi7k)y#QI}b#IA|m8oMoa zN9@knZ(@HH>&02(9C2T9e{qp`uy}}gn7Cd%UF;Xn5VwhEi|2^%5w8|MEN&OC7jG0l zF5WMGO8m6=8S#tam&HfL$HcFR-xZ%1{}I$0GUBr0a^i-> zRm4@rHN?%1yDx56+~aY(0z?U$RiLSh7^IL9$7*Me>MbyJU~#faIX$kmRuBZOJ>5 z_ayI2K9qbRxgfbH`BoYxjgUr31yZ3@B-KmPq(-S(YLVKc{iSwkfwV|kBCV8;mX4K9 zkWP|LmNrXUq+V&Obf&aTI#;?>x<`6I`mywaEJh}g4U`R)4U-L*jgU={O_WWNO_nvw zT4Y{Xt8AvMO}0R`ShiGlmu#7Ax$I%tCfOF*BeLzXCuDnM`(*oNPsu)$U6RMiRdS6y zNuDgvkQc~{)Z6N(cCCyY!Om(ZBtN|=_=oY0%8c$|K5`l&>j|D^Dm-Dc@3lpggbq zN%^btcjaFyQqNF{RT`B}m7+>h8C7Ogj%t8vkjkzqP?f7jtH!Fvt0t=IRSl{ss;R0b zRkLb_>UPx<)g7w4RLfMWR1c^gRIOD#tlFa5qdK5Es5+#2UUfwElIj)Jdx;=XlbD`3 zAaPKlJ+UCMD6u55G_g8yOyao235k;uCnwe>)+f$RT#~pZ@o?frb(C7JR;X2KjXFu4 ztj<*zt4q~G)n)2(^(ggt^%S*7Jzecnx2kVZ->Syyx$1f9`RY5>tJIIGpHd%EA67rF zKB9g}eM)^={kHmD^*Qwi>I>>`)ZeLpRR660Rntpzlcu*OOcSS(Y2r0XO`=AlF=%X> zOihlapJsq&h-RdwLQ|y~t(l~mtf|#FHI15^HMeV)X;x_-&^)MFtJ$F0tl6sBu6a~* zP;*3cLi4uf9nE{1_cfnt&TGEZe69ILi?k71sWwHMrZs6T+6-;Bwy$=8c9^zIJ5pPz z9jzUwov59xt<|<^S8DfaU)Fw-1d@bF%A}N}v?OCvdXg=vf6}0&{G_6!!AV1sd`WAP zjwQXFbS~+`q>q!%Cw-N4G3nc+zjWmATF2An=!$eDx>DUR-L1N%x|O>7b*pu2bPws) z>9*+})$P(fq1&U|r`xZ4PWP(rjP4`dr@HgHuXGo6-|7BL2FX-1FZrhAKFQ(9x@3Fu zl;j!74<&C--j)1x^5Nv?l8+?6oP0F-bn@rPUnYN@{B80N$v-Fmmi#BV5*3{yN{LI6 zrNpNwQW8_NDY}%Dlo2WJl$9w5Q$Eo5(x>T%>4)pb>1*`0dZ&J>zDe)ax9Df+=j#{f z7wQ-3@6)f-uh(zVZ`E(t@6;dAKdnEke_sEh{uTYJ`ZM~o`gis3r>3T6r{<>iOC6ZH zICW*}{i&-{*QTCJ{WA4J>c!OW()y>BrVULSo>rc=I&E{>uC&L~cBk!4dou0Wv=`D| zN_!>kSlVl8r_(-4yO8#q0U3H3`WPY%e1pUwHz*7$gW8}q7!8?*e8W&fnPH@%(lFXE z*-&S28X65Q!!(26z!;Vo?ldejtT3!JJZ$JNY&2{(Y&C2%>^2-SylOaQIBhsG z;k@B1!$rflh93++87>*ajj=|xG1-`EG#ahOOk<9*ud&2fY8+}TGj2BSHtsb(X?)5g zG9{YQO*T`ODc98BG{}^1Dl%1?Mw`Z&CYmOj>P!tLmuZ@5x#=;}Y18lKM02s(ZEi8o zG0!#6H!m{ZX};UM+{{w%(pDGEU}!jd}#T|@`>ehtIe8cEwT=_4z-qBE3DPl zG1f^|r`2tpX`N?XY`w#JxAk7@D(huqt?f)PgwU@pR*pZzGOXW{fG5+>ly1i z*7vOMTR*q{ZvE4G$wt|Dw%)dITa+!@CbEfb8e5Vr*_N8ok})UawhSg?UdA&S$1+~a zIG%AbGcr?_8K0@hOw20Hs?HjdH7;vn_QLFC+4p3x$ljR!NcJwS5JgekPhRI8Z|*Mu HvLF9{$a8EH literal 16111 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