diff options
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/spirv/spirv_to_nir.c | 23 | ||||
-rw-r--r-- | src/compiler/spirv/vtn_cfg.c | 30 | ||||
-rw-r--r-- | 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 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; + }; }; }; |