mesa: glsl clean-ups
authorBrian Paul <brian.paul@tungstengraphics.com>
Fri, 12 Dec 2008 01:49:28 +0000 (18:49 -0700)
committerBrian Paul <brian.paul@tungstengraphics.com>
Fri, 12 Dec 2008 01:49:28 +0000 (18:49 -0700)
src/mesa/shader/slang/slang_codegen.c
src/mesa/shader/slang/slang_compile.c
src/mesa/shader/slang/slang_compile_operation.c
src/mesa/shader/slang/slang_compile_operation.h

index 9d6a9d7d1b226e16f5ab8c4698f6f50eb79d09fe..2030cc03faf792349e6c3c826c13ac631bc0df11 100644 (file)
@@ -2490,61 +2490,62 @@ _slang_gen_var_decl(slang_assemble_ctx *A, slang_variable *var)
    var->declared = GL_TRUE;
 
    n = new_node0(IR_VAR_DECL);
-   if (n) {
-      _slang_attach_storage(n, var);
-      assert(var->store);
-      assert(n->Store == var->store);
-      assert(n->Store);
-      assert(n->Store->Index < 0);
+   if (!n)
+      return NULL;
 
-      if (is_sampler_type(&var->type)) {
-         n->Store->File = PROGRAM_SAMPLER;
-      }
-      else {
-         n->Store->File = PROGRAM_TEMPORARY;
-      }
+   _slang_attach_storage(n, var);
+   assert(var->store);
+   assert(n->Store == var->store);
+   assert(n->Store);
+   assert(n->Store->Index < 0);
+
+   if (is_sampler_type(&var->type)) {
+      n->Store->File = PROGRAM_SAMPLER;
+   }
+   else {
+      n->Store->File = PROGRAM_TEMPORARY;
+   }
 
-      n->Store->Size = _slang_sizeof_type_specifier(&n->Var->type.specifier);
+   n->Store->Size = _slang_sizeof_type_specifier(&n->Var->type.specifier);
 
-      if (n->Store->Size <= 0) {
-         slang_info_log_error(A->log, "invalid declaration for '%s'",
-                              (char*) var->a_name);
-         return NULL;
-      }
+   if (n->Store->Size <= 0) {
+      slang_info_log_error(A->log, "invalid declaration for '%s'",
+                           (char*) var->a_name);
+      return NULL;
+   }
 #if 0
-      printf("%s var %p %s  store=%p index=%d size=%d\n",
-             __FUNCTION__, (void *) var, (char *) var->a_name,
-             (void *) n->Store, n->Store->Index, n->Store->Size);
+   printf("%s var %p %s  store=%p index=%d size=%d\n",
+          __FUNCTION__, (void *) var, (char *) var->a_name,
+          (void *) n->Store, n->Store->Index, n->Store->Size);
 #endif
 
-      if (var->array_len > 0) {
-         /* this is an array */
-         /* round up the element size to a multiple of 4 */
-         GLint sz = (n->Store->Size + 3) & ~3;
-         /* total size = element size * array length */
-         sz *= var->array_len;
-         n->Store->Size = sz;
-      }
-
-      assert(n->Store->Size > 0);
+   if (var->array_len > 0) {
+      /* this is an array */
+      /* round up the element size to a multiple of 4 */
+      GLint sz = (n->Store->Size + 3) & ~3;
+      /* total size = element size * array length */
+      sz *= var->array_len;
+      n->Store->Size = sz;
+   }
 
-      /* setup default swizzle for storing the variable */
-      switch (n->Store->Size) {
-      case 2:
-         n->Store->Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y,
-                                           SWIZZLE_NIL, SWIZZLE_NIL);
-         break;
-      case 3:
-         n->Store->Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y,
-                                           SWIZZLE_Z, SWIZZLE_NIL);
-         break;
-      default:
-         /* Note that float-sized vars may be allocated in any x/y/z/w
-          * slot, but that won't be determined until code emit time.
-          */
-         n->Store->Swizzle = SWIZZLE_NOOP;
-      }
+   /* setup default swizzle for storing the variable */
+   /* XXX this may not be needed anymore - remove & test */
+   switch (n->Store->Size) {
+   case 2:
+      n->Store->Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y,
+                                        SWIZZLE_NIL, SWIZZLE_NIL);
+      break;
+   case 3:
+      n->Store->Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y,
+                                        SWIZZLE_Z, SWIZZLE_NIL);
+      break;
+   default:
+      /* Note that float-sized vars may be allocated in any x/y/z/w
+       * slot, but that won't be determined until code emit time.
+       */
+      n->Store->Swizzle = SWIZZLE_NOOP;
    }
+
    return n;
 }
 
index 68eefd2cf1e70d5ec2c89e3feb681e9f2c0e9985..c0f6dc4c93aab229e179d64079dcb40109ff69b1 100644 (file)
@@ -1477,6 +1477,7 @@ parse_expression(slang_parse_ctx * C, slang_output_ctx * O,
                      RETURN0;
                   }
                   array_constructor_size = (int) array_size.literal[0];
+                  op->array_constructor = GL_TRUE;
                   slang_operation_destruct(&array_size);
                }
                break;
index 53cf6faff9796a7b009bfe5591a2cd1913024f2d..ecec2d8b7dfba504becdf60c41673f9b03b5b23f 100644 (file)
@@ -44,6 +44,7 @@ slang_operation_construct(slang_operation * oper)
    oper->num_children = 0;
    oper->literal[0] = 0.0;
    oper->literal_size = 1;
+   oper->array_constructor = GL_FALSE;
    oper->a_id = SLANG_ATOM_NULL;
    oper->locals = _slang_variable_scope_new(NULL);
    if (oper->locals == NULL)
index ec99338cb8813d28e8511eeda18a0db648362c5f..37af5d617c9775a777443c28b0b102d0f9bc90d7 100644 (file)
@@ -121,6 +121,12 @@ typedef struct slang_operation_
    struct slang_function_ *fun;  /**< If type == SLANG_OPER_CALL */
    struct slang_variable_ *var;  /**< If type == slang_oper_identier */
    struct slang_label_ *label;   /**< If type == SLANG_OPER_LABEL */
+   /** If type==SLANG_OPER_CALL and we're calling an array constructor,
+    * for which there's no real function, we need to have a flag to
+    * indicate such.  num_children indicates number of elements.
+    */
+   GLboolean array_constructor;
+   double x;
 } slang_operation;