spirv: Expand workaround for OpControlBarrier on old GLSLang
In SPIRV of compute shader in Aztec Ruins benchmark there is:
OpControlBarrier %uint_1 %uint_1 %uint_0
// ControlBarrier(Device, Device, rdcspv::MemorySemantics(0));
which is an incorrect translation of glsl barrier().
GLSLang, prior to c3f1cdfa, emitted the OpControlBarrier with
Device instead of Workgroup for execution scope.
2365520c
covers similar case but isn't applied when execution_scope
is SpvScopeDevice.
Cc: <mesa-stable@lists.freedesktop.org>
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/2742
Signed-off-by: Danylo Piliaiev <danylo.piliaiev@globallogic.com>
Tested-by: Rafael Antognolli <rafael.antognolli@intel.com>
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4660>
This commit is contained in:

committed by
Marge Bot

parent
f402b7c576
commit
66229aa169
@@ -3664,11 +3664,15 @@ vtn_handle_barrier(struct vtn_builder *b, SpvOp opcode,
|
||||
|
||||
/* GLSLang, prior to commit 8297936dd6eb3, emitted OpControlBarrier with
|
||||
* memory semantics of None for GLSL barrier().
|
||||
* And before that, prior to c3f1cdfa, emitted the OpControlBarrier with
|
||||
* Device instead of Workgroup for execution scope.
|
||||
*/
|
||||
if (b->wa_glslang_cs_barrier &&
|
||||
b->nb.shader->info.stage == MESA_SHADER_COMPUTE &&
|
||||
execution_scope == SpvScopeWorkgroup &&
|
||||
(execution_scope == SpvScopeWorkgroup ||
|
||||
execution_scope == SpvScopeDevice) &&
|
||||
memory_semantics == SpvMemorySemanticsMaskNone) {
|
||||
execution_scope = SpvScopeWorkgroup;
|
||||
memory_scope = SpvScopeWorkgroup;
|
||||
memory_semantics = SpvMemorySemanticsAcquireReleaseMask |
|
||||
SpvMemorySemanticsWorkgroupMemoryMask;
|
||||
|
Reference in New Issue
Block a user