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:
parent
bc5d8f6bcf
commit
e85efca13f
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue