From 5399119fb1ea646880c5e8a54e4c7f789be4c574 Mon Sep 17 00:00:00 2001 From: Axel Davy Date: Wed, 3 Dec 2014 16:28:56 +0100 Subject: [PATCH] st/nine: Implement TEXCOORD special behaviours texcoord for ps < 1_4 should clamp between 0 and 1 the values. texcrd (texcoord ps 1_4) does not clamp and can be used with two modifiers _dw and _dz that means the channels are divided by w or z. Implement those in shared code, since the same modifiers can be used for texld ps 1_4. v2: replace DIV by RCP + MUL v3: Remove an useless MOV Reviewed-by: Tiziano Bacocco Signed-off-by: Axel Davy Cc: "10.4" --- src/gallium/state_trackers/nine/nine_shader.c | 31 ++++++++++++++++--- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/src/gallium/state_trackers/nine/nine_shader.c b/src/gallium/state_trackers/nine/nine_shader.c index 2b418232eb0..ae609b050ff 100644 --- a/src/gallium/state_trackers/nine/nine_shader.c +++ b/src/gallium/state_trackers/nine/nine_shader.c @@ -925,6 +925,25 @@ tx_src_param(struct shader_translator *tx, const struct sm1_src_param *param) if (param->rel) src = ureg_src_indirect(src, tx_src_param(tx, param->rel)); + switch (param->mod) { + case NINED3DSPSM_DW: + tmp = tx_scratch(tx); + /* NOTE: app is not allowed to read w with this modifier */ + ureg_RCP(ureg, ureg_writemask(tmp, NINED3DSP_WRITEMASK_3), src); + ureg_MUL(ureg, tmp, src, ureg_swizzle(ureg_src(tmp), NINE_SWIZZLE4(W,W,W,W))); + src = ureg_src(tmp); + break; + case NINED3DSPSM_DZ: + tmp = tx_scratch(tx); + /* NOTE: app is not allowed to read z with this modifier */ + ureg_RCP(ureg, ureg_writemask(tmp, NINED3DSP_WRITEMASK_2), src); + ureg_MUL(ureg, tmp, src, ureg_swizzle(ureg_src(tmp), NINE_SWIZZLE4(Z,Z,Z,Z))); + src = ureg_src(tmp); + break; + default: + break; + } + if (param->swizzle != NINED3DSP_NOSWIZZLE) src = ureg_swizzle(src, (param->swizzle >> 0) & 0x3, @@ -967,7 +986,7 @@ tx_src_param(struct shader_translator *tx, const struct sm1_src_param *param) break; case NINED3DSPSM_DZ: case NINED3DSPSM_DW: - /* handled in instruction */ + /* Already handled*/ break; case NINED3DSPSM_SIGN: tmp = tx_scratch(tx); @@ -2060,7 +2079,8 @@ DECL_SPECIAL(TEXCOORD) struct ureg_dst dst = tx_dst_param(tx, &tx->insn.dst[0]); tx_texcoord_alloc(tx, s); - ureg_MOV(ureg, dst, tx->regs.vT[s]); /* XXX is this sufficient ? */ + ureg_MOV(ureg, ureg_writemask(ureg_saturate(dst), TGSI_WRITEMASK_XYZ), tx->regs.vT[s]); + ureg_MOV(ureg, ureg_writemask(dst, TGSI_WRITEMASK_W), ureg_imm1f(tx->ureg, 1.0f)); return D3D_OK; } @@ -2068,11 +2088,12 @@ DECL_SPECIAL(TEXCOORD) DECL_SPECIAL(TEXCOORD_ps14) { struct ureg_program *ureg = tx->ureg; - const unsigned s = tx->insn.src[0].idx; + struct ureg_src src = tx_src_param(tx, &tx->insn.src[0]); struct ureg_dst dst = tx_dst_param(tx, &tx->insn.dst[0]); - tx_texcoord_alloc(tx, s); - ureg_MOV(ureg, dst, tx->regs.vT[s]); /* XXX is this sufficient ? */ + assert(tx->insn.src[0].file == D3DSPR_TEXTURE); + + ureg_MOV(ureg, dst, src); return D3D_OK; } -- 2.30.2