From ade777ea1b62e2280c9f05fa09927a8f9bb63f4f Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Fri, 12 Dec 2008 09:56:13 -0700 Subject: mesa: checkpoint: GLSL 1.20 array constructors --- src/mesa/shader/slang/slang_codegen.c | 50 ++++++++++++++++++-------- src/mesa/shader/slang/slang_compile.c | 4 +-- src/mesa/shader/slang/slang_compile_function.c | 20 +++++++++-- src/mesa/shader/slang/slang_compile_function.h | 3 ++ src/mesa/shader/slang/slang_storage.h | 1 - src/mesa/shader/slang/slang_typeinfo.c | 28 ++++++++++++++- src/mesa/shader/slang/slang_typeinfo.h | 10 ++++-- 7 files changed, 92 insertions(+), 24 deletions(-) diff --git a/src/mesa/shader/slang/slang_codegen.c b/src/mesa/shader/slang/slang_codegen.c index 7e32c1ac2f..d50319432e 100644 --- a/src/mesa/shader/slang/slang_codegen.c +++ b/src/mesa/shader/slang/slang_codegen.c @@ -1757,18 +1757,12 @@ _slang_find_function_by_max_argc(slang_function_scope *scope, * struct type. */ static slang_function * -_slang_make_constructor(slang_assemble_ctx *A, slang_struct *str) +_slang_make_struct_constructor(slang_assemble_ctx *A, slang_struct *str) { const GLint numFields = str->fields->num_variables; - - slang_function *fun = (slang_function *) _mesa_malloc(sizeof(slang_function)); - if (!fun) - return NULL; - - slang_function_construct(fun); + slang_function *fun = slang_new_function(SLANG_FUNC_CONSTRUCTOR); /* function header (name, return type) */ - fun->kind = SLANG_FUNC_CONSTRUCTOR; fun->header.a_name = str->a_name; fun->header.type.qualifier = SLANG_QUAL_NONE; fun->header.type.specifier.type = SLANG_SPEC_STRUCT; @@ -1887,7 +1881,6 @@ _slang_make_constructor(slang_assemble_ctx *A, slang_struct *str) ret->children[0].type = SLANG_OPER_IDENTIFIER; ret->children[0].a_id = var->a_name; ret->children[0].locals = _slang_variable_scope_new(scope); - } } /* @@ -1910,7 +1903,7 @@ _slang_locate_struct_constructor(slang_assemble_ctx *A, const char *name) /* found a structure type that matches the function name */ if (!str->constructor) { /* create the constructor function now */ - str->constructor = _slang_make_constructor(A, str); + str->constructor = _slang_make_struct_constructor(A, str); } return str->constructor; } @@ -1919,6 +1912,29 @@ _slang_locate_struct_constructor(slang_assemble_ctx *A, const char *name) } +/** + * Generate a new slang_function to satisfy a call to an array constructor. + * Ex: float[3](1., 2., 3.) + */ +static slang_function * +_slang_make_array_constructor(slang_assemble_ctx *A, slang_operation *oper) +{ + slang_function *fun = slang_new_function(SLANG_FUNC_CONSTRUCTOR); + if (fun) { + slang_type_specifier_type baseType = + slang_type_specifier_type_from_string((char *) oper->a_id); + + fun->header.a_name = oper->a_id; + fun->header.type.qualifier = SLANG_QUAL_NONE; + fun->header.type.specifier.type = SLANG_SPEC_ARRAY; + fun->header.type.specifier._array = + slang_type_specifier_new(baseType, NULL, NULL); + + + } + return fun; +} + static GLboolean _slang_is_vec_mat_type(const char *name) @@ -1959,11 +1975,15 @@ _slang_gen_function_call_name(slang_assemble_ctx *A, const char *name, if (atom == SLANG_ATOM_NULL) return NULL; - /* - * First, try to find function by name and exact argument type matching. - */ - fun = _slang_locate_function(A->space.funcs, atom, params, param_count, - &A->space, A->atoms, A->log, &error); + if (oper->array_constructor) { + /* this needs special handling */ + fun = _slang_make_array_constructor(A, oper); + } + else { + /* Try to find function by name and exact argument type matching */ + fun = _slang_locate_function(A->space.funcs, atom, params, param_count, + &A->space, A->atoms, A->log, &error); + } if (error) { slang_info_log_error(A->log, diff --git a/src/mesa/shader/slang/slang_compile.c b/src/mesa/shader/slang/slang_compile.c index c0f6dc4c93..ebc98c6c08 100644 --- a/src/mesa/shader/slang/slang_compile.c +++ b/src/mesa/shader/slang/slang_compile.c @@ -2181,8 +2181,8 @@ parse_function(slang_parse_ctx * C, slang_output_ctx * O, int definition, /* destroy the existing function declaration and replace it * with the new one, remember to save the fixup table */ - parsed_func.fixups = found_func->fixups; - slang_fixup_table_init(&found_func->fixups); + //parsed_func.fixups = found_func->fixups; + //slang_fixup_table_init(&found_func->fixups); slang_function_destruct(found_func); *found_func = parsed_func; } diff --git a/src/mesa/shader/slang/slang_compile_function.c b/src/mesa/shader/slang/slang_compile_function.c index 8405d7f778..bc926e6c0e 100644 --- a/src/mesa/shader/slang/slang_compile_function.c +++ b/src/mesa/shader/slang/slang_compile_function.c @@ -86,8 +86,8 @@ slang_function_construct(slang_function * func) _slang_variable_scope_ctr(func->parameters); func->param_count = 0; func->body = NULL; - func->address = ~0; - slang_fixup_table_init(&func->fixups); + //func->address = ~0; + //slang_fixup_table_init(&func->fixups); return 1; } @@ -101,9 +101,23 @@ slang_function_destruct(slang_function * func) slang_operation_destruct(func->body); _slang_free(func->body); } - slang_fixup_table_free(&func->fixups); + //slang_fixup_table_free(&func->fixups); } + +slang_function * +slang_new_function(slang_function_kind kind) +{ + slang_function *fun = (slang_function *) + _mesa_malloc(sizeof(slang_function)); + if (fun) { + slang_function_construct(fun); + fun->kind = kind; + } + return fun; +} + + /* * slang_function_scope */ diff --git a/src/mesa/shader/slang/slang_compile_function.h b/src/mesa/shader/slang/slang_compile_function.h index a59b094e08..7fd697ddc8 100644 --- a/src/mesa/shader/slang/slang_compile_function.h +++ b/src/mesa/shader/slang/slang_compile_function.h @@ -64,12 +64,15 @@ typedef struct slang_function_ slang_variable_scope *parameters; /**< formal parameters AND local vars */ unsigned int param_count; /**< number of formal params (no locals) */ slang_operation *body; /**< The instruction tree */ +#if 0 unsigned int address; /**< Address of this func in memory */ slang_fixup_table fixups; /**< Mem locations which need func's address */ +#endif } slang_function; extern int slang_function_construct(slang_function *); extern void slang_function_destruct(slang_function *); +extern slang_function *slang_new_function(slang_function_kind kind); /** diff --git a/src/mesa/shader/slang/slang_storage.h b/src/mesa/shader/slang/slang_storage.h index d3047ee516..1876a36dd6 100644 --- a/src/mesa/shader/slang/slang_storage.h +++ b/src/mesa/shader/slang/slang_storage.h @@ -26,7 +26,6 @@ #define SLANG_STORAGE_H #include "slang_compile.h" -#include "slang_typeinfo.h" /* diff --git a/src/mesa/shader/slang/slang_typeinfo.c b/src/mesa/shader/slang/slang_typeinfo.c index b1afd969d9..7fa357ca14 100644 --- a/src/mesa/shader/slang/slang_typeinfo.c +++ b/src/mesa/shader/slang/slang_typeinfo.c @@ -187,6 +187,21 @@ slang_type_specifier_dtr(slang_type_specifier * self) } } +slang_type_specifier * +slang_type_specifier_new(slang_type_specifier_type type, + struct slang_struct_ *_struct, + struct slang_type_specifier_ *_array) +{ + slang_type_specifier *spec = + (slang_type_specifier *) _mesa_malloc(sizeof(slang_type_specifier)); + if (spec) { + spec->type = type; + spec->_struct = _struct; + spec->_array = _array; + } + return spec; +} + GLboolean slang_type_specifier_copy(slang_type_specifier * x, const slang_type_specifier * y) @@ -583,7 +598,18 @@ _slang_typeof_operation_(slang_operation * op, } break; case SLANG_OPER_CALL: - if (op->fun) { + if (op->array_constructor) { + /* build array typeinfo */ + ti->spec.type = SLANG_SPEC_ARRAY; + ti->spec._array = (slang_type_specifier *) + _slang_alloc(sizeof(slang_type_specifier)); + slang_type_specifier_ctr(ti->spec._array); + + ti->spec._array->type = + slang_type_specifier_type_from_string((char *) op->a_id); + ti->array_len = op->num_children; + } + else if (op->fun) { /* we've resolved this call before */ slang_type_specifier_copy(&ti->spec, &op->fun->header.type.specifier); } diff --git a/src/mesa/shader/slang/slang_typeinfo.h b/src/mesa/shader/slang/slang_typeinfo.h index b3ad06b65c..cde468bc4e 100644 --- a/src/mesa/shader/slang/slang_typeinfo.h +++ b/src/mesa/shader/slang/slang_typeinfo.h @@ -134,8 +134,8 @@ typedef enum slang_type_specifier_type_ typedef struct slang_type_specifier_ { slang_type_specifier_type type; - struct slang_struct_ *_struct; /**< used if type == spec_struct */ - struct slang_type_specifier_ *_array; /**< used if type == spec_array */ + struct slang_struct_ *_struct; /**< if type == SLANG_SPEC_STRUCT */ + struct slang_type_specifier_ *_array; /**< if type == SLANG_SPEC_ARRAY */ } slang_type_specifier; @@ -145,6 +145,12 @@ slang_type_specifier_ctr(slang_type_specifier *); extern GLvoid slang_type_specifier_dtr(slang_type_specifier *); +extern slang_type_specifier * +slang_type_specifier_new(slang_type_specifier_type type, + struct slang_struct_ *_struct, + struct slang_type_specifier_ *_array); + + extern GLboolean slang_type_specifier_copy(slang_type_specifier *, const slang_type_specifier *); -- cgit v1.2.3