X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fcompiler%2Fspirv%2Fvtn_variables.c;h=318df77669f6f34f0107aaba4a9282a537d05536;hb=6a154aea0d3375aa8469f28bb8a85e5ee79eef4a;hp=9dc2c755ca570bfd5a2164c26caaec3692cdb245;hpb=f5deed138a0b4765438135367248f1d8f0649975;p=mesa.git diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c index 9dc2c755ca5..318df77669f 100644 --- a/src/compiler/spirv/vtn_variables.c +++ b/src/compiler/spirv/vtn_variables.c @@ -78,13 +78,19 @@ vtn_push_value_pointer(struct vtn_builder *b, uint32_t value_id, static void ssa_decoration_cb(struct vtn_builder *b, struct vtn_value *val, int member, - const struct vtn_decoration *dec, void *void_ssa) + const struct vtn_decoration *dec, void *void_ctx) { - struct vtn_ssa_value *ssa = void_ssa; - switch (dec->decoration) { case SpvDecorationNonUniformEXT: - ssa->access |= ACCESS_NON_UNIFORM; + if (val->value_type == vtn_value_type_ssa) { + val->ssa->access |= ACCESS_NON_UNIFORM; + } else if (val->value_type == vtn_value_type_pointer) { + val->pointer->access |= ACCESS_NON_UNIFORM; + } else if (val->value_type == vtn_value_type_sampled_image) { + val->sampled_image->image->access |= ACCESS_NON_UNIFORM; + } else if (val->value_type == vtn_value_type_image_pointer) { + val->image->image->access |= ACCESS_NON_UNIFORM; + } break; default: @@ -102,11 +108,30 @@ vtn_push_ssa(struct vtn_builder *b, uint32_t value_id, } else { val = vtn_push_value(b, value_id, vtn_value_type_ssa); val->ssa = ssa; - vtn_foreach_decoration(b, val, ssa_decoration_cb, val->ssa); + vtn_foreach_decoration(b, val, ssa_decoration_cb, NULL); } return val; } +void +vtn_copy_value(struct vtn_builder *b, uint32_t src_value_id, + uint32_t dst_value_id) +{ + struct vtn_value *src = vtn_untyped_value(b, src_value_id); + struct vtn_value *dst = vtn_push_value(b, dst_value_id, src->value_type); + struct vtn_value src_copy = *src; + + vtn_fail_if(dst->type->id != src->type->id, + "Result Type must equal Operand type"); + + src_copy.name = dst->name; + src_copy.decoration = dst->decoration; + src_copy.type = dst->type; + *dst = src_copy; + + vtn_foreach_decoration(b, dst, ssa_decoration_cb, NULL); +} + static struct vtn_access_chain * vtn_access_chain_create(struct vtn_builder *b, unsigned length) { @@ -609,23 +634,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 +2219,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 +2394,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) { @@ -2761,7 +2776,7 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode, case SpvOpConvertUToPtr: { struct vtn_value *ptr_val = vtn_push_value(b, w[2], vtn_value_type_pointer); - struct vtn_value *u_val = vtn_value(b, w[3], vtn_value_type_ssa); + struct vtn_value *u_val = vtn_untyped_value(b, w[3]); vtn_fail_if(ptr_val->type->type == NULL, "OpConvertUToPtr can only be used on physical pointers"); @@ -2771,7 +2786,8 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode, "OpConvertUToPtr can only be used to cast from a vector or " "scalar type"); - nir_ssa_def *ptr_ssa = nir_sloppy_bitcast(&b->nb, u_val->ssa->def, + struct vtn_ssa_value *u_ssa = vtn_ssa_value(b, w[3]); + nir_ssa_def *ptr_ssa = nir_sloppy_bitcast(&b->nb, u_ssa->def, ptr_val->type->type); ptr_val->pointer = vtn_pointer_from_ssa(b, ptr_ssa, ptr_val->type); vtn_foreach_decoration(b, ptr_val, ptr_decoration_cb, ptr_val->pointer);