[wgsl] Add uniform_buffer_standard_layout language feature

Add the enum and wire it up to all places that need it. Mark it as
experimental.

Bug: 452662924
Change-Id: I6202149aa6a22fff3a4b3746a384b55d741d5b1f
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/267514
Commit-Queue: James Price <jrprice@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/dawn/common/WGSLFeatureMapping.h b/src/dawn/common/WGSLFeatureMapping.h
index 8447f24..712089b 100644
--- a/src/dawn/common/WGSLFeatureMapping.h
+++ b/src/dawn/common/WGSLFeatureMapping.h
@@ -37,6 +37,7 @@
     X(kSizedBindingArray, SizedBindingArray)                                       \
     X(kTexelBuffers, TexelBuffers)                                                 \
     X(kChromiumPrint, ChromiumPrint)                                               \
+    X(kUniformBufferStandardLayout, UniformBufferStandardLayout)                   \
     /* ----------------- entries below are only for testing  ------------------ */ \
     X(kChromiumTestingUnimplemented, ChromiumTestingUnimplemented)                 \
     X(kChromiumTestingUnsafeExperimental, ChromiumTestingUnsafeExperimental)       \
diff --git a/src/dawn/dawn.json b/src/dawn/dawn.json
index 3828e2c..328d8b0 100644
--- a/src/dawn/dawn.json
+++ b/src/dawn/dawn.json
@@ -4423,6 +4423,7 @@
             {"value": 5, "name": "sized binding array", "jsrepr": "'sized_binding_array'", "tags": ["dawn"]},
             {"value": 6, "name": "texel buffers", "jsrepr": "'texel_buffers'", "tags": ["dawn"]},
             {"value": 7, "name": "chromium print", "jsrepr": "'chromium_print'", "tags": ["dawn"]},
+            {"value": 8, "name": "uniform buffer standard layout", "jsrepr": "'uniform_buffer_standard_layout'", "tags": ["dawn"]},
 
             {"value": 0, "name": "chromium testing unimplemented", "jsrepr": "'chromium_testing_unimplemented'", "tags": ["dawn"]},
             {"value": 1, "name": "chromium testing unsafe experimental", "jsrepr": "'chromium_testing_unsafe_experimental'", "tags": ["dawn"]},
diff --git a/src/dawn/node/binding/Converter.cpp b/src/dawn/node/binding/Converter.cpp
index 2674b60..57f6f0c 100644
--- a/src/dawn/node/binding/Converter.cpp
+++ b/src/dawn/node/binding/Converter.cpp
@@ -1780,6 +1780,9 @@
         case interop::WGSLLanguageFeatureName::kChromiumPrint:
             out = wgpu::WGSLLanguageFeatureName::ChromiumPrint;
             return true;
+        case interop::WGSLLanguageFeatureName::kUniformBufferStandardLayout:
+            out = wgpu::WGSLLanguageFeatureName::UniformBufferStandardLayout;
+            return true;
     }
     return false;
 }
@@ -1807,6 +1810,9 @@
         case wgpu::WGSLLanguageFeatureName::ChromiumPrint:
             out = interop::WGSLLanguageFeatureName::kChromiumPrint;
             return true;
+        case wgpu::WGSLLanguageFeatureName::UniformBufferStandardLayout:
+            out = interop::WGSLLanguageFeatureName::kUniformBufferStandardLayout;
+            return true;
 
         case wgpu::WGSLLanguageFeatureName::ChromiumTestingUnimplemented:
         case wgpu::WGSLLanguageFeatureName::ChromiumTestingUnsafeExperimental:
diff --git a/src/dawn/node/interop/DawnExtensions.idl b/src/dawn/node/interop/DawnExtensions.idl
index bf93951..d0544ba 100644
--- a/src/dawn/node/interop/DawnExtensions.idl
+++ b/src/dawn/node/interop/DawnExtensions.idl
@@ -79,6 +79,7 @@
     "sized_binding_array",
     "texel_buffers",
     "chromium_print",
+    "uniform_buffer_standard_layout",
 };
 
 dictionary GPUBindGroupLayoutEntry {
diff --git a/src/tint/cmd/fuzz/wgsl/dictionary.txt b/src/tint/cmd/fuzz/wgsl/dictionary.txt
index cafc90c..8940160 100644
--- a/src/tint/cmd/fuzz/wgsl/dictionary.txt
+++ b/src/tint/cmd/fuzz/wgsl/dictionary.txt
@@ -504,6 +504,7 @@
 "u32"
 "u8"
 "uniform"
+"uniform_buffer_standard_layout"
 "unpack2x16float"
 "unpack2x16snorm"
 "unpack2x16unorm"
diff --git a/src/tint/lang/wgsl/enums.cc b/src/tint/lang/wgsl/enums.cc
index 0acde78..30f27a0 100644
--- a/src/tint/lang/wgsl/enums.cc
+++ b/src/tint/lang/wgsl/enums.cc
@@ -213,6 +213,9 @@
     if (str == "texel_buffers") {
         return LanguageFeature::kTexelBuffers;
     }
+    if (str == "uniform_buffer_standard_layout") {
+        return LanguageFeature::kUniformBufferStandardLayout;
+    }
     if (str == "unrestricted_pointer_parameters") {
         return LanguageFeature::kUnrestrictedPointerParameters;
     }
@@ -244,6 +247,8 @@
             return "sized_binding_array";
         case LanguageFeature::kTexelBuffers:
             return "texel_buffers";
+        case LanguageFeature::kUniformBufferStandardLayout:
+            return "uniform_buffer_standard_layout";
         case LanguageFeature::kUnrestrictedPointerParameters:
             return "unrestricted_pointer_parameters";
     }
diff --git a/src/tint/lang/wgsl/enums.h b/src/tint/lang/wgsl/enums.h
index 495cc86..17be5d9 100644
--- a/src/tint/lang/wgsl/enums.h
+++ b/src/tint/lang/wgsl/enums.h
@@ -198,6 +198,7 @@
     kReadonlyAndReadwriteStorageTextures,
     kSizedBindingArray,
     kTexelBuffers,
+    kUniformBufferStandardLayout,
     kUnrestrictedPointerParameters,
 };
 
@@ -222,6 +223,7 @@
     "readonly_and_readwrite_storage_textures",
     "sized_binding_array",
     "texel_buffers",
+    "uniform_buffer_standard_layout",
     "unrestricted_pointer_parameters",
 };
 
@@ -238,6 +240,7 @@
     LanguageFeature::kReadonlyAndReadwriteStorageTextures,
     LanguageFeature::kSizedBindingArray,
     LanguageFeature::kTexelBuffers,
+    LanguageFeature::kUniformBufferStandardLayout,
     LanguageFeature::kUnrestrictedPointerParameters,
 };
 
diff --git a/src/tint/lang/wgsl/enums_test.cc b/src/tint/lang/wgsl/enums_test.cc
index c29b02e..d545d56 100644
--- a/src/tint/lang/wgsl/enums_test.cc
+++ b/src/tint/lang/wgsl/enums_test.cc
@@ -323,6 +323,7 @@
     {"readonly_and_readwrite_storage_textures", LanguageFeature::kReadonlyAndReadwriteStorageTextures},
     {"sized_binding_array", LanguageFeature::kSizedBindingArray},
     {"texel_buffers", LanguageFeature::kTexelBuffers},
+    {"uniform_buffer_standard_layout", LanguageFeature::kUniformBufferStandardLayout},
     {"unrestricted_pointer_parameters", LanguageFeature::kUnrestrictedPointerParameters},
 };
 
@@ -360,9 +361,12 @@
     {"tezyel_bXXffer", LanguageFeature::kUndefined},
     {"exelPbufVVers", LanguageFeature::kUndefined},
     {"texel_Cufernn", LanguageFeature::kUndefined},
-    {"nrestrqqcHHed_oinAAer_parameters", LanguageFeature::kUndefined},
-    {"unrestricted_pointer_parametrs", LanguageFeature::kUndefined},
-    {"unfestricKKed_pointer_parameer", LanguageFeature::kUndefined},
+    {"qqniformbffer_stanAAard_layoHHt", LanguageFeature::kUndefined},
+    {"uniform_buffr_standard_layout", LanguageFeature::kUndefined},
+    {"unfKform_ffer_standard_layout", LanguageFeature::kUndefined},
+    {"ulrestrictePggointerparameters", LanguageFeature::kUndefined},
+    {"unrestricted_pointer_prameters", LanguageFeature::kUndefined},
+    {"unrectricted_poinTTer_paNamete4s", LanguageFeature::kUndefined},
 };
 
 using LanguageFeatureParseTest = testing::TestWithParam<LanguageFeatureCase>;
diff --git a/src/tint/lang/wgsl/feature_status.cc b/src/tint/lang/wgsl/feature_status.cc
index bb42a34..0721f4b 100644
--- a/src/tint/lang/wgsl/feature_status.cc
+++ b/src/tint/lang/wgsl/feature_status.cc
@@ -36,6 +36,7 @@
             ////////////////////////////////////////////////////////////////////
             // Experimental features
             ///////////////////////////////////////////////////////////////////
+        case LanguageFeature::kUniformBufferStandardLayout:
         case LanguageFeature::kSizedBindingArray:
         case LanguageFeature::kTexelBuffers:
             return FeatureStatus::kUnsafeExperimental;
diff --git a/src/tint/lang/wgsl/wgsl.def b/src/tint/lang/wgsl/wgsl.def
index 847e6fb..c5c3d6e 100644
--- a/src/tint/lang/wgsl/wgsl.def
+++ b/src/tint/lang/wgsl/wgsl.def
@@ -113,6 +113,7 @@
   unrestricted_pointer_parameters
   sized_binding_array
   texel_buffers
+  uniform_buffer_standard_layout
 
   // Non-standard language features for Chromium developers.
   chromium_print