[Mesa-dev] [PATCH 2/2] spirv: propagate the access flag for store and load derefs

Jason Ekstrand jason at jlekstrand.net
Wed Mar 27 00:37:01 UTC 2019


Reviewed-by: <Jason Ekstrand jason at jlekstrand.net>

Also applies to the other patch with or without the suggested change.

On March 26, 2019 17:10:53 Samuel Pitoiset <samuel.pitoiset at gmail.com> wrote:

> It was only propagated when UBO/SSBO access are lowered to offsets.
>
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> ---
> src/compiler/spirv/vtn_cfg.c       |  8 +++---
> src/compiler/spirv/vtn_private.h   |  6 +++--
> src/compiler/spirv/vtn_variables.c | 42 +++++++++++++++++-------------
> 3 files changed, 32 insertions(+), 24 deletions(-)
>
> diff --git a/src/compiler/spirv/vtn_cfg.c b/src/compiler/spirv/vtn_cfg.c
> index 7868eeb60bc..af8ef52e2e8 100644
> --- a/src/compiler/spirv/vtn_cfg.c
> +++ b/src/compiler/spirv/vtn_cfg.c
> @@ -232,7 +232,7 @@ vtn_handle_function_call(struct vtn_builder *b, SpvOp 
> opcode,
>    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));
>    }
> }
>
> @@ -792,7 +792,7 @@ vtn_handle_phis_first_pass(struct vtn_builder *b, SpvOp 
> opcode,
>    _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;
> }
> @@ -816,7 +816,7 @@ vtn_handle_phi_second_pass(struct vtn_builder *b, SpvOp 
> opcode,
>
>       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;
> @@ -910,7 +910,7 @@ vtn_emit_cf_list(struct vtn_builder *b, struct 
> list_head *cf_list,
>             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) {
> diff --git a/src/compiler/spirv/vtn_private.h 
> b/src/compiler/spirv/vtn_private.h
> index 463d6173640..395250984c5 100644
> --- a/src/compiler/spirv/vtn_private.h
> +++ b/src/compiler/spirv/vtn_private.h
> @@ -730,10 +730,12 @@ vtn_pointer_to_offset(struct vtn_builder *b, struct 
> vtn_pointer *ptr,
>                       nir_ssa_def **index_out);
>
> 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);
>
> 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);
>
> struct vtn_ssa_value *
> vtn_variable_load(struct vtn_builder *b, struct vtn_pointer *src);
> diff --git a/src/compiler/spirv/vtn_variables.c 
> b/src/compiler/spirv/vtn_variables.c
> index 43c32930cff..91329567335 100644
> --- a/src/compiler/spirv/vtn_variables.c
> +++ b/src/compiler/spirv/vtn_variables.c
> @@ -590,13 +590,14 @@ vtn_pointer_to_deref(struct vtn_builder *b, struct 
> vtn_pointer *ptr)
>
> 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)) {
> @@ -604,14 +605,14 @@ _vtn_local_load_store(struct vtn_builder *b, bool 
> load, nir_deref_instr *deref,
>       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);
>       }
>    }
> }
> @@ -644,11 +645,12 @@ get_deref_tail(nir_deref_instr *deref)
> }
>
> 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;
> @@ -664,13 +666,13 @@ vtn_local_load(struct vtn_builder *b, nir_deref_instr 
> *src)
>
> 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,
> @@ -678,9 +680,9 @@ vtn_local_store(struct vtn_builder *b, struct 
> vtn_ssa_value *src,
>       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);
>    }
> }
>
> @@ -1014,6 +1016,7 @@ vtn_block_store(struct vtn_builder *b, struct 
> vtn_ssa_value *src,
> 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);
> @@ -1045,15 +1048,17 @@ _vtn_variable_load_store(struct vtn_builder *b, 
> bool load,
>              */
>             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;
> @@ -1080,7 +1085,8 @@ _vtn_variable_load_store(struct vtn_builder *b, bool 
> load,
>       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;
>    }
> @@ -1097,7 +1103,7 @@ vtn_variable_load(struct vtn_builder *b, struct 
> vtn_pointer *src)
>       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;
>    }
> }
> @@ -1111,7 +1117,7 @@ vtn_variable_store(struct vtn_builder *b, struct 
> vtn_ssa_value *src,
>                  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);
>    }
> }
>
> --
> 2.21.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev





More information about the mesa-dev mailing list