[ir][spirv-writer] Support read-write textures

Bug: tint:1906, tint:2007
Change-Id: Ic5d08cab009933081897df3b03beb988eebb6e08
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/146247
Auto-Submit: James Price <jrprice@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/tint/lang/spirv/writer/builtin_test.cc b/src/tint/lang/spirv/writer/builtin_test.cc
index be61e83..fe4e4d7 100644
--- a/src/tint/lang/spirv/writer/builtin_test.cc
+++ b/src/tint/lang/spirv/writer/builtin_test.cc
@@ -1751,6 +1751,17 @@
     EXPECT_INST("OpControlBarrier %uint_2 %uint_2 %uint_72");
 }
 
+TEST_F(SpirvWriterTest, Builtin_TextureBarrier) {
+    auto* func = b.Function("foo", ty.void_());
+    b.Append(func->Block(), [&] {
+        b.Call(ty.void_(), core::Function::kTextureBarrier);
+        b.Return(func);
+    });
+
+    ASSERT_TRUE(Generate()) << Error() << output_;
+    EXPECT_INST("OpControlBarrier %uint_2 %uint_2 %uint_2056");
+}
+
 TEST_F(SpirvWriterTest, Builtin_WorkgroupBarrier) {
     auto* func = b.Function("foo", ty.void_());
     b.Append(func->Block(), [&] {
diff --git a/src/tint/lang/spirv/writer/printer/printer.cc b/src/tint/lang/spirv/writer/printer/printer.cc
index 5af097d..75f2205 100644
--- a/src/tint/lang/spirv/writer/printer/printer.cc
+++ b/src/tint/lang/spirv/writer/printer/printer.cc
@@ -1363,6 +1363,15 @@
         case core::Function::kTanh:
             glsl_ext_inst(GLSLstd450Tanh);
             break;
+        case core::Function::kTextureBarrier:
+            op = spv::Op::OpControlBarrier;
+            operands.clear();
+            operands.push_back(Constant(b_.ConstantValue(u32(spv::Scope::Workgroup))));
+            operands.push_back(Constant(b_.ConstantValue(u32(spv::Scope::Workgroup))));
+            operands.push_back(
+                Constant(b_.ConstantValue(u32(spv::MemorySemanticsMask::ImageMemory |
+                                              spv::MemorySemanticsMask::AcquireRelease))));
+            break;
         case core::Function::kTextureNumLevels:
             module_.PushCapability(SpvCapabilityImageQuery);
             op = spv::Op::OpImageQueryLevels;