svga: fix varying var remapping for unused FS outputs
authorBrian Paul <brianp@vmware.com>
Fri, 4 Nov 2011 20:36:59 +0000 (14:36 -0600)
committerBrian Paul <brianp@vmware.com>
Fri, 4 Nov 2011 22:05:33 +0000 (16:05 -0600)
If the VS has outputs that aren't consumed by the FS we were mapping
them all to one unused VS output index, but that's illegal.  Instead,
map unused VS outputs to unique indexes.

Reviewed-by: José Fonseca <jfonseca@vmware.com>
src/gallium/drivers/svga/svga_swtnl_state.c
src/gallium/drivers/svga/svga_tgsi.c
src/gallium/drivers/svga/svga_tgsi.h

index d7fa1aaa0dcd6d702348bffea5479455c0e8f823..7d0a1c58f60311317a277412a2eee5e378e5aca3 100644 (file)
@@ -153,7 +153,7 @@ svga_swtnl_update_vdecl( struct svga_context *svga )
    SVGA3dVertexDecl vdecl[PIPE_MAX_ATTRIBS];
    const enum interp_mode colorInterp =
       svga->curr.rast->templ.flatshade ? INTERP_CONSTANT : INTERP_LINEAR;
-   const struct svga_fragment_shader *fs = svga->curr.fs;
+   struct svga_fragment_shader *fs = svga->curr.fs;
    int offset = 0;
    int nr_decls = 0;
    int src, i;
index 821def4a3a60ba9712895e2fdf760abb7e9c4a04..2be6f05e009487b0d211b86c6aabfeeee29492b6 100644 (file)
@@ -208,20 +208,22 @@ svga_remap_generics(unsigned generics_mask,
       remap_table[index] = count++;
       generics_mask &= ~(1 << index);
    }
-
-   for (i = 0; i < MAX_GENERIC_VARYING; i++) {
-      if (remap_table[i] == -1)
-         remap_table[i] = count;
-   }
 }
 
 
 /**
  * Use the generic remap table to map a TGSI generic varying variable
- * index to a small integer.
+ * index to a small integer.  If the remapping table doesn't have a
+ * valid value for the given index (the table entry is -1) it means
+ * the fragment shader doesn't use that VS output.  Just allocate
+ * the next free value in that case.  Alternately, we could cull
+ * VS instructions that write to register, or replace the register
+ * with a dummy temp register.
+ * XXX TODO: we should do one of the later as it would save precious
+ * texcoord registers.
  */
 int
-svga_remap_generic_index(const int8_t remap_table[MAX_GENERIC_VARYING],
+svga_remap_generic_index(int8_t remap_table[MAX_GENERIC_VARYING],
                          int generic_index)
 {
    assert(generic_index < MAX_GENERIC_VARYING);
@@ -231,6 +233,17 @@ svga_remap_generic_index(const int8_t remap_table[MAX_GENERIC_VARYING],
       generic_index = MAX_GENERIC_VARYING - 1;
    }
 
+   if (remap_table[generic_index] == -1) {
+      /* This is a VS output that has no matching PS input.  Find a
+       * free index.
+       */
+      int i, max = 0;
+      for (i = 0; i < MAX_GENERIC_VARYING; i++) {
+         max = MAX2(max, remap_table[i]);
+      }
+      remap_table[generic_index] = max + 1;
+   }
+
    return remap_table[generic_index];
 }
 
index 01367e971da129263cc687d585bb2ec11168d07f..7e93bf5aca522ddcc851e09cccd7c08c2599585a 100644 (file)
@@ -160,7 +160,7 @@ svga_remap_generics(unsigned generics_mask,
                     int8_t remap_table[MAX_GENERIC_VARYING]);
 
 int
-svga_remap_generic_index(const int8_t remap_table[MAX_GENERIC_VARYING],
+svga_remap_generic_index(int8_t remap_table[MAX_GENERIC_VARYING],
                          int generic_index);
 
 #endif