summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r--src/gallium/drivers/svga/svga_link.c4
-rw-r--r--src/gallium/drivers/svga/svga_link.h1
-rw-r--r--src/gallium/drivers/svga/svga_tgsi_vgpu10.c11
3 files changed, 13 insertions, 3 deletions
diff --git a/src/gallium/drivers/svga/svga_link.c b/src/gallium/drivers/svga/svga_link.c
index 9c1df0c7f3c..0bf40d153b7 100644
--- a/src/gallium/drivers/svga/svga_link.c
+++ b/src/gallium/drivers/svga/svga_link.c
@@ -96,11 +96,13 @@ svga_link_shaders(const struct tgsi_shader_info *outshader_info,
linkage->input_map[i] = j;
}
}
+ linkage->input_map_max = free_slot - 1;
/* Debug */
if (SVGA_DEBUG & DEBUG_TGSI) {
unsigned reg = 0;
- debug_printf("### linkage info:\n");
+ debug_printf("### linkage info: num_inputs=%d input_map_max=%d\n",
+ linkage->num_inputs, linkage->input_map_max);
for (i = 0; i < linkage->num_inputs; i++) {
diff --git a/src/gallium/drivers/svga/svga_link.h b/src/gallium/drivers/svga/svga_link.h
index 724c61194a2..c21686eef59 100644
--- a/src/gallium/drivers/svga/svga_link.h
+++ b/src/gallium/drivers/svga/svga_link.h
@@ -9,6 +9,7 @@ struct svga_context;
struct shader_linkage
{
unsigned num_inputs;
+ unsigned input_map_max; /* highest index of mapped inputs */
ubyte input_map[PIPE_MAX_SHADER_INPUTS];
};
diff --git a/src/gallium/drivers/svga/svga_tgsi_vgpu10.c b/src/gallium/drivers/svga/svga_tgsi_vgpu10.c
index 2dc870ffef0..7422db247ae 100644
--- a/src/gallium/drivers/svga/svga_tgsi_vgpu10.c
+++ b/src/gallium/drivers/svga/svga_tgsi_vgpu10.c
@@ -1890,7 +1890,7 @@ alloc_immediate_int4(struct svga_shader_emitter_v10 *emit,
static unsigned
alloc_system_value_index(struct svga_shader_emitter_v10 *emit, unsigned index)
{
- const unsigned n = emit->info.file_max[TGSI_FILE_INPUT] + 1 + index;
+ const unsigned n = emit->linkage.input_map_max + 1 + index;
assert(index < ARRAY_SIZE(emit->system_value_indexes));
emit->system_value_indexes[index] = n;
return n;
@@ -2377,8 +2377,8 @@ emit_system_value_declaration(struct svga_shader_emitter_v10 *emit,
* index as the argument. See emit_sample_position_instructions().
*/
assert(emit->version >= 41);
- index = alloc_system_value_index(emit, index);
emit->fs.sample_pos_sys_index = index;
+ index = alloc_system_value_index(emit, index);
break;
default:
debug_printf("unexpected sytem value semantic index %u\n",
@@ -6992,6 +6992,13 @@ svga_tgsi_vgpu10_translate(struct svga_context *svga,
svga_link_shaders(&vs->base.info, &emit->info, &emit->linkage);
}
+ /* Since vertex shader does not need to go through the linker to
+ * establish the input map, we need to make sure the highest index
+ * of input registers is set properly here.
+ */
+ emit->linkage.input_map_max = MAX2((int)emit->linkage.input_map_max,
+ emit->info.file_max[TGSI_FILE_INPUT]);
+
determine_clipping_mode(emit);
if (unit == PIPE_SHADER_GEOMETRY || unit == PIPE_SHADER_VERTEX) {