Re-enable -Wunguarded-availability in Dawn standalone builds

By bumping the min macOS SDK version for standalone Dawn builds we are
able to re-introduce -Wunguarded-availability, which will help prevent
usage of Metal APIs without correctly checking for their availability.

BUG=

Change-Id: Iebf2f64e9f68e2a7a90fc6f3f208967f952f3487
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/11400
Reviewed-by: Nico Weber <thakis@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
diff --git a/.gn b/.gn
index 038d50e..c212766 100644
--- a/.gn
+++ b/.gn
@@ -16,6 +16,13 @@
 
 default_args = {
   clang_use_chrome_plugins = false
+
+  # Override the mac version so standalone Dawn compiles with at least 10.11
+  # which allows us to not skip the -Wunguarded-availability warning and get
+  # proper warnings for use of APIs that are 10.12 and above (even if
+  # Chromium is still on 10.10).
+  mac_deployment_target = "10.11.0"
+  mac_min_system_version = "10.11.0"
 }
 
 check_targets = [
diff --git a/BUILD.gn b/BUILD.gn
index 88085a8..e712d66 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -31,6 +31,11 @@
   import("${dawn_swiftshader_dir}/src/Vulkan/vulkan.gni")
 }
 
+# Import mac_min_system_version
+if (is_mac) {
+  import("//build/config/mac/mac_sdk.gni")
+}
+
 ###############################################################################
 # dawn_platform
 ###############################################################################
@@ -60,9 +65,14 @@
   # Suppress warnings that Metal isn't in the deployment target of Chrome:
   # initialization of the Metal backend is behind a IsMetalSupported check so
   # Dawn won't call Metal functions on macOS 10.10.
+  # At the time this is written Chromium supports 10.10.0 and above, so if we
+  # aren't on 10.11 it means we are on 10.11 and above, and Metal is available.
+  # Skipping this check on 10.11 and above is important as it allows getting
+  # proper compilation warning when using 10.12 and above feature for example.
   # TODO(cwallez@chromium.org): Consider using API_AVAILABLE annotations on all
-  # metal code in dawn once crbug.com/1004024 is sorted out.
-  if (is_mac) {
+  # metal code in dawn once crbug.com/1004024 is sorted out if Chromium still
+  # supports 10.10 then.
+  if (is_mac && mac_min_system_version == "10.10.0") {
     cflags_objcc = [ "-Wno-unguarded-availability" ]
   }
 }
diff --git a/src/dawn_native/metal/BackendMTL.mm b/src/dawn_native/metal/BackendMTL.mm
index 646a387..2266164 100644
--- a/src/dawn_native/metal/BackendMTL.mm
+++ b/src/dawn_native/metal/BackendMTL.mm
@@ -103,7 +103,8 @@
         //
         // [device registryID] is the ID for one of the IOGraphicsAccelerator2 and we can see that
         // their parent always is an IOPCIDevice that has properties for the device and vendor IDs.
-        MaybeError GetDeviceIORegistryPCIInfo(id<MTLDevice> device, PCIIDs* ids) {
+        MaybeError API_AVAILABLE(macos(10.13))
+            GetDeviceIORegistryPCIInfo(id<MTLDevice> device, PCIIDs* ids) {
             // Get a matching dictionary for the IOGraphicsAccelerator2
             CFMutableDictionaryRef matchingDict = IORegistryEntryIDMatching([device registryID]);
             if (matchingDict == nullptr) {
@@ -143,7 +144,7 @@
         MaybeError GetDevicePCIInfo(id<MTLDevice> device, PCIIDs* ids) {
             // [device registryID] is introduced on macOS 10.13+, otherwise workaround to get vendor
             // id by vendor name on old macOS
-            if ([NSProcessInfo.processInfo isOperatingSystemAtLeastVersion:{10, 13, 0}]) {
+            if (@available(macos 10.13, *)) {
                 return GetDeviceIORegistryPCIInfo(device, ids);
             } else {
                 return GetVendorIdFromVendors(device, ids);
diff --git a/src/dawn_native/metal/CommandBufferMTL.mm b/src/dawn_native/metal/CommandBufferMTL.mm
index 3f93587..77596dd 100644
--- a/src/dawn_native/metal/CommandBufferMTL.mm
+++ b/src/dawn_native/metal/CommandBufferMTL.mm
@@ -48,6 +48,15 @@
 
     namespace {
 
+        // Allows this file to use MTLStoreActionStoreAndMultismapleResolve because the logic is
+        // first to compute what the "best" Metal render pass descriptor is, then fix it up if we
+        // are not on macOS 10.12 (i.e. the EmulateStoreAndMSAAResolve toggle is on).
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wunguarded-availability"
+        constexpr MTLStoreAction kMTLStoreActionStoreAndMultisampleResolve =
+            MTLStoreActionStoreAndMultisampleResolve;
+#pragma clang diagnostic pop
+
         // Creates an autoreleased MTLRenderPassDescriptor matching desc
         MTLRenderPassDescriptor* CreateMTLRenderPassDescriptor(BeginRenderPassCmd* renderPass) {
             MTLRenderPassDescriptor* descriptor = [MTLRenderPassDescriptor renderPassDescriptor];
@@ -79,7 +88,7 @@
                         descriptor.colorAttachments[i].resolveSlice =
                             attachmentInfo.resolveTarget->GetBaseArrayLayer();
                         descriptor.colorAttachments[i].storeAction =
-                            MTLStoreActionStoreAndMultisampleResolve;
+                            kMTLStoreActionStoreAndMultisampleResolve;
                     } else {
                         descriptor.colorAttachments[i].storeAction = MTLStoreActionStore;
                     }
@@ -876,7 +885,7 @@
             std::array<id<MTLTexture>, kMaxColorAttachments> resolveTextures = {};
             for (uint32_t i = 0; i < kMaxColorAttachments; ++i) {
                 if (mtlRenderPass.colorAttachments[i].storeAction ==
-                    MTLStoreActionStoreAndMultisampleResolve) {
+                    kMTLStoreActionStoreAndMultisampleResolve) {
                     hasStoreAndMSAAResolve = true;
                     resolveTextures[i] = mtlRenderPass.colorAttachments[i].resolveTexture;