diff --git a/src/common/BUILD.gn b/src/common/BUILD.gn index e34df57104..d7daeaaf35 100644 --- a/src/common/BUILD.gn +++ b/src/common/BUILD.gn @@ -213,6 +213,10 @@ if (is_win || is_linux || is_chromeos || is_mac || is_fuchsia || is_android) { "xlib_with_undefs.h", ] + if (is_mac) { + sources += [ "SystemUtils_mac.mm" ] + } + public_configs = [ ":dawn_internal" ] deps = [ "${dawn_root}/src/dawn:dawn_headers", diff --git a/src/common/SystemUtils.h b/src/common/SystemUtils.h index ed18c31e66..bfbca0a4c4 100644 --- a/src/common/SystemUtils.h +++ b/src/common/SystemUtils.h @@ -24,6 +24,11 @@ std::string GetEnvironmentVar(const char* variableName); bool SetEnvironmentVar(const char* variableName, const char* value); std::string GetExecutableDirectory(); +#ifdef DAWN_PLATFORM_APPLE +void GetMacOSVersion(int32_t* majorVersion, int32_t* minorVersion = nullptr); +bool IsMacOSVersionAtLeast(uint32_t majorVersion, uint32_t minorVersion = 0); +#endif + class ScopedEnvironmentVar { public: ScopedEnvironmentVar() = default; diff --git a/src/common/SystemUtils_mac.mm b/src/common/SystemUtils_mac.mm new file mode 100644 index 0000000000..9bd27d239a --- /dev/null +++ b/src/common/SystemUtils_mac.mm @@ -0,0 +1,33 @@ +// Copyright 2021 The Dawn Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "common/SystemUtils.h" + +#include "common/Assert.h" + +#import + +void GetMacOSVersion(int32_t* majorVersion, int32_t* minorVersion) { + NSOperatingSystemVersion version = [[NSProcessInfo processInfo] operatingSystemVersion]; + ASSERT(majorVersion != nullptr); + *majorVersion = version.majorVersion; + if (minorVersion != nullptr) { + *minorVersion = version.minorVersion; + } +} + +bool IsMacOSVersionAtLeast(uint32_t majorVersion, uint32_t minorVersion) { + return + [NSProcessInfo.processInfo isOperatingSystemAtLeastVersion:{majorVersion, minorVersion, 0}]; +} diff --git a/src/dawn_native/metal/BackendMTL.mm b/src/dawn_native/metal/BackendMTL.mm index ec2b0366d6..b1e2679efe 100644 --- a/src/dawn_native/metal/BackendMTL.mm +++ b/src/dawn_native/metal/BackendMTL.mm @@ -18,6 +18,7 @@ #include "common/GPUInfo.h" #include "common/NSRef.h" #include "common/Platform.h" +#include "common/SystemUtils.h" #include "dawn_native/Instance.h" #include "dawn_native/MetalBackend.h" #include "dawn_native/metal/DeviceMTL.h" @@ -152,8 +153,7 @@ namespace dawn_native { namespace metal { bool IsMetalSupported() { // Metal was first introduced in macOS 10.11 - NSOperatingSystemVersion macOS10_11 = {10, 11, 0}; - return [NSProcessInfo.processInfo isOperatingSystemAtLeastVersion:macOS10_11]; + return IsMacOSVersionAtLeast(10, 11); } #elif defined(DAWN_PLATFORM_IOS) MaybeError GetDevicePCIInfo(id device, PCIIDs* ids) { @@ -225,8 +225,7 @@ namespace dawn_native { namespace metal { // Disable timestamp query on macOS 10.15 on AMD GPU because WriteTimestamp // fails to call without any copy commands on MTLBlitCommandEncoder. This issue // has been fixed on macOS 11.0. See crbug.com/dawn/545 - if (!gpu_info::IsAMD(GetPCIInfo().vendorId) || - [NSProcessInfo.processInfo isOperatingSystemAtLeastVersion:{11, 0, 0}]) { + if (!gpu_info::IsAMD(GetPCIInfo().vendorId) || IsMacOSVersionAtLeast(11)) { mSupportedExtensions.EnableExtension(Extension::TimestampQuery); } } diff --git a/src/tests/DawnTest.cpp b/src/tests/DawnTest.cpp index 936bb12c05..1951fe63e3 100644 --- a/src/tests/DawnTest.cpp +++ b/src/tests/DawnTest.cpp @@ -785,9 +785,15 @@ bool DawnTestBase::IsLinux() const { #endif } -bool DawnTestBase::IsMacOS() const { +bool DawnTestBase::IsMacOS(int32_t majorVersion, int32_t minorVersion) const { #ifdef DAWN_PLATFORM_APPLE - return true; + if (majorVersion == -1 && minorVersion == -1) { + return true; + } + int32_t majorVersionOut, minorVersionOut = 0; + GetMacOSVersion(&majorVersionOut, &minorVersionOut); + return (majorVersion != -1 && majorVersion == majorVersionOut) && + (minorVersion != -1 && minorVersion == minorVersionOut); #else return false; #endif diff --git a/src/tests/DawnTest.h b/src/tests/DawnTest.h index bdf1f384ae..80fd6f0587 100644 --- a/src/tests/DawnTest.h +++ b/src/tests/DawnTest.h @@ -16,6 +16,7 @@ #define TESTS_DAWNTEST_H_ #include "common/Log.h" +#include "common/Platform.h" #include "common/Preprocessor.h" #include "dawn/dawn_proc_table.h" #include "dawn/webgpu_cpp.h" @@ -289,7 +290,7 @@ class DawnTestBase { bool IsWindows() const; bool IsLinux() const; - bool IsMacOS() const; + bool IsMacOS(int32_t majorVersion = -1, int32_t minorVersion = -1) const; bool UsesWire() const; bool IsBackendValidationEnabled() const; diff --git a/src/tests/end2end/BufferZeroInitTests.cpp b/src/tests/end2end/BufferZeroInitTests.cpp index 9f79a0c8e7..2fd8741bc1 100644 --- a/src/tests/end2end/BufferZeroInitTests.cpp +++ b/src/tests/end2end/BufferZeroInitTests.cpp @@ -1205,6 +1205,9 @@ TEST_P(BufferZeroInitTest, ResolveQuerySet) { // Skip if timestamp extension is not supported on device DAWN_TEST_UNSUPPORTED_IF(!SupportsExtensions({"timestamp_query"})); + // crbug.com/dawn/940: Does not work on Mac 11.0+. Backend validation changed. + DAWN_TEST_UNSUPPORTED_IF(IsMacOS() && !IsMacOS(10)); + constexpr uint64_t kBufferSize = 16u; constexpr wgpu::BufferUsage kBufferUsage = wgpu::BufferUsage::QueryResolve | wgpu::BufferUsage::CopyDst;