svga: fix depth/shadow compare for non-projected texcoords
authorBrian Paul <brianp@vmware.com>
Tue, 26 Jul 2011 15:19:40 +0000 (09:19 -0600)
committerBrian Paul <brianp@vmware.com>
Fri, 23 Sep 2011 13:58:48 +0000 (07:58 -0600)
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

index b93c0cbab90124e800212e64f752cdf126369863..91fd470eabca1308a5f35b6db6f07ccbec868337 100644 (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;
+
+            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;
       }