Skip BufferZeroInitTests.ResolveQuerySet if not on MacOS 10

No-trying due to broken branch builders.

Bug: dawn:940, chromium:1128540
Change-Id: I830cebf2247b65ea0be58a10e02fbcc0542ff73b
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/59040
Reviewed-by: Stephen White <senorblanco@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Austin Eng <enga@chromium.org>
(cherry picked from commit e50f8c65b79e9a62e56ac912211a09cb1b4b74dd)
No-try: True
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/60761
Commit-Queue: Brian Sheedy <bsheedy@google.com>
Auto-Submit: Brian Sheedy <bsheedy@google.com>
Reviewed-by: Austin Eng <enga@chromium.org>
diff --git a/src/common/BUILD.gn b/src/common/BUILD.gn
index e34df57..d7daeaa 100644
--- a/src/common/BUILD.gn
+++ b/src/common/BUILD.gn
@@ -213,6 +213,10 @@
       "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 ed18c31..bfbca0a 100644
--- a/src/common/SystemUtils.h
+++ b/src/common/SystemUtils.h
@@ -24,6 +24,11 @@
 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 0000000..9bd27d2
--- /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 <Foundation/NSProcessInfo.h>
+
+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 ec2b036..b1e2679 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 @@
 
         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<MTLDevice> device, PCIIDs* ids) {
@@ -225,8 +225,7 @@
                     // 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 a5fed42..1f0149d 100644
--- a/src/tests/DawnTest.cpp
+++ b/src/tests/DawnTest.cpp
@@ -785,9 +785,15 @@
 #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 aa15e33..a7bb34b 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"
@@ -286,7 +287,7 @@
 
     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 9f79a0c..2fd8741 100644
--- a/src/tests/end2end/BufferZeroInitTests.cpp
+++ b/src/tests/end2end/BufferZeroInitTests.cpp
@@ -1205,6 +1205,9 @@
     // 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;