diff --git a/src/dawn/native/metal/BackendMTL.mm b/src/dawn/native/metal/BackendMTL.mm
index de9968a..92b247e 100644
--- a/src/dawn/native/metal/BackendMTL.mm
+++ b/src/dawn/native/metal/BackendMTL.mm
@@ -124,8 +124,7 @@
 //
 // [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 API_AVAILABLE(macos(10.13))
-    GetDeviceIORegistryPCIInfo(id<MTLDevice> device, PCIIDs* ids) {
+MaybeError GetDeviceIORegistryPCIInfo(id<MTLDevice> device, PCIIDs* ids) {
     // Get a matching dictionary for the IOGraphicsAccelerator2
     CFRef<CFMutableDictionaryRef> matchingDict =
         AcquireCFRef(IORegistryEntryIDMatching([device registryID]));
@@ -167,8 +166,6 @@
 }
 
 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
     auto result = GetDeviceIORegistryPCIInfo(device, ids);
     if (result.IsError()) {
         dawn::WarningLog() << "GetDeviceIORegistryPCIInfo failed: "
@@ -346,8 +343,7 @@
         {
             bool haveStoreAndMSAAResolve = false;
 #if DAWN_PLATFORM_IS(MACOS)
-            haveStoreAndMSAAResolve =
-                [*mDevice supportsFeatureSet:MTLFeatureSet_macOS_GPUFamily1_v2];
+            haveStoreAndMSAAResolve = [*mDevice supportsFamily:MTLGPUFamilyCommon2];
 #elif DAWN_PLATFORM_IS(IOS)
 #if !defined(__IPHONE_16_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_16_0
             haveStoreAndMSAAResolve = [*mDevice supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily3_v2];
@@ -490,14 +486,8 @@
             EnableFeature(Feature::Float32Filterable);
         }
 #elif DAWN_PLATFORM_IS(MACOS)
-        if (@available(macOS 10.15, *)) {
-            if ([*mDevice supportsFamily:MTLGPUFamilyMac2]) {
-                EnableFeature(Feature::Float32Filterable);
-            }
-        } else if (@available(macOS 10.14, *)) {
-            if ([*mDevice supportsFeatureSet:MTLFeatureSet_macOS_GPUFamily2_v1]) {
-                EnableFeature(Feature::Float32Filterable);
-            }
+        if ([*mDevice supportsFamily:MTLGPUFamilyMac2]) {
+            EnableFeature(Feature::Float32Filterable);
         }
 #endif
 
@@ -757,18 +747,11 @@
             if ([*mDevice supportsFamily:MTLGPUFamilyApple1]) {
                 return MTLGPUFamily::Apple1;
             }
+
+            DAWN_UNREACHABLE();
         }
 
-#if DAWN_PLATFORM_IS(MACOS)
-        if (@available(macOS 10.14, *)) {
-            if ([*mDevice supportsFeatureSet:MTLFeatureSet_macOS_GPUFamily2_v1]) {
-                return MTLGPUFamily::Mac2;
-            }
-        }
-        if ([*mDevice supportsFeatureSet:MTLFeatureSet_macOS_GPUFamily1_v1]) {
-            return MTLGPUFamily::Mac1;
-        }
-#elif DAWN_PLATFORM_IS(IOS) && \
+#if DAWN_PLATFORM_IS(IOS) && \
     (!defined(__IPHONE_16_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_16_0)
         if (@available(iOS 10.11, *)) {
             if ([*mDevice supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily4_v1]) {
diff --git a/src/dawn/native/metal/QueueMTL.mm b/src/dawn/native/metal/QueueMTL.mm
index 21e9c71..e439d94 100644
--- a/src/dawn/native/metal/QueueMTL.mm
+++ b/src/dawn/native/metal/QueueMTL.mm
@@ -182,7 +182,7 @@
 
     TRACE_EVENT_ASYNC_BEGIN0(platform, GPUWork, "DeviceMTL::SubmitPendingCommandBuffer",
                              uint64_t(pendingSerial));
-    if (@available(macOS 10.14, *)) {
+    if (@available(macOS 10.14, iOS 12.0, *)) {
         id rawEvent = *mMtlSharedEvent;
         id<MTLSharedEvent> sharedEvent = static_cast<id<MTLSharedEvent>>(rawEvent);
         [*pendingCommands encodeSignalEvent:sharedEvent value:static_cast<uint64_t>(pendingSerial)];
diff --git a/src/dawn/tests/white_box/SharedTextureMemoryTests_apple.mm b/src/dawn/tests/white_box/SharedTextureMemoryTests_apple.mm
index b568404..33dbc5c 100644
--- a/src/dawn/tests/white_box/SharedTextureMemoryTests_apple.mm
+++ b/src/dawn/tests/white_box/SharedTextureMemoryTests_apple.mm
@@ -155,109 +155,99 @@
 
 // Test that a shared event can be imported, and then exported.
 TEST_P(SharedTextureMemoryTests, SharedFenceSuccessfulImportExport) {
-    if (@available(macOS 10.14, iOS 12.0, *)) {
-        auto mtlDevice = AcquireNSPRef(MTLCreateSystemDefaultDevice());
-        auto sharedEvent = AcquireNSPRef([*mtlDevice newSharedEvent]);
+    auto mtlDevice = AcquireNSPRef(MTLCreateSystemDefaultDevice());
+    auto sharedEvent = AcquireNSPRef([*mtlDevice newSharedEvent]);
 
-        wgpu::SharedFenceMTLSharedEventDescriptor sharedEventDesc;
-        sharedEventDesc.sharedEvent = static_cast<void*>(*sharedEvent);
+    wgpu::SharedFenceMTLSharedEventDescriptor sharedEventDesc;
+    sharedEventDesc.sharedEvent = static_cast<void*>(*sharedEvent);
 
-        wgpu::SharedFenceDescriptor fenceDesc;
-        fenceDesc.nextInChain = &sharedEventDesc;
+    wgpu::SharedFenceDescriptor fenceDesc;
+    fenceDesc.nextInChain = &sharedEventDesc;
 
-        wgpu::SharedFence fence = device.ImportSharedFence(&fenceDesc);
+    wgpu::SharedFence fence = device.ImportSharedFence(&fenceDesc);
 
-        // Release the Metal objects. They should be retained by the implementation.
-        mtlDevice = nil;
-        sharedEvent = nil;
+    // Release the Metal objects. They should be retained by the implementation.
+    mtlDevice = nil;
+    sharedEvent = nil;
 
-        wgpu::SharedFenceMTLSharedEventExportInfo sharedEventInfo;
-        wgpu::SharedFenceExportInfo exportInfo;
-        exportInfo.nextInChain = &sharedEventInfo;
-        fence.ExportInfo(&exportInfo);
+    wgpu::SharedFenceMTLSharedEventExportInfo sharedEventInfo;
+    wgpu::SharedFenceExportInfo exportInfo;
+    exportInfo.nextInChain = &sharedEventInfo;
+    fence.ExportInfo(&exportInfo);
 
-        // The exported event should be the same as the imported one.
-        EXPECT_EQ(sharedEventInfo.sharedEvent, sharedEventDesc.sharedEvent);
-        EXPECT_EQ(exportInfo.type, wgpu::SharedFenceType::MTLSharedEvent);
-    }
+    // The exported event should be the same as the imported one.
+    EXPECT_EQ(sharedEventInfo.sharedEvent, sharedEventDesc.sharedEvent);
+    EXPECT_EQ(exportInfo.type, wgpu::SharedFenceType::MTLSharedEvent);
 }
 
 // Test that it is an error to import a shared fence without enabling the feature.
 TEST_P(SharedTextureMemoryNoFeatureTests, SharedFenceImportWithoutFeature) {
-    if (@available(macOS 10.14, iOS 12.0, *)) {
-        auto mtlDevice = AcquireNSPRef(MTLCreateSystemDefaultDevice());
-        auto sharedEvent = AcquireNSPRef([*mtlDevice newSharedEvent]);
+    auto mtlDevice = AcquireNSPRef(MTLCreateSystemDefaultDevice());
+    auto sharedEvent = AcquireNSPRef([*mtlDevice newSharedEvent]);
 
-        wgpu::SharedFenceMTLSharedEventDescriptor sharedEventDesc;
-        sharedEventDesc.sharedEvent = static_cast<void*>(*sharedEvent);
+    wgpu::SharedFenceMTLSharedEventDescriptor sharedEventDesc;
+    sharedEventDesc.sharedEvent = static_cast<void*>(*sharedEvent);
 
-        wgpu::SharedFenceDescriptor fenceDesc;
-        fenceDesc.nextInChain = &sharedEventDesc;
+    wgpu::SharedFenceDescriptor fenceDesc;
+    fenceDesc.nextInChain = &sharedEventDesc;
 
-        ASSERT_DEVICE_ERROR_MSG(wgpu::SharedFence fence = device.ImportSharedFence(&fenceDesc),
-                                testing::HasSubstr("MTLSharedEvent is not enabled"));
-    }
+    ASSERT_DEVICE_ERROR_MSG(wgpu::SharedFence fence = device.ImportSharedFence(&fenceDesc),
+                            testing::HasSubstr("MTLSharedEvent is not enabled"));
 }
 
 // Test that it is an error to import a shared fence with a null MTLSharedEvent
 TEST_P(SharedTextureMemoryTests, SharedFenceImportMTLSharedEventMissing) {
-    if (@available(macOS 10.14, iOS 12.0, *)) {
-        wgpu::SharedFenceMTLSharedEventDescriptor sharedEventDesc;
-        sharedEventDesc.sharedEvent = nullptr;
+    wgpu::SharedFenceMTLSharedEventDescriptor sharedEventDesc;
+    sharedEventDesc.sharedEvent = nullptr;
 
-        wgpu::SharedFenceDescriptor fenceDesc;
-        fenceDesc.nextInChain = &sharedEventDesc;
+    wgpu::SharedFenceDescriptor fenceDesc;
+    fenceDesc.nextInChain = &sharedEventDesc;
 
-        ASSERT_DEVICE_ERROR_MSG(wgpu::SharedFence fence = device.ImportSharedFence(&fenceDesc),
-                                testing::HasSubstr("missing"));
-    }
+    ASSERT_DEVICE_ERROR_MSG(wgpu::SharedFence fence = device.ImportSharedFence(&fenceDesc),
+                            testing::HasSubstr("missing"));
 }
 
 // Test exporting info from a shared fence with no chained struct.
 // It should be valid and the fence type is exported.
 TEST_P(SharedTextureMemoryTests, SharedFenceExportInfoNoChainedStruct) {
-    if (@available(macOS 10.14, iOS 12.0, *)) {
-        auto mtlDevice = AcquireNSPRef(MTLCreateSystemDefaultDevice());
-        auto sharedEvent = AcquireNSPRef([*mtlDevice newSharedEvent]);
+    auto mtlDevice = AcquireNSPRef(MTLCreateSystemDefaultDevice());
+    auto sharedEvent = AcquireNSPRef([*mtlDevice newSharedEvent]);
 
-        wgpu::SharedFenceMTLSharedEventDescriptor sharedEventDesc;
-        sharedEventDesc.sharedEvent = static_cast<void*>(*sharedEvent);
+    wgpu::SharedFenceMTLSharedEventDescriptor sharedEventDesc;
+    sharedEventDesc.sharedEvent = static_cast<void*>(*sharedEvent);
 
-        wgpu::SharedFenceDescriptor fenceDesc;
-        fenceDesc.nextInChain = &sharedEventDesc;
+    wgpu::SharedFenceDescriptor fenceDesc;
+    fenceDesc.nextInChain = &sharedEventDesc;
 
-        wgpu::SharedFence fence = device.ImportSharedFence(&fenceDesc);
+    wgpu::SharedFence fence = device.ImportSharedFence(&fenceDesc);
 
-        // Test no chained struct.
-        wgpu::SharedFenceExportInfo exportInfo;
-        exportInfo.nextInChain = nullptr;
+    // Test no chained struct.
+    wgpu::SharedFenceExportInfo exportInfo;
+    exportInfo.nextInChain = nullptr;
 
-        fence.ExportInfo(&exportInfo);
-        EXPECT_EQ(exportInfo.type, wgpu::SharedFenceType::MTLSharedEvent);
-    }
+    fence.ExportInfo(&exportInfo);
+    EXPECT_EQ(exportInfo.type, wgpu::SharedFenceType::MTLSharedEvent);
 }
 
 // Test exporting info from a shared fence with an invalid chained struct.
 // It should not be valid, but the fence type should still be exported.
 TEST_P(SharedTextureMemoryTests, SharedFenceExportInfoInvalidChainedStruct) {
-    if (@available(macOS 10.14, iOS 12.0, *)) {
-        auto mtlDevice = AcquireNSPRef(MTLCreateSystemDefaultDevice());
-        auto sharedEvent = AcquireNSPRef([*mtlDevice newSharedEvent]);
+    auto mtlDevice = AcquireNSPRef(MTLCreateSystemDefaultDevice());
+    auto sharedEvent = AcquireNSPRef([*mtlDevice newSharedEvent]);
 
-        wgpu::SharedFenceMTLSharedEventDescriptor sharedEventDesc;
-        sharedEventDesc.sharedEvent = static_cast<void*>(*sharedEvent);
+    wgpu::SharedFenceMTLSharedEventDescriptor sharedEventDesc;
+    sharedEventDesc.sharedEvent = static_cast<void*>(*sharedEvent);
 
-        wgpu::SharedFenceDescriptor fenceDesc;
-        fenceDesc.nextInChain = &sharedEventDesc;
+    wgpu::SharedFenceDescriptor fenceDesc;
+    fenceDesc.nextInChain = &sharedEventDesc;
 
-        wgpu::SharedFence fence = device.ImportSharedFence(&fenceDesc);
+    wgpu::SharedFence fence = device.ImportSharedFence(&fenceDesc);
 
-        wgpu::ChainedStructOut otherStruct;
-        wgpu::SharedFenceExportInfo exportInfo;
-        exportInfo.nextInChain = &otherStruct;
+    wgpu::ChainedStructOut otherStruct;
+    wgpu::SharedFenceExportInfo exportInfo;
+    exportInfo.nextInChain = &otherStruct;
 
-        ASSERT_DEVICE_ERROR(fence.ExportInfo(&exportInfo));
-    }
+    ASSERT_DEVICE_ERROR(fence.ExportInfo(&exportInfo));
 }
 
 DAWN_INSTANTIATE_PREFIXED_TEST_P(Metal,
