vtn: remove acquire/release around make visible/available barriers
These are not necessary and can be expensive. I think they were added because of a misunderstanding of the informative descriptions in the Vulkan memory model, or because the memory model requires make visible/available barriers to have these semantics. Because we use these to implement MakePointerVisible/MakePointerAvailable, we can skip that requirement in NIR. Signed-off-by: Rhys Perry <pendingchaos02@gmail.com> Reviewed-by: Georg Lehmann <dadschoorse@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36080>
This commit is contained in:
@@ -82,7 +82,7 @@ TEST_F(AvailabilityVisibility, opload_vis)
|
||||
nir_intrinsic_instr *intrinsic = find_intrinsic(nir_intrinsic_barrier, 0);
|
||||
ASSERT_NE(intrinsic, nullptr);
|
||||
|
||||
EXPECT_EQ(nir_intrinsic_memory_semantics(intrinsic), NIR_MEMORY_MAKE_VISIBLE | NIR_MEMORY_ACQUIRE);
|
||||
EXPECT_EQ(nir_intrinsic_memory_semantics(intrinsic), NIR_MEMORY_MAKE_VISIBLE);
|
||||
EXPECT_NE(nir_intrinsic_memory_modes(intrinsic) & nir_var_mem_ssbo, 0);
|
||||
EXPECT_EQ(nir_intrinsic_memory_scope(intrinsic), SCOPE_DEVICE);
|
||||
EXPECT_EQ(nir_intrinsic_execution_scope(intrinsic), SCOPE_NONE);
|
||||
@@ -146,7 +146,7 @@ TEST_F(AvailabilityVisibility, opstore_avail)
|
||||
nir_intrinsic_instr *intrinsic = find_intrinsic(nir_intrinsic_barrier, 0);
|
||||
ASSERT_NE(intrinsic, nullptr);
|
||||
|
||||
EXPECT_EQ(nir_intrinsic_memory_semantics(intrinsic), NIR_MEMORY_MAKE_AVAILABLE | NIR_MEMORY_RELEASE);
|
||||
EXPECT_EQ(nir_intrinsic_memory_semantics(intrinsic), NIR_MEMORY_MAKE_AVAILABLE);
|
||||
EXPECT_NE(nir_intrinsic_memory_modes(intrinsic) & nir_var_mem_ssbo, 0);
|
||||
EXPECT_EQ(nir_intrinsic_memory_scope(intrinsic), SCOPE_DEVICE);
|
||||
EXPECT_EQ(nir_intrinsic_execution_scope(intrinsic), SCOPE_NONE);
|
||||
@@ -212,12 +212,12 @@ TEST_F(AvailabilityVisibility, opcopymemory_visavail_both_combined)
|
||||
ASSERT_NE(first, nullptr);
|
||||
ASSERT_NE(second, nullptr);
|
||||
|
||||
EXPECT_EQ(nir_intrinsic_memory_semantics(first), NIR_MEMORY_MAKE_VISIBLE | NIR_MEMORY_ACQUIRE);
|
||||
EXPECT_EQ(nir_intrinsic_memory_semantics(first), NIR_MEMORY_MAKE_VISIBLE);
|
||||
EXPECT_NE(nir_intrinsic_memory_modes(first) & nir_var_mem_ssbo, 0);
|
||||
EXPECT_EQ(nir_intrinsic_memory_scope(first), SCOPE_WORKGROUP);
|
||||
EXPECT_EQ(nir_intrinsic_execution_scope(first), SCOPE_NONE);
|
||||
|
||||
EXPECT_EQ(nir_intrinsic_memory_semantics(second), NIR_MEMORY_MAKE_AVAILABLE | NIR_MEMORY_RELEASE);
|
||||
EXPECT_EQ(nir_intrinsic_memory_semantics(second), NIR_MEMORY_MAKE_AVAILABLE);
|
||||
EXPECT_NE(nir_intrinsic_memory_modes(second) & nir_var_mem_ssbo, 0);
|
||||
EXPECT_EQ(nir_intrinsic_memory_scope(second), SCOPE_DEVICE);
|
||||
EXPECT_EQ(nir_intrinsic_execution_scope(first), SCOPE_NONE);
|
||||
@@ -284,12 +284,12 @@ TEST_F(AvailabilityVisibility, opcopymemory_visavail_both_separate)
|
||||
ASSERT_NE(first, nullptr);
|
||||
ASSERT_NE(second, nullptr);
|
||||
|
||||
EXPECT_EQ(nir_intrinsic_memory_semantics(first), NIR_MEMORY_MAKE_VISIBLE | NIR_MEMORY_ACQUIRE);
|
||||
EXPECT_EQ(nir_intrinsic_memory_semantics(first), NIR_MEMORY_MAKE_VISIBLE);
|
||||
EXPECT_NE(nir_intrinsic_memory_modes(first) & nir_var_mem_ssbo, 0);
|
||||
EXPECT_EQ(nir_intrinsic_memory_scope(first), SCOPE_WORKGROUP);
|
||||
EXPECT_EQ(nir_intrinsic_execution_scope(first), SCOPE_NONE);
|
||||
|
||||
EXPECT_EQ(nir_intrinsic_memory_semantics(second), NIR_MEMORY_MAKE_AVAILABLE | NIR_MEMORY_RELEASE);
|
||||
EXPECT_EQ(nir_intrinsic_memory_semantics(second), NIR_MEMORY_MAKE_AVAILABLE);
|
||||
EXPECT_NE(nir_intrinsic_memory_modes(second) & nir_var_mem_ssbo, 0);
|
||||
EXPECT_EQ(nir_intrinsic_memory_scope(second), SCOPE_DEVICE);
|
||||
EXPECT_EQ(nir_intrinsic_execution_scope(second), SCOPE_NONE);
|
||||
@@ -352,7 +352,7 @@ TEST_F(AvailabilityVisibility, opcopymemory_avail)
|
||||
nir_intrinsic_instr *intrinsic = find_intrinsic(nir_intrinsic_barrier, 0);
|
||||
ASSERT_NE(intrinsic, nullptr);
|
||||
|
||||
EXPECT_EQ(nir_intrinsic_memory_semantics(intrinsic), NIR_MEMORY_MAKE_AVAILABLE | NIR_MEMORY_RELEASE);
|
||||
EXPECT_EQ(nir_intrinsic_memory_semantics(intrinsic), NIR_MEMORY_MAKE_AVAILABLE);
|
||||
EXPECT_NE(nir_intrinsic_memory_modes(intrinsic) & nir_var_mem_ssbo, 0);
|
||||
EXPECT_EQ(nir_intrinsic_memory_scope(intrinsic), SCOPE_DEVICE);
|
||||
EXPECT_EQ(nir_intrinsic_execution_scope(intrinsic), SCOPE_NONE);
|
||||
@@ -415,7 +415,7 @@ TEST_F(AvailabilityVisibility, opcopymemory_vis)
|
||||
nir_intrinsic_instr *intrinsic = find_intrinsic(nir_intrinsic_barrier, 0);
|
||||
ASSERT_NE(intrinsic, nullptr);
|
||||
|
||||
EXPECT_EQ(nir_intrinsic_memory_semantics(intrinsic), NIR_MEMORY_MAKE_VISIBLE | NIR_MEMORY_ACQUIRE);
|
||||
EXPECT_EQ(nir_intrinsic_memory_semantics(intrinsic), NIR_MEMORY_MAKE_VISIBLE);
|
||||
EXPECT_NE(nir_intrinsic_memory_modes(intrinsic) & nir_var_mem_ssbo, 0);
|
||||
EXPECT_EQ(nir_intrinsic_memory_scope(intrinsic), SCOPE_WORKGROUP);
|
||||
EXPECT_EQ(nir_intrinsic_execution_scope(intrinsic), SCOPE_NONE);
|
||||
|
||||
@@ -2614,7 +2614,6 @@ vtn_emit_make_visible_barrier(struct vtn_builder *b, SpvMemoryAccessMask access,
|
||||
return;
|
||||
|
||||
vtn_emit_memory_barrier(b, scope, SpvMemorySemanticsMakeVisibleMask |
|
||||
SpvMemorySemanticsAcquireMask |
|
||||
vtn_mode_to_memory_semantics(mode));
|
||||
}
|
||||
|
||||
@@ -2626,7 +2625,6 @@ vtn_emit_make_available_barrier(struct vtn_builder *b, SpvMemoryAccessMask acces
|
||||
return;
|
||||
|
||||
vtn_emit_memory_barrier(b, scope, SpvMemorySemanticsMakeAvailableMask |
|
||||
SpvMemorySemanticsReleaseMask |
|
||||
vtn_mode_to_memory_semantics(mode));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user