[tint][wgsl] Parse @color

Bug: tint:2085
Change-Id: Icf31f22ac86f4f08d284e65fb781521d595fc6ca
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/160084
Reviewed-by: James Price <jrprice@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/tint/lang/wgsl/reader/parser/parser.cc b/src/tint/lang/wgsl/reader/parser/parser.cc
index 6a10c72..8cc0bba 100644
--- a/src/tint/lang/wgsl/reader/parser/parser.cc
+++ b/src/tint/lang/wgsl/reader/parser/parser.cc
@@ -3088,6 +3088,8 @@
             return create<ast::BindingAttribute>(t.source(), args[0]);
         case core::Attribute::kBuiltin:
             return create<ast::BuiltinAttribute>(t.source(), args[0]);
+        case core::Attribute::kColor:
+            return create<ast::ColorAttribute>(t.source(), args[0]);
         case core::Attribute::kCompute:
             return create<ast::StageAttribute>(t.source(), ast::PipelineStage::kCompute);
         case core::Attribute::kFragment:
diff --git a/test/tint/extensions/texel_fetch/additional_params/a.wgsl b/test/tint/extensions/texel_fetch/additional_params/a.wgsl
new file mode 100644
index 0000000..ae672fe
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/a.wgsl
@@ -0,0 +1,11 @@
+enable chromium_experimental_framebuffer_fetch;
+
+struct In {
+  @location(0) uv : vec4f,
+}
+
+fn g(a : f32, b : f32, c : f32) {}
+
+@fragment fn f(@builtin(position) pos : vec4f, @color(0) fbf : vec4f, in : In) {
+  g(pos.x, fbf.x, in.uv.x);
+}
diff --git a/test/tint/extensions/texel_fetch/additional_params/a.wgsl.expected.dxc.hlsl b/test/tint/extensions/texel_fetch/additional_params/a.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..753dc33
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/a.wgsl.expected.dxc.hlsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct In {
+  @location(0)
+  uv : vec4f,
+}
+
+fn g(a : f32, b : f32, c : f32) {
+}
+
+@fragment
+fn f(@builtin(position) pos : vec4f, @color(0) fbf : vec4f, tint_symbol : In) {
+  g(pos.x, fbf.x, tint_symbol.uv.x);
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/a.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/a.wgsl.expected.fxc.hlsl b/test/tint/extensions/texel_fetch/additional_params/a.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..753dc33
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/a.wgsl.expected.fxc.hlsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct In {
+  @location(0)
+  uv : vec4f,
+}
+
+fn g(a : f32, b : f32, c : f32) {
+}
+
+@fragment
+fn f(@builtin(position) pos : vec4f, @color(0) fbf : vec4f, tint_symbol : In) {
+  g(pos.x, fbf.x, tint_symbol.uv.x);
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/a.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/a.wgsl.expected.glsl b/test/tint/extensions/texel_fetch/additional_params/a.wgsl.expected.glsl
new file mode 100644
index 0000000..119b567
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/a.wgsl.expected.glsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct In {
+  @location(0)
+  uv : vec4f,
+}
+
+fn g(a : f32, b : f32, c : f32) {
+}
+
+@fragment
+fn f(@builtin(position) pos : vec4f, @color(0) fbf : vec4f, tint_symbol : In) {
+  g(pos.x, fbf.x, tint_symbol.uv.x);
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/a.wgsl:1:8 error: GLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/a.wgsl.expected.ir.spvasm b/test/tint/extensions/texel_fetch/additional_params/a.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..9ab80a4
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/a.wgsl.expected.ir.spvasm
@@ -0,0 +1,9 @@
+SKIP: FAILED
+
+../../src/tint/lang/wgsl/reader/program_to_ir/program_to_ir.cc:463 internal compiler error: TINT_UNIMPLEMENTED IR does not currently support texel fetch extension
+********************************************************************
+*  The tint shader compiler has encountered an unexpected error.   *
+*                                                                  *
+*  Please help us fix this issue by submitting a bug report at     *
+*  crbug.com/tint with the source program that triggered the bug.  *
+********************************************************************
diff --git a/test/tint/extensions/texel_fetch/additional_params/a.wgsl.expected.msl b/test/tint/extensions/texel_fetch/additional_params/a.wgsl.expected.msl
new file mode 100644
index 0000000..46454ec
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/a.wgsl.expected.msl
@@ -0,0 +1,25 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct In {
+  float4 uv;
+};
+
+void g(float a, float b, float c) {
+}
+
+struct tint_symbol_1 {
+  float4 fbf [[color(0)]];
+  float4 uv [[user(locn0)]];
+};
+
+void f_inner(float4 pos, float4 fbf, In in) {
+  g(pos[0], fbf[0], in.uv[0]);
+}
+
+fragment void f(float4 pos [[position]], tint_symbol_1 tint_symbol [[stage_in]]) {
+  In const tint_symbol_2 = {.uv=tint_symbol.uv};
+  f_inner(pos, tint_symbol.fbf, tint_symbol_2);
+  return;
+}
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/a.wgsl.expected.spvasm b/test/tint/extensions/texel_fetch/additional_params/a.wgsl.expected.spvasm
new file mode 100644
index 0000000..670875d
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/a.wgsl.expected.spvasm
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct In {
+  @location(0)
+  uv : vec4f,
+}
+
+fn g(a : f32, b : f32, c : f32) {
+}
+
+@fragment
+fn f(@builtin(position) pos : vec4f, @color(0) fbf : vec4f, in : In) {
+  g(pos.x, fbf.x, in.uv.x);
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/a.wgsl:1:8 error: SPIR-V backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/a.wgsl.expected.wgsl b/test/tint/extensions/texel_fetch/additional_params/a.wgsl.expected.wgsl
new file mode 100644
index 0000000..977732a
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/a.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable chromium_experimental_framebuffer_fetch;
+
+struct In {
+  @location(0)
+  uv : vec4f,
+}
+
+fn g(a : f32, b : f32, c : f32) {
+}
+
+@fragment
+fn f(@builtin(position) pos : vec4f, @color(0) fbf : vec4f, in : In) {
+  g(pos.x, fbf.x, in.uv.x);
+}
diff --git a/test/tint/extensions/texel_fetch/additional_params/b.wgsl b/test/tint/extensions/texel_fetch/additional_params/b.wgsl
new file mode 100644
index 0000000..86afcc0
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/b.wgsl
@@ -0,0 +1,7 @@
+enable chromium_experimental_framebuffer_fetch;
+
+fn g(a : f32, b : f32, c : f32) {}
+
+@fragment fn f(@builtin(position) pos : vec4f, @location(0) uv : vec4f, @color(0) fbf : vec4f) {
+  g(pos.x, uv.x, fbf.x);
+}
diff --git a/test/tint/extensions/texel_fetch/additional_params/b.wgsl.expected.dxc.hlsl b/test/tint/extensions/texel_fetch/additional_params/b.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..e099cd7
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/b.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+fn g(a : f32, b : f32, c : f32) {
+}
+
+@fragment
+fn f(@builtin(position) pos : vec4f, @location(0) uv : vec4f, @color(0) fbf : vec4f) {
+  g(pos.x, uv.x, fbf.x);
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/b.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/b.wgsl.expected.fxc.hlsl b/test/tint/extensions/texel_fetch/additional_params/b.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..e099cd7
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/b.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+fn g(a : f32, b : f32, c : f32) {
+}
+
+@fragment
+fn f(@builtin(position) pos : vec4f, @location(0) uv : vec4f, @color(0) fbf : vec4f) {
+  g(pos.x, uv.x, fbf.x);
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/b.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/b.wgsl.expected.glsl b/test/tint/extensions/texel_fetch/additional_params/b.wgsl.expected.glsl
new file mode 100644
index 0000000..d173bd8
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/b.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+fn g(a : f32, b : f32, c : f32) {
+}
+
+@fragment
+fn f(@builtin(position) pos : vec4f, @location(0) uv : vec4f, @color(0) fbf : vec4f) {
+  g(pos.x, uv.x, fbf.x);
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/b.wgsl:1:8 error: GLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/b.wgsl.expected.ir.spvasm b/test/tint/extensions/texel_fetch/additional_params/b.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..9ab80a4
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/b.wgsl.expected.ir.spvasm
@@ -0,0 +1,9 @@
+SKIP: FAILED
+
+../../src/tint/lang/wgsl/reader/program_to_ir/program_to_ir.cc:463 internal compiler error: TINT_UNIMPLEMENTED IR does not currently support texel fetch extension
+********************************************************************
+*  The tint shader compiler has encountered an unexpected error.   *
+*                                                                  *
+*  Please help us fix this issue by submitting a bug report at     *
+*  crbug.com/tint with the source program that triggered the bug.  *
+********************************************************************
diff --git a/test/tint/extensions/texel_fetch/additional_params/b.wgsl.expected.msl b/test/tint/extensions/texel_fetch/additional_params/b.wgsl.expected.msl
new file mode 100644
index 0000000..9428553
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/b.wgsl.expected.msl
@@ -0,0 +1,20 @@
+#include <metal_stdlib>
+
+using namespace metal;
+void g(float a, float b, float c) {
+}
+
+struct tint_symbol_1 {
+  float4 fbf [[color(0)]];
+  float4 uv [[user(locn0)]];
+};
+
+void f_inner(float4 pos, float4 uv, float4 fbf) {
+  g(pos[0], uv[0], fbf[0]);
+}
+
+fragment void f(float4 pos [[position]], tint_symbol_1 tint_symbol [[stage_in]]) {
+  f_inner(pos, tint_symbol.uv, tint_symbol.fbf);
+  return;
+}
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/b.wgsl.expected.spvasm b/test/tint/extensions/texel_fetch/additional_params/b.wgsl.expected.spvasm
new file mode 100644
index 0000000..52f165c
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/b.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+fn g(a : f32, b : f32, c : f32) {
+}
+
+@fragment
+fn f(@builtin(position) pos : vec4f, @location(0) uv : vec4f, @color(0) fbf : vec4f) {
+  g(pos.x, uv.x, fbf.x);
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/b.wgsl:1:8 error: SPIR-V backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/b.wgsl.expected.wgsl b/test/tint/extensions/texel_fetch/additional_params/b.wgsl.expected.wgsl
new file mode 100644
index 0000000..1aab2e5
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/b.wgsl.expected.wgsl
@@ -0,0 +1,9 @@
+enable chromium_experimental_framebuffer_fetch;
+
+fn g(a : f32, b : f32, c : f32) {
+}
+
+@fragment
+fn f(@builtin(position) pos : vec4f, @location(0) uv : vec4f, @color(0) fbf : vec4f) {
+  g(pos.x, uv.x, fbf.x);
+}
diff --git a/test/tint/extensions/texel_fetch/additional_params/c.wgsl b/test/tint/extensions/texel_fetch/additional_params/c.wgsl
new file mode 100644
index 0000000..b4b18fe
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/c.wgsl
@@ -0,0 +1,14 @@
+// flags: --pixel_local_attachments 0=1,1=6,2=3
+enable chromium_experimental_pixel_local;
+
+fn g(a : f32, b : f32, c : f32) {}
+
+struct In {
+  @builtin(position) pos : vec4f,
+  @location(0) uv : vec4f,
+  @color(0) fbf : vec4f,
+}
+
+@fragment fn f(in : In) {
+  g(in.pos.x, in.uv.x, in.fbf.y);
+}
diff --git a/test/tint/extensions/texel_fetch/additional_params/c.wgsl.expected.dxc.hlsl b/test/tint/extensions/texel_fetch/additional_params/c.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..c6972a8
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/c.wgsl.expected.dxc.hlsl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+extensions/texel_fetch/additional_params/c.wgsl:9:4 error: use of @color requires enabling extension 'chromium_experimental_framebuffer_fetch'
+  @color(0) fbf : vec4f,
+   ^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/c.wgsl.expected.fxc.hlsl b/test/tint/extensions/texel_fetch/additional_params/c.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..c6972a8
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/c.wgsl.expected.fxc.hlsl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+extensions/texel_fetch/additional_params/c.wgsl:9:4 error: use of @color requires enabling extension 'chromium_experimental_framebuffer_fetch'
+  @color(0) fbf : vec4f,
+   ^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/c.wgsl.expected.glsl b/test/tint/extensions/texel_fetch/additional_params/c.wgsl.expected.glsl
new file mode 100644
index 0000000..c6972a8
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/c.wgsl.expected.glsl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+extensions/texel_fetch/additional_params/c.wgsl:9:4 error: use of @color requires enabling extension 'chromium_experimental_framebuffer_fetch'
+  @color(0) fbf : vec4f,
+   ^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/c.wgsl.expected.ir.spvasm b/test/tint/extensions/texel_fetch/additional_params/c.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..c6972a8
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/c.wgsl.expected.ir.spvasm
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+extensions/texel_fetch/additional_params/c.wgsl:9:4 error: use of @color requires enabling extension 'chromium_experimental_framebuffer_fetch'
+  @color(0) fbf : vec4f,
+   ^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/c.wgsl.expected.msl b/test/tint/extensions/texel_fetch/additional_params/c.wgsl.expected.msl
new file mode 100644
index 0000000..c6972a8
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/c.wgsl.expected.msl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+extensions/texel_fetch/additional_params/c.wgsl:9:4 error: use of @color requires enabling extension 'chromium_experimental_framebuffer_fetch'
+  @color(0) fbf : vec4f,
+   ^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/c.wgsl.expected.spvasm b/test/tint/extensions/texel_fetch/additional_params/c.wgsl.expected.spvasm
new file mode 100644
index 0000000..c6972a8
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/c.wgsl.expected.spvasm
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+extensions/texel_fetch/additional_params/c.wgsl:9:4 error: use of @color requires enabling extension 'chromium_experimental_framebuffer_fetch'
+  @color(0) fbf : vec4f,
+   ^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/c.wgsl.expected.wgsl b/test/tint/extensions/texel_fetch/additional_params/c.wgsl.expected.wgsl
new file mode 100644
index 0000000..c6972a8
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/c.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+extensions/texel_fetch/additional_params/c.wgsl:9:4 error: use of @color requires enabling extension 'chromium_experimental_framebuffer_fetch'
+  @color(0) fbf : vec4f,
+   ^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/d.wgsl b/test/tint/extensions/texel_fetch/additional_params/d.wgsl
new file mode 100644
index 0000000..befe42f
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/d.wgsl
@@ -0,0 +1,11 @@
+enable chromium_experimental_framebuffer_fetch;
+
+fn g(a : i32, b : f32, c : f32, d : u32) {}
+
+struct In {
+  @builtin(position) pos : vec4f,
+}
+
+@fragment fn f(@color(2) fbf_2 : vec4i, in : In, @location(0) uv : vec4f, @color(0) fbf_0 : vec4u) {
+  g(fbf_2.z, in.pos.x, uv.x, fbf_0.y);
+}
diff --git a/test/tint/extensions/texel_fetch/additional_params/d.wgsl.expected.dxc.hlsl b/test/tint/extensions/texel_fetch/additional_params/d.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..20d76e7
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/d.wgsl.expected.dxc.hlsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+fn g(a : i32, b : f32, c : f32, d : u32) {
+}
+
+struct In {
+  @builtin(position)
+  pos : vec4f,
+}
+
+@fragment
+fn f(@color(2) fbf_2 : vec4i, tint_symbol : In, @location(0) uv : vec4f, @color(0) fbf_0 : vec4u) {
+  g(fbf_2.z, tint_symbol.pos.x, uv.x, fbf_0.y);
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/d.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/d.wgsl.expected.fxc.hlsl b/test/tint/extensions/texel_fetch/additional_params/d.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..20d76e7
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/d.wgsl.expected.fxc.hlsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+fn g(a : i32, b : f32, c : f32, d : u32) {
+}
+
+struct In {
+  @builtin(position)
+  pos : vec4f,
+}
+
+@fragment
+fn f(@color(2) fbf_2 : vec4i, tint_symbol : In, @location(0) uv : vec4f, @color(0) fbf_0 : vec4u) {
+  g(fbf_2.z, tint_symbol.pos.x, uv.x, fbf_0.y);
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/d.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/d.wgsl.expected.glsl b/test/tint/extensions/texel_fetch/additional_params/d.wgsl.expected.glsl
new file mode 100644
index 0000000..c8a2335
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/d.wgsl.expected.glsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+fn g(a : i32, b : f32, c : f32, d : u32) {
+}
+
+struct In {
+  @builtin(position)
+  pos : vec4f,
+}
+
+@fragment
+fn f(@color(2) fbf_2 : vec4i, tint_symbol : In, @location(0) uv : vec4f, @color(0) fbf_0 : vec4u) {
+  g(fbf_2.z, tint_symbol.pos.x, uv.x, fbf_0.y);
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/d.wgsl:1:8 error: GLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/d.wgsl.expected.ir.spvasm b/test/tint/extensions/texel_fetch/additional_params/d.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..9ab80a4
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/d.wgsl.expected.ir.spvasm
@@ -0,0 +1,9 @@
+SKIP: FAILED
+
+../../src/tint/lang/wgsl/reader/program_to_ir/program_to_ir.cc:463 internal compiler error: TINT_UNIMPLEMENTED IR does not currently support texel fetch extension
+********************************************************************
+*  The tint shader compiler has encountered an unexpected error.   *
+*                                                                  *
+*  Please help us fix this issue by submitting a bug report at     *
+*  crbug.com/tint with the source program that triggered the bug.  *
+********************************************************************
diff --git a/test/tint/extensions/texel_fetch/additional_params/d.wgsl.expected.msl b/test/tint/extensions/texel_fetch/additional_params/d.wgsl.expected.msl
new file mode 100644
index 0000000..dc88585
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/d.wgsl.expected.msl
@@ -0,0 +1,26 @@
+#include <metal_stdlib>
+
+using namespace metal;
+void g(int a, float b, float c, uint d) {
+}
+
+struct In {
+  float4 pos;
+};
+
+struct tint_symbol_1 {
+  uint4 fbf_0 [[color(0)]];
+  int4 fbf_2 [[color(2)]];
+  float4 uv [[user(locn0)]];
+};
+
+void f_inner(int4 fbf_2, In in, float4 uv, uint4 fbf_0) {
+  g(fbf_2[2], in.pos[0], uv[0], fbf_0[1]);
+}
+
+fragment void f(float4 pos [[position]], tint_symbol_1 tint_symbol [[stage_in]]) {
+  In const tint_symbol_2 = {.pos=pos};
+  f_inner(tint_symbol.fbf_2, tint_symbol_2, tint_symbol.uv, tint_symbol.fbf_0);
+  return;
+}
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/d.wgsl.expected.spvasm b/test/tint/extensions/texel_fetch/additional_params/d.wgsl.expected.spvasm
new file mode 100644
index 0000000..fd3dc47
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/d.wgsl.expected.spvasm
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+fn g(a : i32, b : f32, c : f32, d : u32) {
+}
+
+struct In {
+  @builtin(position)
+  pos : vec4f,
+}
+
+@fragment
+fn f(@color(2) fbf_2 : vec4i, in : In, @location(0) uv : vec4f, @color(0) fbf_0 : vec4u) {
+  g(fbf_2.z, in.pos.x, uv.x, fbf_0.y);
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/d.wgsl:1:8 error: SPIR-V backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/d.wgsl.expected.wgsl b/test/tint/extensions/texel_fetch/additional_params/d.wgsl.expected.wgsl
new file mode 100644
index 0000000..30455a8
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/d.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable chromium_experimental_framebuffer_fetch;
+
+fn g(a : i32, b : f32, c : f32, d : u32) {
+}
+
+struct In {
+  @builtin(position)
+  pos : vec4f,
+}
+
+@fragment
+fn f(@color(2) fbf_2 : vec4i, in : In, @location(0) uv : vec4f, @color(0) fbf_0 : vec4u) {
+  g(fbf_2.z, in.pos.x, uv.x, fbf_0.y);
+}
diff --git a/test/tint/extensions/texel_fetch/additional_params/e.wgsl b/test/tint/extensions/texel_fetch/additional_params/e.wgsl
new file mode 100644
index 0000000..f8e825c
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/e.wgsl
@@ -0,0 +1,12 @@
+enable chromium_experimental_framebuffer_fetch;
+
+struct In {
+  @color(3) fbf : vec4i,
+  @builtin(position) pos : vec4f,
+}
+
+@fragment fn f(in : In) {
+  g(in.fbf.w, in.pos.x);
+}
+
+fn g(a : i32, b : f32) {}
diff --git a/test/tint/extensions/texel_fetch/additional_params/e.wgsl.expected.dxc.hlsl b/test/tint/extensions/texel_fetch/additional_params/e.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..11c7c51
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/e.wgsl.expected.dxc.hlsl
@@ -0,0 +1,24 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct In {
+  @color(3)
+  fbf : vec4i,
+  @builtin(position)
+  pos : vec4f,
+}
+
+@fragment
+fn f(tint_symbol : In) {
+  g(tint_symbol.fbf.w, tint_symbol.pos.x);
+}
+
+fn g(a : i32, b : f32) {
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/e.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/e.wgsl.expected.fxc.hlsl b/test/tint/extensions/texel_fetch/additional_params/e.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..11c7c51
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/e.wgsl.expected.fxc.hlsl
@@ -0,0 +1,24 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct In {
+  @color(3)
+  fbf : vec4i,
+  @builtin(position)
+  pos : vec4f,
+}
+
+@fragment
+fn f(tint_symbol : In) {
+  g(tint_symbol.fbf.w, tint_symbol.pos.x);
+}
+
+fn g(a : i32, b : f32) {
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/e.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/e.wgsl.expected.glsl b/test/tint/extensions/texel_fetch/additional_params/e.wgsl.expected.glsl
new file mode 100644
index 0000000..27921a9
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/e.wgsl.expected.glsl
@@ -0,0 +1,24 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct In {
+  @color(3)
+  fbf : vec4i,
+  @builtin(position)
+  pos : vec4f,
+}
+
+@fragment
+fn f(tint_symbol : In) {
+  g(tint_symbol.fbf.w, tint_symbol.pos.x);
+}
+
+fn g(a : i32, b : f32) {
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/e.wgsl:1:8 error: GLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/e.wgsl.expected.ir.spvasm b/test/tint/extensions/texel_fetch/additional_params/e.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..744df99
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/e.wgsl.expected.ir.spvasm
@@ -0,0 +1,63 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 30
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %f "f" %f_Input %f_position_Input
+               OpExecutionMode %f OriginUpperLeft
+               OpName %f_Input "f_Input"
+               OpName %f_position_Input "f_position_Input"
+               OpName %g "g"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %f_inner "f_inner"
+               OpMemberName %In 0 "fbf"
+               OpMemberName %In 1 "pos"
+               OpName %In "In"
+               OpName %in "in"
+               OpName %f "f"
+               OpDecorate %f_position_Input BuiltIn FragCoord
+               OpMemberDecorate %In 0 Offset 0
+               OpMemberDecorate %In 1 Offset 16
+        %int = OpTypeInt 32 1
+      %v4int = OpTypeVector %int 4
+%_ptr_Input_v4int = OpTypePointer Input %v4int
+    %f_Input = OpVariable %_ptr_Input_v4int Input
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%f_position_Input = OpVariable %_ptr_Input_v4float Input
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void %int %float
+         %In = OpTypeStruct %v4int %v4float
+         %18 = OpTypeFunction %void %In
+         %24 = OpTypeFunction %void
+          %g = OpFunction %void None %13
+          %a = OpFunctionParameter %int
+          %b = OpFunctionParameter %float
+         %14 = OpLabel
+               OpReturn
+               OpFunctionEnd
+    %f_inner = OpFunction %void None %18
+         %in = OpFunctionParameter %In
+         %19 = OpLabel
+         %20 = OpCompositeExtract %int %in 0 3
+         %21 = OpCompositeExtract %float %in 1 0
+         %22 = OpFunctionCall %void %g %20 %21
+               OpReturn
+               OpFunctionEnd
+          %f = OpFunction %void None %24
+         %25 = OpLabel
+         %26 = OpLoad %v4int %f_Input
+         %27 = OpLoad %v4float %f_position_Input
+         %28 = OpCompositeConstruct %In %26 %27
+         %29 = OpFunctionCall %void %f_inner %28
+               OpReturn
+               OpFunctionEnd
+1:1: [VUID-StandaloneSpirv-Flat-04744] Fragment OpEntryPoint operand 1 with Input interfaces with integer or float type must have a Flat decoration for Entry Point id 23.
+  %f_Input = OpVariable %_ptr_Input_v4int Input
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/e.wgsl.expected.msl b/test/tint/extensions/texel_fetch/additional_params/e.wgsl.expected.msl
new file mode 100644
index 0000000..a589874
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/e.wgsl.expected.msl
@@ -0,0 +1,25 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct In {
+  int4 fbf;
+  float4 pos;
+};
+
+struct tint_symbol_1 {
+  int4 fbf [[color(3)]];
+};
+
+void g(int a, float b) {
+}
+
+void f_inner(In in) {
+  g(in.fbf[3], in.pos[0]);
+}
+
+fragment void f(float4 pos [[position]], tint_symbol_1 tint_symbol [[stage_in]]) {
+  In const tint_symbol_2 = {.fbf=tint_symbol.fbf, .pos=pos};
+  f_inner(tint_symbol_2);
+  return;
+}
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/e.wgsl.expected.spvasm b/test/tint/extensions/texel_fetch/additional_params/e.wgsl.expected.spvasm
new file mode 100644
index 0000000..99999f3
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/e.wgsl.expected.spvasm
@@ -0,0 +1,24 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct In {
+  @color(3)
+  fbf : vec4i,
+  @builtin(position)
+  pos : vec4f,
+}
+
+@fragment
+fn f(in : In) {
+  g(in.fbf.w, in.pos.x);
+}
+
+fn g(a : i32, b : f32) {
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/e.wgsl:1:8 error: SPIR-V backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/e.wgsl.expected.wgsl b/test/tint/extensions/texel_fetch/additional_params/e.wgsl.expected.wgsl
new file mode 100644
index 0000000..cfe0281
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/e.wgsl.expected.wgsl
@@ -0,0 +1,16 @@
+enable chromium_experimental_framebuffer_fetch;
+
+struct In {
+  @color(3)
+  fbf : vec4i,
+  @builtin(position)
+  pos : vec4f,
+}
+
+@fragment
+fn f(in : In) {
+  g(in.fbf.w, in.pos.x);
+}
+
+fn g(a : i32, b : f32) {
+}
diff --git a/test/tint/extensions/texel_fetch/additional_params/f.wgsl b/test/tint/extensions/texel_fetch/additional_params/f.wgsl
new file mode 100644
index 0000000..f2ea210
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/f.wgsl
@@ -0,0 +1,11 @@
+enable chromium_experimental_framebuffer_fetch;
+
+struct In {
+  @invariant @builtin(position) pos : vec4f,
+}
+
+fn g(a : f32, b : f32) {}
+
+@fragment fn f(in : In, @color(2) fbf : vec4f) {
+  g(in.pos.x, fbf.g);
+}
diff --git a/test/tint/extensions/texel_fetch/additional_params/f.wgsl.expected.dxc.hlsl b/test/tint/extensions/texel_fetch/additional_params/f.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..a7c9651
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/f.wgsl.expected.dxc.hlsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct In {
+  @invariant @builtin(position)
+  pos : vec4f,
+}
+
+fn g(a : f32, b : f32) {
+}
+
+@fragment
+fn f(tint_symbol : In, @color(2) fbf : vec4f) {
+  g(tint_symbol.pos.x, fbf.g);
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/f.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/f.wgsl.expected.fxc.hlsl b/test/tint/extensions/texel_fetch/additional_params/f.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..a7c9651
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/f.wgsl.expected.fxc.hlsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct In {
+  @invariant @builtin(position)
+  pos : vec4f,
+}
+
+fn g(a : f32, b : f32) {
+}
+
+@fragment
+fn f(tint_symbol : In, @color(2) fbf : vec4f) {
+  g(tint_symbol.pos.x, fbf.g);
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/f.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/f.wgsl.expected.glsl b/test/tint/extensions/texel_fetch/additional_params/f.wgsl.expected.glsl
new file mode 100644
index 0000000..eba0419
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/f.wgsl.expected.glsl
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct In {
+  @invariant @builtin(position)
+  pos : vec4f,
+}
+
+fn g(a : f32, b : f32) {
+}
+
+@fragment
+fn f(tint_symbol : In, @color(2) fbf : vec4f) {
+  g(tint_symbol.pos.x, fbf.g);
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/f.wgsl:1:8 error: GLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/f.wgsl.expected.ir.spvasm b/test/tint/extensions/texel_fetch/additional_params/f.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..9ab80a4
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/f.wgsl.expected.ir.spvasm
@@ -0,0 +1,9 @@
+SKIP: FAILED
+
+../../src/tint/lang/wgsl/reader/program_to_ir/program_to_ir.cc:463 internal compiler error: TINT_UNIMPLEMENTED IR does not currently support texel fetch extension
+********************************************************************
+*  The tint shader compiler has encountered an unexpected error.   *
+*                                                                  *
+*  Please help us fix this issue by submitting a bug report at     *
+*  crbug.com/tint with the source program that triggered the bug.  *
+********************************************************************
diff --git a/test/tint/extensions/texel_fetch/additional_params/f.wgsl.expected.msl b/test/tint/extensions/texel_fetch/additional_params/f.wgsl.expected.msl
new file mode 100644
index 0000000..7d2e28a
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/f.wgsl.expected.msl
@@ -0,0 +1,24 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct In {
+  float4 pos;
+};
+
+void g(float a, float b) {
+}
+
+struct tint_symbol_1 {
+  float4 fbf [[color(2)]];
+};
+
+void f_inner(In in, float4 fbf) {
+  g(in.pos[0], fbf[1]);
+}
+
+fragment void f(float4 pos [[position]], tint_symbol_1 tint_symbol [[stage_in]]) {
+  In const tint_symbol_2 = {.pos=pos};
+  f_inner(tint_symbol_2, tint_symbol.fbf);
+  return;
+}
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/f.wgsl.expected.spvasm b/test/tint/extensions/texel_fetch/additional_params/f.wgsl.expected.spvasm
new file mode 100644
index 0000000..b7bd71e
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/f.wgsl.expected.spvasm
@@ -0,0 +1,22 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct In {
+  @invariant @builtin(position)
+  pos : vec4f,
+}
+
+fn g(a : f32, b : f32) {
+}
+
+@fragment
+fn f(in : In, @color(2) fbf : vec4f) {
+  g(in.pos.x, fbf.g);
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/f.wgsl:1:8 error: SPIR-V backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/f.wgsl.expected.wgsl b/test/tint/extensions/texel_fetch/additional_params/f.wgsl.expected.wgsl
new file mode 100644
index 0000000..7691f85
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/f.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable chromium_experimental_framebuffer_fetch;
+
+struct In {
+  @invariant @builtin(position)
+  pos : vec4f,
+}
+
+fn g(a : f32, b : f32) {
+}
+
+@fragment
+fn f(in : In, @color(2) fbf : vec4f) {
+  g(in.pos.x, fbf.g);
+}
diff --git a/test/tint/extensions/texel_fetch/additional_params/g.wgsl b/test/tint/extensions/texel_fetch/additional_params/g.wgsl
new file mode 100644
index 0000000..bbf3335
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/g.wgsl
@@ -0,0 +1,7 @@
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment fn f(@color(3) fbf : vec4f, @builtin(position) pos : vec4f) {
+  g(fbf.w, pos.x);
+}
+
+fn g(a : f32, b : f32) {}
diff --git a/test/tint/extensions/texel_fetch/additional_params/g.wgsl.expected.dxc.hlsl b/test/tint/extensions/texel_fetch/additional_params/g.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..3aed149
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/g.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@color(3) fbf : vec4f, @builtin(position) pos : vec4f) {
+  g(fbf.w, pos.x);
+}
+
+fn g(a : f32, b : f32) {
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/g.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/g.wgsl.expected.fxc.hlsl b/test/tint/extensions/texel_fetch/additional_params/g.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..3aed149
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/g.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@color(3) fbf : vec4f, @builtin(position) pos : vec4f) {
+  g(fbf.w, pos.x);
+}
+
+fn g(a : f32, b : f32) {
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/g.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/g.wgsl.expected.glsl b/test/tint/extensions/texel_fetch/additional_params/g.wgsl.expected.glsl
new file mode 100644
index 0000000..7dd5b30
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/g.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@color(3) fbf : vec4f, @builtin(position) pos : vec4f) {
+  g(fbf.w, pos.x);
+}
+
+fn g(a : f32, b : f32) {
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/g.wgsl:1:8 error: GLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/g.wgsl.expected.ir.spvasm b/test/tint/extensions/texel_fetch/additional_params/g.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..9ab80a4
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/g.wgsl.expected.ir.spvasm
@@ -0,0 +1,9 @@
+SKIP: FAILED
+
+../../src/tint/lang/wgsl/reader/program_to_ir/program_to_ir.cc:463 internal compiler error: TINT_UNIMPLEMENTED IR does not currently support texel fetch extension
+********************************************************************
+*  The tint shader compiler has encountered an unexpected error.   *
+*                                                                  *
+*  Please help us fix this issue by submitting a bug report at     *
+*  crbug.com/tint with the source program that triggered the bug.  *
+********************************************************************
diff --git a/test/tint/extensions/texel_fetch/additional_params/g.wgsl.expected.msl b/test/tint/extensions/texel_fetch/additional_params/g.wgsl.expected.msl
new file mode 100644
index 0000000..e097cea
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/g.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_symbol_1 {
+  float4 fbf [[color(3)]];
+};
+
+void g(float a, float b) {
+}
+
+void f_inner(float4 fbf, float4 pos) {
+  g(fbf[3], pos[0]);
+}
+
+fragment void f(float4 pos [[position]], tint_symbol_1 tint_symbol [[stage_in]]) {
+  f_inner(tint_symbol.fbf, pos);
+  return;
+}
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/g.wgsl.expected.spvasm b/test/tint/extensions/texel_fetch/additional_params/g.wgsl.expected.spvasm
new file mode 100644
index 0000000..cff04e1
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/g.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@color(3) fbf : vec4f, @builtin(position) pos : vec4f) {
+  g(fbf.w, pos.x);
+}
+
+fn g(a : f32, b : f32) {
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/g.wgsl:1:8 error: SPIR-V backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/g.wgsl.expected.wgsl b/test/tint/extensions/texel_fetch/additional_params/g.wgsl.expected.wgsl
new file mode 100644
index 0000000..6701f9e
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/g.wgsl.expected.wgsl
@@ -0,0 +1,9 @@
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@color(3) fbf : vec4f, @builtin(position) pos : vec4f) {
+  g(fbf.w, pos.x);
+}
+
+fn g(a : f32, b : f32) {
+}
diff --git a/test/tint/extensions/texel_fetch/additional_params/h.wgsl b/test/tint/extensions/texel_fetch/additional_params/h.wgsl
new file mode 100644
index 0000000..dc79549
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/h.wgsl
@@ -0,0 +1,12 @@
+enable chromium_experimental_framebuffer_fetch;
+
+struct FBF {
+  @color(1) c1 : vec4f,
+  @color(3) c3 : vec4i,
+}
+
+@fragment fn f(@invariant @builtin(position) pos : vec4f, fbf : FBF) {
+  g(fbf.c1.x, pos.y, fbf.c3.z);
+}
+
+fn g(a : f32, b : f32, c : i32) {}
diff --git a/test/tint/extensions/texel_fetch/additional_params/h.wgsl.expected.dxc.hlsl b/test/tint/extensions/texel_fetch/additional_params/h.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..664d484
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/h.wgsl.expected.dxc.hlsl
@@ -0,0 +1,24 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct FBF {
+  @color(1)
+  c1 : vec4f,
+  @color(3)
+  c3 : vec4i,
+}
+
+@fragment
+fn f(@invariant @builtin(position) pos : vec4f, fbf : FBF) {
+  g(fbf.c1.x, pos.y, fbf.c3.z);
+}
+
+fn g(a : f32, b : f32, c : i32) {
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/h.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/h.wgsl.expected.fxc.hlsl b/test/tint/extensions/texel_fetch/additional_params/h.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..664d484
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/h.wgsl.expected.fxc.hlsl
@@ -0,0 +1,24 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct FBF {
+  @color(1)
+  c1 : vec4f,
+  @color(3)
+  c3 : vec4i,
+}
+
+@fragment
+fn f(@invariant @builtin(position) pos : vec4f, fbf : FBF) {
+  g(fbf.c1.x, pos.y, fbf.c3.z);
+}
+
+fn g(a : f32, b : f32, c : i32) {
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/h.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/h.wgsl.expected.glsl b/test/tint/extensions/texel_fetch/additional_params/h.wgsl.expected.glsl
new file mode 100644
index 0000000..c286f7e
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/h.wgsl.expected.glsl
@@ -0,0 +1,24 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct FBF {
+  @color(1)
+  c1 : vec4f,
+  @color(3)
+  c3 : vec4i,
+}
+
+@fragment
+fn f(@invariant @builtin(position) pos : vec4f, fbf : FBF) {
+  g(fbf.c1.x, pos.y, fbf.c3.z);
+}
+
+fn g(a : f32, b : f32, c : i32) {
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/h.wgsl:1:8 error: GLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/h.wgsl.expected.ir.spvasm b/test/tint/extensions/texel_fetch/additional_params/h.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..aa0dbfa
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/h.wgsl.expected.ir.spvasm
@@ -0,0 +1,72 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 35
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %f "f" %f_position_Input %f_Input %f_Input_0
+               OpExecutionMode %f OriginUpperLeft
+               OpName %f_position_Input "f_position_Input"
+               OpName %f_Input "f_Input"
+               OpName %f_Input_0 "f_Input"
+               OpName %g "g"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %f_inner "f_inner"
+               OpName %pos "pos"
+               OpMemberName %FBF 0 "c1"
+               OpMemberName %FBF 1 "c3"
+               OpName %FBF "FBF"
+               OpName %fbf "fbf"
+               OpName %f "f"
+               OpDecorate %f_position_Input BuiltIn FragCoord
+               OpDecorate %f_position_Input Invariant
+               OpMemberDecorate %FBF 0 Offset 0
+               OpMemberDecorate %FBF 1 Offset 16
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%f_position_Input = OpVariable %_ptr_Input_v4float Input
+    %f_Input = OpVariable %_ptr_Input_v4float Input
+        %int = OpTypeInt 32 1
+      %v4int = OpTypeVector %int 4
+%_ptr_Input_v4int = OpTypePointer Input %v4int
+  %f_Input_0 = OpVariable %_ptr_Input_v4int Input
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void %float %float %int
+        %FBF = OpTypeStruct %v4float %v4int
+         %21 = OpTypeFunction %void %v4float %FBF
+         %28 = OpTypeFunction %void
+          %g = OpFunction %void None %15
+          %a = OpFunctionParameter %float
+          %b = OpFunctionParameter %float
+          %c = OpFunctionParameter %int
+         %16 = OpLabel
+               OpReturn
+               OpFunctionEnd
+    %f_inner = OpFunction %void None %21
+        %pos = OpFunctionParameter %v4float
+        %fbf = OpFunctionParameter %FBF
+         %22 = OpLabel
+         %23 = OpCompositeExtract %float %fbf 0 0
+         %24 = OpCompositeExtract %float %pos 1
+         %25 = OpCompositeExtract %int %fbf 1 2
+         %26 = OpFunctionCall %void %g %23 %24 %25
+               OpReturn
+               OpFunctionEnd
+          %f = OpFunction %void None %28
+         %29 = OpLabel
+         %30 = OpLoad %v4float %f_position_Input
+         %31 = OpLoad %v4float %f_Input
+         %32 = OpLoad %v4int %f_Input_0
+         %33 = OpCompositeConstruct %FBF %31 %32
+         %34 = OpFunctionCall %void %f_inner %30 %33
+               OpReturn
+               OpFunctionEnd
+1:1: [VUID-StandaloneSpirv-Flat-04744] Fragment OpEntryPoint operand 6 with Input interfaces with integer or float type must have a Flat decoration for Entry Point id 27.
+  %f_Input_0 = OpVariable %_ptr_Input_v4int Input
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/h.wgsl.expected.msl b/test/tint/extensions/texel_fetch/additional_params/h.wgsl.expected.msl
new file mode 100644
index 0000000..5ccc5c8
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/h.wgsl.expected.msl
@@ -0,0 +1,26 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct FBF {
+  float4 c1;
+  int4 c3;
+};
+
+struct tint_symbol_1 {
+  float4 c1 [[color(1)]];
+  int4 c3 [[color(3)]];
+};
+
+void g(float a, float b, int c) {
+}
+
+void f_inner(float4 pos, FBF fbf) {
+  g(fbf.c1[0], pos[1], fbf.c3[2]);
+}
+
+fragment void f(float4 pos [[position]], tint_symbol_1 tint_symbol [[stage_in]]) {
+  FBF const tint_symbol_2 = {.c1=tint_symbol.c1, .c3=tint_symbol.c3};
+  f_inner(pos, tint_symbol_2);
+  return;
+}
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/h.wgsl.expected.spvasm b/test/tint/extensions/texel_fetch/additional_params/h.wgsl.expected.spvasm
new file mode 100644
index 0000000..2870e8b
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/h.wgsl.expected.spvasm
@@ -0,0 +1,24 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct FBF {
+  @color(1)
+  c1 : vec4f,
+  @color(3)
+  c3 : vec4i,
+}
+
+@fragment
+fn f(@invariant @builtin(position) pos : vec4f, fbf : FBF) {
+  g(fbf.c1.x, pos.y, fbf.c3.z);
+}
+
+fn g(a : f32, b : f32, c : i32) {
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/h.wgsl:1:8 error: SPIR-V backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/h.wgsl.expected.wgsl b/test/tint/extensions/texel_fetch/additional_params/h.wgsl.expected.wgsl
new file mode 100644
index 0000000..19f94d5
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/h.wgsl.expected.wgsl
@@ -0,0 +1,16 @@
+enable chromium_experimental_framebuffer_fetch;
+
+struct FBF {
+  @color(1)
+  c1 : vec4f,
+  @color(3)
+  c3 : vec4i,
+}
+
+@fragment
+fn f(@invariant @builtin(position) pos : vec4f, fbf : FBF) {
+  g(fbf.c1.x, pos.y, fbf.c3.z);
+}
+
+fn g(a : f32, b : f32, c : i32) {
+}
diff --git a/test/tint/extensions/texel_fetch/additional_params/i.wgsl b/test/tint/extensions/texel_fetch/additional_params/i.wgsl
new file mode 100644
index 0000000..6c90ae1
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/i.wgsl
@@ -0,0 +1,13 @@
+enable chromium_experimental_framebuffer_fetch;
+
+struct In {
+  @location(0) a : vec4f,
+  @interpolate(flat) @location(1) b : vec4f,
+  @color(1) fbf : vec4i,
+}
+
+@fragment fn f(in : In) {
+  g(in.a.x, in.b.y, in.fbf.x);
+}
+
+fn g(a : f32, b : f32, c : i32) {}
diff --git a/test/tint/extensions/texel_fetch/additional_params/i.wgsl.expected.dxc.hlsl b/test/tint/extensions/texel_fetch/additional_params/i.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..8920f28
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/i.wgsl.expected.dxc.hlsl
@@ -0,0 +1,26 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct In {
+  @location(0)
+  a : vec4f,
+  @interpolate(flat) @location(1)
+  b : vec4f,
+  @color(1)
+  fbf : vec4i,
+}
+
+@fragment
+fn f(tint_symbol : In) {
+  g(tint_symbol.a.x, tint_symbol.b.y, tint_symbol.fbf.x);
+}
+
+fn g(a : f32, b : f32, c : i32) {
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/i.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/i.wgsl.expected.fxc.hlsl b/test/tint/extensions/texel_fetch/additional_params/i.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..8920f28
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/i.wgsl.expected.fxc.hlsl
@@ -0,0 +1,26 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct In {
+  @location(0)
+  a : vec4f,
+  @interpolate(flat) @location(1)
+  b : vec4f,
+  @color(1)
+  fbf : vec4i,
+}
+
+@fragment
+fn f(tint_symbol : In) {
+  g(tint_symbol.a.x, tint_symbol.b.y, tint_symbol.fbf.x);
+}
+
+fn g(a : f32, b : f32, c : i32) {
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/i.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/i.wgsl.expected.glsl b/test/tint/extensions/texel_fetch/additional_params/i.wgsl.expected.glsl
new file mode 100644
index 0000000..b67cdd4
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/i.wgsl.expected.glsl
@@ -0,0 +1,26 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct In {
+  @location(0)
+  a : vec4f,
+  @interpolate(flat) @location(1)
+  b : vec4f,
+  @color(1)
+  fbf : vec4i,
+}
+
+@fragment
+fn f(tint_symbol : In) {
+  g(tint_symbol.a.x, tint_symbol.b.y, tint_symbol.fbf.x);
+}
+
+fn g(a : f32, b : f32, c : i32) {
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/i.wgsl:1:8 error: GLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/i.wgsl.expected.ir.spvasm b/test/tint/extensions/texel_fetch/additional_params/i.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..8ea6617
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/i.wgsl.expected.ir.spvasm
@@ -0,0 +1,73 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 34
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %f "f" %f_loc0_Input %f_loc1_Input %f_Input
+               OpExecutionMode %f OriginUpperLeft
+               OpName %f_loc0_Input "f_loc0_Input"
+               OpName %f_loc1_Input "f_loc1_Input"
+               OpName %f_Input "f_Input"
+               OpName %g "g"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %f_inner "f_inner"
+               OpMemberName %In 0 "a"
+               OpMemberName %In 1 "b"
+               OpMemberName %In 2 "fbf"
+               OpName %In "In"
+               OpName %in "in"
+               OpName %f "f"
+               OpDecorate %f_loc0_Input Location 0
+               OpDecorate %f_loc1_Input Location 1
+               OpDecorate %f_loc1_Input Flat
+               OpMemberDecorate %In 0 Offset 0
+               OpMemberDecorate %In 1 Offset 16
+               OpMemberDecorate %In 2 Offset 32
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%f_loc0_Input = OpVariable %_ptr_Input_v4float Input
+%f_loc1_Input = OpVariable %_ptr_Input_v4float Input
+        %int = OpTypeInt 32 1
+      %v4int = OpTypeVector %int 4
+%_ptr_Input_v4int = OpTypePointer Input %v4int
+    %f_Input = OpVariable %_ptr_Input_v4int Input
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void %float %float %int
+         %In = OpTypeStruct %v4float %v4float %v4int
+         %20 = OpTypeFunction %void %In
+         %27 = OpTypeFunction %void
+          %g = OpFunction %void None %15
+          %a = OpFunctionParameter %float
+          %b = OpFunctionParameter %float
+          %c = OpFunctionParameter %int
+         %16 = OpLabel
+               OpReturn
+               OpFunctionEnd
+    %f_inner = OpFunction %void None %20
+         %in = OpFunctionParameter %In
+         %21 = OpLabel
+         %22 = OpCompositeExtract %float %in 0 0
+         %23 = OpCompositeExtract %float %in 1 1
+         %24 = OpCompositeExtract %int %in 2 0
+         %25 = OpFunctionCall %void %g %22 %23 %24
+               OpReturn
+               OpFunctionEnd
+          %f = OpFunction %void None %27
+         %28 = OpLabel
+         %29 = OpLoad %v4float %f_loc0_Input
+         %30 = OpLoad %v4float %f_loc1_Input
+         %31 = OpLoad %v4int %f_Input
+         %32 = OpCompositeConstruct %In %29 %30 %31
+         %33 = OpFunctionCall %void %f_inner %32
+               OpReturn
+               OpFunctionEnd
+1:1: [VUID-StandaloneSpirv-Flat-04744] Fragment OpEntryPoint operand 6 with Input interfaces with integer or float type must have a Flat decoration for Entry Point id 26.
+  %f_Input = OpVariable %_ptr_Input_v4int Input
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/i.wgsl.expected.msl b/test/tint/extensions/texel_fetch/additional_params/i.wgsl.expected.msl
new file mode 100644
index 0000000..b520c20
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/i.wgsl.expected.msl
@@ -0,0 +1,28 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct In {
+  float4 a;
+  float4 b;
+  int4 fbf;
+};
+
+struct tint_symbol_1 {
+  int4 fbf [[color(1)]];
+  float4 a [[user(locn0)]];
+  float4 b [[user(locn1)]] [[flat]];
+};
+
+void g(float a, float b, int c) {
+}
+
+void f_inner(In in) {
+  g(in.a[0], in.b[1], in.fbf[0]);
+}
+
+fragment void f(tint_symbol_1 tint_symbol [[stage_in]]) {
+  In const tint_symbol_2 = {.a=tint_symbol.a, .b=tint_symbol.b, .fbf=tint_symbol.fbf};
+  f_inner(tint_symbol_2);
+  return;
+}
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/i.wgsl.expected.spvasm b/test/tint/extensions/texel_fetch/additional_params/i.wgsl.expected.spvasm
new file mode 100644
index 0000000..914f34d
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/i.wgsl.expected.spvasm
@@ -0,0 +1,26 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct In {
+  @location(0)
+  a : vec4f,
+  @interpolate(flat) @location(1)
+  b : vec4f,
+  @color(1)
+  fbf : vec4i,
+}
+
+@fragment
+fn f(in : In) {
+  g(in.a.x, in.b.y, in.fbf.x);
+}
+
+fn g(a : f32, b : f32, c : i32) {
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/i.wgsl:1:8 error: SPIR-V backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/i.wgsl.expected.wgsl b/test/tint/extensions/texel_fetch/additional_params/i.wgsl.expected.wgsl
new file mode 100644
index 0000000..363209a
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/i.wgsl.expected.wgsl
@@ -0,0 +1,18 @@
+enable chromium_experimental_framebuffer_fetch;
+
+struct In {
+  @location(0)
+  a : vec4f,
+  @interpolate(flat) @location(1)
+  b : vec4f,
+  @color(1)
+  fbf : vec4i,
+}
+
+@fragment
+fn f(in : In) {
+  g(in.a.x, in.b.y, in.fbf.x);
+}
+
+fn g(a : f32, b : f32, c : i32) {
+}
diff --git a/test/tint/extensions/texel_fetch/additional_params/j.wgsl b/test/tint/extensions/texel_fetch/additional_params/j.wgsl
new file mode 100644
index 0000000..3d2df70
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/j.wgsl
@@ -0,0 +1,7 @@
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment fn f(@location(0) a : vec4f, @interpolate(flat) @location(1) b : vec4f, @color(0) fbf : vec4f) {
+  g(a.x, b.y, fbf.x);
+}
+
+fn g(a : f32, b : f32, c : f32) {}
diff --git a/test/tint/extensions/texel_fetch/additional_params/j.wgsl.expected.dxc.hlsl b/test/tint/extensions/texel_fetch/additional_params/j.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..13c910f
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/j.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@location(0) a : vec4f, @interpolate(flat) @location(1) b : vec4f, @color(0) fbf : vec4f) {
+  g(a.x, b.y, fbf.x);
+}
+
+fn g(a : f32, b : f32, c : f32) {
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/j.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/j.wgsl.expected.fxc.hlsl b/test/tint/extensions/texel_fetch/additional_params/j.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..13c910f
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/j.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@location(0) a : vec4f, @interpolate(flat) @location(1) b : vec4f, @color(0) fbf : vec4f) {
+  g(a.x, b.y, fbf.x);
+}
+
+fn g(a : f32, b : f32, c : f32) {
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/j.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/j.wgsl.expected.glsl b/test/tint/extensions/texel_fetch/additional_params/j.wgsl.expected.glsl
new file mode 100644
index 0000000..e27f1e7
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/j.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@location(0) a : vec4f, @interpolate(flat) @location(1) b : vec4f, @color(0) fbf : vec4f) {
+  g(a.x, b.y, fbf.x);
+}
+
+fn g(a : f32, b : f32, c : f32) {
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/j.wgsl:1:8 error: GLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/j.wgsl.expected.ir.spvasm b/test/tint/extensions/texel_fetch/additional_params/j.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..9ab80a4
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/j.wgsl.expected.ir.spvasm
@@ -0,0 +1,9 @@
+SKIP: FAILED
+
+../../src/tint/lang/wgsl/reader/program_to_ir/program_to_ir.cc:463 internal compiler error: TINT_UNIMPLEMENTED IR does not currently support texel fetch extension
+********************************************************************
+*  The tint shader compiler has encountered an unexpected error.   *
+*                                                                  *
+*  Please help us fix this issue by submitting a bug report at     *
+*  crbug.com/tint with the source program that triggered the bug.  *
+********************************************************************
diff --git a/test/tint/extensions/texel_fetch/additional_params/j.wgsl.expected.msl b/test/tint/extensions/texel_fetch/additional_params/j.wgsl.expected.msl
new file mode 100644
index 0000000..8316d8f
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/j.wgsl.expected.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_symbol_1 {
+  float4 fbf [[color(0)]];
+  float4 a [[user(locn0)]];
+  float4 b [[user(locn1)]] [[flat]];
+};
+
+void g(float a, float b, float c) {
+}
+
+void f_inner(float4 a, float4 b, float4 fbf) {
+  g(a[0], b[1], fbf[0]);
+}
+
+fragment void f(tint_symbol_1 tint_symbol [[stage_in]]) {
+  f_inner(tint_symbol.a, tint_symbol.b, tint_symbol.fbf);
+  return;
+}
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/j.wgsl.expected.spvasm b/test/tint/extensions/texel_fetch/additional_params/j.wgsl.expected.spvasm
new file mode 100644
index 0000000..cfdd418
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/j.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@location(0) a : vec4f, @interpolate(flat) @location(1) b : vec4f, @color(0) fbf : vec4f) {
+  g(a.x, b.y, fbf.x);
+}
+
+fn g(a : f32, b : f32, c : f32) {
+}
+
+Failed to generate: extensions/texel_fetch/additional_params/j.wgsl:1:8 error: SPIR-V backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/additional_params/j.wgsl.expected.wgsl b/test/tint/extensions/texel_fetch/additional_params/j.wgsl.expected.wgsl
new file mode 100644
index 0000000..d6d0379
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/additional_params/j.wgsl.expected.wgsl
@@ -0,0 +1,9 @@
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@location(0) a : vec4f, @interpolate(flat) @location(1) b : vec4f, @color(0) fbf : vec4f) {
+  g(a.x, b.y, fbf.x);
+}
+
+fn g(a : f32, b : f32, c : f32) {
+}
diff --git a/test/tint/extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl b/test/tint/extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl
new file mode 100644
index 0000000..d88872c
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl
@@ -0,0 +1,11 @@
+enable chromium_experimental_framebuffer_fetch;
+
+struct Out {
+  @location(0) x : vec4f,
+  @location(2) y : vec4f,
+  @location(4) z : vec4f,
+}
+
+@fragment fn f(@color(1) fbf_1 : vec4f, @color(3) fbf_3 : vec4f) -> Out {
+  return Out(fbf_1, vec4f(20), fbf_3);
+}
diff --git a/test/tint/extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl.expected.dxc.hlsl b/test/tint/extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..fd054d5
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl.expected.dxc.hlsl
@@ -0,0 +1,23 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct Out {
+  @location(0)
+  x : vec4f,
+  @location(2)
+  y : vec4f,
+  @location(4)
+  z : vec4f,
+}
+
+@fragment
+fn f(@color(1) fbf_1 : vec4f, @color(3) fbf_3 : vec4f) -> Out {
+  return Out(fbf_1, vec4f(20), fbf_3);
+}
+
+Failed to generate: extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl.expected.fxc.hlsl b/test/tint/extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..fd054d5
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl.expected.fxc.hlsl
@@ -0,0 +1,23 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct Out {
+  @location(0)
+  x : vec4f,
+  @location(2)
+  y : vec4f,
+  @location(4)
+  z : vec4f,
+}
+
+@fragment
+fn f(@color(1) fbf_1 : vec4f, @color(3) fbf_3 : vec4f) -> Out {
+  return Out(fbf_1, vec4f(20), fbf_3);
+}
+
+Failed to generate: extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl.expected.glsl b/test/tint/extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl.expected.glsl
new file mode 100644
index 0000000..b5f4820
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl.expected.glsl
@@ -0,0 +1,23 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct Out {
+  @location(0)
+  x : vec4f,
+  @location(2)
+  y : vec4f,
+  @location(4)
+  z : vec4f,
+}
+
+@fragment
+fn f(@color(1) fbf_1 : vec4f, @color(3) fbf_3 : vec4f) -> Out {
+  return Out(fbf_1, vec4f(20), fbf_3);
+}
+
+Failed to generate: extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl:1:8 error: GLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl.expected.ir.spvasm b/test/tint/extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..9ab80a4
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl.expected.ir.spvasm
@@ -0,0 +1,9 @@
+SKIP: FAILED
+
+../../src/tint/lang/wgsl/reader/program_to_ir/program_to_ir.cc:463 internal compiler error: TINT_UNIMPLEMENTED IR does not currently support texel fetch extension
+********************************************************************
+*  The tint shader compiler has encountered an unexpected error.   *
+*                                                                  *
+*  Please help us fix this issue by submitting a bug report at     *
+*  crbug.com/tint with the source program that triggered the bug.  *
+********************************************************************
diff --git a/test/tint/extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl.expected.msl b/test/tint/extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl.expected.msl
new file mode 100644
index 0000000..da10707
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl.expected.msl
@@ -0,0 +1,34 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct Out {
+  float4 x;
+  float4 y;
+  float4 z;
+};
+
+struct tint_symbol_1 {
+  float4 fbf_1 [[color(1)]];
+  float4 fbf_3 [[color(3)]];
+};
+
+struct tint_symbol_2 {
+  float4 x [[color(0)]];
+  float4 y [[color(2)]];
+  float4 z [[color(4)]];
+};
+
+Out f_inner(float4 fbf_1, float4 fbf_3) {
+  Out const tint_symbol_3 = {.x=fbf_1, .y=float4(20.0f), .z=fbf_3};
+  return tint_symbol_3;
+}
+
+fragment tint_symbol_2 f(tint_symbol_1 tint_symbol [[stage_in]]) {
+  Out const inner_result = f_inner(tint_symbol.fbf_1, tint_symbol.fbf_3);
+  tint_symbol_2 wrapper_result = {};
+  wrapper_result.x = inner_result.x;
+  wrapper_result.y = inner_result.y;
+  wrapper_result.z = inner_result.z;
+  return wrapper_result;
+}
+
diff --git a/test/tint/extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl.expected.spvasm b/test/tint/extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl.expected.spvasm
new file mode 100644
index 0000000..1e459a3
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct Out {
+  @location(0)
+  x : vec4f,
+  @location(2)
+  y : vec4f,
+  @location(4)
+  z : vec4f,
+}
+
+@fragment
+fn f(@color(1) fbf_1 : vec4f, @color(3) fbf_3 : vec4f) -> Out {
+  return Out(fbf_1, vec4f(20), fbf_3);
+}
+
+Failed to generate: extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl:1:8 error: SPIR-V backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl.expected.wgsl b/test/tint/extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl.expected.wgsl
new file mode 100644
index 0000000..aa428a8
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/multiple_outputs/multiple_inputs.wgsl.expected.wgsl
@@ -0,0 +1,15 @@
+enable chromium_experimental_framebuffer_fetch;
+
+struct Out {
+  @location(0)
+  x : vec4f,
+  @location(2)
+  y : vec4f,
+  @location(4)
+  z : vec4f,
+}
+
+@fragment
+fn f(@color(1) fbf_1 : vec4f, @color(3) fbf_3 : vec4f) -> Out {
+  return Out(fbf_1, vec4f(20), fbf_3);
+}
diff --git a/test/tint/extensions/texel_fetch/multiple_outputs/single_input.wgsl b/test/tint/extensions/texel_fetch/multiple_outputs/single_input.wgsl
new file mode 100644
index 0000000..4205e58
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/multiple_outputs/single_input.wgsl
@@ -0,0 +1,11 @@
+enable chromium_experimental_framebuffer_fetch;
+
+struct Out {
+  @location(0) x : vec4f,
+  @location(2) y : vec4f,
+  @location(3) z : vec4f,
+}
+
+@fragment fn f(@color(0) fbf : vec4f) -> Out {
+  return Out(vec4f(10), fbf, vec4f(30));
+}
diff --git a/test/tint/extensions/texel_fetch/multiple_outputs/single_input.wgsl.expected.dxc.hlsl b/test/tint/extensions/texel_fetch/multiple_outputs/single_input.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..2b24196
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/multiple_outputs/single_input.wgsl.expected.dxc.hlsl
@@ -0,0 +1,23 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct Out {
+  @location(0)
+  x : vec4f,
+  @location(2)
+  y : vec4f,
+  @location(3)
+  z : vec4f,
+}
+
+@fragment
+fn f(@color(0) fbf : vec4f) -> Out {
+  return Out(vec4f(10), fbf, vec4f(30));
+}
+
+Failed to generate: extensions/texel_fetch/multiple_outputs/single_input.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/multiple_outputs/single_input.wgsl.expected.fxc.hlsl b/test/tint/extensions/texel_fetch/multiple_outputs/single_input.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..2b24196
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/multiple_outputs/single_input.wgsl.expected.fxc.hlsl
@@ -0,0 +1,23 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct Out {
+  @location(0)
+  x : vec4f,
+  @location(2)
+  y : vec4f,
+  @location(3)
+  z : vec4f,
+}
+
+@fragment
+fn f(@color(0) fbf : vec4f) -> Out {
+  return Out(vec4f(10), fbf, vec4f(30));
+}
+
+Failed to generate: extensions/texel_fetch/multiple_outputs/single_input.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/multiple_outputs/single_input.wgsl.expected.glsl b/test/tint/extensions/texel_fetch/multiple_outputs/single_input.wgsl.expected.glsl
new file mode 100644
index 0000000..7c55049
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/multiple_outputs/single_input.wgsl.expected.glsl
@@ -0,0 +1,23 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct Out {
+  @location(0)
+  x : vec4f,
+  @location(2)
+  y : vec4f,
+  @location(3)
+  z : vec4f,
+}
+
+@fragment
+fn f(@color(0) fbf : vec4f) -> Out {
+  return Out(vec4f(10), fbf, vec4f(30));
+}
+
+Failed to generate: extensions/texel_fetch/multiple_outputs/single_input.wgsl:1:8 error: GLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/multiple_outputs/single_input.wgsl.expected.ir.spvasm b/test/tint/extensions/texel_fetch/multiple_outputs/single_input.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..9ab80a4
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/multiple_outputs/single_input.wgsl.expected.ir.spvasm
@@ -0,0 +1,9 @@
+SKIP: FAILED
+
+../../src/tint/lang/wgsl/reader/program_to_ir/program_to_ir.cc:463 internal compiler error: TINT_UNIMPLEMENTED IR does not currently support texel fetch extension
+********************************************************************
+*  The tint shader compiler has encountered an unexpected error.   *
+*                                                                  *
+*  Please help us fix this issue by submitting a bug report at     *
+*  crbug.com/tint with the source program that triggered the bug.  *
+********************************************************************
diff --git a/test/tint/extensions/texel_fetch/multiple_outputs/single_input.wgsl.expected.msl b/test/tint/extensions/texel_fetch/multiple_outputs/single_input.wgsl.expected.msl
new file mode 100644
index 0000000..e6176a5
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/multiple_outputs/single_input.wgsl.expected.msl
@@ -0,0 +1,33 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct Out {
+  float4 x;
+  float4 y;
+  float4 z;
+};
+
+struct tint_symbol_1 {
+  float4 fbf [[color(0)]];
+};
+
+struct tint_symbol_2 {
+  float4 x [[color(0)]];
+  float4 y [[color(2)]];
+  float4 z [[color(3)]];
+};
+
+Out f_inner(float4 fbf) {
+  Out const tint_symbol_3 = {.x=float4(10.0f), .y=fbf, .z=float4(30.0f)};
+  return tint_symbol_3;
+}
+
+fragment tint_symbol_2 f(tint_symbol_1 tint_symbol [[stage_in]]) {
+  Out const inner_result = f_inner(tint_symbol.fbf);
+  tint_symbol_2 wrapper_result = {};
+  wrapper_result.x = inner_result.x;
+  wrapper_result.y = inner_result.y;
+  wrapper_result.z = inner_result.z;
+  return wrapper_result;
+}
+
diff --git a/test/tint/extensions/texel_fetch/multiple_outputs/single_input.wgsl.expected.spvasm b/test/tint/extensions/texel_fetch/multiple_outputs/single_input.wgsl.expected.spvasm
new file mode 100644
index 0000000..d4cad14
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/multiple_outputs/single_input.wgsl.expected.spvasm
@@ -0,0 +1,23 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+struct Out {
+  @location(0)
+  x : vec4f,
+  @location(2)
+  y : vec4f,
+  @location(3)
+  z : vec4f,
+}
+
+@fragment
+fn f(@color(0) fbf : vec4f) -> Out {
+  return Out(vec4f(10), fbf, vec4f(30));
+}
+
+Failed to generate: extensions/texel_fetch/multiple_outputs/single_input.wgsl:1:8 error: SPIR-V backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/multiple_outputs/single_input.wgsl.expected.wgsl b/test/tint/extensions/texel_fetch/multiple_outputs/single_input.wgsl.expected.wgsl
new file mode 100644
index 0000000..5326e5a
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/multiple_outputs/single_input.wgsl.expected.wgsl
@@ -0,0 +1,15 @@
+enable chromium_experimental_framebuffer_fetch;
+
+struct Out {
+  @location(0)
+  x : vec4f,
+  @location(2)
+  y : vec4f,
+  @location(3)
+  z : vec4f,
+}
+
+@fragment
+fn f(@color(0) fbf : vec4f) -> Out {
+  return Out(vec4f(10), fbf, vec4f(30));
+}
diff --git a/test/tint/extensions/texel_fetch/one_output/multiple_inputs.wgsl b/test/tint/extensions/texel_fetch/one_output/multiple_inputs.wgsl
new file mode 100644
index 0000000..df955ab
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/one_output/multiple_inputs.wgsl
@@ -0,0 +1,5 @@
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment fn f(@color(1) fbf_1 : vec4f, @color(3) fbf_3 : vec4f) -> @location(0) vec4f {
+  return fbf_1 + fbf_3;
+}
diff --git a/test/tint/extensions/texel_fetch/one_output/multiple_inputs.wgsl.expected.dxc.hlsl b/test/tint/extensions/texel_fetch/one_output/multiple_inputs.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..5738e9c
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/one_output/multiple_inputs.wgsl.expected.dxc.hlsl
@@ -0,0 +1,14 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@color(1) fbf_1 : vec4f, @color(3) fbf_3 : vec4f) -> @location(0) vec4f {
+  return (fbf_1 + fbf_3);
+}
+
+Failed to generate: extensions/texel_fetch/one_output/multiple_inputs.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/one_output/multiple_inputs.wgsl.expected.fxc.hlsl b/test/tint/extensions/texel_fetch/one_output/multiple_inputs.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..5738e9c
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/one_output/multiple_inputs.wgsl.expected.fxc.hlsl
@@ -0,0 +1,14 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@color(1) fbf_1 : vec4f, @color(3) fbf_3 : vec4f) -> @location(0) vec4f {
+  return (fbf_1 + fbf_3);
+}
+
+Failed to generate: extensions/texel_fetch/one_output/multiple_inputs.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/one_output/multiple_inputs.wgsl.expected.glsl b/test/tint/extensions/texel_fetch/one_output/multiple_inputs.wgsl.expected.glsl
new file mode 100644
index 0000000..2626d64
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/one_output/multiple_inputs.wgsl.expected.glsl
@@ -0,0 +1,14 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@color(1) fbf_1 : vec4f, @color(3) fbf_3 : vec4f) -> @location(0) vec4f {
+  return (fbf_1 + fbf_3);
+}
+
+Failed to generate: extensions/texel_fetch/one_output/multiple_inputs.wgsl:1:8 error: GLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/one_output/multiple_inputs.wgsl.expected.ir.spvasm b/test/tint/extensions/texel_fetch/one_output/multiple_inputs.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..9ab80a4
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/one_output/multiple_inputs.wgsl.expected.ir.spvasm
@@ -0,0 +1,9 @@
+SKIP: FAILED
+
+../../src/tint/lang/wgsl/reader/program_to_ir/program_to_ir.cc:463 internal compiler error: TINT_UNIMPLEMENTED IR does not currently support texel fetch extension
+********************************************************************
+*  The tint shader compiler has encountered an unexpected error.   *
+*                                                                  *
+*  Please help us fix this issue by submitting a bug report at     *
+*  crbug.com/tint with the source program that triggered the bug.  *
+********************************************************************
diff --git a/test/tint/extensions/texel_fetch/one_output/multiple_inputs.wgsl.expected.msl b/test/tint/extensions/texel_fetch/one_output/multiple_inputs.wgsl.expected.msl
new file mode 100644
index 0000000..158fe48
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/one_output/multiple_inputs.wgsl.expected.msl
@@ -0,0 +1,23 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_symbol_1 {
+  float4 fbf_1 [[color(1)]];
+  float4 fbf_3 [[color(3)]];
+};
+
+struct tint_symbol_2 {
+  float4 value [[color(0)]];
+};
+
+float4 f_inner(float4 fbf_1, float4 fbf_3) {
+  return (fbf_1 + fbf_3);
+}
+
+fragment tint_symbol_2 f(tint_symbol_1 tint_symbol [[stage_in]]) {
+  float4 const inner_result = f_inner(tint_symbol.fbf_1, tint_symbol.fbf_3);
+  tint_symbol_2 wrapper_result = {};
+  wrapper_result.value = inner_result;
+  return wrapper_result;
+}
+
diff --git a/test/tint/extensions/texel_fetch/one_output/multiple_inputs.wgsl.expected.spvasm b/test/tint/extensions/texel_fetch/one_output/multiple_inputs.wgsl.expected.spvasm
new file mode 100644
index 0000000..cef34e2
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/one_output/multiple_inputs.wgsl.expected.spvasm
@@ -0,0 +1,14 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@color(1) fbf_1 : vec4f, @color(3) fbf_3 : vec4f) -> @location(0) vec4f {
+  return (fbf_1 + fbf_3);
+}
+
+Failed to generate: extensions/texel_fetch/one_output/multiple_inputs.wgsl:1:8 error: SPIR-V backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/one_output/multiple_inputs.wgsl.expected.wgsl b/test/tint/extensions/texel_fetch/one_output/multiple_inputs.wgsl.expected.wgsl
new file mode 100644
index 0000000..54fbed3
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/one_output/multiple_inputs.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@color(1) fbf_1 : vec4f, @color(3) fbf_3 : vec4f) -> @location(0) vec4f {
+  return (fbf_1 + fbf_3);
+}
diff --git a/test/tint/extensions/texel_fetch/one_output/single_input.wgsl b/test/tint/extensions/texel_fetch/one_output/single_input.wgsl
new file mode 100644
index 0000000..0dc6592
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/one_output/single_input.wgsl
@@ -0,0 +1,5 @@
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment fn f(@color(0) fbf : vec4f) -> @location(0) vec4f {
+  return fbf;
+}
diff --git a/test/tint/extensions/texel_fetch/one_output/single_input.wgsl.expected.dxc.hlsl b/test/tint/extensions/texel_fetch/one_output/single_input.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..1f7c39d
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/one_output/single_input.wgsl.expected.dxc.hlsl
@@ -0,0 +1,14 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@color(0) fbf : vec4f) -> @location(0) vec4f {
+  return fbf;
+}
+
+Failed to generate: extensions/texel_fetch/one_output/single_input.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/one_output/single_input.wgsl.expected.fxc.hlsl b/test/tint/extensions/texel_fetch/one_output/single_input.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..1f7c39d
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/one_output/single_input.wgsl.expected.fxc.hlsl
@@ -0,0 +1,14 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@color(0) fbf : vec4f) -> @location(0) vec4f {
+  return fbf;
+}
+
+Failed to generate: extensions/texel_fetch/one_output/single_input.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/one_output/single_input.wgsl.expected.glsl b/test/tint/extensions/texel_fetch/one_output/single_input.wgsl.expected.glsl
new file mode 100644
index 0000000..0e9e1f5
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/one_output/single_input.wgsl.expected.glsl
@@ -0,0 +1,14 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@color(0) fbf : vec4f) -> @location(0) vec4f {
+  return fbf;
+}
+
+Failed to generate: extensions/texel_fetch/one_output/single_input.wgsl:1:8 error: GLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/one_output/single_input.wgsl.expected.ir.spvasm b/test/tint/extensions/texel_fetch/one_output/single_input.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..9ab80a4
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/one_output/single_input.wgsl.expected.ir.spvasm
@@ -0,0 +1,9 @@
+SKIP: FAILED
+
+../../src/tint/lang/wgsl/reader/program_to_ir/program_to_ir.cc:463 internal compiler error: TINT_UNIMPLEMENTED IR does not currently support texel fetch extension
+********************************************************************
+*  The tint shader compiler has encountered an unexpected error.   *
+*                                                                  *
+*  Please help us fix this issue by submitting a bug report at     *
+*  crbug.com/tint with the source program that triggered the bug.  *
+********************************************************************
diff --git a/test/tint/extensions/texel_fetch/one_output/single_input.wgsl.expected.msl b/test/tint/extensions/texel_fetch/one_output/single_input.wgsl.expected.msl
new file mode 100644
index 0000000..1cfa087
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/one_output/single_input.wgsl.expected.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_symbol_1 {
+  float4 fbf [[color(0)]];
+};
+
+struct tint_symbol_2 {
+  float4 value [[color(0)]];
+};
+
+float4 f_inner(float4 fbf) {
+  return fbf;
+}
+
+fragment tint_symbol_2 f(tint_symbol_1 tint_symbol [[stage_in]]) {
+  float4 const inner_result = f_inner(tint_symbol.fbf);
+  tint_symbol_2 wrapper_result = {};
+  wrapper_result.value = inner_result;
+  return wrapper_result;
+}
+
diff --git a/test/tint/extensions/texel_fetch/one_output/single_input.wgsl.expected.spvasm b/test/tint/extensions/texel_fetch/one_output/single_input.wgsl.expected.spvasm
new file mode 100644
index 0000000..b99dc57
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/one_output/single_input.wgsl.expected.spvasm
@@ -0,0 +1,14 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@color(0) fbf : vec4f) -> @location(0) vec4f {
+  return fbf;
+}
+
+Failed to generate: extensions/texel_fetch/one_output/single_input.wgsl:1:8 error: SPIR-V backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/one_output/single_input.wgsl.expected.wgsl b/test/tint/extensions/texel_fetch/one_output/single_input.wgsl.expected.wgsl
new file mode 100644
index 0000000..644e957
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/one_output/single_input.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@color(0) fbf : vec4f) -> @location(0) vec4f {
+  return fbf;
+}
diff --git a/test/tint/extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl b/test/tint/extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl
new file mode 100644
index 0000000..dc9daed
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl
@@ -0,0 +1,7 @@
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment fn f(@color(1) fbf_1 : vec4f, @color(3) fbf_3 : vec4f) {
+  g(fbf_1.r, fbf_3.g);
+}
+
+fn g(a : f32, b : f32) {}
diff --git a/test/tint/extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl.expected.dxc.hlsl b/test/tint/extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..fdbfaa4
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@color(1) fbf_1 : vec4f, @color(3) fbf_3 : vec4f) {
+  g(fbf_1.r, fbf_3.g);
+}
+
+fn g(a : f32, b : f32) {
+}
+
+Failed to generate: extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl.expected.fxc.hlsl b/test/tint/extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..fdbfaa4
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@color(1) fbf_1 : vec4f, @color(3) fbf_3 : vec4f) {
+  g(fbf_1.r, fbf_3.g);
+}
+
+fn g(a : f32, b : f32) {
+}
+
+Failed to generate: extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl.expected.glsl b/test/tint/extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl.expected.glsl
new file mode 100644
index 0000000..eb1df13
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@color(1) fbf_1 : vec4f, @color(3) fbf_3 : vec4f) {
+  g(fbf_1.r, fbf_3.g);
+}
+
+fn g(a : f32, b : f32) {
+}
+
+Failed to generate: extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl:1:8 error: GLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl.expected.ir.spvasm b/test/tint/extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..9ab80a4
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl.expected.ir.spvasm
@@ -0,0 +1,9 @@
+SKIP: FAILED
+
+../../src/tint/lang/wgsl/reader/program_to_ir/program_to_ir.cc:463 internal compiler error: TINT_UNIMPLEMENTED IR does not currently support texel fetch extension
+********************************************************************
+*  The tint shader compiler has encountered an unexpected error.   *
+*                                                                  *
+*  Please help us fix this issue by submitting a bug report at     *
+*  crbug.com/tint with the source program that triggered the bug.  *
+********************************************************************
diff --git a/test/tint/extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl.expected.msl b/test/tint/extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl.expected.msl
new file mode 100644
index 0000000..00943a1
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl.expected.msl
@@ -0,0 +1,20 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_symbol_1 {
+  float4 fbf_1 [[color(1)]];
+  float4 fbf_3 [[color(3)]];
+};
+
+void g(float a, float b) {
+}
+
+void f_inner(float4 fbf_1, float4 fbf_3) {
+  g(fbf_1[0], fbf_3[1]);
+}
+
+fragment void f(tint_symbol_1 tint_symbol [[stage_in]]) {
+  f_inner(tint_symbol.fbf_1, tint_symbol.fbf_3);
+  return;
+}
+
diff --git a/test/tint/extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl.expected.spvasm b/test/tint/extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl.expected.spvasm
new file mode 100644
index 0000000..9f066d1
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@color(1) fbf_1 : vec4f, @color(3) fbf_3 : vec4f) {
+  g(fbf_1.r, fbf_3.g);
+}
+
+fn g(a : f32, b : f32) {
+}
+
+Failed to generate: extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl:1:8 error: SPIR-V backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl.expected.wgsl b/test/tint/extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl.expected.wgsl
new file mode 100644
index 0000000..1e076f5
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/zero_outputs/multiple_inputs.wgsl.expected.wgsl
@@ -0,0 +1,9 @@
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@color(1) fbf_1 : vec4f, @color(3) fbf_3 : vec4f) {
+  g(fbf_1.r, fbf_3.g);
+}
+
+fn g(a : f32, b : f32) {
+}
diff --git a/test/tint/extensions/texel_fetch/zero_outputs/single_input.wgsl b/test/tint/extensions/texel_fetch/zero_outputs/single_input.wgsl
new file mode 100644
index 0000000..b41aed6
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/zero_outputs/single_input.wgsl
@@ -0,0 +1,7 @@
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment fn f(@color(0) fbf : vec4f) {
+  g(fbf.y);
+}
+
+fn g(a : f32) {}
diff --git a/test/tint/extensions/texel_fetch/zero_outputs/single_input.wgsl.expected.dxc.hlsl b/test/tint/extensions/texel_fetch/zero_outputs/single_input.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..783f662
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/zero_outputs/single_input.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@color(0) fbf : vec4f) {
+  g(fbf.y);
+}
+
+fn g(a : f32) {
+}
+
+Failed to generate: extensions/texel_fetch/zero_outputs/single_input.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/zero_outputs/single_input.wgsl.expected.fxc.hlsl b/test/tint/extensions/texel_fetch/zero_outputs/single_input.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..783f662
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/zero_outputs/single_input.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@color(0) fbf : vec4f) {
+  g(fbf.y);
+}
+
+fn g(a : f32) {
+}
+
+Failed to generate: extensions/texel_fetch/zero_outputs/single_input.wgsl:1:8 error: HLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/zero_outputs/single_input.wgsl.expected.glsl b/test/tint/extensions/texel_fetch/zero_outputs/single_input.wgsl.expected.glsl
new file mode 100644
index 0000000..3e3d5d3
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/zero_outputs/single_input.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@color(0) fbf : vec4f) {
+  g(fbf.y);
+}
+
+fn g(a : f32) {
+}
+
+Failed to generate: extensions/texel_fetch/zero_outputs/single_input.wgsl:1:8 error: GLSL backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/zero_outputs/single_input.wgsl.expected.ir.spvasm b/test/tint/extensions/texel_fetch/zero_outputs/single_input.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..9ab80a4
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/zero_outputs/single_input.wgsl.expected.ir.spvasm
@@ -0,0 +1,9 @@
+SKIP: FAILED
+
+../../src/tint/lang/wgsl/reader/program_to_ir/program_to_ir.cc:463 internal compiler error: TINT_UNIMPLEMENTED IR does not currently support texel fetch extension
+********************************************************************
+*  The tint shader compiler has encountered an unexpected error.   *
+*                                                                  *
+*  Please help us fix this issue by submitting a bug report at     *
+*  crbug.com/tint with the source program that triggered the bug.  *
+********************************************************************
diff --git a/test/tint/extensions/texel_fetch/zero_outputs/single_input.wgsl.expected.msl b/test/tint/extensions/texel_fetch/zero_outputs/single_input.wgsl.expected.msl
new file mode 100644
index 0000000..23cbfa2
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/zero_outputs/single_input.wgsl.expected.msl
@@ -0,0 +1,19 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_symbol_1 {
+  float4 fbf [[color(0)]];
+};
+
+void g(float a) {
+}
+
+void f_inner(float4 fbf) {
+  g(fbf[1]);
+}
+
+fragment void f(tint_symbol_1 tint_symbol [[stage_in]]) {
+  f_inner(tint_symbol.fbf);
+  return;
+}
+
diff --git a/test/tint/extensions/texel_fetch/zero_outputs/single_input.wgsl.expected.spvasm b/test/tint/extensions/texel_fetch/zero_outputs/single_input.wgsl.expected.spvasm
new file mode 100644
index 0000000..55a7ec4
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/zero_outputs/single_input.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@color(0) fbf : vec4f) {
+  g(fbf.y);
+}
+
+fn g(a : f32) {
+}
+
+Failed to generate: extensions/texel_fetch/zero_outputs/single_input.wgsl:1:8 error: SPIR-V backend does not support extension 'chromium_experimental_framebuffer_fetch'
+enable chromium_experimental_framebuffer_fetch;
+       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
diff --git a/test/tint/extensions/texel_fetch/zero_outputs/single_input.wgsl.expected.wgsl b/test/tint/extensions/texel_fetch/zero_outputs/single_input.wgsl.expected.wgsl
new file mode 100644
index 0000000..3206c8d
--- /dev/null
+++ b/test/tint/extensions/texel_fetch/zero_outputs/single_input.wgsl.expected.wgsl
@@ -0,0 +1,9 @@
+enable chromium_experimental_framebuffer_fetch;
+
+@fragment
+fn f(@color(0) fbf : vec4f) {
+  g(fbf.y);
+}
+
+fn g(a : f32) {
+}