summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/drivers/svga/svga_tgsi_emit.h8
-rw-r--r--src/gallium/drivers/svga/svga_tgsi_insn.c15
2 files changed, 17 insertions, 6 deletions
diff --git a/src/gallium/drivers/svga/svga_tgsi_emit.h b/src/gallium/drivers/svga/svga_tgsi_emit.h
index 1769d62570d..73c4cdabefc 100644
--- a/src/gallium/drivers/svga/svga_tgsi_emit.h
+++ b/src/gallium/drivers/svga/svga_tgsi_emit.h
@@ -256,6 +256,12 @@ inst_token( unsigned opcode )
return inst;
}
+
+/**
+ * Create an instance of a SVGA3dShaderDestToken.
+ * Note that this function is used to create tokens for output registers,
+ * temp registers AND constants (see emit_def_const()).
+ */
static INLINE SVGA3dShaderDestToken
dst_register( unsigned file,
int number )
@@ -266,8 +272,6 @@ dst_register( unsigned file,
assert(number < (1 << 11));
assert(file <= SVGA3DREG_PREDICATE);
- assert(number < SVGA3D_TEMPREG_MAX);
-
dest.value = 0;
dest.num = number;
dest.type_upper = file >> 3;
diff --git a/src/gallium/drivers/svga/svga_tgsi_insn.c b/src/gallium/drivers/svga/svga_tgsi_insn.c
index 5a9af89bf03..5e6d1fbc904 100644
--- a/src/gallium/drivers/svga/svga_tgsi_insn.c
+++ b/src/gallium/drivers/svga/svga_tgsi_insn.c
@@ -105,8 +105,12 @@ translate_dst_register( struct svga_shader_emitter *emit,
break;
default:
- dest = dst_register( translate_file( reg->Register.File ),
- reg->Register.Index );
+ {
+ unsigned index = reg->Register.Index;
+ assert(index < SVGA3D_TEMPREG_MAX);
+ index = MIN2(index, SVGA3D_TEMPREG_MAX - 1);
+ dest = dst_register(translate_file(reg->Register.File), index);
+ }
break;
}
@@ -258,13 +262,16 @@ translate_src_register( const struct svga_shader_emitter *emit,
/*
- * Get a temporary register, return -1 if none available
+ * Get a temporary register.
+ * Note: if we exceed the temporary register limit we just use
+ * register SVGA3D_TEMPREG_MAX - 1.
*/
static INLINE SVGA3dShaderDestToken
get_temp( struct svga_shader_emitter *emit )
{
int i = emit->nr_hw_temp + emit->internal_temp_count++;
-
+ assert(i < SVGA3D_TEMPREG_MAX);
+ i = MIN2(i, SVGA3D_TEMPREG_MAX - 1);
return dst_register( SVGA3DREG_TEMP, i );
}