Make RequestAdapterOptionsBackendType part of RequestAdapterOptions

Removes the chained struct and adds it as a member to RequestAdapterOptions

PR: https://github.com/webgpu-native/webgpu-headers/pull/195

Bug: dawn:1875
Change-Id: I8693bab697292ef1dd832356913e1d23d985990e
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/138160
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
Commit-Queue: Austin Eng <enga@chromium.org>
diff --git a/dawn.json b/dawn.json
index 81e98ca..a975648 100644
--- a/dawn.json
+++ b/dawn.json
@@ -53,19 +53,11 @@
         "members": [
             {"name": "compatible surface", "type": "surface", "optional": true},
             {"name": "power preference", "type": "power preference", "default": "undefined"},
+            {"name": "backend type", "type": "backend type", "default": "undefined"},
             {"name": "force fallback adapter", "type": "bool", "default": "false"},
             {"name": "compatibility mode", "type": "bool", "default": "false", "tags": ["dawn", "emscripten"]}
         ]
     },
-    "request adapter options backend type": {
-        "tags": ["dawn"],
-        "category": "structure",
-        "chained": "in",
-        "chain roots": ["request adapter options"],
-        "members": [
-            {"name": "backend type", "type": "backend type"}
-        ]
-    },
     "request adapter status": {
         "category": "enum",
         "emscripten_no_enum_table": true,
@@ -210,14 +202,15 @@
         "category": "enum",
         "emscripten_no_enum_table": true,
         "values": [
-            {"value": 0, "name": "null"},
-            {"value": 1, "name": "WebGPU"},
-            {"value": 2, "name": "D3D11"},
-            {"value": 3, "name": "D3D12"},
-            {"value": 4, "name": "metal"},
-            {"value": 5, "name": "vulkan"},
-            {"value": 6, "name": "openGL"},
-            {"value": 7, "name": "openGLES"}
+            {"value": 0, "name": "undefined", "jsrepr": "undefined", "valid": false},
+            {"value": 1, "name": "null"},
+            {"value": 2, "name": "WebGPU"},
+            {"value": 3, "name": "D3D11"},
+            {"value": 4, "name": "D3D12"},
+            {"value": 5, "name": "metal"},
+            {"value": 6, "name": "vulkan"},
+            {"value": 7, "name": "openGL"},
+            {"value": 8, "name": "openGLES"}
         ]
     },
     "bind group": {
@@ -2628,9 +2621,8 @@
             {"value": 1007, "name": "dawn buffer descriptor error info from wire client", "tags": ["dawn"]},
             {"value": 1008, "name": "dawn toggles descriptor", "tags": ["dawn", "native"]},
             {"value": 1009, "name": "dawn shader module SPIRV options descriptor", "tags": ["dawn"]},
-            {"value": 1010, "name": "request adapter options backend type", "tags": ["dawn"]},
-            {"value": 1011, "name": "request adapter options LUID", "tags": ["dawn", "native"]},
-            {"value": 1012, "name": "request adapter options get GL proc", "tags": ["dawn", "native"]}
+            {"value": 1010, "name": "request adapter options LUID", "tags": ["dawn", "native"]},
+            {"value": 1011, "name": "request adapter options get GL proc", "tags": ["dawn", "native"]}
         ]
     },
     "texture": {
diff --git a/docs/dawn/features/adapter_options.md b/docs/dawn/features/adapter_options.md
index 37b4a7d..56c209f 100644
--- a/docs/dawn/features/adapter_options.md
+++ b/docs/dawn/features/adapter_options.md
@@ -13,15 +13,12 @@
  - `RequestAdapterOptions::powerPreference` adapters are sorted according to powerPreference such that
    preferred adapters are at the front of the list. It is a preference - so if
   wgpu::PowerPreference::LowPower is passed, the list may contain only integrated GPUs, fallback adapters, or a mix of everything. Implementations *should* try to avoid returning any discrete GPUs when low power is requested if at least one integrated GPU is available.
+ - `RequestAdapterOptions::backendType` filters adapters such that only those on a particular backend are discovered. If `WGPURequestAdapterType_Undefined` is passed, all backends may be discovered.
  - `RequestAdapterOptions::compatibilityMode` all returned adapters must match the requested compatibility mode.
  - `RequestAdapterOptions::forceFallbackAdapter` all returned adapters must be fallback adapters.
 
 If no options are passed to EnumerateAdapters, then it is as if the default `RequestAdapterOptions` are passed.
 
-### `RequestAdapterOptionsBackendType`
-
-Filters the adapters that Dawn discovers to only one particular backend.
-
 ### `RequestAdapterOptionsGetGLProc`
 
 When discovering adapters on the GL backend, Dawn uses the provided `RequestAdapterOptionsGetGLProc::getProc` method to load GL procs. This extension struct does nothing on other backends.
diff --git a/src/dawn/native/Adapter.cpp b/src/dawn/native/Adapter.cpp
index bb8fa36..f79e1d4 100644
--- a/src/dawn/native/Adapter.cpp
+++ b/src/dawn/native/Adapter.cpp
@@ -232,6 +232,8 @@
                 return 5;
             case wgpu::BackendType::Null:
                 return 6;
+            case wgpu::BackendType::Undefined:
+                UNREACHABLE();
         }
     };
 
diff --git a/src/dawn/native/Instance.cpp b/src/dawn/native/Instance.cpp
index bc88e0a..2b51648 100644
--- a/src/dawn/native/Instance.cpp
+++ b/src/dawn/native/Instance.cpp
@@ -241,11 +241,7 @@
                           "RequestAdapter instead.";
     // Transform the deprecated options to RequestAdapterOptions.
     RequestAdapterOptions adapterOptions = {};
-
-    RequestAdapterOptionsBackendType backendTypeOptions = {};
-    backendTypeOptions.backendType = wgpu::BackendType(deprecatedOptions->backendType);
-
-    adapterOptions.nextInChain = &backendTypeOptions;
+    adapterOptions.backendType = wgpu::BackendType(deprecatedOptions->backendType);
 
 #if defined(DAWN_ENABLE_BACKEND_D3D11) || defined(DAWN_ENABLE_BACKEND_D3D12)
     d3d::RequestAdapterOptionsLUID adapterOptionsLUID = {};
@@ -255,7 +251,7 @@
     opengl::RequestAdapterOptionsGetGLProc glGetProcOptions = {};
 #endif  // defined(DAWN_ENABLE_BACKEND_OPENGL)
 
-    switch (backendTypeOptions.backendType) {
+    switch (adapterOptions.backendType) {
 #if defined(DAWN_ENABLE_BACKEND_D3D11) || defined(DAWN_ENABLE_BACKEND_D3D12)
         case wgpu::BackendType::D3D11:
         case wgpu::BackendType::D3D12: {
@@ -268,7 +264,7 @@
                     return false;
                 }
                 adapterOptionsLUID.adapterLUID = desc.AdapterLuid;
-                backendTypeOptions.nextInChain = &adapterOptionsLUID;
+                adapterOptions.nextInChain = &adapterOptionsLUID;
             }
             break;
         }
@@ -280,7 +276,7 @@
             glGetProcOptions.getProc =
                 static_cast<const opengl::PhysicalDeviceDiscoveryOptions*>(deprecatedOptions)
                     ->getProc;
-            backendTypeOptions.nextInChain = &glGetProcOptions;
+            adapterOptions.nextInChain = &glGetProcOptions;
             break;
 #endif  // defined(DAWN_ENABLE_BACKEND_OPENGL)
 
@@ -455,16 +451,12 @@
     const RequestAdapterOptions* options) {
     ASSERT(options);
 
-    const RequestAdapterOptionsBackendType* backendTypeOptions = nullptr;
-    FindInChain(options->nextInChain, &backendTypeOptions);
-
     BackendsBitset enabledBackends = GetEnabledBackends();
     BackendsBitset backendsToFind;
-    if (backendTypeOptions) {
+    if (options->backendType != wgpu::BackendType::Undefined) {
         backendsToFind = {};
-        if (!ConsumedErrorAndWarnOnce(ValidateBackendType(backendTypeOptions->backendType))) {
-            wgpu::BackendType backendType(backendTypeOptions->backendType);
-            backendsToFind.set(backendType, enabledBackends[backendType]);
+        if (!ConsumedErrorAndWarnOnce(ValidateBackendType(options->backendType))) {
+            backendsToFind.set(options->backendType, enabledBackends[options->backendType]);
         }
     } else {
         backendsToFind = enabledBackends;
diff --git a/src/dawn/samples/SampleUtils.cpp b/src/dawn/samples/SampleUtils.cpp
index b7843cf..320d0c0 100644
--- a/src/dawn/samples/SampleUtils.cpp
+++ b/src/dawn/samples/SampleUtils.cpp
@@ -129,11 +129,8 @@
 
     instance = std::make_unique<dawn::native::Instance>();
 
-    wgpu::RequestAdapterOptionsBackendType backendTypeOptions = {};
-    backendTypeOptions.backendType = backendType;
-
     wgpu::RequestAdapterOptions options = {};
-    options.nextInChain = &backendTypeOptions;
+    options.backendType = backendType;
 
     // Get an adapter for the backend to use, and create the device.
     dawn::native::Adapter backendAdapter = instance->EnumerateAdapters(&options)[0];
diff --git a/src/dawn/tests/AdapterTestConfig.cpp b/src/dawn/tests/AdapterTestConfig.cpp
index e81bb29..476e01a 100644
--- a/src/dawn/tests/AdapterTestConfig.cpp
+++ b/src/dawn/tests/AdapterTestConfig.cpp
@@ -91,6 +91,7 @@
             return "OpenGLES";
         case wgpu::BackendType::Vulkan:
             return "Vulkan";
+        case wgpu::BackendType::Undefined:
         default:
             UNREACHABLE();
     }
diff --git a/src/dawn/tests/DawnNativeTest.cpp b/src/dawn/tests/DawnNativeTest.cpp
index 31503b8..29b5031 100644
--- a/src/dawn/tests/DawnNativeTest.cpp
+++ b/src/dawn/tests/DawnNativeTest.cpp
@@ -65,11 +65,8 @@
         reinterpret_cast<const WGPUInstanceDescriptor*>(&instanceDesc));
     instance->EnableAdapterBlocklist(false);
 
-    wgpu::RequestAdapterOptionsBackendType backendTypeOptions = {};
-    backendTypeOptions.backendType = wgpu::BackendType::Null;
-
     wgpu::RequestAdapterOptions options = {};
-    options.nextInChain = &backendTypeOptions;
+    options.backendType = wgpu::BackendType::Null;
 
     adapter = instance->EnumerateAdapters(&options)[0];
     device = wgpu::Device::Acquire(CreateTestDevice());
diff --git a/src/dawn/tests/DawnTest.cpp b/src/dawn/tests/DawnTest.cpp
index 24a748e..54f3ffd 100644
--- a/src/dawn/tests/DawnTest.cpp
+++ b/src/dawn/tests/DawnTest.cpp
@@ -706,11 +706,8 @@
                                       WGPURequestAdapterCallback callback, void* userdata) {
         ASSERT(gCurrentTest);
 
-        wgpu::RequestAdapterOptionsBackendType adapterBackendTypeOptions;
-        adapterBackendTypeOptions.backendType = gCurrentTest->mParam.adapterProperties.backendType;
-
         wgpu::RequestAdapterOptions adapterOptions;
-        adapterOptions.nextInChain = &adapterBackendTypeOptions;
+        adapterOptions.backendType = gCurrentTest->mParam.adapterProperties.backendType;
         adapterOptions.compatibilityMode = gCurrentTest->mParam.adapterProperties.compatibilityMode;
 
         // Find the adapter that exactly matches our adapter properties.
diff --git a/src/dawn/tests/benchmarks/NullDeviceSetup.cpp b/src/dawn/tests/benchmarks/NullDeviceSetup.cpp
index f4c0e8f..c7057fc 100644
--- a/src/dawn/tests/benchmarks/NullDeviceSetup.cpp
+++ b/src/dawn/tests/benchmarks/NullDeviceSetup.cpp
@@ -36,11 +36,8 @@
     }
 
     if (!nullBackendAdapter) {
-        wgpu::RequestAdapterOptionsBackendType backendTypeOptions = {};
-        backendTypeOptions.backendType = wgpu::BackendType::Null;
-
         wgpu::RequestAdapterOptions options = {};
-        options.nextInChain = &backendTypeOptions;
+        options.backendType = wgpu::BackendType::Null;
 
         auto nativeAdapter = nativeInstance->EnumerateAdapters(&options)[0];
         nullBackendAdapter = wgpu::Adapter(nativeAdapter.Get());
diff --git a/src/dawn/tests/end2end/PhysicalDeviceDiscoveryTests.cpp b/src/dawn/tests/end2end/PhysicalDeviceDiscoveryTests.cpp
index 51532c5..af0288a 100644
--- a/src/dawn/tests/end2end/PhysicalDeviceDiscoveryTests.cpp
+++ b/src/dawn/tests/end2end/PhysicalDeviceDiscoveryTests.cpp
@@ -263,11 +263,8 @@
 TEST(AdapterEnumerationTests, OnlyVulkan) {
     native::Instance instance;
 
-    wgpu::RequestAdapterOptionsBackendType backendTypeOptions = {};
-    backendTypeOptions.backendType = wgpu::BackendType::Vulkan;
-
     wgpu::RequestAdapterOptions adapterOptions = {};
-    adapterOptions.nextInChain = &backendTypeOptions;
+    adapterOptions.backendType = wgpu::BackendType::Vulkan;
 
     const auto& adapters = instance.EnumerateAdapters(&adapterOptions);
     for (const auto& adapter : adapters) {
@@ -282,11 +279,8 @@
 TEST(AdapterEnumerationTests, OnlyD3D11) {
     native::Instance instance;
 
-    wgpu::RequestAdapterOptionsBackendType backendTypeOptions = {};
-    backendTypeOptions.backendType = wgpu::BackendType::D3D11;
-
     wgpu::RequestAdapterOptions adapterOptions = {};
-    adapterOptions.nextInChain = &backendTypeOptions;
+    adapterOptions.backendType = wgpu::BackendType::D3D11;
 
     const auto& adapters = instance.EnumerateAdapters(&adapterOptions);
     for (const auto& adapter : adapters) {
@@ -320,12 +314,9 @@
         native::d3d::RequestAdapterOptionsLUID luidOptions = {};
         luidOptions.adapterLUID = adapterDesc.AdapterLuid;
 
-        wgpu::RequestAdapterOptionsBackendType backendTypeOptions = {};
-        backendTypeOptions.backendType = wgpu::BackendType::D3D11;
-
         wgpu::RequestAdapterOptions adapterOptions = {};
-        adapterOptions.nextInChain = &backendTypeOptions;
-        backendTypeOptions.nextInChain = &luidOptions;
+        adapterOptions.backendType = wgpu::BackendType::D3D11;
+        adapterOptions.nextInChain = &luidOptions;
 
         const auto& adapters = instance.EnumerateAdapters(&adapterOptions);
         if (adapters.empty()) {
@@ -362,11 +353,8 @@
 TEST(AdapterEnumerationTests, OnlyD3D12) {
     native::Instance instance;
 
-    wgpu::RequestAdapterOptionsBackendType backendTypeOptions = {};
-    backendTypeOptions.backendType = wgpu::BackendType::D3D12;
-
     wgpu::RequestAdapterOptions adapterOptions = {};
-    adapterOptions.nextInChain = &backendTypeOptions;
+    adapterOptions.backendType = wgpu::BackendType::D3D12;
 
     const auto& adapters = instance.EnumerateAdapters(&adapterOptions);
     for (const auto& adapter : adapters) {
@@ -400,12 +388,9 @@
         native::d3d::RequestAdapterOptionsLUID luidOptions = {};
         luidOptions.adapterLUID = adapterDesc.AdapterLuid;
 
-        wgpu::RequestAdapterOptionsBackendType backendTypeOptions = {};
-        backendTypeOptions.backendType = wgpu::BackendType::D3D12;
-
         wgpu::RequestAdapterOptions adapterOptions = {};
-        adapterOptions.nextInChain = &backendTypeOptions;
-        backendTypeOptions.nextInChain = &luidOptions;
+        adapterOptions.backendType = wgpu::BackendType::D3D12;
+        adapterOptions.nextInChain = &luidOptions;
 
         const auto& adapters = instance.EnumerateAdapters(&adapterOptions);
         if (adapters.empty()) {
@@ -442,11 +427,8 @@
 TEST(AdapterEnumerationTests, OnlyMetal) {
     native::Instance instance;
 
-    wgpu::RequestAdapterOptionsBackendType backendTypeOptions = {};
-    backendTypeOptions.backendType = wgpu::BackendType::Metal;
-
     wgpu::RequestAdapterOptions adapterOptions = {};
-    adapterOptions.nextInChain = &backendTypeOptions;
+    adapterOptions.backendType = wgpu::BackendType::Metal;
 
     const auto& adapters = instance.EnumerateAdapters(&adapterOptions);
     for (const auto& adapter : adapters) {
@@ -460,11 +442,8 @@
 // Test enumerating the Metal backend, then the Vulkan backend
 // does not duplicate physical devices.
 TEST(AdapterEnumerationTests, OneBackendThenTheOther) {
-    wgpu::RequestAdapterOptionsBackendType backendTypeOptions = {};
-    backendTypeOptions.backendType = wgpu::BackendType::Metal;
-
     wgpu::RequestAdapterOptions adapterOptions = {};
-    adapterOptions.nextInChain = &backendTypeOptions;
+    adapterOptions.backendType = wgpu::BackendType::Metal;
 
     native::Instance instance;
 
@@ -482,7 +461,7 @@
     }
     // Enumerate vulkan adapters. We should only see vulkan adapters.
     {
-        backendTypeOptions.backendType = wgpu::BackendType::Vulkan;
+        adapterOptions.backendType = wgpu::BackendType::Vulkan;
 
         const auto& adapters = instance.EnumerateAdapters(&adapterOptions);
         for (const auto& adapter : adapters) {
@@ -495,7 +474,7 @@
 
     // Enumerate metal adapters. We should see the same number of metal adapters.
     {
-        backendTypeOptions.backendType = wgpu::BackendType::Metal;
+        adapterOptions.backendType = wgpu::BackendType::Metal;
 
         const auto& adapters = instance.EnumerateAdapters(&adapterOptions);
         uint32_t metalAdapterCount2 = adapters.size();
diff --git a/src/dawn/tests/unittests/ToggleTests.cpp b/src/dawn/tests/unittests/ToggleTests.cpp
index 2ced630..014538d 100644
--- a/src/dawn/tests/unittests/ToggleTests.cpp
+++ b/src/dawn/tests/unittests/ToggleTests.cpp
@@ -131,11 +131,8 @@
         native::InstanceBase* instance = native::FromAPI(nativeInstance->Get());
         const native::TogglesState& instanceTogglesState = instance->GetTogglesState();
 
-        native::RequestAdapterOptionsBackendType backendTypeOptions = {};
-        backendTypeOptions.backendType = wgpu::BackendType::Null;
-
         native::RequestAdapterOptions options = {};
-        options.nextInChain = &backendTypeOptions;
+        options.backendType = wgpu::BackendType::Null;
 
         // Get the null adapter with default toggles.
         Ref<native::AdapterBase> nullAdapter = instance->EnumerateAdapters(&options)[0];
diff --git a/src/dawn/tests/unittests/native/DeviceCreationTests.cpp b/src/dawn/tests/unittests/native/DeviceCreationTests.cpp
index d20a70c..56ab31f 100644
--- a/src/dawn/tests/unittests/native/DeviceCreationTests.cpp
+++ b/src/dawn/tests/unittests/native/DeviceCreationTests.cpp
@@ -44,11 +44,8 @@
         WGPUInstanceDescriptor safeInstanceDesc = {};
         instance = std::make_unique<dawn::native::Instance>(&safeInstanceDesc);
 
-        wgpu::RequestAdapterOptionsBackendType backendTypeOptions = {};
-        backendTypeOptions.backendType = wgpu::BackendType::Null;
-
         wgpu::RequestAdapterOptions options = {};
-        options.nextInChain = &backendTypeOptions;
+        options.backendType = wgpu::BackendType::Null;
 
         // Get the null adapter with default toggles.
         adapter = instance->EnumerateAdapters(&options)[0];
diff --git a/src/dawn/tests/unittests/validation/ValidationTest.cpp b/src/dawn/tests/unittests/validation/ValidationTest.cpp
index eff8065..9a9dc3e 100644
--- a/src/dawn/tests/unittests/validation/ValidationTest.cpp
+++ b/src/dawn/tests/unittests/validation/ValidationTest.cpp
@@ -144,11 +144,8 @@
         "_" + ::testing::UnitTest::GetInstance()->current_test_info()->name();
     mWireHelper->BeginWireTrace(traceName.c_str());
 
-    wgpu::RequestAdapterOptionsBackendType backendTypeOptions = {};
-    backendTypeOptions.backendType = wgpu::BackendType::Null;
-
     wgpu::RequestAdapterOptions options = {};
-    options.nextInChain = &backendTypeOptions;
+    options.backendType = wgpu::BackendType::Null;
     options.compatibilityMode = gCurrentTest->UseCompatibilityMode();
 
     mInstance.RequestAdapter(