[tint] Add subgroup_matrix_uniformity diagnostic rule

Set the default severity to "error", but otherwise do nothing with it
for now.

Bug: 348702031
Change-Id: I2e72fa0395f5ddf4b5d2c626b8ebb8564c91c601
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/227655
Commit-Queue: James Price <jrprice@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/cmd/fuzz/wgsl/dictionary.txt b/src/tint/cmd/fuzz/wgsl/dictionary.txt
index 3be88bf..2f83f76 100644
--- a/src/tint/cmd/fuzz/wgsl/dictionary.txt
+++ b/src/tint/cmd/fuzz/wgsl/dictionary.txt
@@ -413,6 +413,7 @@
 "subgroup_matrix_left"
 "subgroup_matrix_result"
 "subgroup_matrix_right"
+"subgroup_matrix_uniformity"
 "subgroup_size"
 "subgroup_uniformity"
 "subgroups"
diff --git a/src/tint/lang/wgsl/diagnostic_rule.cc b/src/tint/lang/wgsl/diagnostic_rule.cc
index dc3e130..45f4286 100644
--- a/src/tint/lang/wgsl/diagnostic_rule.cc
+++ b/src/tint/lang/wgsl/diagnostic_rule.cc
@@ -72,6 +72,9 @@
 /// @returns the parsed enum, or ChromiumDiagnosticRule::kUndefined if the string could not be
 /// parsed.
 ChromiumDiagnosticRule ParseChromiumDiagnosticRule(std::string_view str) {
+    if (str == "subgroup_matrix_uniformity") {
+        return ChromiumDiagnosticRule::kSubgroupMatrixUniformity;
+    }
     if (str == "unreachable_code") {
         return ChromiumDiagnosticRule::kUnreachableCode;
     }
@@ -82,6 +85,8 @@
     switch (value) {
         case ChromiumDiagnosticRule::kUndefined:
             return "undefined";
+        case ChromiumDiagnosticRule::kSubgroupMatrixUniformity:
+            return "subgroup_matrix_uniformity";
         case ChromiumDiagnosticRule::kUnreachableCode:
             return "unreachable_code";
     }
diff --git a/src/tint/lang/wgsl/diagnostic_rule.h b/src/tint/lang/wgsl/diagnostic_rule.h
index c533aea..98e2f55 100644
--- a/src/tint/lang/wgsl/diagnostic_rule.h
+++ b/src/tint/lang/wgsl/diagnostic_rule.h
@@ -76,6 +76,7 @@
 /// Chromium-specific diagnostic rules.
 enum class ChromiumDiagnosticRule : uint8_t {
     kUndefined,
+    kSubgroupMatrixUniformity,
     kUnreachableCode,
 };
 
@@ -98,6 +99,7 @@
 ChromiumDiagnosticRule ParseChromiumDiagnosticRule(std::string_view str);
 
 constexpr std::string_view kChromiumDiagnosticRuleStrings[] = {
+    "subgroup_matrix_uniformity",
     "unreachable_code",
 };
 
diff --git a/src/tint/lang/wgsl/diagnostic_rule_bench.cc b/src/tint/lang/wgsl/diagnostic_rule_bench.cc
index 4b6a8c7..7614d2c 100644
--- a/src/tint/lang/wgsl/diagnostic_rule_bench.cc
+++ b/src/tint/lang/wgsl/diagnostic_rule_bench.cc
@@ -63,8 +63,20 @@
 
 void ChromiumDiagnosticRuleParser(::benchmark::State& state) {
     const char* kStrings[] = {
-        "unreahaXgge_code", "unreahale_Xodu",    "unrea3hable_code",  "unreachable_code",
-        "unrEachable_code", "uPPrTTacable_code", "uneddchaxxle_code",
+        "sbgroup_ggatrix_uniformXty",
+        "suVroup_matrx_uniforXitu",
+        "subgroup_ma3rix_uniformity",
+        "subgroup_matrix_uniformity",
+        "subgroup_matrix_uniformitE",
+        "subgroup_atrix_uniTTPormity",
+        "suxxdgroup_matri_uniformity",
+        "44nreachable_code",
+        "unreaVVhabSSe_code",
+        "unre22chabR_Rode",
+        "unreachable_code",
+        "nFeachable_9ode",
+        "unrachable_code",
+        "VnreacaRRlH_OOode",
     };
     for (auto _ : state) {
         for (auto* str : kStrings) {
diff --git a/src/tint/lang/wgsl/diagnostic_rule_test.cc b/src/tint/lang/wgsl/diagnostic_rule_test.cc
index eb2f0bb..eb9a59d 100644
--- a/src/tint/lang/wgsl/diagnostic_rule_test.cc
+++ b/src/tint/lang/wgsl/diagnostic_rule_test.cc
@@ -112,13 +112,17 @@
 }
 
 static constexpr Case kValidCases[] = {
+    {"subgroup_matrix_uniformity", ChromiumDiagnosticRule::kSubgroupMatrixUniformity},
     {"unreachable_code", ChromiumDiagnosticRule::kUnreachableCode},
 };
 
 static constexpr Case kInvalidCases[] = {
-    {"pqnreachableHHcode", ChromiumDiagnosticRule::kUndefined},
-    {"unrechcbe_cov", ChromiumDiagnosticRule::kUndefined},
-    {"unreachGblecode", ChromiumDiagnosticRule::kUndefined},
+    {"subgroppHp_matriqq_uiformity", ChromiumDiagnosticRule::kUndefined},
+    {"subroup_matrcx_niformit", ChromiumDiagnosticRule::kUndefined},
+    {"subroupGmatrbx_uniformity", ChromiumDiagnosticRule::kUndefined},
+    {"vnriiachable_code", ChromiumDiagnosticRule::kUndefined},
+    {"unreac8ablWW_code", ChromiumDiagnosticRule::kUndefined},
+    {"unreMchablxxcode", ChromiumDiagnosticRule::kUndefined},
 };
 
 using ChromiumDiagnosticRuleParseTest = testing::TestWithParam<Case>;
diff --git a/src/tint/lang/wgsl/resolver/diagnostic_control_test.cc b/src/tint/lang/wgsl/resolver/diagnostic_control_test.cc
index e22593d..f7a9e48 100644
--- a/src/tint/lang/wgsl/resolver/diagnostic_control_test.cc
+++ b/src/tint/lang/wgsl/resolver/diagnostic_control_test.cc
@@ -281,7 +281,7 @@
     EXPECT_EQ(r()->error(),
               R"(12:34 warning: unrecognized diagnostic rule 'chromium.unreachable_cod'
 Did you mean 'chromium.unreachable_code'?
-Possible values: 'chromium.unreachable_code')");
+Possible values: 'chromium.subgroup_matrix_uniformity', 'chromium.unreachable_code')");
 }
 
 TEST_F(ResolverDiagnosticControlTest, UnrecognizedChromiumRuleName_Attribute) {
@@ -293,7 +293,7 @@
     EXPECT_EQ(r()->error(),
               R"(12:34 warning: unrecognized diagnostic rule 'chromium.unreachable_cod'
 Did you mean 'chromium.unreachable_code'?
-Possible values: 'chromium.unreachable_code')");
+Possible values: 'chromium.subgroup_matrix_uniformity', 'chromium.unreachable_code')");
 }
 
 TEST_F(ResolverDiagnosticControlTest, UnrecognizedOtherRuleName_Directive) {
@@ -340,10 +340,10 @@
     EXPECT_EQ(r()->error(),
               R"(12:34 warning: unrecognized diagnostic rule 'chromium.unreachable_codes'
 Did you mean 'chromium.unreachable_code'?
-Possible values: 'chromium.unreachable_code'
+Possible values: 'chromium.subgroup_matrix_uniformity', 'chromium.unreachable_code'
 56:78 warning: unrecognized diagnostic rule 'chromium.unreachable_codes'
 Did you mean 'chromium.unreachable_code'?
-Possible values: 'chromium.unreachable_code'
+Possible values: 'chromium.subgroup_matrix_uniformity', 'chromium.unreachable_code'
 56:78 error: conflicting diagnostic directive
 12:34 note: severity of 'chromium.unreachable_codes' set to 'off' here)");
 }
@@ -394,10 +394,10 @@
     EXPECT_EQ(r()->error(),
               R"(12:34 warning: unrecognized diagnostic rule 'chromium.unreachable_codes'
 Did you mean 'chromium.unreachable_code'?
-Possible values: 'chromium.unreachable_code'
+Possible values: 'chromium.subgroup_matrix_uniformity', 'chromium.unreachable_code'
 56:78 warning: unrecognized diagnostic rule 'chromium.unreachable_codes'
 Did you mean 'chromium.unreachable_code'?
-Possible values: 'chromium.unreachable_code'
+Possible values: 'chromium.subgroup_matrix_uniformity', 'chromium.unreachable_code'
 56:78 error: conflicting diagnostic attribute
 12:34 note: severity of 'chromium.unreachable_codes' set to 'off' here)");
 }
diff --git a/src/tint/lang/wgsl/resolver/subgroup_matrix_test.cc b/src/tint/lang/wgsl/resolver/subgroup_matrix_test.cc
index b8410e6c..95b3410 100644
--- a/src/tint/lang/wgsl/resolver/subgroup_matrix_test.cc
+++ b/src/tint/lang/wgsl/resolver/subgroup_matrix_test.cc
@@ -640,5 +640,11 @@
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 }
 
+// Using the subgroup_matrix_uniformity diagnostic rule without the extension should succeed.
+TEST_F(ResolverSubgroupMatrixTest, UseSubgroupUniformityRuleWithoutExtension) {
+    DiagnosticDirective(wgsl::DiagnosticSeverity::kOff, "chromium", "subgroup_matrix_uniformity");
+    EXPECT_TRUE(r()->Resolve()) << r()->error();
+}
+
 }  // namespace
 }  // namespace tint::resolver
diff --git a/src/tint/lang/wgsl/resolver/validator.cc b/src/tint/lang/wgsl/resolver/validator.cc
index db1350c..7150f93 100644
--- a/src/tint/lang/wgsl/resolver/validator.cc
+++ b/src/tint/lang/wgsl/resolver/validator.cc
@@ -180,6 +180,8 @@
                             wgsl::DiagnosticSeverity::kError);
     diagnostic_filters_.Set(wgsl::CoreDiagnosticRule::kSubgroupUniformity,
                             wgsl::DiagnosticSeverity::kError);
+    diagnostic_filters_.Set(wgsl::ChromiumDiagnosticRule::kSubgroupMatrixUniformity,
+                            wgsl::DiagnosticSeverity::kError);
     diagnostic_filters_.Set(wgsl::ChromiumDiagnosticRule::kUnreachableCode,
                             wgsl::DiagnosticSeverity::kWarning);
 }
diff --git a/src/tint/lang/wgsl/wgsl.def b/src/tint/lang/wgsl/wgsl.def
index 6338902..f553579 100644
--- a/src/tint/lang/wgsl/wgsl.def
+++ b/src/tint/lang/wgsl/wgsl.def
@@ -57,6 +57,7 @@
 // chromium-specific diagnostics
 enum chromium_diagnostic_rule {
   // Chromium specific rules not defined in the spec.
+  subgroup_matrix_uniformity
   unreachable_code
 }