diff --git a/3rdparty/SPIRV b/3rdparty/SPIRV index 6a9e876..94a1232 160000 --- a/3rdparty/SPIRV +++ b/3rdparty/SPIRV @@ -1 +1 @@ -Subproject commit 6a9e876fadc4952d1e44c7c7daee7e5780c7356a +Subproject commit 94a1232b87a54574e5bab839c263fb9f2f61d2f3 diff --git a/OpenEmuShaders.xcodeproj/project.pbxproj b/OpenEmuShaders.xcodeproj/project.pbxproj index f1cdede..00cb084 100644 --- a/OpenEmuShaders.xcodeproj/project.pbxproj +++ b/OpenEmuShaders.xcodeproj/project.pbxproj @@ -941,6 +941,7 @@ FRAMEWORK_VERSION = A; INFOPLIST_FILE = OpenEmuShaders/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", @@ -952,8 +953,13 @@ PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = macosx; SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "appletvos appletvsimulator iphoneos iphonesimulator macosx"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,3"; + TVOS_DEPLOYMENT_TARGET = 14.0; }; name = Debug; }; @@ -972,6 +978,7 @@ FRAMEWORK_VERSION = A; INFOPLIST_FILE = OpenEmuShaders/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", @@ -983,7 +990,12 @@ PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = macosx; SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "appletvos appletvsimulator iphoneos iphonesimulator macosx"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,3"; + TVOS_DEPLOYMENT_TARGET = 14.0; }; name = Release; }; diff --git a/Source/FilterChain.swift b/Source/FilterChain.swift index 35b90ab..3ddf515 100644 --- a/Source/FilterChain.swift +++ b/Source/FilterChain.swift @@ -159,6 +159,7 @@ final public class FilterChain { T1, T0, T1, T0, T1, T0, T1, T0, ] + #if canImport(AppKit) let ctx = CGContext(data: &checkerboard, width: 8, height: 8, @@ -166,6 +167,15 @@ final public class FilterChain { bytesPerRow: 32, space: NSColorSpace.deviceRGB.cgColorSpace!, bitmapInfo: CGBitmapInfo.byteOrder32Little.rawValue | CGImageAlphaInfo.premultipliedLast.rawValue)! + #else + let ctx = CGContext(data: &checkerboard, + width: 8, + height: 8, + bitsPerComponent: 8, + bytesPerRow: 32, + space: CGColorSpaceCreateDeviceRGB(), + bitmapInfo: CGBitmapInfo.byteOrder32Little.rawValue | CGImageAlphaInfo.premultipliedLast.rawValue)! + #endif let img = ctx.makeImage()! return try! loader.newTexture(cgImage: img) }() @@ -252,7 +262,11 @@ final public class FilterChain { } label = "clamp_to_border" - sd.sAddressMode = .clampToBorderColor + if #available(macOS 10.9, iOS 14.0, tvOS 16.0, *) { + sd.sAddressMode = .clampToBorderColor + } else { + // Fallback on earlier versions + } case .edge: label = "clamp_to_edge" @@ -358,7 +372,11 @@ final public class FilterChain { size: outRectSize) // This is going into a Nearest Neighbor, so the edges should be on pixels! + #if canImport(AppKit) return NSIntegralRectWithOptions(outRect, .alignAllEdgesNearest) + #else + return CGRectIntegral(outRect) + #endif } private func resize() { @@ -576,9 +594,11 @@ final public class FilterChain { data.advanced(by: uniform.offset).copyMemory(from: uniform.data, byteCount: uniform.size) } + #if canImport(AppKit) if !deviceHasUnifiedMemory { buffer.didModifyRange(0.. 0 else { continue } + #if canImport(AppKit) let opts: MTLResourceOptions = deviceHasUnifiedMemory ? .storageModeShared : .storageModeManaged + #else + let opts: MTLResourceOptions = .storageModeShared + #endif let buf = device.makeBuffer(length: size, options: opts) self.pass[passNumber].buffers[j] = buf @@ -1085,7 +1109,7 @@ extension MTLLanguageVersion { init(_ languageVersion: Compiled.LanguageVersion) throws { switch languageVersion { case .version2_4: - if #available(macOS 12.0, iOS 15.0, *) { + if #available(macOS 12.0, iOS 15.0, tvOS 15.0, *) { self = .version2_4 } else { throw MTLLangageVersionError.versionUnavailable