mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-04 14:08:05 +02:00
st/mesa: fix broken translation of negative register indexes
A src register's index can be negative if we're doing indirect addressing into the constant buffer. Ex: MOV OUT[1], CONST[ADDR[0].x-3] This fixes the piglit vp-arl-neg-array.vpfp test. Before this change we were going out of bounds of the t->constants[] array and getting garbage that later triggered an assertion.
This commit is contained in:
parent
487a14b476
commit
9f544394c1
1 changed files with 16 additions and 4 deletions
|
|
@ -160,13 +160,14 @@ dst_register( struct st_translate *t,
|
|||
static struct ureg_src
|
||||
src_register( struct st_translate *t,
|
||||
gl_register_file file,
|
||||
GLuint index )
|
||||
GLint index )
|
||||
{
|
||||
switch( file ) {
|
||||
case PROGRAM_UNDEFINED:
|
||||
return ureg_src_undef();
|
||||
|
||||
case PROGRAM_TEMPORARY:
|
||||
ASSERT(index >= 0);
|
||||
if (ureg_dst_is_undef(t->temps[index]))
|
||||
t->temps[index] = ureg_DECL_temporary( t->ureg );
|
||||
return ureg_src(t->temps[index]);
|
||||
|
|
@ -176,8 +177,13 @@ src_register( struct st_translate *t,
|
|||
case PROGRAM_ENV_PARAM:
|
||||
case PROGRAM_LOCAL_PARAM:
|
||||
case PROGRAM_UNIFORM:
|
||||
case PROGRAM_CONSTANT: /* ie, immediate */
|
||||
ASSERT(index >= 0);
|
||||
return t->constants[index];
|
||||
case PROGRAM_CONSTANT: /* ie, immediate */
|
||||
if (index < 0)
|
||||
return ureg_DECL_constant( t->ureg, 0 );
|
||||
else
|
||||
return t->constants[index];
|
||||
|
||||
case PROGRAM_INPUT:
|
||||
return t->inputs[t->inputMapping[index]];
|
||||
|
|
@ -264,9 +270,14 @@ translate_src( struct st_translate *t,
|
|||
if (SrcReg->Abs)
|
||||
src = ureg_abs(src);
|
||||
|
||||
if (SrcReg->RelAddr)
|
||||
if (SrcReg->RelAddr) {
|
||||
src = ureg_src_indirect( src, ureg_src(t->address[0]));
|
||||
|
||||
/* If SrcReg->Index was negative, it was set to zero in
|
||||
* src_register(). Reassign it now.
|
||||
*/
|
||||
src.Index = SrcReg->Index;
|
||||
}
|
||||
|
||||
return src;
|
||||
}
|
||||
|
||||
|
|
@ -806,6 +817,7 @@ st_translate_mesa_program(
|
|||
for (i = 0; i < program->Parameters->NumParameters; i++) {
|
||||
switch (program->Parameters->Parameters[i].Type) {
|
||||
case PROGRAM_ENV_PARAM:
|
||||
case PROGRAM_LOCAL_PARAM:
|
||||
case PROGRAM_STATE_VAR:
|
||||
case PROGRAM_NAMED_PARAM:
|
||||
case PROGRAM_UNIFORM:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue