svga: fix depth/shadow compare for non-projected texcoords

We only need to do the divide by Q step for TXP instructions.
This fixes the incorrectly rendered soft shadow test in Lightsmark.
Along with the previous texture swizzle commit, this also fixes all
the piglit glsl-fs-shadow2d-XX.shader_test failures.
This commit is contained in:
Brian Paul
2011-07-26 09:19:40 -06:00
parent 9bd15aef86
commit 7d09df0cbc
+24 -16
View File
@@ -1658,25 +1658,33 @@ static boolean emit_tex(struct svga_shader_emitter *emit,
* the Y component.
*/
struct src_register tex_src_x = scalar(src(tex_result), TGSI_SWIZZLE_Y);
struct src_register r_coord;
/* Divide texcoord R by Q */
if (!submit_op1( emit, inst_token( SVGA3DOP_RCP ),
writemask(src0_zdivw, TGSI_WRITEMASK_X),
scalar(src0, TGSI_SWIZZLE_W) ))
return FALSE;
if (insn->Instruction.Opcode == TGSI_OPCODE_TXP) {
/* Divide texcoord R by Q */
if (!submit_op1( emit, inst_token( SVGA3DOP_RCP ),
writemask(src0_zdivw, TGSI_WRITEMASK_X),
scalar(src0, TGSI_SWIZZLE_W) ))
return FALSE;
if (!submit_op2( emit, inst_token( SVGA3DOP_MUL ),
writemask(src0_zdivw, TGSI_WRITEMASK_X),
scalar(src0, TGSI_SWIZZLE_Z),
scalar(src(src0_zdivw), TGSI_SWIZZLE_X) ))
return FALSE;
if (!submit_op2( emit, inst_token( SVGA3DOP_MUL ),
writemask(src0_zdivw, TGSI_WRITEMASK_X),
scalar(src0, TGSI_SWIZZLE_Z),
scalar(src(src0_zdivw), TGSI_SWIZZLE_X) ))
return FALSE;
if (!emit_select(
emit,
emit->key.fkey.tex[unit].compare_func,
writemask( dst2, TGSI_WRITEMASK_XYZ ),
scalar(src(src0_zdivw), TGSI_SWIZZLE_X),
tex_src_x))
r_coord = scalar(src(src0_zdivw), TGSI_SWIZZLE_X);
}
else {
r_coord = scalar(src0, TGSI_SWIZZLE_Z);
}
/* Compare texture sample value against R component of texcoord */
if (!emit_select(emit,
emit->key.fkey.tex[unit].compare_func,
writemask( dst2, TGSI_WRITEMASK_XYZ ),
r_coord,
tex_src_x))
return FALSE;
}