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) {