diff --git a/Sources/Voxelotl/Renderer.swift b/Sources/Voxelotl/Renderer.swift index b7845a9..ee6020e 100644 --- a/Sources/Voxelotl/Renderer.swift +++ b/Sources/Voxelotl/Renderer.swift @@ -40,9 +40,10 @@ fileprivate let cubeIndices: [UInt16] = [ 20, 21, 22, 22, 21, 23 ] -class Renderer { - private let depthFormat: MTLPixelFormat = .depth16Unorm +fileprivate let numFramesInFlight: Int = 3 +fileprivate let depthFormat: MTLPixelFormat = .depth16Unorm +class Renderer { private var device: MTLDevice private var layer: CAMetalLayer private var viewport: MTLViewport @@ -52,12 +53,15 @@ class Renderer { private let passDescription = MTLRenderPassDescriptor() private var pso: MTLRenderPipelineState private var depthStencilState: MTLDepthStencilState - private var depthStencilTexture: MTLTexture + private var depthTextures: [MTLTexture] private var vtxBuffer: MTLBuffer, idxBuffer: MTLBuffer private var defaultTexture: MTLTexture private var cubeTexture: MTLTexture? = nil + private let inFlightSemaphore = DispatchSemaphore(value: numFramesInFlight) + private var frame = 0 + fileprivate static func createMetalDevice() -> MTLDevice? { MTLCopyAllDevices().reduce(nil, { best, dev in if best == nil { dev } @@ -95,11 +99,12 @@ class Renderer { passDescription.depthAttachment.storeAction = .dontCare passDescription.depthAttachment.clearDepth = 1.0 - guard let depthStencilTexture = Self.createDepthTexture(device, size, format: depthFormat) else { - throw RendererError.initFailure("Failed to create depth buffer") + self.depthTextures = try (0..) { if Int(self.viewport.width) != size.x || Int(self.viewport.height) != size.y { - if let depthStencilTexture = Self.createDepthTexture(device, size, format: depthFormat) { - self.depthStencilTexture = depthStencilTexture - passDescription.depthAttachment.texture = self.depthStencilTexture + self.depthTextures = (0..