Update memory scope rules for WebGPU (#2725)

Fixes #2721
diff --git a/source/val/validate_scopes.cpp b/source/val/validate_scopes.cpp
index 7e396c0..791ada7 100644
--- a/source/val/validate_scopes.cpp
+++ b/source/val/validate_scopes.cpp
@@ -229,12 +229,12 @@
 
   // WebGPU specific rules
   if (spvIsWebGPUEnv(_.context()->target_env)) {
-    if (value != SpvScopeWorkgroup && value != SpvScopeSubgroup &&
+    if (value != SpvScopeWorkgroup && value != SpvScopeInvocation &&
         value != SpvScopeQueueFamilyKHR) {
       return _.diag(SPV_ERROR_INVALID_DATA, inst)
              << spvOpcodeString(opcode)
              << ": in WebGPU environment Memory Scope is limited to "
-             << "Workgroup, Subgroup and QueuFamilyKHR";
+             << "Workgroup, Invocation, and QueueFamilyKHR";
     }
   }
 
diff --git a/test/val/val_atomics_test.cpp b/test/val/val_atomics_test.cpp
index f130e02..a005614 100644
--- a/test/val/val_atomics_test.cpp
+++ b/test/val/val_atomics_test.cpp
@@ -397,7 +397,7 @@
 
 TEST_F(ValidateAtomics, AtomicLoadWebGPUSequentiallyConsistentFailure) {
   const std::string body = R"(
-%val3 = OpAtomicLoad %u32 %u32_var %subgroup %sequentially_consistent
+%val3 = OpAtomicLoad %u32 %u32_var %invocation %sequentially_consistent
 )";
 
   CompileSuccessfully(GenerateWebGPUShaderCode(body), SPV_ENV_WEBGPU_0);
@@ -1916,7 +1916,7 @@
   EXPECT_THAT(
       getDiagnosticString(),
       HasSubstr("AtomicLoad: in WebGPU environment Memory Scope is limited to "
-                "Workgroup, Subgroup and QueuFamilyKHR\n"
+                "Workgroup, Invocation, and QueueFamilyKHR\n"
                 "  %34 = OpAtomicLoad %uint %29 %uint_0_0 %uint_0_1\n"));
 }
 
@@ -1930,7 +1930,7 @@
   EXPECT_THAT(
       getDiagnosticString(),
       HasSubstr("AtomicLoad: in WebGPU environment Memory Scope is limited to "
-                "Workgroup, Subgroup and QueuFamilyKHR\n"
+                "Workgroup, Invocation, and QueueFamilyKHR\n"
                 "  %34 = OpAtomicLoad %uint %29 %uint_1_0 %uint_0_1\n"));
 }
 
@@ -1943,27 +1943,27 @@
   EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_WEBGPU_0));
 }
 
-TEST_F(ValidateAtomics, WebGPUSubgroupMemoryScopeGood) {
+TEST_F(ValidateAtomics, WebGPUSubgroupMemoryScopeBad) {
   const std::string body = R"(
 %val1 = OpAtomicLoad %u32 %u32_var %subgroup %relaxed
 )";
 
   CompileSuccessfully(GenerateWebGPUShaderCode(body), SPV_ENV_WEBGPU_0);
-  EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_WEBGPU_0));
-}
-
-TEST_F(ValidateAtomics, WebGPUInvocationMemoryScopeBad) {
-  const std::string body = R"(
-%val1 = OpAtomicLoad %u32 %u32_var %invocation %relaxed
-)";
-
-  CompileSuccessfully(GenerateWebGPUShaderCode(body), SPV_ENV_WEBGPU_0);
   EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_WEBGPU_0));
   EXPECT_THAT(
       getDiagnosticString(),
       HasSubstr("AtomicLoad: in WebGPU environment Memory Scope is limited to "
-                "Workgroup, Subgroup and QueuFamilyKHR\n"
-                "  %34 = OpAtomicLoad %uint %29 %uint_4 %uint_0_1\n"));
+                "Workgroup, Invocation, and QueueFamilyKHR\n"
+                "  %34 = OpAtomicLoad %uint %29 %uint_3 %uint_0_1\n"));
+}
+
+TEST_F(ValidateAtomics, WebGPUInvocationMemoryScopeGood) {
+  const std::string body = R"(
+%val1 = OpAtomicLoad %u32 %u32_var %invocation %relaxed
+)";
+
+  CompileSuccessfully(GenerateWebGPUShaderCode(body), SPV_ENV_WEBGPU_0);
+  EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_WEBGPU_0));
 }
 
 TEST_F(ValidateAtomics, WebGPUQueueFamilyMemoryScopeGood) {