[tint] Add the "sized_binding_array" feature.

It is experimental for now.

Bug: 393558555
Change-Id: If1f77dcd0d2f4fc9b479142f7a3b04f9a9cbf97d
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/224374
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/dawn/common/WGSLFeatureMapping.h b/src/dawn/common/WGSLFeatureMapping.h
index 814e089..4dbf1b4 100644
--- a/src/dawn/common/WGSLFeatureMapping.h
+++ b/src/dawn/common/WGSLFeatureMapping.h
@@ -34,6 +34,7 @@
     X(kPointerCompositeAccess, PointerCompositeAccess)                             \
     X(kReadonlyAndReadwriteStorageTextures, ReadonlyAndReadwriteStorageTextures)   \
     X(kUnrestrictedPointerParameters, UnrestrictedPointerParameters)               \
+    X(kSizedBindingArray, SizedBindingArray)                                       \
     /* ----------------- 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 d8385c1..9890a7a 100644
--- a/src/dawn/dawn.json
+++ b/src/dawn/dawn.json
@@ -4103,6 +4103,7 @@
             {"value": 2, "name": "packed 4x8 integer dot product", "jsrepr": "'packed_4x8_integer_dot_product'"},
             {"value": 3, "name": "unrestricted pointer parameters", "jsrepr": "'unrestricted_pointer_parameters'"},
             {"value": 4, "name": "pointer composite access", "jsrepr": "'pointer_composite_access'"},
+            {"value": 5, "name": "sized binding array", "jsrepr": "'sized_binding_array'"},
 
             {"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 c8b5c68..099ca42 100644
--- a/src/dawn/node/binding/Converter.cpp
+++ b/src/dawn/node/binding/Converter.cpp
@@ -1637,6 +1637,9 @@
         case interop::WGSLLanguageFeatureName::kPointerCompositeAccess:
             out = wgpu::WGSLLanguageFeatureName::PointerCompositeAccess;
             return true;
+        case interop::WGSLLanguageFeatureName::kSizedBindingArray:
+            out = wgpu::WGSLLanguageFeatureName::SizedBindingArray;
+            return true;
     }
     return false;
 }
@@ -1655,6 +1658,9 @@
         case wgpu::WGSLLanguageFeatureName::PointerCompositeAccess:
             out = interop::WGSLLanguageFeatureName::kPointerCompositeAccess;
             return true;
+        case wgpu::WGSLLanguageFeatureName::SizedBindingArray:
+            out = interop::WGSLLanguageFeatureName::kSizedBindingArray;
+            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 150f6dd..789093e 100644
--- a/src/dawn/node/interop/DawnExtensions.idl
+++ b/src/dawn/node/interop/DawnExtensions.idl
@@ -60,6 +60,7 @@
     "packed_4x8_integer_dot_product",
     "unrestricted_pointer_parameters",
     "pointer_composite_access",
+    "sized_binding_array",
 };
 
 // TODO(crbug.com/354751907) Move to GPUAdapterInfo
diff --git a/src/tint/cmd/fuzz/wgsl/dictionary.txt b/src/tint/cmd/fuzz/wgsl/dictionary.txt
index 4e536dd..7a8f64c 100644
--- a/src/tint/cmd/fuzz/wgsl/dictionary.txt
+++ b/src/tint/cmd/fuzz/wgsl/dictionary.txt
@@ -377,6 +377,7 @@
 "sin"
 "sinh"
 "size"
+"sized_binding_array"
 "smoothstep"
 "sqrt"
 "step"
diff --git a/src/tint/lang/wgsl/features/language_feature.cc b/src/tint/lang/wgsl/features/language_feature.cc
index f0391dc..7e51181 100644
--- a/src/tint/lang/wgsl/features/language_feature.cc
+++ b/src/tint/lang/wgsl/features/language_feature.cc
@@ -66,6 +66,9 @@
     if (str == "readonly_and_readwrite_storage_textures") {
         return LanguageFeature::kReadonlyAndReadwriteStorageTextures;
     }
+    if (str == "sized_binding_array") {
+        return LanguageFeature::kSizedBindingArray;
+    }
     if (str == "unrestricted_pointer_parameters") {
         return LanguageFeature::kUnrestrictedPointerParameters;
     }
@@ -92,6 +95,8 @@
             return "pointer_composite_access";
         case LanguageFeature::kReadonlyAndReadwriteStorageTextures:
             return "readonly_and_readwrite_storage_textures";
+        case LanguageFeature::kSizedBindingArray:
+            return "sized_binding_array";
         case LanguageFeature::kUnrestrictedPointerParameters:
             return "unrestricted_pointer_parameters";
     }
diff --git a/src/tint/lang/wgsl/features/language_feature.h b/src/tint/lang/wgsl/features/language_feature.h
index b7aedbb..7c04716 100644
--- a/src/tint/lang/wgsl/features/language_feature.h
+++ b/src/tint/lang/wgsl/features/language_feature.h
@@ -54,6 +54,7 @@
     kPacked4X8IntegerDotProduct,
     kPointerCompositeAccess,
     kReadonlyAndReadwriteStorageTextures,
+    kSizedBindingArray,
     kUnrestrictedPointerParameters,
 };
 
@@ -75,6 +76,7 @@
     "packed_4x8_integer_dot_product",
     "pointer_composite_access",
     "readonly_and_readwrite_storage_textures",
+    "sized_binding_array",
     "unrestricted_pointer_parameters",
 };
 
@@ -88,6 +90,7 @@
     LanguageFeature::kPacked4X8IntegerDotProduct,
     LanguageFeature::kPointerCompositeAccess,
     LanguageFeature::kReadonlyAndReadwriteStorageTextures,
+    LanguageFeature::kSizedBindingArray,
     LanguageFeature::kUnrestrictedPointerParameters,
 };
 
diff --git a/src/tint/lang/wgsl/features/status.cc b/src/tint/lang/wgsl/features/status.cc
index 87462d2..a8162e3 100644
--- a/src/tint/lang/wgsl/features/status.cc
+++ b/src/tint/lang/wgsl/features/status.cc
@@ -36,6 +36,8 @@
             ////////////////////////////////////////////////////////////////////
             // Experimental features
             ///////////////////////////////////////////////////////////////////
+        case LanguageFeature::kSizedBindingArray:
+            return FeatureStatus::kUnsafeExperimental;
 
             ////////////////////////////////////////////////////////////////////
             // Enabled features
diff --git a/src/tint/lang/wgsl/language_feature_test.cc b/src/tint/lang/wgsl/language_feature_test.cc
index dc3b564..b4d96d9 100644
--- a/src/tint/lang/wgsl/language_feature_test.cc
+++ b/src/tint/lang/wgsl/language_feature_test.cc
@@ -67,6 +67,7 @@
     {"pointer_composite_access", LanguageFeature::kPointerCompositeAccess},
     {"readonly_and_readwrite_storage_textures",
      LanguageFeature::kReadonlyAndReadwriteStorageTextures},
+    {"sized_binding_array", LanguageFeature::kSizedBindingArray},
     {"unrestricted_pointer_parameters", LanguageFeature::kUnrestrictedPointerParameters},
 };
 
@@ -95,9 +96,12 @@
     {"readonlF_and_readwrite_st9rage_textues", LanguageFeature::kUndefined},
     {"readonly_and_radwrite_storage_textures", LanguageFeature::kUndefined},
     {"readonly_and_readwrite_sOOrage_tVxRRures", LanguageFeature::kUndefined},
-    {"unrestrictd_pointer_payameters", LanguageFeature::kUndefined},
-    {"unrerrt77iGted_poillter_paramenners", LanguageFeature::kUndefined},
-    {"unrestricted4point00r_parameters", LanguageFeature::kUndefined},
+    {"sized_indiyg_array", LanguageFeature::kUndefined},
+    {"llGznnd_bin77ing_rrrray", LanguageFeature::kUndefined},
+    {"sized_bindin4_00rray", LanguageFeature::kUndefined},
+    {"unrestrictedpointr_prameteoos", LanguageFeature::kUndefined},
+    {"unrstrited_pointzzr_parameters", LanguageFeature::kUndefined},
+    {"unrst11icted_pppiniierparameters", LanguageFeature::kUndefined},
 };
 
 using LanguageFeatureParseTest = testing::TestWithParam<Case>;
diff --git a/src/tint/lang/wgsl/wgsl.def b/src/tint/lang/wgsl/wgsl.def
index 63b14ee..90c2e95 100644
--- a/src/tint/lang/wgsl/wgsl.def
+++ b/src/tint/lang/wgsl/wgsl.def
@@ -108,6 +108,7 @@
   pointer_composite_access
   readonly_and_readwrite_storage_textures
   unrestricted_pointer_parameters
+  sized_binding_array
 
   // Language features used only for testing whose status will never change.
   chromium_testing_unimplemented