summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/svga/svga_swtnl_state.c2
-rw-r--r--src/gallium/drivers/svga/svga_tgsi.c27
-rw-r--r--src/gallium/drivers/svga/svga_tgsi.h2
3 files changed, 22 insertions, 9 deletions
diff --git a/src/gallium/drivers/svga/svga_swtnl_state.c b/src/gallium/drivers/svga/svga_swtnl_state.c
index d7fa1aaa0dc..7d0a1c58f60 100644
--- a/src/gallium/drivers/svga/svga_swtnl_state.c
+++ b/src/gallium/drivers/svga/svga_swtnl_state.c
@@ -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;
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];
}
diff --git a/src/gallium/drivers/svga/svga_tgsi.h b/src/gallium/drivers/svga/svga_tgsi.h
index 01367e971da..7e93bf5aca5 100644
--- a/src/gallium/drivers/svga/svga_tgsi.h
+++ b/src/gallium/drivers/svga/svga_tgsi.h
@@ -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