tgsi: add ArrayID to declarations
authorChristian König <christian.koenig@amd.com>
Wed, 13 Mar 2013 13:58:15 +0000 (14:58 +0100)
committerChristian König <christian.koenig@amd.com>
Tue, 19 Mar 2013 12:38:32 +0000 (13:38 +0100)
Remember which declarations are declared as "arrays" and so
can be indirectly addressed. ArrayIDs start at 1, cause for
compatibility reasons zero is treaded as no array present.

Signed-off-by: Christian König <christian.koenig@amd.com>
src/gallium/auxiliary/tgsi/tgsi_dump.c
src/gallium/auxiliary/tgsi/tgsi_parse.c
src/gallium/auxiliary/tgsi/tgsi_parse.h
src/gallium/auxiliary/tgsi/tgsi_text.c
src/gallium/auxiliary/tgsi/tgsi_ureg.c
src/gallium/include/pipe/p_shader_tokens.h

index 177be0f30c2bc2498306115cfa4acbef7ceeaa17..adca6af2a2912db6a0be5baf0fc7a6d523553279 100644 (file)
@@ -272,6 +272,12 @@ iter_declaration(
       ctx,
       decl->Declaration.UsageMask );
 
+   if (decl->Declaration.Array) {
+      TXT( ", ARRAY(" );
+      SID(decl->Array.ArrayID);
+      CHR(')');
+   }
+
    if (decl->Declaration.Local)
       TXT( ", LOCAL" );
 
index 720d68d1f2255505b283204d207588b1e1cde345..29079ef2140c95dc1ccfcd4be91ed18d2b57bdc7 100644 (file)
@@ -129,6 +129,10 @@ tgsi_parse_token(
          next_token(ctx, &decl->SamplerView);
       }
 
+      if( decl->Declaration.Array ) {
+         next_token(ctx, &decl->Array);
+      }
+
       break;
    }
 
index 78210ed7219baebcc7da515fdcdad016a7df8e13..ae40f13affcce836732233e9c28e629f5d69ead8 100644 (file)
@@ -66,6 +66,7 @@ struct tgsi_full_declaration
    struct tgsi_declaration_semantic Semantic;
    struct tgsi_declaration_resource Resource;
    struct tgsi_declaration_sampler_view SamplerView;
+   struct tgsi_declaration_array Array;
 };
 
 struct tgsi_full_immediate
index 7d580e6e3d8a0ea996b0cc17c8fb8f0f939baf2e..8a2a760ef595e3ad8e0a5494f607c579119d1ae6 100644 (file)
@@ -1114,6 +1114,28 @@ static boolean parse_declaration( struct translate_ctx *ctx )
 
    cur = ctx->cur;
    eat_opt_white( &cur );
+   if (*cur == ',') {
+      cur2 = cur;
+      cur2++;
+      eat_opt_white( &cur2 );
+      if (str_match_nocase_whole( &cur2, "ARRAY(" )) {
+         int arrayid;
+         eat_opt_white( &cur2 );
+         if (!parse_int( &cur2, &arrayid )) {
+            report_error( ctx, "Expected `,'" );
+            return FALSE;
+         }
+         eat_opt_white( &cur2 );
+         if (*cur2 != ')') {
+            report_error( ctx, "Expected `,'" );
+            return FALSE;
+         }
+         decl.Declaration.Array = 1;
+         decl.Array.ArrayID = arrayid;
+         cur = cur2;
+      }
+   }
+
    if (*cur == ',' && !is_vs_input) {
       uint i, j;
 
index 88acdcb12cd6a6f87b3c8caf42956d6dea07817f..1e862cb2198e2b54b433c3aa7cbf21efd097ce9b 100644 (file)
@@ -50,6 +50,7 @@ union tgsi_any_token {
    struct tgsi_declaration_interp decl_interp;
    struct tgsi_declaration_semantic decl_semantic;
    struct tgsi_declaration_sampler_view decl_sampler_view;
+   struct tgsi_declaration_array array;
    struct tgsi_immediate imm;
    union  tgsi_immediate_data imm_data;
    struct tgsi_instruction insn;
@@ -78,6 +79,7 @@ struct ureg_tokens {
 #define UREG_MAX_IMMEDIATE 256
 #define UREG_MAX_ADDR 2
 #define UREG_MAX_PRED 1
+#define UREG_MAX_ARRAY_TEMPS 256
 
 struct const_decl {
    struct {
@@ -156,6 +158,9 @@ struct ureg_program
    struct util_bitmask *decl_temps;
    unsigned nr_temps;
 
+   unsigned array_temps[UREG_MAX_ARRAY_TEMPS];
+   unsigned nr_array_temps;
+
    struct const_decl const_decls;
    struct const_decl const_decls2D[PIPE_MAX_CONSTANT_BUFFERS];
 
@@ -584,11 +589,17 @@ struct ureg_dst ureg_DECL_array_temporary( struct ureg_program *ureg,
    if (local)
       util_bitmask_set(ureg->local_temps, i);
 
+   /* Always start a new declaration at the start */
    util_bitmask_set(ureg->decl_temps, i);
 
    ureg->nr_temps += size;
+
+   /* and also at the end of the array */
    util_bitmask_set(ureg->decl_temps, ureg->nr_temps);
 
+   if (ureg->nr_array_temps < UREG_MAX_ARRAY_TEMPS)
+      ureg->array_temps[ureg->nr_array_temps++] = i;
+
    return dst;
 }
 
@@ -1284,9 +1295,11 @@ emit_decl_fs(struct ureg_program *ureg,
 static void
 emit_decl_temps( struct ureg_program *ureg,
                  unsigned first, unsigned last,
-                 boolean local )
+                 boolean local,
+                 unsigned arrayid )
 {
-   union tgsi_any_token *out = get_tokens( ureg, DOMAIN_DECL, 2 );
+   union tgsi_any_token *out = get_tokens( ureg, DOMAIN_DECL,
+                                           arrayid ? 3 : 2 );
 
    out[0].value = 0;
    out[0].decl.Type = TGSI_TOKEN_TYPE_DECLARATION;
@@ -1298,6 +1311,12 @@ emit_decl_temps( struct ureg_program *ureg,
    out[1].value = 0;
    out[1].decl_range.First = first;
    out[1].decl_range.Last = last;
+
+   if (arrayid) {
+      out[0].decl.Array = 1;
+      out[2].value = 0;
+      out[2].array.ArrayID = arrayid;
+   }
 }
 
 static void emit_decl_range( struct ureg_program *ureg,
@@ -1555,6 +1574,7 @@ static void emit_decls( struct ureg_program *ureg )
    }
 
    if (ureg->nr_temps) {
+      unsigned array = 0;
       for (i = 0; i < ureg->nr_temps;) {
          boolean local = util_bitmask_get(ureg->local_temps, i);
          unsigned first = i;
@@ -1562,7 +1582,10 @@ static void emit_decls( struct ureg_program *ureg )
          if (i == UTIL_BITMASK_INVALID_INDEX)
             i = ureg->nr_temps;
 
-         emit_decl_temps( ureg, first, i - 1, local );
+         if (array < ureg->nr_array_temps && ureg->array_temps[array] == first)
+            emit_decl_temps( ureg, first, i - 1, local, ++array );
+         else
+            emit_decl_temps( ureg, first, i - 1, local, 0 );
       }
    }
 
index 81e4a6b52ce3e423dbc082e2c9160abca1dc34bd..eac75e69e5df77e2e59298f617edbf445f422f9c 100644 (file)
@@ -119,7 +119,8 @@ struct tgsi_declaration
    unsigned Interpolate : 1;  /**< any interpolation info? */
    unsigned Invariant   : 1;  /**< invariant optimization? */
    unsigned Local       : 1;  /**< optimize as subroutine local variable? */
-   unsigned Padding     : 7;
+   unsigned Array       : 1;  /**< extra array info? */
+   unsigned Padding     : 6;
 };
 
 struct tgsi_declaration_range
@@ -185,6 +186,11 @@ struct tgsi_declaration_sampler_view {
    unsigned ReturnTypeW : 6; /**< one of enum pipe_type */
 };
 
+struct tgsi_declaration_array {
+   unsigned ArrayID : 10;
+   unsigned Padding : 22;
+};
+
 /*
  * Special resources that don't need to be declared.  They map to the
  * GLOBAL/LOCAL/PRIVATE/INPUT compute memory spaces.