mesa: glsl: code consolidation in _slang_gen_declaration()
authorBrian Paul <brian.paul@tungstengraphics.com>
Wed, 6 Aug 2008 02:56:18 +0000 (20:56 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Wed, 6 Aug 2008 02:57:17 +0000 (20:57 -0600)
src/mesa/shader/slang/slang_codegen.c

index 94497cd833ec62e33f2808b9b9fd92ea6a6e53a6..f891068322cf25b196770f7fe23f9483cd8798f3 100644 (file)
@@ -2717,6 +2717,7 @@ _slang_gen_declaration(slang_assemble_ctx *A, slang_operation *oper)
    slang_ir_node *varDecl;
    slang_variable *v;
    const char *varName = (char *) oper->a_id;
+   slang_operation *initializer;
 
    assert(oper->num_children == 0 || oper->num_children == 1);
 
@@ -2733,26 +2734,24 @@ _slang_gen_declaration(slang_assemble_ctx *A, slang_operation *oper)
 
    varDecl = _slang_gen_var_decl(A, v);
 
+   /* check if the var has an initializer */
    if (oper->num_children > 0) {
-      /* child is initializer */
-      slang_ir_node *var, *init, *rhs;
       assert(oper->num_children == 1);
-      var = new_var(A, oper, oper->a_id);
-      if (!var) {
-         slang_info_log_error(A->log, "undefined variable '%s'", varName);
-         return NULL;
-      }
-      /* XXX make copy of this initializer? */
-      rhs = _slang_gen_operation(A, &oper->children[0]);
-      if (!rhs)
-         return NULL;  /* must have found an error */
-      init = new_node2(IR_COPY, var, rhs);
-
-      /*assert(rhs->Opcode != IR_SEQ);*/
-      n = new_seq(varDecl, init);
+      initializer = &oper->children[0];
    }
    else if (v->initializer) {
-      slang_ir_node *var, *init, *rhs;
+      initializer = v->initializer;
+   }
+   else {
+      initializer = NULL;
+   }
+
+   if (initializer) {
+      slang_ir_node *var, *init;
+
+      /* XXX todo: type check/compare var and initializer */
+
+
       var = new_var(A, oper, oper->a_id);
       if (!var) {
          slang_info_log_error(A->log, "undefined variable '%s'", varName);
@@ -2763,42 +2762,36 @@ _slang_gen_declaration(slang_assemble_ctx *A, slang_operation *oper)
          /* if the variable is const, the initializer must be a const
           * expression as well.
           */
-         if (!_slang_is_constant_expr(v->initializer)) {
+#if 0
+         if (!_slang_is_constant_expr(initializer)) {
             slang_info_log_error(A->log,
                                  "initializer for %s not constant", varName);
             return NULL;
          }
+#endif
       }
 
-#if 0
-      /* XXX make copy of this initializer? */
-      {
-         slang_operation dup;
-         slang_operation_construct(&dup);
-         slang_operation_copy(&dup, v->initializer);
-         _slang_simplify(&dup, &A->space, A->atoms); 
-         rhs = _slang_gen_operation(A, &dup);
-      }
-#else
-      _slang_simplify(v->initializer, &A->space, A->atoms); 
-      rhs = _slang_gen_operation(A, v->initializer);
-#endif
-      if (!rhs)
+      _slang_simplify(initializer, &A->space, A->atoms); 
+
+      init = _slang_gen_operation(A, initializer);
+      if (!init)
          return NULL;
 
-      /*assert(rhs->Store);*/
+      /*assert(init->Store);*/
 
-      if (rhs->Store && var->Store->Size != rhs->Store->Size) {
+      /* XXX remove this when type checking is added above */
+      if (init->Store && var->Store->Size != init->Store->Size) {
          slang_info_log_error(A->log, "invalid assignment (wrong types)");
          return NULL;
       }
 
-      init = new_node2(IR_COPY, var, rhs);
-      n = new_seq(varDecl, init);
+      n = new_node2(IR_COPY, var, init);
+      n = new_seq(varDecl, n);
    }
    else {
       n = varDecl;
    }
+
    return n;
 }
 
@@ -2893,11 +2886,11 @@ _slang_assignment_compatible(slang_assemble_ctx *A,
        t1.spec.type == SLANG_SPEC_BOOL)
       return GL_FALSE;
 
-#if 0 /* not used just yet - causes problems elsewhere */
    if (t0.spec.type == SLANG_SPEC_INT &&
        t1.spec.type == SLANG_SPEC_FLOAT)
       return GL_FALSE;
 
+#if 0 /* not used just yet - causes problems elsewhere */
    if (t0.spec.type == SLANG_SPEC_BOOL &&
        t1.spec.type == SLANG_SPEC_FLOAT)
       return GL_FALSE;