[tint] Add chromium_experimental_subgroups

Add support for parsing the extension name.

Bug: tint:2000
Change-Id: Iac46faceb00e770b7d870b46cfadb08613e51d4c
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/143832
Commit-Queue: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Reviewed-by: David Neto <dneto@google.com>
diff --git a/src/tint/intrinsics.def b/src/tint/intrinsics.def
index 6b756db..4e9b03a 100644
--- a/src/tint/intrinsics.def
+++ b/src/tint/intrinsics.def
@@ -74,6 +74,8 @@
   // A Chromium-specific extension that enables passing of uniform, storage and workgroup
   // address-spaced pointers as parameters, as well as pointers into sub-objects.
   chromium_experimental_full_ptr_parameters
+  // A Chromium-specific extension that adds basic subgroup functionality.
+  chromium_experimental_subgroups
   // A Chromium-specific extension that relaxes memory layout requirements for uniform storage.
   chromium_internal_relaxed_uniform_layout
   // A Chromium-specific extension that enables dual source blending.
diff --git a/src/tint/lang/core/builtin/extension.cc b/src/tint/lang/core/builtin/extension.cc
index 5ee7e10..360e317 100644
--- a/src/tint/lang/core/builtin/extension.cc
+++ b/src/tint/lang/core/builtin/extension.cc
@@ -40,6 +40,9 @@
     if (str == "chromium_experimental_push_constant") {
         return Extension::kChromiumExperimentalPushConstant;
     }
+    if (str == "chromium_experimental_subgroups") {
+        return Extension::kChromiumExperimentalSubgroups;
+    }
     if (str == "chromium_internal_dual_source_blending") {
         return Extension::kChromiumInternalDualSourceBlending;
     }
@@ -64,6 +67,8 @@
             return "chromium_experimental_full_ptr_parameters";
         case Extension::kChromiumExperimentalPushConstant:
             return "chromium_experimental_push_constant";
+        case Extension::kChromiumExperimentalSubgroups:
+            return "chromium_experimental_subgroups";
         case Extension::kChromiumInternalDualSourceBlending:
             return "chromium_internal_dual_source_blending";
         case Extension::kChromiumInternalRelaxedUniformLayout:
diff --git a/src/tint/lang/core/builtin/extension.h b/src/tint/lang/core/builtin/extension.h
index a2640ed..09ccd209 100644
--- a/src/tint/lang/core/builtin/extension.h
+++ b/src/tint/lang/core/builtin/extension.h
@@ -36,6 +36,7 @@
     kChromiumExperimentalDp4A,
     kChromiumExperimentalFullPtrParameters,
     kChromiumExperimentalPushConstant,
+    kChromiumExperimentalSubgroups,
     kChromiumInternalDualSourceBlending,
     kChromiumInternalRelaxedUniformLayout,
     kF16,
@@ -59,13 +60,10 @@
 Extension ParseExtension(std::string_view str);
 
 constexpr const char* kExtensionStrings[] = {
-    "chromium_disable_uniformity_analysis",
-    "chromium_experimental_dp4a",
-    "chromium_experimental_full_ptr_parameters",
-    "chromium_experimental_push_constant",
-    "chromium_internal_dual_source_blending",
-    "chromium_internal_relaxed_uniform_layout",
-    "f16",
+    "chromium_disable_uniformity_analysis",      "chromium_experimental_dp4a",
+    "chromium_experimental_full_ptr_parameters", "chromium_experimental_push_constant",
+    "chromium_experimental_subgroups",           "chromium_internal_dual_source_blending",
+    "chromium_internal_relaxed_uniform_layout",  "f16",
 };
 
 // A unique vector of extensions
diff --git a/src/tint/lang/core/builtin/extension_bench.cc b/src/tint/lang/core/builtin/extension_bench.cc
index 0b21919..d0d564b 100644
--- a/src/tint/lang/core/builtin/extension_bench.cc
+++ b/src/tint/lang/core/builtin/extension_bench.cc
@@ -59,27 +59,34 @@
         "chromium_exp9rimFntal_ush_constant",
         "chrmium_experimental_push_constant",
         "cOOromium_experiVeHtal_puh_conRRtant",
-        "chromium_internay_dual_sorce_blending",
-        "chrnnmium_internal_duGrr_source_bllend77ng",
-        "chromiu4_inter00al_dual_source_blending",
+        "chromium_eperimental_sybgroups",
+        "chrorri77mGexperimllntal_subgrnnups",
+        "chromium_exp4rimen00al_subgroups",
+        "chromium_experimental_subgroups",
+        "chromium_exprimenal_ubgrouoos",
+        "chrmiumexperimenzzal_subgroups",
+        "chrmi11m_experppmeiita_subgroups",
+        "chromium_internal_dual_sourcXX_blending",
+        "chromium_internal_dual_99ou5IInce_blending",
+        "crrroSSium_internYlaadual_source_bHHending",
         "chromium_internal_dual_source_blending",
-        "chromium_intoornal_dua_sorce_bleding",
-        "cromium_nternal_dual_sourcezzblending",
-        "chiiomiu_internal_dppal_source11blendig",
-        "XXhromium_internal_relaxed_uniform_layout",
-        "chromium_99nternal_reIInaxed_un55form_layout",
-        "chromYuaaSSinternrrl_rHHlaxed_uniform_layout",
+        "chromium_internakk_ualsourc_blendHng",
+        "chromium_inRRrnal_dujl_sourceblgnding",
+        "chromiuminternal_duab_source_blendin",
+        "chromium_internal_relaxed_uniform_lajout",
+        "chromium_internal_relxed_uniform_layout",
+        "chroium_inqernal_rlaxed_uniform_layout",
         "chromium_internal_relaxed_uniform_layout",
-        "chroiHm_internal_rkklaxd_uniform_layou",
-        "chromium_internl_relaxedguniRRorm_lajou",
-        "chromium_inernal_relaxedbuniorm_layout",
+        "chromium_internNNl_relaxed_uniform_layou",
+        "chromium_internal_relaxvvd_unifom_laout",
+        "chromium_internalrelaxed_uniQQorm_layout",
+        "ff",
         "fj6",
-        "f6",
-        "q",
+        "wNN2",
         "f16",
-        "fNN",
-        "fv",
-        "Q16",
+        "f6",
+        "rr16",
+        "fG6",
     };
     for (auto _ : state) {
         for (auto* str : kStrings) {
diff --git a/src/tint/lang/core/builtin/extension_test.cc b/src/tint/lang/core/builtin/extension_test.cc
index 5d70f13..6059949 100644
--- a/src/tint/lang/core/builtin/extension_test.cc
+++ b/src/tint/lang/core/builtin/extension_test.cc
@@ -48,6 +48,7 @@
     {"chromium_experimental_full_ptr_parameters",
      Extension::kChromiumExperimentalFullPtrParameters},
     {"chromium_experimental_push_constant", Extension::kChromiumExperimentalPushConstant},
+    {"chromium_experimental_subgroups", Extension::kChromiumExperimentalSubgroups},
     {"chromium_internal_dual_source_blending", Extension::kChromiumInternalDualSourceBlending},
     {"chromium_internal_relaxed_uniform_layout", Extension::kChromiumInternalRelaxedUniformLayout},
     {"f16", Extension::kF16},
@@ -66,15 +67,18 @@
     {"chvomium_experimental_push_constiint", Extension::kUndefined},
     {"chromiu8WWexperimental_push_constant", Extension::kUndefined},
     {"chromium_experiMental_push_costanxx", Extension::kUndefined},
-    {"Xhromium_ggnternal_dual_sourceblending", Extension::kUndefined},
-    {"chromium_internludual_sorce_bVenXing", Extension::kUndefined},
-    {"chromium_internal_dual_source_b3ending", Extension::kUndefined},
-    {"chromium_internal_rElaxed_uniform_layout", Extension::kUndefined},
-    {"chromium_internalPPrTTlaed_uniform_layout", Extension::kUndefined},
-    {"chroddium_internxxl_relaxed_unform_layout", Extension::kUndefined},
-    {"4416", Extension::kUndefined},
-    {"fSVV6", Extension::kUndefined},
-    {"RR2", Extension::kUndefined},
+    {"chromiuX_experimentl_sugggroups", Extension::kUndefined},
+    {"chromiu_exuerimntal_XVbgroups", Extension::kUndefined},
+    {"chromium_experimen3al_subgroups", Extension::kUndefined},
+    {"chromium_internal_dual_soErce_blending", Extension::kUndefined},
+    {"chromiuPP_internal_dual_sourceblenTTing", Extension::kUndefined},
+    {"chromim_internadd_dual_sxxurce_blending", Extension::kUndefined},
+    {"chromium_interna44_relaxed_uniform_layout", Extension::kUndefined},
+    {"chromium_internal_relaxed_uniformSSlayouVV", Extension::kUndefined},
+    {"chromiumRnteRnal_re22axed_uniform_layout", Extension::kUndefined},
+    {"96", Extension::kUndefined},
+    {"f1", Extension::kUndefined},
+    {"VOR6", Extension::kUndefined},
 };
 
 using ExtensionParseTest = testing::TestWithParam<Case>;
diff --git a/src/tint/lang/wgsl/reader/parser/enable_directive_test.cc b/src/tint/lang/wgsl/reader/parser/enable_directive_test.cc
index d406496..538c618 100644
--- a/src/tint/lang/wgsl/reader/parser/enable_directive_test.cc
+++ b/src/tint/lang/wgsl/reader/parser/enable_directive_test.cc
@@ -164,7 +164,7 @@
     // Error when unknown extension found
     EXPECT_TRUE(p->has_error());
     EXPECT_EQ(p->error(), R"(1:8: expected extension
-Possible values: 'chromium_disable_uniformity_analysis', 'chromium_experimental_dp4a', 'chromium_experimental_full_ptr_parameters', 'chromium_experimental_push_constant', 'chromium_internal_dual_source_blending', 'chromium_internal_relaxed_uniform_layout', 'f16')");
+Possible values: 'chromium_disable_uniformity_analysis', 'chromium_experimental_dp4a', 'chromium_experimental_full_ptr_parameters', 'chromium_experimental_push_constant', 'chromium_experimental_subgroups', 'chromium_internal_dual_source_blending', 'chromium_internal_relaxed_uniform_layout', 'f16')");
     auto program = p->program();
     auto& ast = program.AST();
     EXPECT_EQ(ast.Enables().Length(), 0u);
@@ -178,7 +178,7 @@
     EXPECT_TRUE(p->has_error());
     EXPECT_EQ(p->error(), R"(1:8: expected extension
 Did you mean 'f16'?
-Possible values: 'chromium_disable_uniformity_analysis', 'chromium_experimental_dp4a', 'chromium_experimental_full_ptr_parameters', 'chromium_experimental_push_constant', 'chromium_internal_dual_source_blending', 'chromium_internal_relaxed_uniform_layout', 'f16')");
+Possible values: 'chromium_disable_uniformity_analysis', 'chromium_experimental_dp4a', 'chromium_experimental_full_ptr_parameters', 'chromium_experimental_push_constant', 'chromium_experimental_subgroups', 'chromium_internal_dual_source_blending', 'chromium_internal_relaxed_uniform_layout', 'f16')");
     auto program = p->program();
     auto& ast = program.AST();
     EXPECT_EQ(ast.Enables().Length(), 0u);
@@ -226,7 +226,7 @@
         p->translation_unit();
         EXPECT_TRUE(p->has_error());
         EXPECT_EQ(p->error(), R"(1:8: expected extension
-Possible values: 'chromium_disable_uniformity_analysis', 'chromium_experimental_dp4a', 'chromium_experimental_full_ptr_parameters', 'chromium_experimental_push_constant', 'chromium_internal_dual_source_blending', 'chromium_internal_relaxed_uniform_layout', 'f16')");
+Possible values: 'chromium_disable_uniformity_analysis', 'chromium_experimental_dp4a', 'chromium_experimental_full_ptr_parameters', 'chromium_experimental_push_constant', 'chromium_experimental_subgroups', 'chromium_internal_dual_source_blending', 'chromium_internal_relaxed_uniform_layout', 'f16')");
         auto program = p->program();
         auto& ast = program.AST();
         EXPECT_EQ(ast.Enables().Length(), 0u);
@@ -237,7 +237,7 @@
         p->translation_unit();
         EXPECT_TRUE(p->has_error());
         EXPECT_EQ(p->error(), R"(1:8: expected extension
-Possible values: 'chromium_disable_uniformity_analysis', 'chromium_experimental_dp4a', 'chromium_experimental_full_ptr_parameters', 'chromium_experimental_push_constant', 'chromium_internal_dual_source_blending', 'chromium_internal_relaxed_uniform_layout', 'f16')");
+Possible values: 'chromium_disable_uniformity_analysis', 'chromium_experimental_dp4a', 'chromium_experimental_full_ptr_parameters', 'chromium_experimental_push_constant', 'chromium_experimental_subgroups', 'chromium_internal_dual_source_blending', 'chromium_internal_relaxed_uniform_layout', 'f16')");
         auto program = p->program();
         auto& ast = program.AST();
         EXPECT_EQ(ast.Enables().Length(), 0u);
@@ -249,7 +249,7 @@
         EXPECT_TRUE(p->has_error());
         EXPECT_EQ(p->error(), R"(1:8: expected extension
 Did you mean 'f16'?
-Possible values: 'chromium_disable_uniformity_analysis', 'chromium_experimental_dp4a', 'chromium_experimental_full_ptr_parameters', 'chromium_experimental_push_constant', 'chromium_internal_dual_source_blending', 'chromium_internal_relaxed_uniform_layout', 'f16')");
+Possible values: 'chromium_disable_uniformity_analysis', 'chromium_experimental_dp4a', 'chromium_experimental_full_ptr_parameters', 'chromium_experimental_push_constant', 'chromium_experimental_subgroups', 'chromium_internal_dual_source_blending', 'chromium_internal_relaxed_uniform_layout', 'f16')");
         auto program = p->program();
         auto& ast = program.AST();
         EXPECT_EQ(ast.Enables().Length(), 0u);