aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/drivers/svga/svga_tgsi_insn.c40
1 files 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;
}