r600: Add spill output to group only if register or target index changes
authorGert Wollny <gert.wollny@collabora.com>
Thu, 5 Jul 2018 17:11:22 +0000 (19:11 +0200)
committerGert Wollny <gw.fossdev@gmail.com>
Fri, 13 Jul 2018 19:11:34 +0000 (21:11 +0200)
commit695a4cb0f6120463d16d3e0ef747675a83b769ea
treee22ea5526fcb62b6f027e07ec519a9a603235d33
parent3b4279f772b0ca29def6aa666d69008b1f118a16
r600: Add spill output to group only if register or target index changes

The current spill code checks in each instruction of an instruction group whether
spilling is needed and if so, it adds spilling for each component as a seperate
instruction and it allocates a new temporary for each component and since it takes
the write mask from the TGSI representation, all components might be written
each time and as a result already written components might be overwritten with
garbage like:

   ...
   y: MOV                R9.y,  [0x42140000 37].x
   t: MOV                R8.x,  [0x42040000 33].y
   ...
   MEM_SCRATCH  WRITE_IND_ACK 0     R9.xy__, @R4.x  ES:3
   MEM_SCRATCH  WRITE_IND_ACK 0     R8.xy__, @R4.x  ES:3
   ...

To resolve this isse accumulate spills to the same memory location so that only one
memory write instruction is emitted for an instruction group that writes up to all
four components.

This fixes updated piglits (see https://patchwork.freedesktop.org/series/46064/):
   spec/glsl-1.30/execution
       fs-large-local-array-vec2.shader_test
       fs-large-local-array-vec3.shader_test
       fs-large-local-array-vec4.shader_test

v2: fix some typos and add comment about piglits (Roland Scheidegger)

Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Roland Scheidegger <sroland@vmware.com> (v1)
src/gallium/drivers/r600/r600_shader.c