vtn: Support scoped control barriers for OpenCL too

The current handling for SPIR-V memory semantics is very specific to
the wording in the SPIR-V spec, which breaks its handling of OpenCL
(compared to what we had working downstream before merging upstream).

Update/relax the logic here to support CL's barrier(CLK_GLOBAL_MEM_FENCE);

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10165>
This commit is contained in:
Jesse Natalie
2021-04-11 19:13:44 -07:00
committed by Marge Bot
parent f9b527a9a5
commit 70aefe3449

View File

@@ -2334,9 +2334,11 @@ vtn_mem_semantics_to_nir_var_modes(struct vtn_builder *b,
/* Vulkan Environment for SPIR-V says "SubgroupMemory, CrossWorkgroupMemory,
* and AtomicCounterMemory are ignored".
*/
semantics &= ~(SpvMemorySemanticsSubgroupMemoryMask |
SpvMemorySemanticsCrossWorkgroupMemoryMask |
SpvMemorySemanticsAtomicCounterMemoryMask);
if (b->options->environment == NIR_SPIRV_VULKAN) {
semantics &= ~(SpvMemorySemanticsSubgroupMemoryMask |
SpvMemorySemanticsCrossWorkgroupMemoryMask |
SpvMemorySemanticsAtomicCounterMemoryMask);
}
/* TODO: Consider adding nir_var_mem_image mode to NIR so it can be used
* for SpvMemorySemanticsImageMemoryMask.
@@ -2352,6 +2354,8 @@ vtn_mem_semantics_to_nir_var_modes(struct vtn_builder *b,
}
if (semantics & SpvMemorySemanticsWorkgroupMemoryMask)
modes |= nir_var_mem_shared;
if (semantics & SpvMemorySemanticsCrossWorkgroupMemoryMask)
modes |= nir_var_mem_global;
if (semantics & SpvMemorySemanticsOutputMemoryMask) {
modes |= nir_var_shader_out;
}