From 5b97a02288ccf9678adaf453f5ea8eef9c3a0946 Mon Sep 17 00:00:00 2001 From: a dinosaur Date: Fri, 9 Aug 2024 21:34:55 +1000 Subject: [PATCH] allow for up to 3 frames to be processed at once --- Sources/Voxelotl/Renderer.swift | 37 ++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 10 deletions(-) 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..