diff options
author | Eric Anholt <eric@anholt.net> | 2009-11-12 09:08:50 -0800 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2009-11-12 11:41:39 -0800 |
commit | 514544f373b6e6fae11b7b4426949b8ad64c441b (patch) | |
tree | 6f228974bcf6684fb060610d5ef0725e48d846f3 /src | |
parent | 5f305b1db925c819ddeb29a75f6fbad6500a2d11 (diff) |
i965: Fix Ironlake shadow comparisons.
The cube map array index arg is always present.
Diffstat (limited to 'src')
-rw-r--r-- | 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 268f7965c0..9b1f54414b 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)) { |