From 5daa99d2a40fa12d51043c4e326bf62f66ef727d Mon Sep 17 00:00:00 2001 From: Brian Date: Sat, 13 Jan 2007 14:47:48 -0700 Subject: slang_variable_scope now stores array of pointers to slang_variables. --- src/mesa/shader/slang/slang_assemble.c | 18 ++++---- src/mesa/shader/slang/slang_assemble.h | 9 +--- src/mesa/shader/slang/slang_compile_function.c | 4 +- src/mesa/shader/slang/slang_compile_struct.c | 4 +- src/mesa/shader/slang/slang_compile_variable.c | 61 +++++++++++++++++++------- src/mesa/shader/slang/slang_compile_variable.h | 6 +-- 6 files changed, 63 insertions(+), 39 deletions(-) diff --git a/src/mesa/shader/slang/slang_assemble.c b/src/mesa/shader/slang/slang_assemble.c index c318a0b79b..a9d2baedb9 100644 --- a/src/mesa/shader/slang/slang_assemble.c +++ b/src/mesa/shader/slang/slang_assemble.c @@ -218,7 +218,7 @@ sizeof_variables(slang_assemble_ctx * A, slang_variable_scope * vars, GLuint i; for (i = start; i < stop; i++) - if (!sizeof_variable2(A, &vars->variables[i], size)) + if (!sizeof_variable2(A, vars->variables[i], size)) return GL_FALSE; return GL_TRUE; } @@ -270,7 +270,7 @@ _slang_locate_function(const slang_function_scope * funcs, slang_atom a_name, return NULL; } if (!slang_type_specifier_equal(&ti.spec, - &f->parameters->variables[j/* + haveRetValue*/].type.specifier)) { + &f->parameters->variables[j/* + haveRetValue*/]->type.specifier)) { slang_assembly_typeinfo_destruct(&ti); break; } @@ -278,8 +278,8 @@ _slang_locate_function(const slang_function_scope * funcs, slang_atom a_name, /* "out" and "inout" formal parameter requires the actual parameter to be l-value */ if (!ti.can_be_referenced && - (f->parameters->variables[j/* + haveRetValue*/].type.qualifier == slang_qual_out || - f->parameters->variables[j/* + haveRetValue*/].type.qualifier == slang_qual_inout)) + (f->parameters->variables[j/* + haveRetValue*/]->type.qualifier == slang_qual_out || + f->parameters->variables[j/* + haveRetValue*/]->type.qualifier == slang_qual_inout)) break; } if (j == num_args) @@ -599,8 +599,8 @@ _slang_assemble_function_call(slang_assemble_ctx * A, slang_function * fun, /* push the actual parameters on the stack */ for (i = 0; i < param_count; i++) { - if (fun->parameters->variables[i /*+ haveRetValue*/].type.qualifier == slang_qual_inout || - fun->parameters->variables[i /*+ haveRetValue*/].type.qualifier == slang_qual_out) { + if (fun->parameters->variables[i /*+ haveRetValue*/]->type.qualifier == slang_qual_inout || + fun->parameters->variables[i /*+ haveRetValue*/]->type.qualifier == slang_qual_out) { if (!PLAB2(A->file, slang_asm_local_addr, A->local.addr_tmp, 4)) return GL_FALSE; /* TODO: optimize the "out" parameter case */ @@ -644,8 +644,8 @@ _slang_assemble_function_call(slang_assemble_ctx * A, slang_function * fun, A->swz = p_swz[j]; A->ref = p_ref[j]; - if (fun->parameters->variables[j /*+ haveRetValue*/].type.qualifier == slang_qual_inout || - fun->parameters->variables[j/* + haveRetValue*/].type.qualifier == slang_qual_out) { + if (fun->parameters->variables[j /*+ haveRetValue*/]->type.qualifier == slang_qual_inout || + fun->parameters->variables[j/* + haveRetValue*/]->type.qualifier == slang_qual_out) { /* for output parameter copy the contents of the formal parameter * back to the original actual parameter */ @@ -1088,7 +1088,7 @@ handle_field(slang_assemble_ctx * A, slang_assembly_typeinfo * tia, slang_storage_aggregate agg; GLuint size; - field = &tib->spec._struct->fields->variables[i]; + field = tib->spec._struct->fields->variables[i]; if (!slang_storage_aggregate_construct(&agg)) RETURN_NIL(); if (!_slang_aggregate_variable(&agg, &field->type.specifier, diff --git a/src/mesa/shader/slang/slang_assemble.h b/src/mesa/shader/slang/slang_assemble.h index 8aafeb012f..e801ea249d 100644 --- a/src/mesa/shader/slang/slang_assemble.h +++ b/src/mesa/shader/slang/slang_assemble.h @@ -28,6 +28,7 @@ #include "imports.h" #include "mtypes.h" #include "slang_utility.h" +#include "slang_vartable.h" #if defined __cplusplus extern "C" { @@ -243,12 +244,6 @@ typedef struct slang_assembly_name_space_ } slang_assembly_name_space; -typedef struct { - GLboolean TempUsed[MAX_PROGRAM_TEMPS]; - GLuint NumSamplers; -} slang_gen_context; - - typedef struct slang_assemble_ctx_ { slang_assembly_file *file; @@ -260,7 +255,7 @@ typedef struct slang_assemble_ctx_ slang_ref_type ref; slang_swizzle swz; struct gl_program *program; - slang_gen_context *codegen; + slang_var_table *vartable; } slang_assemble_ctx; extern struct slang_function_ * diff --git a/src/mesa/shader/slang/slang_compile_function.c b/src/mesa/shader/slang/slang_compile_function.c index 58a453d4c2..3642b12e92 100644 --- a/src/mesa/shader/slang/slang_compile_function.c +++ b/src/mesa/shader/slang/slang_compile_function.c @@ -196,8 +196,8 @@ slang_function_scope_find(slang_function_scope * funcs, slang_function * fun, continue; for (j = haveRetValue; j < fun->param_count; j++) { if (!slang_type_specifier_equal - (&fun->parameters->variables[j].type.specifier, - &f->parameters->variables[j].type.specifier)) + (&fun->parameters->variables[j]->type.specifier, + &f->parameters->variables[j]->type.specifier)) break; } if (j == fun->param_count) { diff --git a/src/mesa/shader/slang/slang_compile_struct.c b/src/mesa/shader/slang/slang_compile_struct.c index 15585a62af..5033a6cb10 100644 --- a/src/mesa/shader/slang/slang_compile_struct.c +++ b/src/mesa/shader/slang/slang_compile_struct.c @@ -153,8 +153,8 @@ int slang_struct_equal (const slang_struct *x, const slang_struct *y) return 0; for (i = 0; i < x->fields->num_variables; i++) { - slang_variable *varx = &x->fields->variables[i]; - slang_variable *vary = &y->fields->variables[i]; + slang_variable *varx = x->fields->variables[i]; + slang_variable *vary = y->fields->variables[i]; if (varx->a_name != vary->a_name) return 0; diff --git a/src/mesa/shader/slang/slang_compile_variable.c b/src/mesa/shader/slang/slang_compile_variable.c index 046db2cefc..b19615b085 100644 --- a/src/mesa/shader/slang/slang_compile_variable.c +++ b/src/mesa/shader/slang/slang_compile_variable.c @@ -123,6 +123,29 @@ slang_fully_specified_type_copy(slang_fully_specified_type * x, return 1; } + +static slang_variable * +slang_variable_new(void) +{ + slang_variable *v = (slang_variable *) malloc(sizeof(slang_variable)); + if (v) { + if (!slang_variable_construct(v)) { + free(v); + v = NULL; + } + } + return v; +} + + +static void +slang_variable_delete(slang_variable * var) +{ + slang_variable_destruct(var); + free(var); +} + + /* * slang_variable_scope */ @@ -152,8 +175,10 @@ slang_variable_scope_destruct(slang_variable_scope * scope) if (!scope) return; - for (i = 0; i < scope->num_variables; i++) - slang_variable_destruct(scope->variables + i); + for (i = 0; i < scope->num_variables; i++) { + if (scope->variables[i]) + slang_variable_delete(scope->variables[i]); + } slang_alloc_free(scope->variables); /* do not free scope->outer_scope */ } @@ -166,21 +191,22 @@ slang_variable_scope_copy(slang_variable_scope * x, unsigned int i; _slang_variable_scope_ctr(&z); - z.variables = (slang_variable *) - slang_alloc_malloc(y->num_variables * sizeof(slang_variable)); + z.variables = (slang_variable **) + _mesa_calloc(y->num_variables * sizeof(slang_variable *)); if (z.variables == NULL) { slang_variable_scope_destruct(&z); return 0; } for (z.num_variables = 0; z.num_variables < y->num_variables; z.num_variables++) { - if (!slang_variable_construct(&z.variables[z.num_variables])) { + z.variables[z.num_variables] = slang_variable_new(); + if (!z.variables[z.num_variables]) { slang_variable_scope_destruct(&z); return 0; } } for (i = 0; i < z.num_variables; i++) { - if (!slang_variable_copy(&z.variables[i], &y->variables[i])) { + if (!slang_variable_copy(z.variables[i], y->variables[i])) { slang_variable_scope_destruct(&z); return 0; } @@ -200,19 +226,20 @@ slang_variable * slang_variable_scope_grow(slang_variable_scope *scope) { const int n = scope->num_variables; - scope->variables = (slang_variable *) + scope->variables = (slang_variable **) slang_alloc_realloc(scope->variables, - n * sizeof(slang_variable), - (n + 1) * sizeof(slang_variable)); + n * sizeof(slang_variable *), + (n + 1) * sizeof(slang_variable *)); if (!scope->variables) return NULL; scope->num_variables++; - if (!slang_variable_construct(scope->variables + n)) + scope->variables[n] = slang_variable_new(); + if (!scope->variables[n]) return NULL; - return scope->variables + n; + return scope->variables[n]; } @@ -230,12 +257,13 @@ slang_variable_construct(slang_variable * var) var->address = ~0; var->size = 0; var->global = GL_FALSE; - var->declared = GL_FALSE; + var->isTemp = GL_FALSE; var->used = GL_FALSE; var->aux = NULL; return 1; } + void slang_variable_destruct(slang_variable * var) { @@ -246,6 +274,7 @@ slang_variable_destruct(slang_variable * var) } } + int slang_variable_copy(slang_variable * x, const slang_variable * y) { @@ -291,8 +320,8 @@ _slang_locate_variable(const slang_variable_scope * scope, GLuint i; for (i = 0; i < scope->num_variables; i++) - if (a_name == scope->variables[i].a_name) - return &scope->variables[i]; + if (a_name == scope->variables[i]->a_name) + return scope->variables[i]; if (all && scope->outer_scope != NULL) return _slang_locate_variable(scope->outer_scope, a_name, 1); return NULL; @@ -384,7 +413,7 @@ build_quant(slang_export_data_quant * q, const slang_variable * var) slang_export_data_quant_ctr(&q->structure[i]); for (i = 0; i < q->u.field_count; i++) { if (!build_quant(&q->structure[i], - &spec->_struct->fields->variables[i])) + spec->_struct->fields->variables[i])) return GL_FALSE; } } @@ -400,7 +429,7 @@ _slang_build_export_data_table(slang_export_data_table * tbl, GLuint i; for (i = 0; i < vars->num_variables; i++) { - const slang_variable *var = &vars->variables[i]; + const slang_variable *var = vars->variables[i]; slang_export_data_entry *e; e = slang_export_data_table_add(tbl); diff --git a/src/mesa/shader/slang/slang_compile_variable.h b/src/mesa/shader/slang/slang_compile_variable.h index d52e2660dc..82800b32b5 100644 --- a/src/mesa/shader/slang/slang_compile_variable.h +++ b/src/mesa/shader/slang/slang_compile_variable.h @@ -81,7 +81,7 @@ typedef struct slang_variable_ GLuint size; /**< Variable's size in bytes */ GLboolean global; /**< A global var? */ GLboolean used; /**< Ever referenced by code? */ - GLboolean declared; /**< Declared by slang_variable_decl? */ + GLboolean isTemp; /**< a named temporary (__resultTmp) */ void *aux; /**< Used during code gen */ } slang_variable; @@ -91,7 +91,7 @@ typedef struct slang_variable_ */ typedef struct slang_variable_scope_ { - slang_variable *variables; /**< Array [num_variables] */ + slang_variable **variables; /**< Array [num_variables] of ptrs to vars */ GLuint num_variables; struct slang_variable_scope_ *outer_scope; } slang_variable_scope; @@ -110,7 +110,7 @@ extern int slang_variable_scope_copy(slang_variable_scope *, const slang_variable_scope *); -slang_variable * +extern slang_variable * slang_variable_scope_grow(slang_variable_scope *); extern int -- cgit v1.2.3