storageBarrier() has workgroup memory scope

The storageBarrier() builtin causes flushes to be visible to
all invocations within a workgroup, not the whole device.
The limitation is inherited from Metal.

Fixes: tint:1310
Change-Id: I6f94faa88bd3c7b6cec0601312c6c65a907c5973
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/69800
Auto-Submit: David Neto <dneto@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index 5fbdfb7..c17cb4d 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -3109,7 +3109,7 @@
         static_cast<uint32_t>(spv::MemorySemanticsMask::WorkgroupMemory);
   } else if (intrinsic->Type() == sem::IntrinsicType::kStorageBarrier) {
     execution = static_cast<uint32_t>(spv::Scope::Workgroup);
-    memory = static_cast<uint32_t>(spv::Scope::Device);
+    memory = static_cast<uint32_t>(spv::Scope::Workgroup);
     semantics =
         static_cast<uint32_t>(spv::MemorySemanticsMask::AcquireRelease) |
         static_cast<uint32_t>(spv::MemorySemanticsMask::UniformMemory);
diff --git a/src/writer/spirv/builder_intrinsic_test.cc b/src/writer/spirv/builder_intrinsic_test.cc
index 5925370..f7c068d 100644
--- a/src/writer/spirv/builder_intrinsic_test.cc
+++ b/src/writer/spirv/builder_intrinsic_test.cc
@@ -2541,13 +2541,12 @@
 %1 = OpTypeFunction %2
 %6 = OpTypeInt 32 0
 %7 = OpConstant %6 2
-%8 = OpConstant %6 1
-%9 = OpConstant %6 72
+%8 = OpConstant %6 72
 )";
   auto got_types = DumpInstructions(b.types());
   EXPECT_EQ(expected_types, got_types);
 
-  auto* expected_instructions = R"(OpControlBarrier %7 %8 %9
+  auto* expected_instructions = R"(OpControlBarrier %7 %7 %8
 )";
   auto got_instructions = DumpInstructions(b.functions()[0].instructions());
   EXPECT_EQ(expected_instructions, got_instructions);
diff --git a/test/intrinsics/gen/storageBarrier/d87211.wgsl.expected.spvasm b/test/intrinsics/gen/storageBarrier/d87211.wgsl.expected.spvasm
index f8fa6e9..79f2372 100644
--- a/test/intrinsics/gen/storageBarrier/d87211.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/storageBarrier/d87211.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 13
+; Bound: 12
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -13,15 +13,14 @@
           %1 = OpTypeFunction %void
        %uint = OpTypeInt 32 0
      %uint_2 = OpConstant %uint 2
-     %uint_1 = OpConstant %uint 1
     %uint_72 = OpConstant %uint 72
 %storageBarrier_d87211 = OpFunction %void None %1
           %4 = OpLabel
-               OpControlBarrier %uint_2 %uint_1 %uint_72
+               OpControlBarrier %uint_2 %uint_2 %uint_72
                OpReturn
                OpFunctionEnd
 %compute_main = OpFunction %void None %1
-         %11 = OpLabel
-         %12 = OpFunctionCall %void %storageBarrier_d87211
+         %10 = OpLabel
+         %11 = OpFunctionCall %void %storageBarrier_d87211
                OpReturn
                OpFunctionEnd