From 7d09df0cbc7e4524919a025cdd506b29e2d8b4f1 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 26 Jul 2011 09:19:40 -0600 Subject: [PATCH] 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. --- src/gallium/drivers/svga/svga_tgsi_insn.c | 40 ++++++++++++++--------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/src/gallium/drivers/svga/svga_tgsi_insn.c b/src/gallium/drivers/svga/svga_tgsi_insn.c index b93c0cbab90..91fd470eabc 100644 --- a/src/gallium/drivers/svga/svga_tgsi_insn.c +++ b/src/gallium/drivers/svga/svga_tgsi_insn.c @@ -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; + + r_coord = scalar(src(src0_zdivw), TGSI_SWIZZLE_X); + } + else { + r_coord = scalar(src0, TGSI_SWIZZLE_Z); + } - 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)) + /* 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; } -- 2.30.2