Do simplifications assuming macOS 10.11 is the min version supported.

Bug: dawn:1397
Change-Id: I42a588b2a30e12eb7b6889a8954311b632547c58
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/90243
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/README.chromium b/README.chromium
index e14cc8b..15f5c6f 100644
--- a/README.chromium
+++ b/README.chromium
@@ -1,4 +1,58 @@
 Name: Dawn
+![Dawn's logo: a sun rising behind a stylized mountain inspired by the WebGPU logo. The text "Dawn" is written below it.](docs/imgs/dawn_logo.png "Dawn's logo")
+
+# Dawn, a WebGPU implementation
+
+Dawn is an open-source and cross-platform implementation of the work-in-progress [WebGPU](https://webgpu.dev) standard.
+More precisely it implements [`webgpu.h`](https://github.com/webgpu-native/webgpu-headers/blob/main/webgpu.h) that is a one-to-one mapping with the WebGPU IDL.
+Dawn is meant to be integrated as part of a larger system and is the underlying implementation of WebGPU in Chromium.
+
+Dawn provides several WebGPU building blocks:
+ - **WebGPU C/C++ headers** that applications and other building blocks use.
+   - The `webgpu.h` version that Dawn implements.
+   - A C++ wrapper for the `webgpu.h`.
+ - **A "native" implementation of WebGPU** using platforms' GPU APIs: D3D12, Metal, Vulkan and OpenGL. See [per API support](docs/support.md) for more details.
+ - **A client-server implementation of WebGPU** for applications that are in a sandbox without access to native drivers
+ - **Tint** is a compiler for the WebGPU Shader Language (WGSL) that can be used in standalone to convert shaders from and to WGSL.
+
+Helpful links:
+
+ - [Dawn bug tracker](https://bugs.chromium.org/p/dawn/issues/entry) if you find issues with Dawn.
+ - [Tint bug tracker](https://bugs.chromium.org/p/tint/issues/entry) if you find issues with Tint.
+ - [Dawn's mailing list](https://groups.google.com/forum/#!members/dawn-graphics) for other discussions related to Dawn.
+ - [Dawn's source code](https://dawn.googlesource.com/dawn)
+ - [Dawn's Matrix chatroom](https://matrix.to/#/#webgpu-dawn:matrix.org) for live discussion around contributing or using Dawn.
+ - [WebGPU's Matrix chatroom](https://matrix.to/#/#WebGPU:matrix.org)
+ - [Tint mirror](https://dawn.googlesource.com/tint) for standalone usage.
+
+## Documentation table of content
+
+Developer documentation:
+
+ - [Dawn overview](docs/dawn/overview.md)
+ - [Building](docs/building.md)
+ - [Contributing](CONTRIBUTING.md)
+ - [Code of Conduct](CODE_OF_CONDUCT.md)
+ - [Testing Dawn](docs/dawn/testing.md)
+ - [Debugging Dawn](docs/dawn/debugging.md)
+ - [Dawn's infrastructure](docs/dawn/infra.md)
+ - [Dawn errors](docs/dawn/errors.md)
+ - [Tint experimental extensions](docs/tint/experimental_extensions.md)
+
+
+User documentation: (TODO, figure out what overlaps with the webgpu.h docs)
+
+## Status
+
+(TODO)
+
+## License
+
+Apache 2.0 Public License, please see [LICENSE](/LICENSE).
+
+## Disclaimer
+
+This is not an officially supported Google product.
 Short Name: dawn
 URL: https://dawn.googlesource.com/dawn
 License: Apache 2.0
diff --git a/docs/support.md b/docs/support.md
new file mode 100644
index 0000000..c4e38bf
--- /dev/null
+++ b/docs/support.md
@@ -0,0 +1,54 @@
+# Platform and API support for Dawn/Tint
+
+## Khronos's Vulkan
+
+Vulkan is supported with minimal features, limits and extensions being required (what's required has been measured to be wildly available).
+Vulkan is the preferred target API on platforms that don't have other "modern" GPU APIs.
+Vulkan is supported as best effort on other platforms (e.g. Windows and macOS).
+
+**Required version**: Vulkan 1.0 is supported with some required extensions (`VK_KHR_maintenance1`), or Vulkan 1.1 and above without extensions.
+
+**Required features**: `depthBiasClamp`, `fragmentStoresAndAtomics`, `fullDrawIndexUint32`, `imageCubeArray`, `independentBlend`, `sampleRateShading`, and either `textureCompressionBC` or both of `textureCompressionETC` and `textureCompressionASTC_LDR`.
+
+**Required limites**: they are too detailed to describe here, but in general should be wildly supported.
+See the [WebGPU limits](https://gpuweb.github.io/gpuweb/#limits) that mostly correspond to Vulkan limits.
+
+**Operating system support**:
+
+ - Linux: Supported.
+ - ChromeOS: Supported.
+ - Android: Work in progress.
+ - Fuchsia: Work in progress.
+
+## Microsoft's D3D12
+
+D3D12 is supported with feature level 11.1, or feature level 11.0 with Resource Binding Tier 2.
+This is the vast majority of D3D12 devices.
+Supported shader models are 5.1 and above. It is the preferred target API when available.
+
+**Windows flavor support**:
+
+ - Win32: Supported.
+ - UWP: Supported, best effort.
+ - Xbox: Not supported, contributions welcome.
+
+## Apple's Metal
+
+Metal is supported and is the preferred target API when available.
+
+**Apple OS support:**
+
+ - macOS: supported.
+ - iOS: supported, best effort.
+ - tvOS/ipadOS/...: Not supported, contributions welcome.
+
+## Khronos's OpenGL family
+
+Support for OpenGL is in progress with the aim to make OpenGL ES 3.1 (with extensions and limits) supported through EGL.
+Other flavors of OpenGL (desktop OpenGL) or binding APIs (GLX, WGL, EAGL, CGL) are supported as best effort with contributions welcome.
+
+
+## Microsoft's D3D12
+
+Dawn doesn't have a D3D11 backend at the moment, but D3D11 support can be achieved with the OpenGL ES backend through ANGLE's OpenGL ES to D3D11 translation.
+There might be a D3D11 backend in the future.
diff --git a/src/dawn/native/metal/BackendMTL.mm b/src/dawn/native/metal/BackendMTL.mm
index ee480a6..fdd27bf 100644
--- a/src/dawn/native/metal/BackendMTL.mm
+++ b/src/dawn/native/metal/BackendMTL.mm
@@ -158,22 +158,14 @@
     return GetVendorIdFromVendors(device, ids);
 }
 
-bool IsMetalSupported() {
-    // Metal was first introduced in macOS 10.11
-    // WebGPU is targeted at macOS 10.12+
-    // TODO(dawn:1181): Dawn native should allow non-conformant WebGPU on macOS 10.11
-    return IsMacOSVersionAtLeast(10, 12);
-}
 #elif DAWN_PLATFORM_IS(IOS)
+
 MaybeError GetDevicePCIInfo(id<MTLDevice> device, PCIIDs* ids) {
     DAWN_UNUSED(device);
     *ids = PCIIDs{0, 0};
     return {};
 }
 
-bool IsMetalSupported() {
-    return true;
-}
 #else
 #error "Unsupported Apple platform."
 #endif
@@ -467,10 +459,8 @@
                 return MTLGPUFamily::Mac2;
             }
         }
-        if (@available(macOS 10.11, *)) {
-            if ([*mDevice supportsFeatureSet:MTLFeatureSet_macOS_GPUFamily1_v1]) {
-                return MTLGPUFamily::Mac1;
-            }
+        if ([*mDevice supportsFeatureSet:MTLFeatureSet_macOS_GPUFamily1_v1]) {
+            return MTLGPUFamily::Mac1;
         }
 #elif TARGET_OS_IOS
         if (@available(iOS 10.11, *)) {
@@ -658,43 +648,30 @@
     ASSERT(optionsBase->backendType == WGPUBackendType_Metal);
 
     std::vector<Ref<AdapterBase>> adapters;
-    BOOL supportedVersion = NO;
 #if DAWN_PLATFORM_IS(MACOS)
-    if (@available(macOS 10.11, *)) {
-        supportedVersion = YES;
+    NSRef<NSArray<id<MTLDevice>>> devices = AcquireNSRef(MTLCopyAllDevices());
 
-        NSRef<NSArray<id<MTLDevice>>> devices = AcquireNSRef(MTLCopyAllDevices());
-
-        for (id<MTLDevice> device in devices.Get()) {
-            Ref<Adapter> adapter = AcquireRef(new Adapter(GetInstance(), device));
-            if (!GetInstance()->ConsumedError(adapter->Initialize())) {
-                adapters.push_back(std::move(adapter));
-            }
-        }
-    }
-#endif
-
-#if DAWN_PLATFORM_IS(IOS)
-    if (@available(iOS 8.0, *)) {
-        supportedVersion = YES;
-        // iOS only has a single device so MTLCopyAllDevices doesn't exist there.
-        Ref<Adapter> adapter =
-            AcquireRef(new Adapter(GetInstance(), MTLCreateSystemDefaultDevice()));
+    for (id<MTLDevice> device in devices.Get()) {
+        Ref<Adapter> adapter = AcquireRef(new Adapter(GetInstance(), device));
         if (!GetInstance()->ConsumedError(adapter->Initialize())) {
             adapters.push_back(std::move(adapter));
         }
     }
 #endif
-    if (!supportedVersion) {
-        UNREACHABLE();
+
+    // iOS only has a single device so MTLCopyAllDevices doesn't exist there.
+#if defined(DAWN_PLATFORM_IOS)
+    Ref<Adapter> adapter =
+        AcquireRef(new Adapter(GetInstance(), MTLCreateSystemDefaultDevice()));
+    if (!GetInstance()->ConsumedError(adapter->Initialize())) {
+        adapters.push_back(std::move(adapter));
     }
+#endif
+
     return adapters;
 }
 
 BackendConnection* Connect(InstanceBase* instance) {
-    if (!IsMetalSupported()) {
-        return nullptr;
-    }
     return new Backend(instance);
 }
 
diff --git a/src/dawn/utils/GLFWUtils_metal.mm b/src/dawn/utils/GLFWUtils_metal.mm
index d07eeca..3bb39e0 100644
--- a/src/dawn/utils/GLFWUtils_metal.mm
+++ b/src/dawn/utils/GLFWUtils_metal.mm
@@ -29,25 +29,21 @@
 namespace utils {
 
 std::unique_ptr<wgpu::ChainedStruct> SetupWindowAndGetSurfaceDescriptorCocoa(GLFWwindow* window) {
-    if (@available(macOS 10.11, *)) {
-        NSWindow* nsWindow = glfwGetCocoaWindow(window);
-        NSView* view = [nsWindow contentView];
+    NSWindow* nsWindow = glfwGetCocoaWindow(window);
+    NSView* view = [nsWindow contentView];
 
-        // Create a CAMetalLayer that covers the whole window that will be passed to
-        // CreateSurface.
-        [view setWantsLayer:YES];
-        [view setLayer:[CAMetalLayer layer]];
+    // Create a CAMetalLayer that covers the whole window that will be passed to
+    // CreateSurface.
+    [view setWantsLayer:YES];
+    [view setLayer:[CAMetalLayer layer]];
 
-        // Use retina if the window was created with retina support.
-        [[view layer] setContentsScale:[nsWindow backingScaleFactor]];
+    // Use retina if the window was created with retina support.
+    [[view layer] setContentsScale:[nsWindow backingScaleFactor]];
 
-        std::unique_ptr<wgpu::SurfaceDescriptorFromMetalLayer> desc =
-            std::make_unique<wgpu::SurfaceDescriptorFromMetalLayer>();
-        desc->layer = [view layer];
-        return std::move(desc);
-    }
-
-    return nullptr;
+    std::unique_ptr<wgpu::SurfaceDescriptorFromMetalLayer> desc =
+        std::make_unique<wgpu::SurfaceDescriptorFromMetalLayer>();
+    desc->layer = [view layer];
+    return std::move(desc);
 }
 
 }  // namespace utils