OSDN Git Service

slang_variable_scope now stores array of pointers to slang_variables.
authorBrian <brian@yutani.localnet.net>
Sat, 13 Jan 2007 21:47:48 +0000 (14:47 -0700)
committerBrian <brian@yutani.localnet.net>
Sat, 13 Jan 2007 21:47:48 +0000 (14:47 -0700)
src/mesa/shader/slang/slang_assemble.c
src/mesa/shader/slang/slang_assemble.h
src/mesa/shader/slang/slang_compile_function.c
src/mesa/shader/slang/slang_compile_struct.c
src/mesa/shader/slang/slang_compile_variable.c
src/mesa/shader/slang/slang_compile_variable.h

index c318a0b..a9d2bae 100644 (file)
@@ -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,
index 8aafeb0..e801ea2 100644 (file)
@@ -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_ *
index 58a453d..3642b12 100644 (file)
@@ -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) {
index 15585a6..5033a6c 100644 (file)
@@ -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;
index 046db2c..b19615b 100644 (file)
@@ -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);
index d52e266..82800b3 100644 (file)
@@ -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