diff --git a/MetaballsKit/Memory.swift b/MetaballsKit/Memory.swift index c404213..22b0cca 100644 --- a/MetaballsKit/Memory.swift +++ b/MetaballsKit/Memory.swift @@ -11,7 +11,7 @@ import Foundation extension UnsafeMutableRawPointer { func writeAndAdvance(value: inout T) -> UnsafeMutableRawPointer { let stride = MemoryLayout.stride(ofValue: value) - copyBytes(from: &value, count: stride) + copyMemory(from: &value, byteCount: stride) return advanced(by: stride) } } diff --git a/MetaballsKit/Metaballs.swift b/MetaballsKit/Metaballs.swift index dae6d0f..058ee96 100644 --- a/MetaballsKit/Metaballs.swift +++ b/MetaballsKit/Metaballs.swift @@ -63,7 +63,7 @@ public struct Parameters { public mutating func write(to buffer: MTLBuffer, offset: Int = 0) { let start = buffer.contents().advanced(by: offset) let stride = MemoryLayout.stride(ofValue: self) - start.copyBytes(from: &self, count: stride) + start.copyMemory(from: &self, byteCount: stride) } } @@ -226,7 +226,9 @@ public class Field { var ptr = ballBuffer.contents() var idx = 0 for var ball in self.balls { - ballBuffer.addDebugMarker("Ball \(idx)", range: NSRange(location: ballBuffer.contents().distance(to: ptr), length: 16)) + if let range = Range(NSRange(location: ballBuffer.contents().distance(to: ptr), length: 16)) { + ballBuffer.addDebugMarker("Ball \(idx)", range: range) + } ptr = write(value: &ball.position.x, to: ptr) ptr = write(value: &ball.position.y, to: ptr) var r = ball.radius @@ -242,7 +244,7 @@ public class Field { private func write(value: inout T, to ptr: UnsafeMutableRawPointer) -> UnsafeMutableRawPointer { let sizeOfType = MemoryLayout.stride - ptr.copyBytes(from: &value, count: sizeOfType) + ptr.copyMemory(from: &value, byteCount: sizeOfType) return ptr.advanced(by: sizeOfType) } diff --git a/MetaballsKit/Renderer.swift b/MetaballsKit/Renderer.swift index f45ba24..8129dc6 100644 --- a/MetaballsKit/Renderer.swift +++ b/MetaballsKit/Renderer.swift @@ -73,9 +73,12 @@ public class Renderer: NSObject, MTKViewDelegate { guard let device = MTLCreateSystemDefaultDevice() else { fatalError("Unable to create Metal system device") } + guard let queue = device.makeCommandQueue() else { + fatalError("Unable to create Metal command queue") + } self.device = device - commandQueue = device.makeCommandQueue() + commandQueue = queue super.init() } @@ -109,24 +112,24 @@ public class Renderer: NSObject, MTKViewDelegate { field.update() - let buffer = commandQueue.makeCommandBuffer() - buffer.label = "Render" + if let buffer = commandQueue.makeCommandBuffer() { + buffer.label = "Render" - if let renderPass = view.currentRenderPassDescriptor, let renderPipelineState = renderPipelineState { - let encoder = buffer.makeRenderCommandEncoder(descriptor: renderPass) - encoder.label = "Render Pass" - encoder.setViewport(MTLViewport(originX: 0.0, originY: 0.0, width: Double(view.drawableSize.width), height: Double(view.drawableSize.height), znear: -1.0, zfar: 1.0)) - encoder.setRenderPipelineState(renderPipelineState) - encoder.setVertexBytes(points, length: points.count * MemoryLayout.stride, index: 0) - encoder.setFragmentBuffer(field.parametersBuffer, offset: 0, index: 0) - encoder.setFragmentBuffer(field.ballBuffer, offset: 0, index: 1) - encoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 6) - encoder.endEncoding() + if let renderPass = view.currentRenderPassDescriptor, let renderPipelineState = renderPipelineState, let encoder = buffer.makeRenderCommandEncoder(descriptor: renderPass) { + encoder.label = "Render Pass" + encoder.setViewport(MTLViewport(originX: 0.0, originY: 0.0, width: Double(view.drawableSize.width), height: Double(view.drawableSize.height), znear: -1.0, zfar: 1.0)) + encoder.setRenderPipelineState(renderPipelineState) + encoder.setVertexBytes(points, length: points.count * MemoryLayout.stride, index: 0) + encoder.setFragmentBuffer(field.parametersBuffer, offset: 0, index: 0) + encoder.setFragmentBuffer(field.ballBuffer, offset: 0, index: 1) + encoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 6) + encoder.endEncoding() - if let drawable = view.currentDrawable { - buffer.present(drawable) + if let drawable = view.currentDrawable { + buffer.present(drawable) + } } + buffer.commit() } - buffer.commit() } }