summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2011-11-21 14:53:46 -0700
committerBrian Paul <[email protected]>2012-02-23 07:49:06 -0700
commit4516fcc57f8f45fc0e2e4d8681fd5d74e4f31d7d (patch)
tree6b90d2623bfcfda397b3a6744f90a2b128ff015e /src/gallium/drivers
parentf12f67c00a5a75ec58bef14f3cecda6c4c685727 (diff)
svga: move temp register index assertions
The assertion recently added in dst_register() was invalid because that function is also (suprisingly) used to declare constant registers. Move the assertion to the callers where we're really creating temp registers and add some code to prevent emitting invalid temp register indexes for release builds. Also, update the comment for get_temp(). It didn't return -1 if it ran out of registers and none of the callers checked for that. Reviewed-by: Jose Fonseca <[email protected]>
Diffstat (limited to 'src/gallium/drivers')
-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 );
}