mirror of
				https://github.com/GayPizzaSpecifications/voxelotl-engine.git
				synced 2025-11-04 10:59:39 +00:00 
			
		
		
		
	hopefully more robust platform detection
This commit is contained in:
		@ -19,7 +19,7 @@ public class Renderer {
 | 
				
			|||||||
  private let passDescription = MTLRenderPassDescriptor()
 | 
					  private let passDescription = MTLRenderPassDescriptor()
 | 
				
			||||||
  private var pso: MTLRenderPipelineState
 | 
					  private var pso: MTLRenderPipelineState
 | 
				
			||||||
  private var depthStencilState: MTLDepthStencilState
 | 
					  private var depthStencilState: MTLDepthStencilState
 | 
				
			||||||
  private let _defaultStorage: MTLResourceOptions
 | 
					  private let _defaultStorageMode: MTLResourceOptions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private var depthTextures: [MTLTexture]
 | 
					  private var depthTextures: [MTLTexture]
 | 
				
			||||||
  private var _instances: [MTLBuffer?]
 | 
					  private var _instances: [MTLBuffer?]
 | 
				
			||||||
@ -56,13 +56,14 @@ public class Renderer {
 | 
				
			|||||||
      throw RendererError.initFailure("Failed to create Metal device")
 | 
					      throw RendererError.initFailure("Failed to create Metal device")
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    self.device = device
 | 
					    self.device = device
 | 
				
			||||||
#if arch(x86_64)
 | 
					    self._defaultStorageMode = if #available(macOS 100.100, iOS 12.0, *) {
 | 
				
			||||||
    // https://developer.apple.com/documentation/metal/gpu_devices_and_work_submission/multi-gpu_systems/finding_multiple_gpus_on_an_intel-based_mac#3030770
 | 
					      .storageModeShared
 | 
				
			||||||
    self._defaultStorage = (self.device.isRemovable || (!self.device.isLowPower && !self.device.isRemovable))
 | 
					    } else if #available(macOS 10.15, iOS 13.0, *) {
 | 
				
			||||||
      ? .storageModeManaged : .storageModeShared
 | 
					      self.device.hasUnifiedMemory ? .storageModeShared : .storageModeManaged
 | 
				
			||||||
#else
 | 
					    } else {
 | 
				
			||||||
    self._defaultStorage = .storageModeShared
 | 
					      // https://developer.apple.com/documentation/metal/gpu_devices_and_work_submission/multi-gpu_systems/finding_multiple_gpus_on_an_intel-based_mac#3030770
 | 
				
			||||||
#endif
 | 
					      (self.device.isLowPower && !self.device.isRemovable) ? .storageModeShared : .storageModeManaged
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    layer.device = device
 | 
					    layer.device = device
 | 
				
			||||||
    layer.pixelFormat = colorFormat
 | 
					    layer.pixelFormat = colorFormat
 | 
				
			||||||
@ -126,14 +127,14 @@ public class Renderer {
 | 
				
			|||||||
      self.defaultTexture = try Self.loadTexture(device, queue, image2D: Image2D(Data([
 | 
					      self.defaultTexture = try Self.loadTexture(device, queue, image2D: Image2D(Data([
 | 
				
			||||||
          0xFF, 0x00, 0xFF, 0xFF,  0x00, 0x00, 0x00, 0xFF,
 | 
					          0xFF, 0x00, 0xFF, 0xFF,  0x00, 0x00, 0x00, 0xFF,
 | 
				
			||||||
          0x00, 0x00, 0x00, 0xFF,  0xFF, 0x00, 0xFF, 0xFF
 | 
					          0x00, 0x00, 0x00, 0xFF,  0xFF, 0x00, 0xFF, 0xFF
 | 
				
			||||||
        ]), format: .abgr8888, width: 2, height: 2, stride: 2 * 4), self._defaultStorage)
 | 
					        ]), format: .abgr8888, width: 2, height: 2, stride: 2 * 4), self._defaultStorageMode)
 | 
				
			||||||
    } catch {
 | 
					    } catch {
 | 
				
			||||||
      throw RendererError.initFailure("Failed to create default texture")
 | 
					      throw RendererError.initFailure("Failed to create default texture")
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Load texture from a file in the bundle
 | 
					    // Load texture from a file in the bundle
 | 
				
			||||||
    do {
 | 
					    do {
 | 
				
			||||||
      self.cubeTexture = try Self.loadTexture(device, queue, resourcePath: "test.png", self._defaultStorage)
 | 
					      self.cubeTexture = try Self.loadTexture(device, queue, resourcePath: "test.png", self._defaultStorageMode)
 | 
				
			||||||
    } catch RendererError.loadFailure(let message) {
 | 
					    } catch RendererError.loadFailure(let message) {
 | 
				
			||||||
      printErr("Failed to load texture image: \(message)")
 | 
					      printErr("Failed to load texture image: \(message)")
 | 
				
			||||||
    } catch {
 | 
					    } catch {
 | 
				
			||||||
@ -167,14 +168,14 @@ public class Renderer {
 | 
				
			|||||||
  private func createMesh(_ vertices: [ShaderVertex], _ indices: [UInt16]) -> RendererMesh? {
 | 
					  private func createMesh(_ vertices: [ShaderVertex], _ indices: [UInt16]) -> RendererMesh? {
 | 
				
			||||||
    autoreleasepool {
 | 
					    autoreleasepool {
 | 
				
			||||||
      let vtxSize = vertices.count * MemoryLayout<ShaderVertex>.stride
 | 
					      let vtxSize = vertices.count * MemoryLayout<ShaderVertex>.stride
 | 
				
			||||||
      guard let vtxSource = self.device.makeBuffer(bytes: vertices, length: vtxSize, options: self._defaultStorage) else {
 | 
					      guard let vtxSource = self.device.makeBuffer(bytes: vertices, length: vtxSize, options: self._defaultStorageMode) else {
 | 
				
			||||||
        printErr("Failed to create vertex buffer source")
 | 
					        printErr("Failed to create vertex buffer source")
 | 
				
			||||||
        return nil
 | 
					        return nil
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      let numIndices = indices.count
 | 
					      let numIndices = indices.count
 | 
				
			||||||
      let idxSize = numIndices * MemoryLayout<UInt16>.stride
 | 
					      let idxSize = numIndices * MemoryLayout<UInt16>.stride
 | 
				
			||||||
      guard let idxSource = self.device.makeBuffer(bytes: indices, length: idxSize, options: self._defaultStorage) else {
 | 
					      guard let idxSource = self.device.makeBuffer(bytes: indices, length: idxSize, options: self._defaultStorageMode) else {
 | 
				
			||||||
        printErr("Failed to create index buffer source")
 | 
					        printErr("Failed to create index buffer source")
 | 
				
			||||||
        return nil
 | 
					        return nil
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@ -290,11 +291,11 @@ public class Renderer {
 | 
				
			|||||||
      texDescriptor.depth       = 1
 | 
					      texDescriptor.depth       = 1
 | 
				
			||||||
      texDescriptor.sampleCount = 1
 | 
					      texDescriptor.sampleCount = 1
 | 
				
			||||||
      texDescriptor.usage       = [ .renderTarget, .shaderRead ]
 | 
					      texDescriptor.usage       = [ .renderTarget, .shaderRead ]
 | 
				
			||||||
  #if !NDEBUG
 | 
					#if !NDEBUG
 | 
				
			||||||
      texDescriptor.storageMode = .private
 | 
					      texDescriptor.storageMode = .private
 | 
				
			||||||
  #else
 | 
					#else
 | 
				
			||||||
      texDescriptor.storageMode = .memoryless
 | 
					      texDescriptor.storageMode = .memoryless
 | 
				
			||||||
  #endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      guard let depthStencilTexture = device.makeTexture(descriptor: texDescriptor) else { return nil }
 | 
					      guard let depthStencilTexture = device.makeTexture(descriptor: texDescriptor) else { return nil }
 | 
				
			||||||
      depthStencilTexture.label = "Depth buffer"
 | 
					      depthStencilTexture.label = "Depth buffer"
 | 
				
			||||||
@ -425,7 +426,7 @@ public class Renderer {
 | 
				
			|||||||
    if self._instances[self.currentFrame] == nil || instancesBytes > self._instances[self.currentFrame]!.length {
 | 
					    if self._instances[self.currentFrame] == nil || instancesBytes > self._instances[self.currentFrame]!.length {
 | 
				
			||||||
      guard let instanceBuffer = self.device.makeBuffer(
 | 
					      guard let instanceBuffer = self.device.makeBuffer(
 | 
				
			||||||
        length: instancesBytes,
 | 
					        length: instancesBytes,
 | 
				
			||||||
        options: self._defaultStorage)
 | 
					        options: self._defaultStorageMode)
 | 
				
			||||||
      else {
 | 
					      else {
 | 
				
			||||||
        fatalError("Failed to (re)create instance buffer")
 | 
					        fatalError("Failed to (re)create instance buffer")
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@ -447,8 +448,8 @@ public class Renderer {
 | 
				
			|||||||
          color: SIMD4(instance.color))
 | 
					          color: SIMD4(instance.color))
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
#if arch(x86_64)
 | 
					#if os(macOS)
 | 
				
			||||||
    if self._defaultStorage == .storageModeManaged {
 | 
					    if self._defaultStorageMode == .storageModeManaged {
 | 
				
			||||||
      instanceBuffer.didModifyRange(0..<instancesBytes)
 | 
					      instanceBuffer.didModifyRange(0..<instancesBytes)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user