mesa: fix some more GLSL 1.20 array things.
authorBrian Paul <brian.paul@tungstengraphics.com>
Fri, 12 Dec 2008 20:05:29 +0000 (13:05 -0700)
committerBrian Paul <brian.paul@tungstengraphics.com>
Fri, 12 Dec 2008 20:05:29 +0000 (13:05 -0700)
Function that return arrays should work now.

src/mesa/shader/slang/slang_codegen.c
src/mesa/shader/slang/slang_compile.c

index 3f31f956fa550b6a3d004513795ff3d6e3e5b19a..38f6713aff9f5c7a5988948f27bc9a5c20ef54aa 100644 (file)
@@ -67,9 +67,9 @@ _slang_gen_operation(slang_assemble_ctx * A, slang_operation *oper);
  * Returns GL_FALSE otherwise.
  */
 static GLboolean
-typeof_operation(const struct slang_assemble_ctx_ * A,
-                        slang_operation * op,
-                        slang_typeinfo * ti)
+typeof_operation(const struct slang_assemble_ctx_ *A,
+                 slang_operation *op,
+                 slang_typeinfo *ti)
 {
    return _slang_typeof_operation(op, &A->space, ti, A->atoms, A->log);
 }
@@ -2559,6 +2559,14 @@ _slang_gen_var_decl(slang_assemble_ctx *A, slang_variable *var,
           (void *) store, store->Index, store->Size);
 #endif
 
+   if (var->type.array_len > 0) {
+      /* the type is an array, ex: float[4] x; */
+      GLint sz = (store->Size + 3) & ~3;
+      /* total size = element size * array length */
+      sz *= var->type.array_len;
+      store->Size = sz;
+   }
+
    if (var->array_len > 0) {
       /* this is an array */
       /* round up the element size to a multiple of 4 */
index aef874b70bac7139a440dbe9c2fc037760bd0354..6803e5a13c53642e90c54bfb0770c5d686991c4d 100644 (file)
@@ -345,6 +345,20 @@ calculate_var_size(slang_parse_ctx * C, slang_output_ctx * O,
    return GL_TRUE;
 }
 
+static void
+promote_type_to_array(slang_parse_ctx *C,
+                      slang_fully_specified_type *type,
+                      GLint array_len)
+{
+   slang_type_specifier *baseType =
+      slang_type_specifier_new(type->specifier.type, NULL, NULL);
+
+   type->specifier.type = SLANG_SPEC_ARRAY;
+   type->specifier._array = baseType;
+   type->array_len = array_len;
+}
+
+
 static GLboolean
 convert_to_array(slang_parse_ctx * C, slang_variable * var,
                  const slang_type_specifier * sp)
@@ -889,6 +903,11 @@ parse_fully_specified_type(slang_parse_ctx * C, slang_output_ctx * O,
       RETURN0;
    }
 
+   if (type->array_len >= 0) {
+      /* convert type to array type (ex: convert "int" to "array of int" */
+      promote_type_to_array(C, type, type->array_len);
+   }
+
    return 1;
 }
 
@@ -1972,6 +1991,7 @@ parse_init_declarator(slang_parse_ctx * C, slang_output_ctx * O,
    var->type.centroid = type->centroid;
    var->type.precision = type->precision;
    var->type.variant = type->variant;
+   var->type.array_len = type->array_len;
    var->a_name = a_name;
    if (var->a_name == SLANG_ATOM_NULL)
       RETURN0;
@@ -1979,15 +1999,8 @@ parse_init_declarator(slang_parse_ctx * C, slang_output_ctx * O,
    switch (*C->I++) {
    case VARIABLE_NONE:
       /* simple variable declarator - just copy the specifier */
-      if (type->array_len >= 0) {
-         /* The type was something like "float[4]" */
-         convert_to_array(C, var, &type->specifier);
-         var->array_len = type->array_len;
-      }
-      else {
-         if (!slang_type_specifier_copy(&var->type.specifier, &type->specifier))
-            RETURN0;
-      }
+      if (!slang_type_specifier_copy(&var->type.specifier, &type->specifier))
+         RETURN0;
       break;
    case VARIABLE_INITIALIZER:
       /* initialized variable - copy the specifier and parse the expression */