[Mesa-dev] [PATCH 092/133] nir: Add a pass to lower local variables to registers

Connor Abbott cwabbott0 at gmail.com
Fri Jan 9 16:38:37 PST 2015


>>>> +      case nir_intrinsic_copy_var:
>>>> +         unreachable("There should be no copies whatsoever at this
>>>> point");
>>>> +         break;
>>>
>>>
>>> Are you sure about this? My impression is that lower_variables will lower
>>> copies involving things that aren't indirectly referenced, but if you have
>>> something like:
>>>
>>> foo[i] = ...
>>> bar[*] = foo[*];
>>> ... = bar[i];
>>>
>>> then the copy in the middle won't get lowered, unless there's something
>>> else I'm missing that will lower it.
>>
>>
>> Yeah, there may be something missing there.  I have a pass lying around
>> somewhere that lowers all copies.  Unfortunately, I've never actually seen
>> this happen in the wild so It's untested.  I'll try and cook something up
>> that I think is reliable.
>
>
> Ok, more info.  Right now, GLSL IR is lowering all truely indirect accesses
> to if-ladders right now so we can never hit this.  Once we can handle
> indirects in the backends or generate the if-ladders in NIR, we will need
> this.  Until then, let's leave it as-is to reduce the ammount of untested
> code.
> --Jason

Huh, that's weird... it lowers input/output indirect accesses to
if-ladders, but not temporary indirect references, right? So wouldn't
something like:

uniform int i;
uniform bool f; /* false */
in vec4 in_array[20];
out vec4 color;

void main()
{
   vec4 foo[20], bar[20], temp[20];
   foo = in_array;
   foo[i] = 0.0f;
   while (f) {
      temp = foo;
      temp[i] = 1.0f;
      foo = bar;
      bar = temp;
   }
   bar[i] = 2.0f;
   color = bar[0];
}

where GLSL IR can't eliminate the copies and doesn't turn the indirect
references into if-ladders, and we can't lower them to SSA values,
trigger the bug? If GLSL did turn everything into if-ladders, then
this entire pass as well as half of lower_variables would be dead
code...


More information about the mesa-dev mailing list