diff --git a/Common/MVKOSExtensions.h b/Common/MVKOSExtensions.h index 8e7e8213..83adaae3 100644 --- a/Common/MVKOSExtensions.h +++ b/Common/MVKOSExtensions.h @@ -18,12 +18,17 @@ #pragma once +#include "MVKCommonEnvironment.h" #include #include +#include typedef float MVKOSVersion; +/*** Constant indicating unsupported functionality in an OS. */ +static const MVKOSVersion kMVKOSVersionUnsupported = std::numeric_limits::max(); + /** * Returns the operating system version as an MVKOSVersion, which is a float in which the * whole number portion indicates the major version, and the fractional portion indicates @@ -33,9 +38,29 @@ typedef float MVKOSVersion; */ MVKOSVersion mvkOSVersion(); +/** Returns a MVKOSVersion built from the version components. */ +inline MVKOSVersion mvkMakeOSVersion(uint32_t major, uint32_t minor, uint32_t patch) { + return (float)major + ((float)minor / 100.0f) + ((float)patch / 10000.0f); +} + /** Returns whether the operating system version is at least minVer. */ inline bool mvkOSVersionIsAtLeast(MVKOSVersion minVer) { return mvkOSVersion() >= minVer; } +/** + * Returns whether the operating system version is at least the appropriate min version. + * The constant kMVKOSVersionUnsupported can be used for either value to cause the test + * to always fail on that OS, which is useful for indidicating functionalty guarded by + * this test is not supported on that OS. + */ +inline bool mvkOSVersionIsAtLeast(MVKOSVersion macOSMinVer, MVKOSVersion iOSMinVer) { +#if MVK_MACOS + return mvkOSVersionIsAtLeast(macOSMinVer); +#endif +#if MVK_IOS + return mvkOSVersionIsAtLeast(iOSMinVer); +#endif +} + /** * Returns a monotonic timestamp value for use in Vulkan and performance timestamping. * diff --git a/Common/MVKOSExtensions.mm b/Common/MVKOSExtensions.mm index f04484c9..27837777 100644 --- a/Common/MVKOSExtensions.mm +++ b/Common/MVKOSExtensions.mm @@ -29,17 +29,13 @@ using namespace std; -static const MVKOSVersion kMVKOSVersionUnknown = 0.0f; -static MVKOSVersion _mvkOSVersion = kMVKOSVersionUnknown; MVKOSVersion mvkOSVersion() { - if (_mvkOSVersion == kMVKOSVersionUnknown) { - NSOperatingSystemVersion osVer = [[NSProcessInfo processInfo] operatingSystemVersion]; - float maj = osVer.majorVersion; - float min = osVer.minorVersion; - float pat = osVer.patchVersion; - _mvkOSVersion = maj + (min / 100.0f) + + (pat / 10000.0f); - } - return _mvkOSVersion; + static MVKOSVersion _mvkOSVersion = 0; + if ( !_mvkOSVersion ) { + NSOperatingSystemVersion osVer = [[NSProcessInfo processInfo] operatingSystemVersion]; + _mvkOSVersion = mvkMakeOSVersion((uint32_t)osVer.majorVersion, (uint32_t)osVer.minorVersion, (uint32_t)osVer.patchVersion); + } + return _mvkOSVersion; } static uint64_t _mvkTimestampBase; diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm index 7362b304..6f5e4597 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm @@ -1476,7 +1476,7 @@ void MVKPhysicalDevice::initProperties() { _properties.limits.maxComputeWorkGroupCount[1] = kMVKUndefinedLargeUInt32; _properties.limits.maxComputeWorkGroupCount[2] = kMVKUndefinedLargeUInt32; - _properties.limits.maxDrawIndexedIndexValue = numeric_limits::max(); + _properties.limits.maxDrawIndexedIndexValue = kMVKUndefinedLargeUInt32; _properties.limits.maxDrawIndirectCount = kMVKUndefinedLargeUInt32; _properties.limits.maxClipDistances = kMVKUndefinedLargeUInt32; diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm b/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm index a2774259..87e126cc 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm @@ -991,7 +991,7 @@ void MVKPresentableSwapchainImage::presentCAMetalDrawable(id m }]; if (hasPresentTime) { - if (@available(iOS 10.3, macOS 10.15.4, *)) { + if ([_mtlDrawable respondsToSelector: @selector(addPresentedHandler:)]) { [_mtlDrawable addPresentedHandler: ^(id drawable) { // Record the presentation time CFTimeInterval presentedTimeSeconds = drawable.presentedTime; diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.mm b/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.mm index 31bd8fae..45e23351 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.mm @@ -383,19 +383,19 @@ void MVKSwapchain::initSurfaceImages(const VkSwapchainCreateInfoKHR* pCreateInfo } VkResult MVKSwapchain::getRefreshCycleDuration(VkRefreshCycleDurationGOOGLE *pRefreshCycleDuration) { -#if MVK_IOS NSInteger framesPerSecond = 60; - if (@available(iOS 10.3, *)) { - framesPerSecond = [UIScreen mainScreen].maximumFramesPerSecond; - } else { - // TODO: fallback + +#if MVK_IOS + UIScreen* screen = [UIScreen mainScreen]; + if ([screen respondsToSelector: @selector(maximumFramesPerSecond)]) { + framesPerSecond = screen.maximumFramesPerSecond; } #endif #if MVK_MACOS // TODO: hook this up for macOS, probably need to use CGDisplayModeGetRefeshRate - NSInteger framesPerSecond = 60; #endif - pRefreshCycleDuration->refreshDuration = 1e9 / ( uint64_t ) framesPerSecond; + + pRefreshCycleDuration->refreshDuration = (uint64_t)1e9 / framesPerSecond; return VK_SUCCESS; } diff --git a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/project.pbxproj b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/project.pbxproj index a52b7835..e0d366ab 100644 --- a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/project.pbxproj +++ b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/project.pbxproj @@ -836,9 +836,10 @@ CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = NO; CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = NO; + CLANG_WARN_UNGUARDED_AVAILABILITY = NO; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -855,8 +856,8 @@ GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES; GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_PARAMETER = YES; GCC_WARN_UNUSED_VARIABLE = NO; HEADER_SEARCH_PATHS = ( "$(inherited)", @@ -890,9 +891,10 @@ CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = NO; CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = NO; + CLANG_WARN_UNGUARDED_AVAILABILITY = NO; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; @@ -909,8 +911,8 @@ GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES; GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_PARAMETER = YES; GCC_WARN_UNUSED_VARIABLE = NO; HEADER_SEARCH_PATHS = ( "$(inherited)", diff --git a/MoltenVKShaderConverter/MoltenVKShaderConverterTool/OSSupport.mm b/MoltenVKShaderConverter/MoltenVKShaderConverterTool/OSSupport.mm index 91d2dc98..5b72b696 100644 --- a/MoltenVKShaderConverter/MoltenVKShaderConverterTool/OSSupport.mm +++ b/MoltenVKShaderConverter/MoltenVKShaderConverterTool/OSSupport.mm @@ -19,6 +19,7 @@ #include "OSSupport.h" #include "FileSupport.h" #include "MoltenVKShaderConverterTool.h" +#include "MVKOSExtensions.h" #import #import @@ -71,13 +72,9 @@ bool mvk::compile(const string& mslSourceCode, MTLLanguageVersion mslVerEnum = (MTLLanguageVersion)0; if (mslVer(2, 1, 0)) { - if (@available(macOS 10.14, *)) { - mslVerEnum = MTLLanguageVersion2_1; - } + mslVerEnum = MTLLanguageVersion2_1; } else if (mslVer(2, 0, 0)) { - if (@available(macOS 10.13, *)) { - mslVerEnum = MTLLanguageVersion2_0; - } + mslVerEnum = MTLLanguageVersion2_0; } else if (mslVer(1, 2, 0)) { mslVerEnum = MTLLanguageVersion1_2; } else if (mslVer(1, 1, 0)) {