[Mesa-dev] [PATCH 16/18] nir/spirv: Stop using glsl_type for function types

Jason Ekstrand jason at jlekstrand.net
Thu Jun 29 17:33:38 UTC 2017


We're going to want the full vtn_type available to us anyway at which
point glsl_type isn't really buying us anything.
---
 src/compiler/spirv/spirv_to_nir.c | 23 +++++++++++++----------
 src/compiler/spirv/vtn_cfg.c      | 30 +++++++++---------------------
 src/compiler/spirv/vtn_private.h  |  9 +++++++++
 3 files changed, 31 insertions(+), 31 deletions(-)

diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c
index 2d912e9..cc3ba0d 100644
--- a/src/compiler/spirv/spirv_to_nir.c
+++ b/src/compiler/spirv/spirv_to_nir.c
@@ -423,7 +423,6 @@ vtn_type_copy(struct vtn_builder *b, struct vtn_type *src)
    case vtn_base_type_array:
    case vtn_base_type_image:
    case vtn_base_type_sampler:
-   case vtn_base_type_function:
       /* Nothing more to do */
       break;
 
@@ -436,6 +435,11 @@ vtn_type_copy(struct vtn_builder *b, struct vtn_type *src)
       memcpy(dest->offsets, src->offsets,
              src->length * sizeof(src->offsets[0]));
       break;
+
+   case vtn_base_type_function:
+      dest->params = ralloc_array(b, struct vtn_type *, src->length);
+      memcpy(dest->params, src->params, src->length * sizeof(src->params[0]));
+      break;
    }
 
    return dest;
@@ -840,18 +844,17 @@ vtn_handle_type(struct vtn_builder *b, SpvOp opcode,
 
    case SpvOpTypeFunction: {
       val->type->base_type = vtn_base_type_function;
+      val->type->type = NULL;
 
-      const struct glsl_type *return_type =
-         vtn_value(b, w[2], vtn_value_type_type)->type->type;
-      NIR_VLA(struct glsl_function_param, params, count - 3);
-      for (unsigned i = 0; i < count - 3; i++) {
-         params[i].type = vtn_value(b, w[i + 3], vtn_value_type_type)->type->type;
+      val->type->return_type = vtn_value(b, w[2], vtn_value_type_type)->type;
 
-         /* FIXME: */
-         params[i].in = true;
-         params[i].out = true;
+      const unsigned num_params = count - 3;
+      val->type->length = num_params;
+      val->type->params = ralloc_array(b, struct vtn_type *, num_params);
+      for (unsigned i = 0; i < count - 3; i++) {
+         val->type->params[i] =
+            vtn_value(b, w[i + 3], vtn_value_type_type)->type;
       }
-      val->type->type = glsl_function_type(return_type, params, count - 3);
       break;
    }
 
diff --git a/src/compiler/spirv/vtn_cfg.c b/src/compiler/spirv/vtn_cfg.c
index 0bdc913..dc429e6 100644
--- a/src/compiler/spirv/vtn_cfg.c
+++ b/src/compiler/spirv/vtn_cfg.c
@@ -41,36 +41,24 @@ vtn_cfg_handle_prepass_instruction(struct vtn_builder *b, SpvOp opcode,
       struct vtn_value *val = vtn_push_value(b, w[2], vtn_value_type_function);
       val->func = b->func;
 
-      const struct glsl_type *func_type =
-         vtn_value(b, w[4], vtn_value_type_type)->type->type;
+      const struct vtn_type *func_type =
+         vtn_value(b, w[4], vtn_value_type_type)->type;
 
-      assert(glsl_get_function_return_type(func_type) == result_type);
+      assert(func_type->return_type->type == result_type);
 
       nir_function *func =
          nir_function_create(b->shader, ralloc_strdup(b->shader, val->name));
 
-      func->num_params = glsl_get_length(func_type);
+      func->num_params = func_type->length;
       func->params = ralloc_array(b->shader, nir_parameter, func->num_params);
       for (unsigned i = 0; i < func->num_params; i++) {
-         const struct glsl_function_param *param =
-            glsl_get_function_param(func_type, i);
-         func->params[i].type = param->type;
-         if (param->in) {
-            if (param->out) {
-               func->params[i].param_type = nir_parameter_inout;
-            } else {
-               func->params[i].param_type = nir_parameter_in;
-            }
-         } else {
-            if (param->out) {
-               func->params[i].param_type = nir_parameter_out;
-            } else {
-               assert(!"Parameter is neither in nor out");
-            }
-         }
+         func->params[i].type = func_type->params[i]->type;
+
+         /* TODO: We could do something smarter here. */
+         func->params[i].param_type = nir_parameter_inout;
       }
 
-      func->return_type = glsl_get_function_return_type(func_type);
+      func->return_type = func_type->return_type->type;
 
       b->func->impl = nir_function_impl_create(func);
 
diff --git a/src/compiler/spirv/vtn_private.h b/src/compiler/spirv/vtn_private.h
index e54ddf0..4972b55 100644
--- a/src/compiler/spirv/vtn_private.h
+++ b/src/compiler/spirv/vtn_private.h
@@ -271,6 +271,15 @@ struct vtn_type {
          /* Access qualifier for storage images */
          SpvAccessQualifier access_qualifier;
       };
+
+      /* Members for function types */
+      struct {
+         /* For functions, the vtn_type for each parameter */
+         struct vtn_type **params;
+
+         /* Return type for functions */
+         struct vtn_type *return_type;
+      };
    };
 };
 
-- 
2.5.0.400.gff86faf



More information about the mesa-dev mailing list