tgsi: finish declaration parsing for arrays.
authorDave Airlie <airlied@redhat.com>
Mon, 12 Aug 2013 07:34:27 +0000 (17:34 +1000)
committerDave Airlie <airlied@redhat.com>
Tue, 27 Aug 2013 00:41:09 +0000 (10:41 +1000)
I previously fixed this partly in 9e8400f4c95bde1f955c7977066583b507159a10,
however I didn't go far enough in testing it, now when I parse a TGSI shader
with arrays in it my iterator can see the ArrayID set to the proper value.

Reviewed-by: Brian Paul <brianp@vmware.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/auxiliary/tgsi/tgsi_build.c

index 523430b3ca79b1e6b172fe0a3abedcca0f64750c..fa18462bed414f910a88b5d5b508426cb9ab26b9 100644 (file)
@@ -124,6 +124,7 @@ tgsi_build_declaration(
    unsigned semantic,
    unsigned invariant,
    unsigned local,
+   unsigned array,
    struct tgsi_header *header )
 {
    struct tgsi_declaration declaration;
@@ -139,7 +140,7 @@ tgsi_build_declaration(
    declaration.Semantic = semantic;
    declaration.Invariant = invariant;
    declaration.Local = local;
-
+   declaration.Array = array;
    header_bodysize_grow( header );
 
    return declaration;
@@ -339,6 +340,21 @@ tgsi_default_declaration_array( void )
    return a;
 }
 
+static struct tgsi_declaration_array
+tgsi_build_declaration_array(unsigned arrayid,
+                             struct tgsi_declaration *declaration,
+                             struct tgsi_header *header)
+{
+   struct tgsi_declaration_array da;
+
+   da = tgsi_default_declaration_array();
+   da.ArrayID = arrayid;
+
+   declaration_grow(declaration, header);
+
+   return da;
+}
+
 struct tgsi_full_declaration
 tgsi_default_full_declaration( void )
 {
@@ -379,6 +395,7 @@ tgsi_build_full_declaration(
       full_decl->Declaration.Semantic,
       full_decl->Declaration.Invariant,
       full_decl->Declaration.Local,
+      full_decl->Declaration.Array,
       header );
 
    if (maxsize <= size)
@@ -472,6 +489,19 @@ tgsi_build_full_declaration(
          header);
    }
 
+   if (full_decl->Declaration.Array) {
+      struct tgsi_declaration_array *da;
+
+      if (maxsize <= size) {
+         return 0;
+      }
+      da = (struct tgsi_declaration_array *)&tokens[size];
+      size++;
+      *da = tgsi_build_declaration_array(
+         full_decl->Array.ArrayID,
+         declaration,
+         header);
+   }
    return size;
 }