summaryrefslogtreecommitdiffstats
path: root/src/compiler
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/spirv/spirv_to_nir.c23
-rw-r--r--src/compiler/spirv/vtn_cfg.c30
-rw-r--r--src/compiler/spirv/vtn_private.h9
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 2d912e9e54e..cc3ba0d003a 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 b03db904cc8..7158b32cf98 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 48156fac4bd..b43b013d523 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;
+ };
};
};