Mesa (master): i965 Gen4/5: clip: Don't mangle flat varyings

Chris Forbes chrisf at kemper.freedesktop.org
Thu Aug 1 09:00:02 UTC 2013


Module: Mesa
Branch: master
Commit: 3eef7fec677f40eef1674e44e7ebd836bc7f8612
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=3eef7fec677f40eef1674e44e7ebd836bc7f8612

Author: Chris Forbes <chrisf at ijw.co.nz>
Date:   Sun Jul  7 22:22:57 2013 +1200

i965 Gen4/5: clip: Don't mangle flat varyings

This patch ensures that integers will pass through unscathed.  Doing
(useless) computations on them is risky, especially when their bit
patterns correspond to values like inf or nan.

[V1-2]: Signed-off-by: Olivier Galibert <galibert at pobox.com>
Signed-off-by: Chris Forbes <chrisf at ijw.co.nz>
Reviewed-by: Paul Berry <stereotype441 at gmail.com>
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

---

 src/mesa/drivers/dri/i965/brw_clip_util.c |   53 +++++++++++++++++-----------
 1 files changed, 32 insertions(+), 21 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_clip_util.c b/src/mesa/drivers/dri/i965/brw_clip_util.c
index b188bf7..8500b8b 100644
--- a/src/mesa/drivers/dri/i965/brw_clip_util.c
+++ b/src/mesa/drivers/dri/i965/brw_clip_util.c
@@ -269,28 +269,39 @@ void brw_clip_interp_vertex( struct brw_clip_compile *c,
 	  * header), so interpolate:
 	  *
 	  *        New = attr0 + t*attr1 - t*attr0
+          *
+          * Unless the attribute is flat shaded -- in which case just copy
+          * from one of the sources (doesn't matter which; already copied from pv)
 	  */
-         struct brw_reg tmp = get_tmp(c);
-         struct brw_reg t =
-            c->key.interpolation_mode.mode[slot] == INTERP_QUALIFIER_NOPERSPECTIVE ?
-            t_nopersp : t0;
-
-	 brw_MUL(p, 
-		 vec4(brw_null_reg()),
-		 deref_4f(v1_ptr, delta),
-		 t);
-
-	 brw_MAC(p, 
-		 tmp,	      
-		 negate(deref_4f(v0_ptr, delta)),
-		 t); 
-	      
-	 brw_ADD(p,
-		 deref_4f(dest_ptr, delta), 
-		 deref_4f(v0_ptr, delta),
-		 tmp);
-
-         release_tmp(c, tmp);
+         GLuint interp = c->key.interpolation_mode.mode[slot];
+
+         if (interp != INTERP_QUALIFIER_FLAT) {
+            struct brw_reg tmp = get_tmp(c);
+            struct brw_reg t =
+               interp == INTERP_QUALIFIER_NOPERSPECTIVE ? t_nopersp : t0;
+
+            brw_MUL(p,
+                  vec4(brw_null_reg()),
+                  deref_4f(v1_ptr, delta),
+                  t);
+
+            brw_MAC(p,
+                  tmp,
+                  negate(deref_4f(v0_ptr, delta)),
+                  t);
+
+            brw_ADD(p,
+                  deref_4f(dest_ptr, delta),
+                  deref_4f(v0_ptr, delta),
+                  tmp);
+
+            release_tmp(c, tmp);
+         }
+         else {
+            brw_MOV(p,
+                  deref_4f(dest_ptr, delta),
+                  deref_4f(v0_ptr, delta));
+         }
       }
    }
 




More information about the mesa-commit mailing list