spirv: Handle MakePointerAvailable/Visible
Emit barriers with semantics matching the access operand and the storage class of the pointer. v2: Fix order of visible / available emission relative to the operations. (Bas) Reviewed-by: Jason Ekstrand <jason@jlekstrand.net> Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:
@@ -2533,6 +2533,22 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (count > 4) {
|
||||||
|
unsigned idx = 5;
|
||||||
|
SpvMemoryAccessMask access = w[4];
|
||||||
|
if (access & SpvMemoryAccessAlignedMask)
|
||||||
|
idx++;
|
||||||
|
|
||||||
|
if (access & SpvMemoryAccessMakePointerVisibleMask) {
|
||||||
|
SpvMemorySemanticsMask semantics =
|
||||||
|
SpvMemorySemanticsMakeVisibleMask |
|
||||||
|
vtn_storage_class_to_memory_semantics(src->ptr_type->storage_class);
|
||||||
|
|
||||||
|
SpvScope scope = vtn_constant_uint(b, w[idx]);
|
||||||
|
vtn_emit_memory_barrier(b, scope, semantics);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
vtn_push_ssa(b, w[2], res_type, vtn_variable_load(b, src));
|
vtn_push_ssa(b, w[2], res_type, vtn_variable_load(b, src));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -2582,6 +2598,22 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode,
|
|||||||
|
|
||||||
struct vtn_ssa_value *src = vtn_ssa_value(b, w[2]);
|
struct vtn_ssa_value *src = vtn_ssa_value(b, w[2]);
|
||||||
vtn_variable_store(b, src, dest);
|
vtn_variable_store(b, src, dest);
|
||||||
|
|
||||||
|
if (count > 3) {
|
||||||
|
unsigned idx = 4;
|
||||||
|
SpvMemoryAccessMask access = w[3];
|
||||||
|
|
||||||
|
if (access & SpvMemoryAccessAlignedMask)
|
||||||
|
idx++;
|
||||||
|
|
||||||
|
if (access & SpvMemoryAccessMakePointerAvailableMask) {
|
||||||
|
SpvMemorySemanticsMask semantics =
|
||||||
|
SpvMemorySemanticsMakeAvailableMask |
|
||||||
|
vtn_storage_class_to_memory_semantics(dest->ptr_type->storage_class);
|
||||||
|
SpvScope scope = vtn_constant_uint(b, w[idx]);
|
||||||
|
vtn_emit_memory_barrier(b, scope, semantics);
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user