diff options
-rw-r--r-- | src/gallium/drivers/svga/svga_tgsi_emit.h | 8 | ||||
-rw-r--r-- | src/gallium/drivers/svga/svga_tgsi_insn.c | 15 |
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 ); } |