Add resource_binding tests

Add some examples of resource binding usage.

Bug: 439626491
Change-Id: I1480dc573b92b2f2819ec9a7d6d4402d13df270b
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/259474
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/cmd/common/helper.cc b/src/tint/cmd/common/helper.cc
index d64c6d3..aa5857d 100644
--- a/src/tint/cmd/common/helper.cc
+++ b/src/tint/cmd/common/helper.cc
@@ -258,10 +258,6 @@
         fflush(stderr);
     }
 
-    if (!info.program.IsValid()) {
-        exit(1);
-    }
-
     return info;
 }
 
diff --git a/src/tint/cmd/fuzz/ir/as/main.cc b/src/tint/cmd/fuzz/ir/as/main.cc
index 5e21e74..51e1b1e 100644
--- a/src/tint/cmd/fuzz/ir/as/main.cc
+++ b/src/tint/cmd/fuzz/ir/as/main.cc
@@ -263,6 +263,11 @@
     opts.printer = options.printer.get();
 
     auto info = tint::cmd::LoadProgramInfo(opts);
+    if (!info.program.IsValid()) {
+        // If the program just fails to load, ignore it as it's probably just a test file added in
+        // anticipation of a new feature.
+        return true;
+    }
 
     if (options.dump_ir) {
         DumpIR(info.program, options);
diff --git a/src/tint/cmd/info/main.cc b/src/tint/cmd/info/main.cc
index c6fc1eb..2e563f3 100644
--- a/src/tint/cmd/info/main.cc
+++ b/src/tint/cmd/info/main.cc
@@ -313,6 +313,9 @@
 #endif
 
     auto info = tint::cmd::LoadProgramInfo(opts);
+    if (!info.program.IsValid()) {
+        return 1;
+    }
 
     if (options.emit_json) {
         EmitJson(info.program);
diff --git a/src/tint/cmd/tint/main.cc b/src/tint/cmd/tint/main.cc
index 96edc8e..7f549f3 100644
--- a/src/tint/cmd/tint/main.cc
+++ b/src/tint/cmd/tint/main.cc
@@ -1444,6 +1444,9 @@
 #endif
 
     auto info = tint::cmd::LoadProgramInfo(opts);
+    if (!info.program.IsValid()) {
+        return 1;
+    }
 
     if (options.parse_only) {
         return 1;
diff --git a/test/tint/binding_array/runtime_array_access_as_constant.wgsl b/test/tint/binding_array/runtime_array_access_as_constant.wgsl
deleted file mode 100644
index 5e0395f..0000000
--- a/test/tint/binding_array/runtime_array_access_as_constant.wgsl
+++ /dev/null
@@ -1,7 +0,0 @@
-enable chromium_experimental_dynamic_binding;
-
-@group(0) @binding(0) var sampled_textures : binding_array<texture_2d<f32>>;
-
-@fragment fn fs() {
-    let texture_load = textureLoad(sampled_textures[0], vec2(0, 0), 0);
-}
diff --git a/test/tint/binding_array/runtime_array_access_as_constant.wgsl.expected.dxc.hlsl b/test/tint/binding_array/runtime_array_access_as_constant.wgsl.expected.dxc.hlsl
deleted file mode 100644
index 93b3662..0000000
--- a/test/tint/binding_array/runtime_array_access_as_constant.wgsl.expected.dxc.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-
-Texture2D<float4> sampled_textures[] : register(t0);
-void fs() {
-  float4 texture_load = sampled_textures[int(0)].Load(int3((int(0)).xx, int(0)));
-}
-
diff --git a/test/tint/binding_array/runtime_array_access_as_constant.wgsl.expected.fxc.hlsl b/test/tint/binding_array/runtime_array_access_as_constant.wgsl.expected.fxc.hlsl
deleted file mode 100644
index b12a39a..0000000
--- a/test/tint/binding_array/runtime_array_access_as_constant.wgsl.expected.fxc.hlsl
+++ /dev/null
@@ -1,5 +0,0 @@
-SKIP: INVALID
-
-runtime binding array not supported by the HLSL FXC backend
-
-tint executable returned error: exit status 1
diff --git a/test/tint/binding_array/runtime_array_access_as_constant.wgsl.expected.glsl b/test/tint/binding_array/runtime_array_access_as_constant.wgsl.expected.glsl
deleted file mode 100644
index d682685..0000000
--- a/test/tint/binding_array/runtime_array_access_as_constant.wgsl.expected.glsl
+++ /dev/null
@@ -1,5 +0,0 @@
-SKIP: INVALID
-
-runtime binding array not supported by the GLSL backend
-
-tint executable returned error: exit status 1
diff --git a/test/tint/binding_array/runtime_array_access_as_constant.wgsl.expected.msl b/test/tint/binding_array/runtime_array_access_as_constant.wgsl.expected.msl
deleted file mode 100644
index 9ac25c6..0000000
--- a/test/tint/binding_array/runtime_array_access_as_constant.wgsl.expected.msl
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <metal_stdlib>
-using namespace metal;
-
-struct tint_module_vars_struct {
-  array<texture2d<float, access::sample>, 1> sampled_textures;
-};
-
-fragment void fs(array<texture2d<float, access::sample>, 1> sampled_textures [[texture(0)]]) {
-  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.sampled_textures=sampled_textures};
-  uint const v = min(uint(0), (tint_module_vars.sampled_textures[0].get_num_mip_levels() - 1u));
-  uint2 const v_1 = (uint2(tint_module_vars.sampled_textures[0].get_width(v), tint_module_vars.sampled_textures[0].get_height(v)) - uint2(1u));
-  float4 const texture_load = tint_module_vars.sampled_textures[0].read(min(uint2(int2(0)), v_1), v);
-}
diff --git a/test/tint/binding_array/runtime_array_access_as_constant.wgsl.expected.spvasm b/test/tint/binding_array/runtime_array_access_as_constant.wgsl.expected.spvasm
deleted file mode 100644
index b6b79d8..0000000
--- a/test/tint/binding_array/runtime_array_access_as_constant.wgsl.expected.spvasm
+++ /dev/null
@@ -1,50 +0,0 @@
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 1
-; Bound: 32
-; Schema: 0
-               OpCapability Shader
-               OpCapability RuntimeDescriptorArray
-               OpCapability ImageQuery
-               OpExtension "SPV_EXT_descriptor_indexing"
-         %21 = OpExtInstImport "GLSL.std.450"
-               OpMemoryModel Logical GLSL450
-               OpEntryPoint Fragment %fs "fs"
-               OpExecutionMode %fs OriginUpperLeft
-               OpName %sampled_textures "sampled_textures"
-               OpName %fs "fs"
-               OpName %texture_load "texture_load"
-               OpDecorate %sampled_textures DescriptorSet 0
-               OpDecorate %sampled_textures Binding 0
-      %float = OpTypeFloat 32
-          %4 = OpTypeImage %float 2D 0 0 0 1 Unknown
-%_runtimearr_4 = OpTypeRuntimeArray %4
-%_ptr_UniformConstant__runtimearr_4 = OpTypePointer UniformConstant %_runtimearr_4
-%sampled_textures = OpVariable %_ptr_UniformConstant__runtimearr_4 UniformConstant
-       %void = OpTypeVoid
-          %8 = OpTypeFunction %void
-%_ptr_UniformConstant_4 = OpTypePointer UniformConstant %4
-        %int = OpTypeInt 32 1
-      %int_0 = OpConstant %int 0
-       %uint = OpTypeInt 32 0
-     %uint_1 = OpConstant %uint 1
-     %v2uint = OpTypeVector %uint 2
-         %25 = OpConstantComposite %v2uint %uint_1 %uint_1
-      %v2int = OpTypeVector %int 2
-         %27 = OpConstantNull %v2int
-    %v4float = OpTypeVector %float 4
-         %fs = OpFunction %void None %8
-          %9 = OpLabel
-         %10 = OpAccessChain %_ptr_UniformConstant_4 %sampled_textures %int_0
-         %14 = OpLoad %4 %10 None
-         %15 = OpImageQueryLevels %uint %14
-         %17 = OpISub %uint %15 %uint_1
-         %19 = OpBitcast %uint %int_0
-         %20 = OpExtInst %uint %21 UMin %19 %17
-         %22 = OpImageQuerySizeLod %v2uint %14 %20
-         %24 = OpISub %v2uint %22 %25
-         %26 = OpBitcast %v2uint %27
-         %29 = OpExtInst %v2uint %21 UMin %26 %24
-%texture_load = OpImageFetch %v4float %14 %29 Lod %20
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/binding_array/runtime_array_access_as_constant.wgsl.expected.wgsl b/test/tint/binding_array/runtime_array_access_as_constant.wgsl.expected.wgsl
deleted file mode 100644
index bc324a8..0000000
--- a/test/tint/binding_array/runtime_array_access_as_constant.wgsl.expected.wgsl
+++ /dev/null
@@ -1,8 +0,0 @@
-enable chromium_experimental_dynamic_binding;
-
-@group(0) @binding(0) var sampled_textures : binding_array<texture_2d<f32>>;
-
-@fragment
-fn fs() {
-  let texture_load = textureLoad(sampled_textures[0], vec2(0, 0), 0);
-}
diff --git a/test/tint/binding_array/runtime_array_access_as_function_argument.wgsl b/test/tint/binding_array/runtime_array_access_as_function_argument.wgsl
deleted file mode 100644
index c5a04fe..0000000
--- a/test/tint/binding_array/runtime_array_access_as_function_argument.wgsl
+++ /dev/null
@@ -1,11 +0,0 @@
-enable chromium_experimental_dynamic_binding;
-
-@group(0) @binding(0) var sampled_textures : binding_array<texture_2d<f32>>;
-
-@fragment fn fs() {
-    do_texture_load(sampled_textures[0]);
-}
-
-fn do_texture_load(t : texture_2d<f32>) {
-    let texture_load = textureLoad(t, vec2(0, 0), 0);
-}
diff --git a/test/tint/binding_array/runtime_array_access_as_function_argument.wgsl.expected.dxc.hlsl b/test/tint/binding_array/runtime_array_access_as_function_argument.wgsl.expected.dxc.hlsl
deleted file mode 100644
index b7bf3ff..0000000
--- a/test/tint/binding_array/runtime_array_access_as_function_argument.wgsl.expected.dxc.hlsl
+++ /dev/null
@@ -1,10 +0,0 @@
-
-Texture2D<float4> sampled_textures[] : register(t0);
-void do_texture_load(Texture2D<float4> t) {
-  float4 texture_load = t.Load(int3((int(0)).xx, int(0)));
-}
-
-void fs() {
-  do_texture_load(sampled_textures[int(0)]);
-}
-
diff --git a/test/tint/binding_array/runtime_array_access_as_function_argument.wgsl.expected.fxc.hlsl b/test/tint/binding_array/runtime_array_access_as_function_argument.wgsl.expected.fxc.hlsl
deleted file mode 100644
index b12a39a..0000000
--- a/test/tint/binding_array/runtime_array_access_as_function_argument.wgsl.expected.fxc.hlsl
+++ /dev/null
@@ -1,5 +0,0 @@
-SKIP: INVALID
-
-runtime binding array not supported by the HLSL FXC backend
-
-tint executable returned error: exit status 1
diff --git a/test/tint/binding_array/runtime_array_access_as_function_argument.wgsl.expected.glsl b/test/tint/binding_array/runtime_array_access_as_function_argument.wgsl.expected.glsl
deleted file mode 100644
index d682685..0000000
--- a/test/tint/binding_array/runtime_array_access_as_function_argument.wgsl.expected.glsl
+++ /dev/null
@@ -1,5 +0,0 @@
-SKIP: INVALID
-
-runtime binding array not supported by the GLSL backend
-
-tint executable returned error: exit status 1
diff --git a/test/tint/binding_array/runtime_array_access_as_function_argument.wgsl.expected.msl b/test/tint/binding_array/runtime_array_access_as_function_argument.wgsl.expected.msl
deleted file mode 100644
index 873c048..0000000
--- a/test/tint/binding_array/runtime_array_access_as_function_argument.wgsl.expected.msl
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <metal_stdlib>
-using namespace metal;
-
-struct tint_module_vars_struct {
-  array<texture2d<float, access::sample>, 1> sampled_textures;
-};
-
-void do_texture_load(texture2d<float, access::sample> t) {
-  uint const v = min(uint(0), (t.get_num_mip_levels() - 1u));
-  uint2 const v_1 = (uint2(t.get_width(v), t.get_height(v)) - uint2(1u));
-  float4 const texture_load = t.read(min(uint2(int2(0)), v_1), v);
-}
-
-fragment void fs(array<texture2d<float, access::sample>, 1> sampled_textures [[texture(0)]]) {
-  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.sampled_textures=sampled_textures};
-  do_texture_load(tint_module_vars.sampled_textures[0]);
-}
diff --git a/test/tint/binding_array/runtime_array_access_as_function_argument.wgsl.expected.spvasm b/test/tint/binding_array/runtime_array_access_as_function_argument.wgsl.expected.spvasm
deleted file mode 100644
index c0f3646..0000000
--- a/test/tint/binding_array/runtime_array_access_as_function_argument.wgsl.expected.spvasm
+++ /dev/null
@@ -1,59 +0,0 @@
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 1
-; Bound: 37
-; Schema: 0
-               OpCapability Shader
-               OpCapability RuntimeDescriptorArray
-               OpCapability ImageQuery
-               OpExtension "SPV_EXT_descriptor_indexing"
-         %19 = OpExtInstImport "GLSL.std.450"
-               OpMemoryModel Logical GLSL450
-               OpEntryPoint Fragment %fs "fs"
-               OpExecutionMode %fs OriginUpperLeft
-               OpName %sampled_textures "sampled_textures"
-               OpName %do_texture_load "do_texture_load"
-               OpName %t "t"
-               OpName %texture_load "texture_load"
-               OpName %fs "fs"
-               OpDecorate %sampled_textures DescriptorSet 0
-               OpDecorate %sampled_textures Binding 0
-      %float = OpTypeFloat 32
-          %4 = OpTypeImage %float 2D 0 0 0 1 Unknown
-%_runtimearr_4 = OpTypeRuntimeArray %4
-%_ptr_UniformConstant__runtimearr_4 = OpTypePointer UniformConstant %_runtimearr_4
-%sampled_textures = OpVariable %_ptr_UniformConstant__runtimearr_4 UniformConstant
-       %void = OpTypeVoid
-          %9 = OpTypeFunction %void %4
-       %uint = OpTypeInt 32 0
-     %uint_1 = OpConstant %uint 1
-        %int = OpTypeInt 32 1
-      %int_0 = OpConstant %int 0
-     %v2uint = OpTypeVector %uint 2
-         %23 = OpConstantComposite %v2uint %uint_1 %uint_1
-      %v2int = OpTypeVector %int 2
-         %25 = OpConstantNull %v2int
-    %v4float = OpTypeVector %float 4
-         %31 = OpTypeFunction %void
-%_ptr_UniformConstant_4 = OpTypePointer UniformConstant %4
-%do_texture_load = OpFunction %void None %9
-          %t = OpFunctionParameter %4
-         %10 = OpLabel
-         %11 = OpImageQueryLevels %uint %t
-         %13 = OpISub %uint %11 %uint_1
-         %15 = OpBitcast %uint %int_0
-         %18 = OpExtInst %uint %19 UMin %15 %13
-         %20 = OpImageQuerySizeLod %v2uint %t %18
-         %22 = OpISub %v2uint %20 %23
-         %24 = OpBitcast %v2uint %25
-         %27 = OpExtInst %v2uint %19 UMin %24 %22
-%texture_load = OpImageFetch %v4float %t %27 Lod %18
-               OpReturn
-               OpFunctionEnd
-         %fs = OpFunction %void None %31
-         %32 = OpLabel
-         %33 = OpAccessChain %_ptr_UniformConstant_4 %sampled_textures %int_0
-         %35 = OpLoad %4 %33 None
-         %36 = OpFunctionCall %void %do_texture_load %35
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/binding_array/runtime_array_access_as_function_argument.wgsl.expected.wgsl b/test/tint/binding_array/runtime_array_access_as_function_argument.wgsl.expected.wgsl
deleted file mode 100644
index d5fd235..0000000
--- a/test/tint/binding_array/runtime_array_access_as_function_argument.wgsl.expected.wgsl
+++ /dev/null
@@ -1,12 +0,0 @@
-enable chromium_experimental_dynamic_binding;
-
-@group(0) @binding(0) var sampled_textures : binding_array<texture_2d<f32>>;
-
-@fragment
-fn fs() {
-  do_texture_load(sampled_textures[0]);
-}
-
-fn do_texture_load(t : texture_2d<f32>) {
-  let texture_load = textureLoad(t, vec2(0, 0), 0);
-}
diff --git a/test/tint/binding_array/runtime_array_access_uniform.wgsl b/test/tint/binding_array/runtime_array_access_uniform.wgsl
deleted file mode 100644
index 4b4a372..0000000
--- a/test/tint/binding_array/runtime_array_access_uniform.wgsl
+++ /dev/null
@@ -1,8 +0,0 @@
-enable chromium_experimental_dynamic_binding;
-
-@group(1) @binding(0) var<uniform> index : u32;
-@group(0) @binding(0) var sampled_textures : binding_array<texture_2d<f32>>;
-
-@fragment fn fs() {
-    let texture_load = textureLoad(sampled_textures[index], vec2(0, 0), 0);
-}
diff --git a/test/tint/binding_array/runtime_array_access_uniform.wgsl.expected.dxc.hlsl b/test/tint/binding_array/runtime_array_access_uniform.wgsl.expected.dxc.hlsl
deleted file mode 100644
index dd7d955..0000000
--- a/test/tint/binding_array/runtime_array_access_uniform.wgsl.expected.dxc.hlsl
+++ /dev/null
@@ -1,10 +0,0 @@
-
-cbuffer cbuffer_index : register(b0, space1) {
-  uint4 index[1];
-};
-Texture2D<float4> sampled_textures[] : register(t0);
-void fs() {
-  uint v = index[0u].x;
-  float4 texture_load = sampled_textures[v].Load(int3((int(0)).xx, int(0)));
-}
-
diff --git a/test/tint/binding_array/runtime_array_access_uniform.wgsl.expected.fxc.hlsl b/test/tint/binding_array/runtime_array_access_uniform.wgsl.expected.fxc.hlsl
deleted file mode 100644
index b12a39a..0000000
--- a/test/tint/binding_array/runtime_array_access_uniform.wgsl.expected.fxc.hlsl
+++ /dev/null
@@ -1,5 +0,0 @@
-SKIP: INVALID
-
-runtime binding array not supported by the HLSL FXC backend
-
-tint executable returned error: exit status 1
diff --git a/test/tint/binding_array/runtime_array_access_uniform.wgsl.expected.glsl b/test/tint/binding_array/runtime_array_access_uniform.wgsl.expected.glsl
deleted file mode 100644
index d682685..0000000
--- a/test/tint/binding_array/runtime_array_access_uniform.wgsl.expected.glsl
+++ /dev/null
@@ -1,5 +0,0 @@
-SKIP: INVALID
-
-runtime binding array not supported by the GLSL backend
-
-tint executable returned error: exit status 1
diff --git a/test/tint/binding_array/runtime_array_access_uniform.wgsl.expected.msl b/test/tint/binding_array/runtime_array_access_uniform.wgsl.expected.msl
deleted file mode 100644
index 9547eaf..0000000
--- a/test/tint/binding_array/runtime_array_access_uniform.wgsl.expected.msl
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <metal_stdlib>
-using namespace metal;
-
-struct tint_module_vars_struct {
-  const constant uint* index;
-  array<texture2d<float, access::sample>, 1> sampled_textures;
-};
-
-fragment void fs(const constant uint* index [[buffer(0)]], array<texture2d<float, access::sample>, 1> sampled_textures [[texture(0)]]) {
-  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.index=index, .sampled_textures=sampled_textures};
-  texture2d<float, access::sample> const v = tint_module_vars.sampled_textures[(*tint_module_vars.index)];
-  uint const v_1 = min(uint(0), (v.get_num_mip_levels() - 1u));
-  uint2 const v_2 = (uint2(v.get_width(v_1), v.get_height(v_1)) - uint2(1u));
-  float4 const texture_load = v.read(min(uint2(int2(0)), v_2), v_1);
-}
diff --git a/test/tint/binding_array/runtime_array_access_uniform.wgsl.expected.spvasm b/test/tint/binding_array/runtime_array_access_uniform.wgsl.expected.spvasm
deleted file mode 100644
index 64c392f..0000000
--- a/test/tint/binding_array/runtime_array_access_uniform.wgsl.expected.spvasm
+++ /dev/null
@@ -1,64 +0,0 @@
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 1
-; Bound: 39
-; Schema: 0
-               OpCapability Shader
-               OpCapability RuntimeDescriptorArray
-               OpCapability ImageQuery
-               OpExtension "SPV_EXT_descriptor_indexing"
-         %28 = OpExtInstImport "GLSL.std.450"
-               OpMemoryModel Logical GLSL450
-               OpEntryPoint Fragment %fs "fs"
-               OpExecutionMode %fs OriginUpperLeft
-               OpMemberName %index_block 0 "inner"
-               OpName %index_block "index_block"
-               OpName %sampled_textures "sampled_textures"
-               OpName %fs "fs"
-               OpName %texture_load "texture_load"
-               OpMemberDecorate %index_block 0 Offset 0
-               OpDecorate %index_block Block
-               OpDecorate %1 DescriptorSet 1
-               OpDecorate %1 Binding 0
-               OpDecorate %1 NonWritable
-               OpDecorate %sampled_textures DescriptorSet 0
-               OpDecorate %sampled_textures Binding 0
-       %uint = OpTypeInt 32 0
-%index_block = OpTypeStruct %uint
-%_ptr_Uniform_index_block = OpTypePointer Uniform %index_block
-          %1 = OpVariable %_ptr_Uniform_index_block Uniform
-      %float = OpTypeFloat 32
-          %8 = OpTypeImage %float 2D 0 0 0 1 Unknown
-%_runtimearr_8 = OpTypeRuntimeArray %8
-%_ptr_UniformConstant__runtimearr_8 = OpTypePointer UniformConstant %_runtimearr_8
-%sampled_textures = OpVariable %_ptr_UniformConstant__runtimearr_8 UniformConstant
-       %void = OpTypeVoid
-         %12 = OpTypeFunction %void
-%_ptr_Uniform_uint = OpTypePointer Uniform %uint
-     %uint_0 = OpConstant %uint 0
-%_ptr_UniformConstant_8 = OpTypePointer UniformConstant %8
-     %uint_1 = OpConstant %uint 1
-        %int = OpTypeInt 32 1
-      %int_0 = OpConstant %int 0
-     %v2uint = OpTypeVector %uint 2
-         %32 = OpConstantComposite %v2uint %uint_1 %uint_1
-      %v2int = OpTypeVector %int 2
-         %34 = OpConstantNull %v2int
-    %v4float = OpTypeVector %float 4
-         %fs = OpFunction %void None %12
-         %13 = OpLabel
-         %14 = OpAccessChain %_ptr_Uniform_uint %1 %uint_0
-         %17 = OpLoad %uint %14 None
-         %18 = OpAccessChain %_ptr_UniformConstant_8 %sampled_textures %17
-         %20 = OpLoad %8 %18 None
-         %21 = OpImageQueryLevels %uint %20
-         %22 = OpISub %uint %21 %uint_1
-         %24 = OpBitcast %uint %int_0
-         %27 = OpExtInst %uint %28 UMin %24 %22
-         %29 = OpImageQuerySizeLod %v2uint %20 %27
-         %31 = OpISub %v2uint %29 %32
-         %33 = OpBitcast %v2uint %34
-         %36 = OpExtInst %v2uint %28 UMin %33 %31
-%texture_load = OpImageFetch %v4float %20 %36 Lod %27
-               OpReturn
-               OpFunctionEnd
diff --git a/test/tint/binding_array/runtime_array_access_uniform.wgsl.expected.wgsl b/test/tint/binding_array/runtime_array_access_uniform.wgsl.expected.wgsl
deleted file mode 100644
index 36473ab..0000000
--- a/test/tint/binding_array/runtime_array_access_uniform.wgsl.expected.wgsl
+++ /dev/null
@@ -1,10 +0,0 @@
-enable chromium_experimental_dynamic_binding;
-
-@group(1) @binding(0) var<uniform> index : u32;
-
-@group(0) @binding(0) var sampled_textures : binding_array<texture_2d<f32>>;
-
-@fragment
-fn fs() {
-  let texture_load = textureLoad(sampled_textures[index], vec2(0, 0), 0);
-}
diff --git a/test/tint/extensions/dynamic_binding/access_as_constant.wgsl b/test/tint/extensions/dynamic_binding/access_as_constant.wgsl
new file mode 100644
index 0000000..5799dde
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/access_as_constant.wgsl
@@ -0,0 +1,8 @@
+enable chromium_experimental_dynamic_binding;
+
+@group(0) @binding(0) var sampled_textures : resource_binding;
+
+@fragment fn fs() {
+    let t = getBinding<texture_1d<f32>>(sampled_textures, 2);
+    let texture_load = textureLoad(t, vec2(0, 0), 0);
+}
diff --git a/test/tint/extensions/dynamic_binding/access_as_constant.wgsl.expected.dxc.hlsl b/test/tint/extensions/dynamic_binding/access_as_constant.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..78cae57
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/access_as_constant.wgsl.expected.dxc.hlsl
@@ -0,0 +1,8 @@
+SKIP: FAILED
+
+<dawn>/test/tint/extensions/dynamic_binding/access_as_constant.wgsl:6:13 error: unresolved call target 'getBinding'
+    let t = getBinding<texture_1d<f32>>(sampled_textures, 2);
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+tint executable returned error: exit status 1
diff --git a/test/tint/extensions/dynamic_binding/access_as_constant.wgsl.expected.fxc.hlsl b/test/tint/extensions/dynamic_binding/access_as_constant.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..78cae57
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/access_as_constant.wgsl.expected.fxc.hlsl
@@ -0,0 +1,8 @@
+SKIP: FAILED
+
+<dawn>/test/tint/extensions/dynamic_binding/access_as_constant.wgsl:6:13 error: unresolved call target 'getBinding'
+    let t = getBinding<texture_1d<f32>>(sampled_textures, 2);
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+tint executable returned error: exit status 1
diff --git a/test/tint/extensions/dynamic_binding/access_as_constant.wgsl.expected.glsl b/test/tint/extensions/dynamic_binding/access_as_constant.wgsl.expected.glsl
new file mode 100644
index 0000000..ea126db
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/access_as_constant.wgsl.expected.glsl
@@ -0,0 +1,8 @@
+SKIP: INVALID
+
+<dawn>/test/tint/extensions/dynamic_binding/access_as_constant.wgsl:6:13 error: unresolved call target 'getBinding'
+    let t = getBinding<texture_1d<f32>>(sampled_textures, 2);
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+tint executable returned error: exit status 1
diff --git a/test/tint/extensions/dynamic_binding/access_as_constant.wgsl.expected.msl b/test/tint/extensions/dynamic_binding/access_as_constant.wgsl.expected.msl
new file mode 100644
index 0000000..78cae57
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/access_as_constant.wgsl.expected.msl
@@ -0,0 +1,8 @@
+SKIP: FAILED
+
+<dawn>/test/tint/extensions/dynamic_binding/access_as_constant.wgsl:6:13 error: unresolved call target 'getBinding'
+    let t = getBinding<texture_1d<f32>>(sampled_textures, 2);
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+tint executable returned error: exit status 1
diff --git a/test/tint/extensions/dynamic_binding/access_as_constant.wgsl.expected.spvasm b/test/tint/extensions/dynamic_binding/access_as_constant.wgsl.expected.spvasm
new file mode 100644
index 0000000..78cae57
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/access_as_constant.wgsl.expected.spvasm
@@ -0,0 +1,8 @@
+SKIP: FAILED
+
+<dawn>/test/tint/extensions/dynamic_binding/access_as_constant.wgsl:6:13 error: unresolved call target 'getBinding'
+    let t = getBinding<texture_1d<f32>>(sampled_textures, 2);
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+tint executable returned error: exit status 1
diff --git a/test/tint/extensions/dynamic_binding/access_as_constant.wgsl.expected.wgsl b/test/tint/extensions/dynamic_binding/access_as_constant.wgsl.expected.wgsl
new file mode 100644
index 0000000..78cae57
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/access_as_constant.wgsl.expected.wgsl
@@ -0,0 +1,8 @@
+SKIP: FAILED
+
+<dawn>/test/tint/extensions/dynamic_binding/access_as_constant.wgsl:6:13 error: unresolved call target 'getBinding'
+    let t = getBinding<texture_1d<f32>>(sampled_textures, 2);
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+tint executable returned error: exit status 1
diff --git a/test/tint/extensions/dynamic_binding/access_as_uniform.wgsl b/test/tint/extensions/dynamic_binding/access_as_uniform.wgsl
new file mode 100644
index 0000000..2ebc6d0
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/access_as_uniform.wgsl
@@ -0,0 +1,9 @@
+enable chromium_experimental_dynamic_binding;
+
+@group(1) @binding(0) var<uniform> index : u32;
+@group(0) @binding(0) var sampled_textures : resource_binding;
+
+@fragment fn fs() {
+    let t = getBinding<texture_3d<f32>>(sampled_textures, index);
+    let texture_load = textureLoad(t, vec2(0, 0), 0);
+}
diff --git a/test/tint/extensions/dynamic_binding/access_as_uniform.wgsl.expected.dxc.hlsl b/test/tint/extensions/dynamic_binding/access_as_uniform.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..fe1cf4a
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/access_as_uniform.wgsl.expected.dxc.hlsl
@@ -0,0 +1,8 @@
+SKIP: FAILED
+
+<dawn>/test/tint/extensions/dynamic_binding/access_as_uniform.wgsl:7:13 error: unresolved call target 'getBinding'
+    let t = getBinding<texture_3d<f32>>(sampled_textures, index);
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+tint executable returned error: exit status 1
diff --git a/test/tint/extensions/dynamic_binding/access_as_uniform.wgsl.expected.fxc.hlsl b/test/tint/extensions/dynamic_binding/access_as_uniform.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..fe1cf4a
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/access_as_uniform.wgsl.expected.fxc.hlsl
@@ -0,0 +1,8 @@
+SKIP: FAILED
+
+<dawn>/test/tint/extensions/dynamic_binding/access_as_uniform.wgsl:7:13 error: unresolved call target 'getBinding'
+    let t = getBinding<texture_3d<f32>>(sampled_textures, index);
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+tint executable returned error: exit status 1
diff --git a/test/tint/extensions/dynamic_binding/access_as_uniform.wgsl.expected.glsl b/test/tint/extensions/dynamic_binding/access_as_uniform.wgsl.expected.glsl
new file mode 100644
index 0000000..fd5d671
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/access_as_uniform.wgsl.expected.glsl
@@ -0,0 +1,8 @@
+SKIP: INVALID
+
+<dawn>/test/tint/extensions/dynamic_binding/access_as_uniform.wgsl:7:13 error: unresolved call target 'getBinding'
+    let t = getBinding<texture_3d<f32>>(sampled_textures, index);
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+tint executable returned error: exit status 1
diff --git a/test/tint/extensions/dynamic_binding/access_as_uniform.wgsl.expected.msl b/test/tint/extensions/dynamic_binding/access_as_uniform.wgsl.expected.msl
new file mode 100644
index 0000000..fe1cf4a
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/access_as_uniform.wgsl.expected.msl
@@ -0,0 +1,8 @@
+SKIP: FAILED
+
+<dawn>/test/tint/extensions/dynamic_binding/access_as_uniform.wgsl:7:13 error: unresolved call target 'getBinding'
+    let t = getBinding<texture_3d<f32>>(sampled_textures, index);
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+tint executable returned error: exit status 1
diff --git a/test/tint/extensions/dynamic_binding/access_as_uniform.wgsl.expected.spvasm b/test/tint/extensions/dynamic_binding/access_as_uniform.wgsl.expected.spvasm
new file mode 100644
index 0000000..fe1cf4a
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/access_as_uniform.wgsl.expected.spvasm
@@ -0,0 +1,8 @@
+SKIP: FAILED
+
+<dawn>/test/tint/extensions/dynamic_binding/access_as_uniform.wgsl:7:13 error: unresolved call target 'getBinding'
+    let t = getBinding<texture_3d<f32>>(sampled_textures, index);
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+tint executable returned error: exit status 1
diff --git a/test/tint/extensions/dynamic_binding/access_as_uniform.wgsl.expected.wgsl b/test/tint/extensions/dynamic_binding/access_as_uniform.wgsl.expected.wgsl
new file mode 100644
index 0000000..fe1cf4a
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/access_as_uniform.wgsl.expected.wgsl
@@ -0,0 +1,8 @@
+SKIP: FAILED
+
+<dawn>/test/tint/extensions/dynamic_binding/access_as_uniform.wgsl:7:13 error: unresolved call target 'getBinding'
+    let t = getBinding<texture_3d<f32>>(sampled_textures, index);
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+tint executable returned error: exit status 1
diff --git a/test/tint/extensions/dynamic_binding/arraylength.wgsl b/test/tint/extensions/dynamic_binding/arraylength.wgsl
new file mode 100644
index 0000000..ef89caf
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/arraylength.wgsl
@@ -0,0 +1,7 @@
+enable chromium_experimental_dynamic_binding;
+
+@group(0) @binding(0) var sampled_textures : resource_binding;
+
+@fragment fn fs() {
+    let t = arrayLength(sampled_textures);
+}
diff --git a/test/tint/extensions/dynamic_binding/arraylength.wgsl.expected.dxc.hlsl b/test/tint/extensions/dynamic_binding/arraylength.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..3ed2676
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/arraylength.wgsl.expected.dxc.hlsl
@@ -0,0 +1,15 @@
+SKIP: FAILED
+
+<dawn>/test/tint/extensions/dynamic_binding/arraylength.wgsl:6:13 error: no matching call to 'arrayLength(resource_binding)'
+
+2 candidate functions:
+ • 'arrayLength(ptr<storage, array<T>, R>  ✗ ) -> u32' where:
+      ✗  'R' is 'read'
+ • 'arrayLength(ptr<storage, array<T>, W>  ✗ ) -> u32' where:
+      ✗  'W' is 'write' or 'read_write'
+
+    let t = arrayLength(sampled_textures);
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+tint executable returned error: exit status 1
diff --git a/test/tint/extensions/dynamic_binding/arraylength.wgsl.expected.fxc.hlsl b/test/tint/extensions/dynamic_binding/arraylength.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..3ed2676
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/arraylength.wgsl.expected.fxc.hlsl
@@ -0,0 +1,15 @@
+SKIP: FAILED
+
+<dawn>/test/tint/extensions/dynamic_binding/arraylength.wgsl:6:13 error: no matching call to 'arrayLength(resource_binding)'
+
+2 candidate functions:
+ • 'arrayLength(ptr<storage, array<T>, R>  ✗ ) -> u32' where:
+      ✗  'R' is 'read'
+ • 'arrayLength(ptr<storage, array<T>, W>  ✗ ) -> u32' where:
+      ✗  'W' is 'write' or 'read_write'
+
+    let t = arrayLength(sampled_textures);
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+tint executable returned error: exit status 1
diff --git a/test/tint/extensions/dynamic_binding/arraylength.wgsl.expected.glsl b/test/tint/extensions/dynamic_binding/arraylength.wgsl.expected.glsl
new file mode 100644
index 0000000..9c02951
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/arraylength.wgsl.expected.glsl
@@ -0,0 +1,15 @@
+SKIP: INVALID
+
+<dawn>/test/tint/extensions/dynamic_binding/arraylength.wgsl:6:13 error: no matching call to 'arrayLength(resource_binding)'
+
+2 candidate functions:
+ • 'arrayLength(ptr<storage, array<T>, R>  ✗ ) -> u32' where:
+      ✗  'R' is 'read'
+ • 'arrayLength(ptr<storage, array<T>, W>  ✗ ) -> u32' where:
+      ✗  'W' is 'write' or 'read_write'
+
+    let t = arrayLength(sampled_textures);
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+tint executable returned error: exit status 1
diff --git a/test/tint/extensions/dynamic_binding/arraylength.wgsl.expected.msl b/test/tint/extensions/dynamic_binding/arraylength.wgsl.expected.msl
new file mode 100644
index 0000000..3ed2676
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/arraylength.wgsl.expected.msl
@@ -0,0 +1,15 @@
+SKIP: FAILED
+
+<dawn>/test/tint/extensions/dynamic_binding/arraylength.wgsl:6:13 error: no matching call to 'arrayLength(resource_binding)'
+
+2 candidate functions:
+ • 'arrayLength(ptr<storage, array<T>, R>  ✗ ) -> u32' where:
+      ✗  'R' is 'read'
+ • 'arrayLength(ptr<storage, array<T>, W>  ✗ ) -> u32' where:
+      ✗  'W' is 'write' or 'read_write'
+
+    let t = arrayLength(sampled_textures);
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+tint executable returned error: exit status 1
diff --git a/test/tint/extensions/dynamic_binding/arraylength.wgsl.expected.spvasm b/test/tint/extensions/dynamic_binding/arraylength.wgsl.expected.spvasm
new file mode 100644
index 0000000..3ed2676
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/arraylength.wgsl.expected.spvasm
@@ -0,0 +1,15 @@
+SKIP: FAILED
+
+<dawn>/test/tint/extensions/dynamic_binding/arraylength.wgsl:6:13 error: no matching call to 'arrayLength(resource_binding)'
+
+2 candidate functions:
+ • 'arrayLength(ptr<storage, array<T>, R>  ✗ ) -> u32' where:
+      ✗  'R' is 'read'
+ • 'arrayLength(ptr<storage, array<T>, W>  ✗ ) -> u32' where:
+      ✗  'W' is 'write' or 'read_write'
+
+    let t = arrayLength(sampled_textures);
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+tint executable returned error: exit status 1
diff --git a/test/tint/extensions/dynamic_binding/arraylength.wgsl.expected.wgsl b/test/tint/extensions/dynamic_binding/arraylength.wgsl.expected.wgsl
new file mode 100644
index 0000000..3ed2676
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/arraylength.wgsl.expected.wgsl
@@ -0,0 +1,15 @@
+SKIP: FAILED
+
+<dawn>/test/tint/extensions/dynamic_binding/arraylength.wgsl:6:13 error: no matching call to 'arrayLength(resource_binding)'
+
+2 candidate functions:
+ • 'arrayLength(ptr<storage, array<T>, R>  ✗ ) -> u32' where:
+      ✗  'R' is 'read'
+ • 'arrayLength(ptr<storage, array<T>, W>  ✗ ) -> u32' where:
+      ✗  'W' is 'write' or 'read_write'
+
+    let t = arrayLength(sampled_textures);
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+tint executable returned error: exit status 1
diff --git a/test/tint/extensions/dynamic_binding/has_binding.wgsl b/test/tint/extensions/dynamic_binding/has_binding.wgsl
new file mode 100644
index 0000000..1226fba
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/has_binding.wgsl
@@ -0,0 +1,7 @@
+enable chromium_experimental_dynamic_binding;
+
+@group(0) @binding(0) var sampled_textures : resource_binding;
+
+@fragment fn fs() {
+    let t = has_binding<texture_2d<i32>>(sampled_textures, 4);
+}
diff --git a/test/tint/extensions/dynamic_binding/has_binding.wgsl.expected.dxc.hlsl b/test/tint/extensions/dynamic_binding/has_binding.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..71225a7
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/has_binding.wgsl.expected.dxc.hlsl
@@ -0,0 +1,8 @@
+SKIP: FAILED
+
+<dawn>/test/tint/extensions/dynamic_binding/has_binding.wgsl:6:13 error: unresolved call target 'has_binding'
+    let t = has_binding<texture_2d<i32>>(sampled_textures, 4);
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+tint executable returned error: exit status 1
diff --git a/test/tint/extensions/dynamic_binding/has_binding.wgsl.expected.fxc.hlsl b/test/tint/extensions/dynamic_binding/has_binding.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..71225a7
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/has_binding.wgsl.expected.fxc.hlsl
@@ -0,0 +1,8 @@
+SKIP: FAILED
+
+<dawn>/test/tint/extensions/dynamic_binding/has_binding.wgsl:6:13 error: unresolved call target 'has_binding'
+    let t = has_binding<texture_2d<i32>>(sampled_textures, 4);
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+tint executable returned error: exit status 1
diff --git a/test/tint/extensions/dynamic_binding/has_binding.wgsl.expected.glsl b/test/tint/extensions/dynamic_binding/has_binding.wgsl.expected.glsl
new file mode 100644
index 0000000..ef66dd8
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/has_binding.wgsl.expected.glsl
@@ -0,0 +1,8 @@
+SKIP: INVALID
+
+<dawn>/test/tint/extensions/dynamic_binding/has_binding.wgsl:6:13 error: unresolved call target 'has_binding'
+    let t = has_binding<texture_2d<i32>>(sampled_textures, 4);
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+tint executable returned error: exit status 1
diff --git a/test/tint/extensions/dynamic_binding/has_binding.wgsl.expected.msl b/test/tint/extensions/dynamic_binding/has_binding.wgsl.expected.msl
new file mode 100644
index 0000000..71225a7
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/has_binding.wgsl.expected.msl
@@ -0,0 +1,8 @@
+SKIP: FAILED
+
+<dawn>/test/tint/extensions/dynamic_binding/has_binding.wgsl:6:13 error: unresolved call target 'has_binding'
+    let t = has_binding<texture_2d<i32>>(sampled_textures, 4);
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+tint executable returned error: exit status 1
diff --git a/test/tint/extensions/dynamic_binding/has_binding.wgsl.expected.spvasm b/test/tint/extensions/dynamic_binding/has_binding.wgsl.expected.spvasm
new file mode 100644
index 0000000..71225a7
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/has_binding.wgsl.expected.spvasm
@@ -0,0 +1,8 @@
+SKIP: FAILED
+
+<dawn>/test/tint/extensions/dynamic_binding/has_binding.wgsl:6:13 error: unresolved call target 'has_binding'
+    let t = has_binding<texture_2d<i32>>(sampled_textures, 4);
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+tint executable returned error: exit status 1
diff --git a/test/tint/extensions/dynamic_binding/has_binding.wgsl.expected.wgsl b/test/tint/extensions/dynamic_binding/has_binding.wgsl.expected.wgsl
new file mode 100644
index 0000000..71225a7
--- /dev/null
+++ b/test/tint/extensions/dynamic_binding/has_binding.wgsl.expected.wgsl
@@ -0,0 +1,8 @@
+SKIP: FAILED
+
+<dawn>/test/tint/extensions/dynamic_binding/has_binding.wgsl:6:13 error: unresolved call target 'has_binding'
+    let t = has_binding<texture_2d<i32>>(sampled_textures, 4);
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+tint executable returned error: exit status 1