[Mesa-dev] [PATCH v3 33/51] st/nine: Implement TEXCOORD special behaviours

Axel Davy axel.davy at ens.fr
Sun Jan 11 01:41:00 PST 2015


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

Signed-off-by: Axel Davy <axel.davy at ens.fr>

Cc: "10.4" <mesa-stable at lists.freedesktop.org>
---
 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 2b41823..ae609b0 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.1.0



More information about the mesa-dev mailing list