spirv: Fix propagation of OpVariable access flags
After the decorations of a variable are evaluated, propagate the access flag to the associated vtn_pointer. This was done when creating the pointer but at that point there was no access flags for the variable. Inline the pointer creation to make this point clearer, in isolation the helper made the impression that the value was being propagated. Issue found by Ken. Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4620>
This commit is contained in:

committed by
Marge Bot

parent
c76f2292b5
commit
a1f6ae4744
@@ -799,10 +799,6 @@ struct vtn_ssa_value *vtn_ssa_transpose(struct vtn_builder *b,
|
||||
|
||||
nir_deref_instr *vtn_nir_deref(struct vtn_builder *b, uint32_t id);
|
||||
|
||||
struct vtn_pointer *vtn_pointer_for_variable(struct vtn_builder *b,
|
||||
struct vtn_variable *var,
|
||||
struct vtn_type *ptr_type);
|
||||
|
||||
nir_deref_instr *vtn_pointer_to_deref(struct vtn_builder *b,
|
||||
struct vtn_pointer *ptr);
|
||||
nir_ssa_def *
|
||||
|
@@ -609,23 +609,6 @@ vtn_pointer_dereference(struct vtn_builder *b,
|
||||
}
|
||||
}
|
||||
|
||||
struct vtn_pointer *
|
||||
vtn_pointer_for_variable(struct vtn_builder *b,
|
||||
struct vtn_variable *var, struct vtn_type *ptr_type)
|
||||
{
|
||||
struct vtn_pointer *pointer = rzalloc(b, struct vtn_pointer);
|
||||
|
||||
pointer->mode = var->mode;
|
||||
pointer->type = var->type;
|
||||
vtn_assert(ptr_type->base_type == vtn_base_type_pointer);
|
||||
vtn_assert(ptr_type->deref->type == var->type->type);
|
||||
pointer->ptr_type = ptr_type;
|
||||
pointer->var = var;
|
||||
pointer->access = var->access | var->type->access;
|
||||
|
||||
return pointer;
|
||||
}
|
||||
|
||||
/* Returns an atomic_uint type based on the original uint type. The returned
|
||||
* type will be equivalent to the original one but will have an atomic_uint
|
||||
* type as leaf instead of an uint.
|
||||
@@ -2211,8 +2194,12 @@ vtn_create_variable(struct vtn_builder *b, struct vtn_value *val,
|
||||
var->mode = mode;
|
||||
var->base_location = -1;
|
||||
|
||||
vtn_assert(val->value_type == vtn_value_type_pointer);
|
||||
val->pointer = vtn_pointer_for_variable(b, var, ptr_type);
|
||||
val->pointer = rzalloc(b, struct vtn_pointer);
|
||||
val->pointer->mode = var->mode;
|
||||
val->pointer->type = var->type;
|
||||
val->pointer->ptr_type = ptr_type;
|
||||
val->pointer->var = var;
|
||||
val->pointer->access = var->type->access;
|
||||
|
||||
switch (var->mode) {
|
||||
case vtn_variable_mode_function:
|
||||
@@ -2382,6 +2369,9 @@ vtn_create_variable(struct vtn_builder *b, struct vtn_value *val,
|
||||
vtn_foreach_decoration(b, val, var_decoration_cb, var);
|
||||
vtn_foreach_decoration(b, val, ptr_decoration_cb, val->pointer);
|
||||
|
||||
/* Propagate access flags from the OpVariable decorations. */
|
||||
val->pointer->access |= var->access;
|
||||
|
||||
if ((var->mode == vtn_variable_mode_input ||
|
||||
var->mode == vtn_variable_mode_output) &&
|
||||
var->var->members) {
|
||||
|
Reference in New Issue
Block a user