From 2fa2654ec80f87514a6aea5c8c63f9da2d4702bd Mon Sep 17 00:00:00 2001 From: Marius Horga Date: Tue, 29 Nov 2016 21:44:40 +0200 Subject: [PATCH] updated to Swift 3 --- .../Sources/MetalView.swift | 14 ++-- .../UserInterfaceState.xcuserstate | Bin 23421 -> 18328 bytes .../Sources/MetalView.swift | 76 +++++++++--------- .../UserInterfaceState.xcuserstate | Bin 19188 -> 19061 bytes 4 files changed, 45 insertions(+), 45 deletions(-) diff --git a/ch10/chapter10.playground/Sources/MetalView.swift b/ch10/chapter10.playground/Sources/MetalView.swift index 393222e..879e690 100755 --- a/ch10/chapter10.playground/Sources/MetalView.swift +++ b/ch10/chapter10.playground/Sources/MetalView.swift @@ -14,13 +14,13 @@ public class MetalView: NSObject, MTKViewDelegate { func registerShaders() { device = MTLCreateSystemDefaultDevice()! - queue = device.newCommandQueue() - let path = Bundle.main.pathForResource("Shaders", ofType: "metal") + queue = device.makeCommandQueue() + let path = Bundle.main.path(forResource: "Shaders", ofType: "metal") do { let input = try String(contentsOfFile: path!, encoding: String.Encoding.utf8) - let library = try device.newLibrary(withSource: input, options: nil) - let kernel = library.newFunction(withName: "compute")! - cps = try device.newComputePipelineState(with: kernel) + let library = try device.makeLibrary(source: input, options: nil) + let kernel = library.makeFunction(name: "compute")! + cps = try device.makeComputePipelineState(function: kernel) } catch let e { Swift.print("\(e)") } @@ -30,8 +30,8 @@ public class MetalView: NSObject, MTKViewDelegate { public func draw(in view: MTKView) { if let drawable = view.currentDrawable { - let commandBuffer = queue.commandBuffer() - let commandEncoder = commandBuffer.computeCommandEncoder() + let commandBuffer = queue.makeCommandBuffer() + let commandEncoder = commandBuffer.makeComputeCommandEncoder() commandEncoder.setComputePipelineState(cps) commandEncoder.setTexture(drawable.texture, at: 0) let threadGroupCount = MTLSizeMake(8, 8, 1) diff --git a/ch10/chapter10.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch10/chapter10.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index 4591e067402659c8f2fa1fb12861372764f1ff17..70c0b8b2d94be42e97dd937b86a665e52fc3d201 100755 GIT binary patch literal 18328 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 RH$?^iMlr#^q2Gmd{~!OSV-)}Z literal 23421 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 diff --git a/ch11/chapter11.playground/Sources/MetalView.swift b/ch11/chapter11.playground/Sources/MetalView.swift index db61db1..24c4256 100755 --- a/ch11/chapter11.playground/Sources/MetalView.swift +++ b/ch11/chapter11.playground/Sources/MetalView.swift @@ -2,44 +2,44 @@ import MetalKit public class MetalView: NSObject, MTKViewDelegate { - - public var device: MTLDevice! - var queue: MTLCommandQueue! - var cps: MTLComputePipelineState! - - override public init() { - super.init() - registerShaders() + + public var device: MTLDevice! + var queue: MTLCommandQueue! + var cps: MTLComputePipelineState! + + override public init() { + super.init() + registerShaders() + } + + func registerShaders() { + device = MTLCreateSystemDefaultDevice()! + queue = device.makeCommandQueue() + let path = Bundle.main.path(forResource: "Shaders", ofType: "metal") + do { + let input = try String(contentsOfFile: path!, encoding: String.Encoding.utf8) + let library = try device.makeLibrary(source: input, options: nil) + let kernel = library.makeFunction(name: "compute")! + cps = try device.makeComputePipelineState(function: kernel) + } catch let e { + Swift.print("\(e)") } - - func registerShaders() { - device = MTLCreateSystemDefaultDevice()! - queue = device.newCommandQueue() - let path = Bundle.main.pathForResource("Shaders", ofType: "metal") - do { - let input = try String(contentsOfFile: path!, encoding: String.Encoding.utf8) - let library = try device.newLibrary(withSource: input, options: nil) - let kernel = library.newFunction(withName: "compute")! - cps = try device.newComputePipelineState(with: kernel) - } catch let e { - Swift.print("\(e)") - } - } - - public func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {} - - public func draw(in view: MTKView) { - if let drawable = view.currentDrawable { - let commandBuffer = queue.commandBuffer() - let commandEncoder = commandBuffer.computeCommandEncoder() - commandEncoder.setComputePipelineState(cps) - commandEncoder.setTexture(drawable.texture, at: 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) - commandEncoder.endEncoding() - commandBuffer.present(drawable) - commandBuffer.commit() - } + } + + 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() + commandEncoder.setComputePipelineState(cps) + commandEncoder.setTexture(drawable.texture, at: 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) + commandEncoder.endEncoding() + commandBuffer.present(drawable) + commandBuffer.commit() } + } } diff --git a/ch11/chapter11.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate b/ch11/chapter11.playground/playground.xcworkspace/xcuserdata/marius.xcuserdatad/UserInterfaceState.xcuserstate index 81d391f703f4bec3a0f64a34640d4465e91c0139..d18e907a9931fa7300a979ee1e3926659a0eba5c 100755 GIT binary patch literal 19061 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

NJk40smHjk6@kWR?l-=;quDjmY=(A@fQtJ&u)b$ z#FsgU0<01WH^{%K5)bnk8IK_5|5OkD4k8Z~zPeSyS9|jBHI9Fwe_tXhPZ#UqW9D%X z!~Pc};(2l)ZHll+j}MSeu?W}ws+yJZZFVPG2u#xpRHfeHquFfh#((3K2S zF;K%m9Rm#v%w(XM1-^&eOYS50lLyFy4M$-prTtY;w3BA#O4vkdOgDm*>Jmz+LE+XP+z zG`_pNS8Hs=6aLp6e0eM3KSG!Aof9@ybaLU^6aHlme(XPj--@K<8V5hlCg}L5{BdOz zo(94)=${7I3g} z5BzT`VKd&3G$1ORgRN~PUvL)Ma<41nua%sVaPajuLHmEEide}XRxVI-4lur4_&2TR zk4V?l)p&|Bo`Y;^ElWJJ*VeEknS*cnNAR0P>RrM#mBCaRg%7kF@lBtP@GYO+_>RwG z_`pq0TV)}0yn7*epeVy?VYw;;2qUa!R+3AF*A3>DOCbeZgp7&k-< zg&W%5romhbQOtX9)q#N>8Q6(|og1m%R38pf7Y26aApPmFTC1)M{nN9vZO4b5h}gApV78DYtTr zr|=!bMrr~zk(xvy2Iezx00RpcSlCECNlnJ2Ol9Ce1{SfT4Ej$=nSMU=_zi`N6t?v? z0N>KWXQ9nPd7gUtk(A7)=5W$|oPoAx=}y1YE&E{A0GFzpn&G@jH9Qi|LW(`w!zN>A z;E)zL-<&=7%tj6|4~tnr;U4`XSo=1$4zqRx14|g_U|BoVWzExXQdx5wit4pG_D-~3 zt(s7X??kIHoh|0Pg~HA8M;PJ`>H`e+Lk13KU?~fBgbVEPa@CZ1&u}(vGUzy<_?Au! z(7n_l4D^pa;xKgt13bpSG6t5j04q2rLEP?oeEGn7HFh*=qe{<0G-|Y-5I?29V9`8H zeMX(3K4)MR14l6s+l8}{`jR?}p?<}{8V1&~P)Gl#iZxRoR{s9NPH?dbJuu)p|p{OFh6) z|KRLtKtoQ?#xrn2v!0#0@*+AJ<E~u8CMlDeEu{eaXiqNFQFIK;<%fAAI+kw3@#JX+KGV#T z>EFBuuXJjL*yPseWLnAcB!y0;)97>tPGjJ644lru8I5!Xt-?IfFmNUVpJ#dU!hgz> zukL?;C9XSG6E%CaLxV5c6xHKEjx8%w(<0=ybT&(nmCm9cqjAaj5(8&3@MQ+hZlv4O zIhY_Ejps1%6_%h^|5Jj_4he6w+`@@OWnx`}D>-R)Hgs>gKkoF?edxY)KRTDJVBlN^ zzQMqG44jX9<%{TidH`KO7t%QHG%#=p1D7*!H3K(zRlc;1%feo_3Dkd@n7S)p&n(X) zTck@kIB&KVj%Nbx38$2U^HwY2cvZ@ta4I-B3v2@ApVIY*iq)vr^^-}+Z z*a8;Ob@W(lN(X4{T^bp<2pbd5<`%n@=27>&ajN;%gMc2-^mWNqqhYTi;lCa(lAcUI zhi`Y`tkr!>eGk})b658*_4cUk60D{(@V?LETk1#H+c6AW%5J?3=bl~ITQaVMcGmkB zbGTjb?QSjDwZZTqy3Ys>v%I97>lOu z{KIBTY5ah}Vm5ZsE2uN{s+RbLyHhxXt;JDnF};?48{fK5fZOSf41Alxx7FCkxn?kM zJ-cnIF5LeKw`aCZ;;X-Np{Ccdi5vdw$?f;(4>3a?deM#Eg>l-AdA)~$8(D@{V9!` zS2)kWJM3rRK?WZ2w#}xl6uu(x54uu+tnYr`XrP)oS&$!KSX%_Ey68 zE~+0@;k9((>87sKj@H8W^j)o}Q0b=5)Xsn2aCm5SO8-dT!N zy9~r_(vMNM{$toDLh^?@*o$=d($;0yVQ^f#r@Od5G^rR5@+fZ@JetR2;9dsqV{c+S z<(dre`d7V{`SXH)w=9_5`haU|JeynQ-Xx4C`rT|X54V`HcR0*$@^p-AdR)6H+z0nE z887yC%i6G;9Bta<$sMj`uE#jKJH|RnxQkDY>Z3dbFS)<#Fd0Go=y)W4*fSOAff+nT zULvoNck!dYfm9e3i68fkrrJ>P_+eiKuA7HaPF!Y9p`OBz@J^$q&@%S%jNaw4d4~>ig<&0HlCeV&O^MJyzRWBKEOxl)5gc*)6XZ@ z=Lw%NK4X3AeJ1!!@?m@?`%LwD+UHrH=X_@PH2N&|S?aUgXQj_-pS3>gd^Y&Jlg@$dTqKf*7>Pv{r!C-RH*i}H*1ll#T`DgDfT{ryV)rur@PTjRIa z@1);Fze|4K`d#(A=6A#I2fthXgg@oa^Y``l^AGS3@)!7r`WyWF`j`37^55#e*Z;Wx z=l&P{ulxV#|C9fN0Dgdfz>5KM16BsC57-v)QNX@{vjH~)VPIIGDo_)s3p4~~2ATuQ z0&4^70>=f84}3Q8<-oatZv@T@oFBM6aAn}ez!QO|1MdXEpr9a0P<&8gkRm80$QCp_ zXkyUhpx1&Lf(`~93%VDa7_1Gp1a}VZ8r(g&XK;S-pkRCOh~V(W+BP&Rv}YLAUq^IB0MHMAv`JkRQQ?jb{Gr`2nz}mgoTEMg++wLhQ);?ge8R~ zhoy$4hjj@n4x1MCYS@mjyY(TneZ>e&xM~4zZ?Er1V17)A}k^zLL4E9 zh>J*wNQy{~NR3F3FhsPA=pIoVQ57*ZqCR3m#H0u&Vp_!Xh?x;DM7$L7a>Tlb!x1+{ z{-Q8ZxJV?57bS_3MQI|XNG0kZ>MP0<<%?_>MBb7B2_c~*Jc(QqD~XdNNRlKfiC$uqm?RcSo+MvVAQ>nb zBymWFOGZe_BvU0%OP-ZHCz&C6UeYL8ELkd9E?FsAE!ia5CfP38A=xQ8EIB4QAvq;E zEjc5(EV(MVCiz}+Q*v8!FNznXiqc2fqJ~G!jG7g-Icj&*-l+XihoX)|9g8{>buQ|B z)P<;TqHaaqiMkv0n-oe(DJ}Jp`btBjGHIMNL7F5@lPaYusYYs%c9Hg!_LlaQ=1U8t z1EqtcRnl3~ccdRmk4TS6Pe@NnKb3wa{apI3^s4ll^oH~Y=`HDx(x0P)qOH+`qEYno z(F>wiN537tKKh;LccZsNABa93{dx44(O*S>9epwSM)YqoQbx;sWPF)G7AgyqMaaam zNLj2bRhB8U$gHw|@zp*?!qU*2iy_gS@XiUtS;|D7VS&@?yC|UMFYdtL0neyXAZ2`{jq^N98BvXXWSR7v-1b zSLD~^H)8x^q%o$LJ~34>V`FBl1Y71I#2C}wHQikMX~TVl4wY>)XM z7RCm}3SvWJ!(+>0$HvyjPQXus?`(6p&Cxc;+nkI`k2A-$jmwJ5j++!WJ#J>)3vsjJ z-;X~Ke<=P){PBd41X)5%LYsty#J-7-Cq9ulB+-%dV$$5CH~xduP9IyDIQnY6(x#ciV=!(MU}#-7_Atq7_XS5cv7)U zu~M-{u}-m3@vdU4V!Pr4#V*CiihYWMiX)2Sij#`diq92i6<;Z?E529URQ#Bno!l$A zPjbKH{>clHS0}GcUYEQv1*Qb02vR~*!czvPj7TXvMFU(%I=gsDf?5yQe#u& zQWH`YsTHa9sS{Esr9PRuFZERF>C`i+U#6v`8PiN@mb9$2r_yGn%}#qIZEo86v>RzZ zq}@vUDZPDq@ASUux#{`ouct3fU!J})eNFn0NzslJQo??u-)|zo}@IKozY@R3)p@R2eFb%A(3r zWvg;j9aWuGeN=_2p{hz%wW?NCr>a*?Q9Z4irkbvLUiG4CrRuoqD>Yvos*X~}tJP|= z+Ny4+&QW(#_g42)_g4>44^$6Qk5SK4uT-B*lhSKUE7T3qIdsEyBXt$JF}iWO3A#zTCv{VFGjy-%8gy%P@9MVbw&}L(cIfu%4(JZ+ zj_Qu z2Ez`+0mEs-dBa7+Wy4j&b;HkwyM}v)2S&n38Rf=K#ysPA<5c5JXp_JsG)0&qO;VHGlw!jFYl=x@(wU4VlPS+M*fi8sX&P^O&NRdHyy->L zEYob$E2h^>OHIp7t4wQ5>r5L=@0i{-Z83dlI$%0&x?s9wx?;L!`rdTQbl(ikl$mGt zHT#(Z%t>aI*<|iy&Nb(o3(bSfHuDg(!(45yHP@NPna7(ani=zC^Aht;^M3OQ^B3kT z<{!;Jn}0F?YQATFVDYmAT7oU1mN1LR5@~5;Nww%K*_Ixb-j;rr{+0quk!7f*)KX@t zv{YMaEn_TGEKgaUu{>uvWw~Ja#&X$mwXLyjhqj&Cc4^za?JI2?+b(XqwC#$vKU*m) z&+2RSx8_=(usW>6ts|{fR;P8ewaz-xI@LPU`iiyDy3D%Ly2iS}y2-l5y3P8L^^o<9 z^_=x<>o?Y`*6Y?EthcPcW%09uvO==LvLdsjS@NvdtduNmR=cc@SzWTaXZ6X-&C1Uz b$g*cSv+A-Yy6O%<5ZpU2g?o4Z%|ibJ!C^}%