Mesa (master): i965: Fix Ironlake shadow comparisons.

Eric Anholt anholt at kemper.freedesktop.org
Sat Nov 14 00:04:59 UTC 2009


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

Author: Eric Anholt <eric at anholt.net>
Date:   Thu Nov 12 09:08:50 2009 -0800

i965: Fix Ironlake shadow comparisons.

The cube map array index arg is always present.

---

 src/mesa/drivers/dri/i965/brw_wm_emit.c |   24 +++++++++++++++++-------
 1 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_wm_emit.c b/src/mesa/drivers/dri/i965/brw_wm_emit.c
index 268f796..9b1f544 100644
--- a/src/mesa/drivers/dri/i965/brw_wm_emit.c
+++ b/src/mesa/drivers/dri/i965/brw_wm_emit.c
@@ -745,22 +745,32 @@ static void emit_tex( struct brw_wm_compile *c,
       abort();
    }
 
-   if (inst->tex_shadow) {
-      nr = 4;
-      emit |= WRITEMASK_W;
-   }
+   /* For shadow comparisons, we have to supply u,v,r. */
+   if (inst->tex_shadow)
+      nr = 3;
 
    msgLength = 1;
 
    for (i = 0; i < nr; i++) {
-      static const GLuint swz[4] = {0,1,2,2};
-      if (emit & (1<<i)) 
-	 brw_MOV(p, brw_message_reg(msgLength+1), arg[swz[i]]);
+      if (emit & (1<<i))
+	 brw_MOV(p, brw_message_reg(msgLength+1), arg[i]);
       else
 	 brw_MOV(p, brw_message_reg(msgLength+1), brw_imm_f(0));
       msgLength += 2;
    }
 
+   /* Fill in the cube map array index value. */
+   if (BRW_IS_IGDNG(p->brw) && inst->tex_shadow) {
+	 brw_MOV(p, brw_message_reg(msgLength+1), brw_imm_f(0));
+      msgLength += 2;
+   }
+
+   /* Fill in the shadow comparison reference value. */
+   if (inst->tex_shadow) {
+      brw_MOV(p, brw_message_reg(msgLength+1), arg[2]);
+      msgLength += 2;
+   }
+
    responseLength = 8;		/* always */
 
    if (BRW_IS_IGDNG(p->brw)) {




More information about the mesa-commit mailing list