if (ret_type->base_type == vtn_base_type_void) {
vtn_push_value(b, w[2], vtn_value_type_undef);
} else {
- vtn_push_ssa(b, w[2], res_type, vtn_local_load(b, ret_deref));
+ vtn_push_ssa(b, w[2], res_type, vtn_local_load(b, ret_deref, 0));
}
}
_mesa_hash_table_insert(b->phi_table, w, phi_var);
vtn_push_ssa(b, w[2], type,
- vtn_local_load(b, nir_build_deref_var(&b->nb, phi_var)));
+ vtn_local_load(b, nir_build_deref_var(&b->nb, phi_var), 0));
return true;
}
struct vtn_ssa_value *src = vtn_ssa_value(b, w[i]);
- vtn_local_store(b, src, nir_build_deref_var(&b->nb, phi_var));
+ vtn_local_store(b, src, nir_build_deref_var(&b->nb, phi_var), 0);
}
return true;
nir_deref_instr *ret_deref =
nir_build_deref_cast(&b->nb, nir_load_param(&b->nb, 0),
nir_var_function_temp, ret_type, 0);
- vtn_local_store(b, src, ret_deref);
+ vtn_local_store(b, src, ret_deref, 0);
}
if (block->branch_type != vtn_branch_type_none) {
static void
_vtn_local_load_store(struct vtn_builder *b, bool load, nir_deref_instr *deref,
- struct vtn_ssa_value *inout)
+ struct vtn_ssa_value *inout,
+ enum gl_access_qualifier access)
{
if (glsl_type_is_vector_or_scalar(deref->type)) {
if (load) {
- inout->def = nir_load_deref(&b->nb, deref);
+ inout->def = nir_load_deref_with_access(&b->nb, deref, access);
} else {
- nir_store_deref(&b->nb, deref, inout->def, ~0);
+ nir_store_deref_with_access(&b->nb, deref, inout->def, ~0, access);
}
} else if (glsl_type_is_array(deref->type) ||
glsl_type_is_matrix(deref->type)) {
for (unsigned i = 0; i < elems; i++) {
nir_deref_instr *child =
nir_build_deref_array_imm(&b->nb, deref, i);
- _vtn_local_load_store(b, load, child, inout->elems[i]);
+ _vtn_local_load_store(b, load, child, inout->elems[i], access);
}
} else {
vtn_assert(glsl_type_is_struct_or_ifc(deref->type));
unsigned elems = glsl_get_length(deref->type);
for (unsigned i = 0; i < elems; i++) {
nir_deref_instr *child = nir_build_deref_struct(&b->nb, deref, i);
- _vtn_local_load_store(b, load, child, inout->elems[i]);
+ _vtn_local_load_store(b, load, child, inout->elems[i], access);
}
}
}
}
struct vtn_ssa_value *
-vtn_local_load(struct vtn_builder *b, nir_deref_instr *src)
+vtn_local_load(struct vtn_builder *b, nir_deref_instr *src,
+ enum gl_access_qualifier access)
{
nir_deref_instr *src_tail = get_deref_tail(src);
struct vtn_ssa_value *val = vtn_create_ssa_value(b, src_tail->type);
- _vtn_local_load_store(b, true, src_tail, val);
+ _vtn_local_load_store(b, true, src_tail, val, access);
if (src_tail != src) {
val->type = src->type;
void
vtn_local_store(struct vtn_builder *b, struct vtn_ssa_value *src,
- nir_deref_instr *dest)
+ nir_deref_instr *dest, enum gl_access_qualifier access)
{
nir_deref_instr *dest_tail = get_deref_tail(dest);
if (dest_tail != dest) {
struct vtn_ssa_value *val = vtn_create_ssa_value(b, dest_tail->type);
- _vtn_local_load_store(b, true, dest_tail, val);
+ _vtn_local_load_store(b, true, dest_tail, val, access);
if (nir_src_is_const(dest->arr.index))
val->def = vtn_vector_insert(b, val->def, src->def,
else
val->def = vtn_vector_insert_dynamic(b, val->def, src->def,
dest->arr.index.ssa);
- _vtn_local_load_store(b, false, dest_tail, val);
+ _vtn_local_load_store(b, false, dest_tail, val, access);
} else {
- _vtn_local_load_store(b, false, dest_tail, src);
+ _vtn_local_load_store(b, false, dest_tail, src, access);
}
}
static void
_vtn_variable_load_store(struct vtn_builder *b, bool load,
struct vtn_pointer *ptr,
+ enum gl_access_qualifier access,
struct vtn_ssa_value **inout)
{
enum glsl_base_type base_type = glsl_get_base_type(ptr->type->type);
*/
if (load) {
*inout = vtn_create_ssa_value(b, ptr->type->type);
- (*inout)->def = nir_load_deref(&b->nb, deref);
+ (*inout)->def = nir_load_deref_with_access(&b->nb, deref,
+ ptr->type->access | access);
} else {
- nir_store_deref(&b->nb, deref, (*inout)->def, ~0);
+ nir_store_deref_with_access(&b->nb, deref, (*inout)->def, ~0,
+ ptr->type->access | access);
}
} else {
if (load) {
- *inout = vtn_local_load(b, deref);
+ *inout = vtn_local_load(b, deref, ptr->type->access | access);
} else {
- vtn_local_store(b, *inout, deref);
+ vtn_local_store(b, *inout, deref, ptr->type->access | access);
}
}
return;
for (unsigned i = 0; i < elems; i++) {
chain.link[0].id = i;
struct vtn_pointer *elem = vtn_pointer_dereference(b, ptr, &chain);
- _vtn_variable_load_store(b, load, elem, &(*inout)->elems[i]);
+ _vtn_variable_load_store(b, load, elem, ptr->type->access | access,
+ &(*inout)->elems[i]);
}
return;
}
return vtn_block_load(b, src);
} else {
struct vtn_ssa_value *val = NULL;
- _vtn_variable_load_store(b, true, src, &val);
+ _vtn_variable_load_store(b, true, src, src->access, &val);
return val;
}
}
dest->mode == vtn_variable_mode_workgroup);
vtn_block_store(b, src, dest);
} else {
- _vtn_variable_load_store(b, false, dest, &src);
+ _vtn_variable_load_store(b, false, dest, dest->access, &src);
}
}