[spirv][ir] Add memory model annotations to texture Load/Store

This CL adds the Vulkan Memory Model `NonPrivateTexel` annotation to
the texture loads and stores.

Bug: 348702031
Change-Id: Iaa50f5935dbeead33b63bd38edd146ac0962d2bb
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/203654
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/spirv/writer/builtin_test.cc b/src/tint/lang/spirv/writer/builtin_test.cc
index 8da2a5d..5a6fbd6 100644
--- a/src/tint/lang/spirv/writer/builtin_test.cc
+++ b/src/tint/lang/spirv/writer/builtin_test.cc
@@ -1905,6 +1905,19 @@
     EXPECT_INST("OpControlBarrier %uint_2 %uint_2 %uint_2056");
 }
 
+TEST_F(SpirvWriterTest, Builtin_TextureBarrier_Vulkan) {
+    auto* func = b.Function("foo", ty.void_());
+    b.Append(func->Block(), [&] {
+        b.Call(ty.void_(), core::BuiltinFn::kTextureBarrier);
+        b.Return(func);
+    });
+
+    Options opts{};
+    opts.use_vulkan_memory_model = true;
+    ASSERT_TRUE(Generate(opts)) << Error() << output_;
+    EXPECT_INST("OpControlBarrier %uint_2 %uint_2 %uint_26632");
+}
+
 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 ad56939..a6b58be 100644
--- a/src/tint/lang/spirv/writer/printer/printer.cc
+++ b/src/tint/lang/spirv/writer/printer/printer.cc
@@ -1812,15 +1812,21 @@
             case core::BuiltinFn::kTanh:
                 glsl_ext_inst(GLSLstd450Tanh);
                 break;
-            case core::BuiltinFn::kTextureBarrier:
+            case core::BuiltinFn::kTextureBarrier: {
+                spv::MemorySemanticsMask memory_mask = spv::MemorySemanticsMask::ImageMemory |
+                                                       spv::MemorySemanticsMask::AcquireRelease;
+                if (options_.use_vulkan_memory_model) {
+                    memory_mask = memory_mask | spv::MemorySemanticsMask::MakeAvailable |
+                                  spv::MemorySemanticsMask::MakeVisible;
+                }
+
                 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))));
+                operands.push_back(Constant(b_.ConstantValue(u32(memory_mask))));
                 break;
+            }
             case core::BuiltinFn::kTextureNumLevels:
                 module_.PushCapability(SpvCapabilityImageQuery);
                 op = spv::Op::OpImageQueryLevels;
diff --git a/src/tint/lang/spirv/writer/raise/builtin_polyfill.cc b/src/tint/lang/spirv/writer/raise/builtin_polyfill.cc
index 5c1ccd4..aee71d2 100644
--- a/src/tint/lang/spirv/writer/raise/builtin_polyfill.cc
+++ b/src/tint/lang/spirv/writer/raise/builtin_polyfill.cc
@@ -59,6 +59,9 @@
     /// The IR module.
     core::ir::Module& ir;
 
+    /// If we should use the vulkan memory model
+    bool use_vulkan_memory_model = false;
+
     /// The IR builder.
     core::ir::Builder b{ir};
 
@@ -432,7 +435,7 @@
     /// @param requires_float_lod true if the lod needs to be a floating point value
     void AppendImageOperands(ImageOperands& operands,
                              Vector<core::ir::Value*, 8>& args,
-                             core::ir::Instruction* insertion_point,
+                             core::ir::CoreBuiltinCall* insertion_point,
                              bool requires_float_lod) {
         // Add a placeholder argument for the image operand mask, which we will fill in when we have
         // processed the image operands.
@@ -440,6 +443,19 @@
         size_t mask_idx = args.Length();
         args.Push(nullptr);
 
+        // Append the NonPrivateTexel flag to Read/Write storage textures when we load/store them.
+        if (use_vulkan_memory_model) {
+            if (insertion_point->Func() == core::BuiltinFn::kTextureLoad ||
+                insertion_point->Func() == core::BuiltinFn::kTextureStore) {
+                if (auto* st =
+                        insertion_point->Args()[0]->Type()->As<core::type::StorageTexture>()) {
+                    if (st->Access() == core::Access::kReadWrite) {
+                        image_operand_mask |= SpvImageOperandsNonPrivateTexelMask;
+                    }
+                }
+            }
+        }
+
         // Add each of the optional image operands if used, updating the image operand mask.
         if (operands.bias) {
             image_operand_mask |= SpvImageOperandsBiasMask;
@@ -942,13 +958,13 @@
 
 }  // namespace
 
-Result<SuccessType> BuiltinPolyfill(core::ir::Module& ir) {
+Result<SuccessType> BuiltinPolyfill(core::ir::Module& ir, bool use_vulkan_memory_model) {
     auto result = ValidateAndDumpIfNeeded(ir, "BuiltinPolyfill transform");
     if (result != Success) {
         return result.Failure();
     }
 
-    State{ir}.Process();
+    State{ir, use_vulkan_memory_model}.Process();
 
     return Success;
 }
diff --git a/src/tint/lang/spirv/writer/raise/builtin_polyfill.h b/src/tint/lang/spirv/writer/raise/builtin_polyfill.h
index 794e75f..c17b5e7 100644
--- a/src/tint/lang/spirv/writer/raise/builtin_polyfill.h
+++ b/src/tint/lang/spirv/writer/raise/builtin_polyfill.h
@@ -46,8 +46,9 @@
 /// BuiltinPolyfill is a transform that replaces calls to builtins with polyfills and calls to
 /// SPIR-V backend intrinsic functions.
 /// @param module the module to transform
+/// @param use_vulkan_memory_model set `true` to use the vulkan memory model
 /// @returns success or failure
-Result<SuccessType> BuiltinPolyfill(core::ir::Module& module);
+Result<SuccessType> BuiltinPolyfill(core::ir::Module& module, bool use_vulkan_memory_model);
 
 }  // namespace tint::spirv::writer::raise
 
diff --git a/src/tint/lang/spirv/writer/raise/builtin_polyfill_test.cc b/src/tint/lang/spirv/writer/raise/builtin_polyfill_test.cc
index 79faef7..c055cca 100644
--- a/src/tint/lang/spirv/writer/raise/builtin_polyfill_test.cc
+++ b/src/tint/lang/spirv/writer/raise/builtin_polyfill_test.cc
@@ -106,7 +106,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -176,7 +176,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -246,7 +246,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -292,7 +292,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -336,7 +336,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -380,7 +380,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -441,7 +441,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -485,7 +485,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -527,7 +527,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -571,7 +571,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -615,7 +615,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -659,7 +659,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -703,7 +703,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -747,7 +747,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -791,7 +791,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -835,7 +835,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -879,7 +879,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -914,7 +914,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -955,7 +955,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -1004,7 +1004,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -1039,7 +1039,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -1074,7 +1074,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -1110,7 +1110,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -1146,7 +1146,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -1183,7 +1183,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -1220,7 +1220,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -1260,7 +1260,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -1301,7 +1301,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -1338,7 +1338,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -1376,7 +1376,85 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureLoad_Storage) {
+    auto format = core::TexelFormat::kR32Uint;
+    auto* t = b.FunctionParam(
+        "t", ty.Get<core::type::StorageTexture>(
+                 core::type::TextureDimension::k2d, format, core::Access::kReadWrite,
+                 core::type::StorageTexture::SubtypeFor(format, ty)));
+    auto* coords = b.FunctionParam("coords", ty.vec2<i32>());
+    auto* func = b.Function("foo", ty.vec4<u32>());
+    func->SetParams({t, coords});
+
+    b.Append(func->Block(), [&] {
+        auto* result = b.Call(ty.vec4<u32>(), core::BuiltinFn::kTextureLoad, t, coords);
+        b.Return(func, result);
+    });
+
+    auto* src = R"(
+%foo = func(%t:texture_storage_2d<r32uint, read_write>, %coords:vec2<i32>):vec4<u32> {
+  $B1: {
+    %4:vec4<u32> = textureLoad %t, %coords
+    ret %4
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+%foo = func(%t:texture_storage_2d<r32uint, read_write>, %coords:vec2<i32>):vec4<u32> {
+  $B1: {
+    %4:vec4<u32> = spirv.image_read %t, %coords, 0u
+    ret %4
+  }
+}
+)";
+
+    Run(BuiltinPolyfill, false);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureLoad_Storage_Vulkan) {
+    auto format = core::TexelFormat::kR32Uint;
+    auto* t = b.FunctionParam(
+        "t", ty.Get<core::type::StorageTexture>(
+                 core::type::TextureDimension::k2d, format, core::Access::kReadWrite,
+                 core::type::StorageTexture::SubtypeFor(format, ty)));
+    auto* coords = b.FunctionParam("coords", ty.vec2<i32>());
+    auto* func = b.Function("foo", ty.vec4<u32>());
+    func->SetParams({t, coords});
+
+    b.Append(func->Block(), [&] {
+        auto* result = b.Call(ty.vec4<u32>(), core::BuiltinFn::kTextureLoad, t, coords);
+        b.Return(func, result);
+    });
+
+    auto* src = R"(
+%foo = func(%t:texture_storage_2d<r32uint, read_write>, %coords:vec2<i32>):vec4<u32> {
+  $B1: {
+    %4:vec4<u32> = textureLoad %t, %coords
+    ret %4
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+%foo = func(%t:texture_storage_2d<r32uint, read_write>, %coords:vec2<i32>):vec4<u32> {
+  $B1: {
+    %4:vec4<u32> = spirv.image_read %t, %coords, 1024u
+    ret %4
+  }
+}
+)";
+
+    Run(BuiltinPolyfill, true);
 
     EXPECT_EQ(expect, str());
 }
@@ -1414,7 +1492,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -1452,7 +1530,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -1491,7 +1569,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -1533,7 +1611,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -1573,7 +1651,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -1613,7 +1691,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -1656,7 +1734,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -1695,7 +1773,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -1735,7 +1813,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -1778,7 +1856,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -1818,7 +1896,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -1858,7 +1936,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -1901,7 +1979,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -1942,7 +2020,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -1983,7 +2061,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -2027,7 +2105,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -2067,7 +2145,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -2107,7 +2185,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -2150,7 +2228,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -2190,7 +2268,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -2230,7 +2308,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -2273,7 +2351,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -2311,7 +2389,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -2351,7 +2429,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -2391,7 +2469,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -2434,7 +2512,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -2474,7 +2552,47 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
+
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(SpirvWriter_BuiltinPolyfillTest, TextureStore_2D_Vulkan) {
+    auto format = core::TexelFormat::kR32Uint;
+    auto* t = b.FunctionParam(
+        "t", ty.Get<core::type::StorageTexture>(
+                 core::type::TextureDimension::k2d, format, core::Access::kReadWrite,
+                 core::type::StorageTexture::SubtypeFor(format, ty)));
+    auto* coords = b.FunctionParam("coords", ty.vec2<i32>());
+    auto* texel = b.FunctionParam("texel", ty.vec4<u32>());
+    auto* func = b.Function("foo", ty.void_());
+    func->SetParams({t, coords, texel});
+
+    b.Append(func->Block(), [&] {
+        b.Call(ty.void_(), core::BuiltinFn::kTextureStore, t, coords, texel);
+        b.Return(func);
+    });
+
+    auto* src = R"(
+%foo = func(%t:texture_storage_2d<r32uint, read_write>, %coords:vec2<i32>, %texel:vec4<u32>):void {
+  $B1: {
+    %5:void = textureStore %t, %coords, %texel
+    ret
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+%foo = func(%t:texture_storage_2d<r32uint, read_write>, %coords:vec2<i32>, %texel:vec4<u32>):void {
+  $B1: {
+    %5:void = spirv.image_write %t, %coords, %texel, 1024u
+    ret
+  }
+}
+)";
+
+    Run(BuiltinPolyfill, true);
 
     EXPECT_EQ(expect, str());
 }
@@ -2516,7 +2634,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -2559,7 +2677,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -2594,7 +2712,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -2630,7 +2748,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -2666,7 +2784,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -2701,7 +2819,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -2737,7 +2855,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -2773,7 +2891,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -2809,7 +2927,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -2845,7 +2963,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -2884,7 +3002,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -2911,7 +3029,7 @@
 
     auto* expect = src;
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -2953,7 +3071,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -2987,7 +3105,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -3021,7 +3139,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -3054,7 +3172,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
@@ -3087,7 +3205,7 @@
 }
 )";
 
-    Run(BuiltinPolyfill);
+    Run(BuiltinPolyfill, false);
 
     EXPECT_EQ(expect, str());
 }
diff --git a/src/tint/lang/spirv/writer/raise/raise.cc b/src/tint/lang/spirv/writer/raise/raise.cc
index 6314869..9395c87 100644
--- a/src/tint/lang/spirv/writer/raise/raise.cc
+++ b/src/tint/lang/spirv/writer/raise/raise.cc
@@ -139,7 +139,7 @@
     // DemoteToHelper must come before any transform that introduces non-core instructions.
     RUN_TRANSFORM(core::ir::transform::DemoteToHelper, module);
 
-    RUN_TRANSFORM(raise::BuiltinPolyfill, module);
+    RUN_TRANSFORM(raise::BuiltinPolyfill, module, options.use_vulkan_memory_model);
     RUN_TRANSFORM(raise::ExpandImplicitSplats, module);
     RUN_TRANSFORM(raise::HandleMatrixArithmetic, module);
     RUN_TRANSFORM(raise::MergeReturn, module);