>>>> + 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... _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev