Mesa (master): spirv: Fix propagation of OpVariable access flags

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Apr 20 17:07:19 UTC 2020


Module: Mesa
Branch: master
Commit: a1f6ae4744da830b9bf584296dd9738aa3532357
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=a1f6ae4744da830b9bf584296dd9738aa3532357

Author: Caio Marcelo de Oliveira Filho <caio.oliveira at intel.com>
Date:   Fri Apr 17 14:44:12 2020 -0700

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 at whitecape.org>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4620>

---

 src/compiler/spirv/vtn_private.h   |  4 ----
 src/compiler/spirv/vtn_variables.c | 28 +++++++++-------------------
 2 files changed, 9 insertions(+), 23 deletions(-)

diff --git a/src/compiler/spirv/vtn_private.h b/src/compiler/spirv/vtn_private.h
index f4e6201febe..13f1cf65a83 100644
--- a/src/compiler/spirv/vtn_private.h
+++ b/src/compiler/spirv/vtn_private.h
@@ -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 *
diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c
index 9dc2c755ca5..a4b5799afc4 100644
--- a/src/compiler/spirv/vtn_variables.c
+++ b/src/compiler/spirv/vtn_variables.c
@@ -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) {



More information about the mesa-commit mailing list