summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/svga/svga_tgsi.c
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2011-11-04 14:36:59 -0600
committerBrian Paul <[email protected]>2011-11-04 16:05:33 -0600
commit1ca48b3161449945b769b27c33f88f397f98084a (patch)
tree1ea64dd28f969978d98c35d11cb73fa70ae397ec /src/gallium/drivers/svga/svga_tgsi.c
parent0bc15650c1cb4c9ae087f393447841f9da89e5e3 (diff)
svga: fix varying var remapping for unused FS outputs
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 <[email protected]>
Diffstat (limited to 'src/gallium/drivers/svga/svga_tgsi.c')
-rw-r--r--src/gallium/drivers/svga/svga_tgsi.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/src/gallium/drivers/svga/svga_tgsi.c b/src/gallium/drivers/svga/svga_tgsi.c
index 821def4a3a6..2be6f05e009 100644
--- a/src/gallium/drivers/svga/svga_tgsi.c
+++ b/src/gallium/drivers/svga/svga_tgsi.c
@@ -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];
}