[Freedreno] [PATCH] freedreno/a3xx: set .zw of sprite coords to .01

Ilia Mirkin imirkin at alum.mit.edu
Wed May 20 01:01:50 PDT 2015


Fixes non-determinism in bin/point-sprite rendering, and the stars on
the intro screen to neverball.

Cc: "10.6" <mesa-stable at lists.freedesktop.org>
Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
---
 src/gallium/drivers/freedreno/a3xx/fd3_program.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_program.c b/src/gallium/drivers/freedreno/a3xx/fd3_program.c
index a6824ef..57fcaa9 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_program.c
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_program.c
@@ -413,12 +413,15 @@ fd3_program_emit(struct fd_ringbuffer *ring, struct fd3_emit *emit,
 				}
 			}
 
-			/* TODO: Figure out if there's a way to make it spit out 0's and
-			 * 1's for the .z and .w components.
+			/* Replace the .xy coordinates with S/T from the point sprite. Set
+			 * interpolation bits for .zw such that they become .01
 			 */
-			if (emit->sprite_coord_enable & (1 << sem2idx(fp->inputs[j].semantic)))
+			if (emit->sprite_coord_enable & (1 << sem2idx(fp->inputs[j].semantic))) {
 				vpsrepl[inloc / 16] |= (emit->sprite_coord_mode ? 0x0d : 0x09)
 					<< ((inloc % 16) * 2);
+				vinterp[(inloc + 2) / 16] |= 2 << (((inloc + 2) % 16) * 2);
+				vinterp[(inloc + 3) / 16] |= 3 << (((inloc + 3) % 16) * 2);
+			}
 		}
 
 		OUT_PKT0(ring, REG_A3XX_VPC_ATTR, 2);
-- 
2.3.6



More information about the Freedreno mailing list