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>
This commit is contained in:
David Neto 2021-11-22 20:47:37 +00:00 committed by Tint LUCI CQ
parent bc5d8f6bcf
commit e85efca13f
3 changed files with 7 additions and 9 deletions

View File

@ -3109,7 +3109,7 @@ bool Builder::GenerateControlBarrierIntrinsic(const sem::Intrinsic* intrinsic) {
static_cast<uint32_t>(spv::MemorySemanticsMask::WorkgroupMemory); static_cast<uint32_t>(spv::MemorySemanticsMask::WorkgroupMemory);
} else if (intrinsic->Type() == sem::IntrinsicType::kStorageBarrier) { } else if (intrinsic->Type() == sem::IntrinsicType::kStorageBarrier) {
execution = static_cast<uint32_t>(spv::Scope::Workgroup); 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 = semantics =
static_cast<uint32_t>(spv::MemorySemanticsMask::AcquireRelease) | static_cast<uint32_t>(spv::MemorySemanticsMask::AcquireRelease) |
static_cast<uint32_t>(spv::MemorySemanticsMask::UniformMemory); static_cast<uint32_t>(spv::MemorySemanticsMask::UniformMemory);

View File

@ -2541,13 +2541,12 @@ TEST_F(IntrinsicBuilderTest, Call_StorageBarrier) {
%1 = OpTypeFunction %2 %1 = OpTypeFunction %2
%6 = OpTypeInt 32 0 %6 = OpTypeInt 32 0
%7 = OpConstant %6 2 %7 = OpConstant %6 2
%8 = OpConstant %6 1 %8 = OpConstant %6 72
%9 = OpConstant %6 72
)"; )";
auto got_types = DumpInstructions(b.types()); auto got_types = DumpInstructions(b.types());
EXPECT_EQ(expected_types, got_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()); auto got_instructions = DumpInstructions(b.functions()[0].instructions());
EXPECT_EQ(expected_instructions, got_instructions); EXPECT_EQ(expected_instructions, got_instructions);

View File

@ -1,7 +1,7 @@
; SPIR-V ; SPIR-V
; Version: 1.3 ; Version: 1.3
; Generator: Google Tint Compiler; 0 ; Generator: Google Tint Compiler; 0
; Bound: 13 ; Bound: 12
; Schema: 0 ; Schema: 0
OpCapability Shader OpCapability Shader
OpMemoryModel Logical GLSL450 OpMemoryModel Logical GLSL450
@ -13,15 +13,14 @@
%1 = OpTypeFunction %void %1 = OpTypeFunction %void
%uint = OpTypeInt 32 0 %uint = OpTypeInt 32 0
%uint_2 = OpConstant %uint 2 %uint_2 = OpConstant %uint 2
%uint_1 = OpConstant %uint 1
%uint_72 = OpConstant %uint 72 %uint_72 = OpConstant %uint 72
%storageBarrier_d87211 = OpFunction %void None %1 %storageBarrier_d87211 = OpFunction %void None %1
%4 = OpLabel %4 = OpLabel
OpControlBarrier %uint_2 %uint_1 %uint_72 OpControlBarrier %uint_2 %uint_2 %uint_72
OpReturn OpReturn
OpFunctionEnd OpFunctionEnd
%compute_main = OpFunction %void None %1 %compute_main = OpFunction %void None %1
%11 = OpLabel %10 = OpLabel
%12 = OpFunctionCall %void %storageBarrier_d87211 %11 = OpFunctionCall %void %storageBarrier_d87211
OpReturn OpReturn
OpFunctionEnd OpFunctionEnd