From e85efca13f872f17da362ec6adbdde77b2e5988a Mon Sep 17 00:00:00 2001 From: David Neto Date: Mon, 22 Nov 2021 20:47:37 +0000 Subject: [PATCH] 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 Commit-Queue: Ben Clayton Kokoro: Kokoro Reviewed-by: Ben Clayton --- src/writer/spirv/builder.cc | 2 +- src/writer/spirv/builder_intrinsic_test.cc | 5 ++--- .../gen/storageBarrier/d87211.wgsl.expected.spvasm | 9 ++++----- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc index 5fbdfb70ff..c17cb4de1c 100644 --- a/src/writer/spirv/builder.cc +++ b/src/writer/spirv/builder.cc @@ -3109,7 +3109,7 @@ bool Builder::GenerateControlBarrierIntrinsic(const sem::Intrinsic* intrinsic) { static_cast(spv::MemorySemanticsMask::WorkgroupMemory); } else if (intrinsic->Type() == sem::IntrinsicType::kStorageBarrier) { execution = static_cast(spv::Scope::Workgroup); - memory = static_cast(spv::Scope::Device); + memory = static_cast(spv::Scope::Workgroup); semantics = static_cast(spv::MemorySemanticsMask::AcquireRelease) | static_cast(spv::MemorySemanticsMask::UniformMemory); diff --git a/src/writer/spirv/builder_intrinsic_test.cc b/src/writer/spirv/builder_intrinsic_test.cc index 5925370ddb..f7c068d62e 100644 --- a/src/writer/spirv/builder_intrinsic_test.cc +++ b/src/writer/spirv/builder_intrinsic_test.cc @@ -2541,13 +2541,12 @@ TEST_F(IntrinsicBuilderTest, Call_StorageBarrier) { %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 f8fa6e97d7..79f2372a0d 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