[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;