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 <tizbac2@gmail.com> Signed-off-by: Axel Davy <axel.davy@ens.fr> Cc: "10.4" <mesa-stable@lists.freedesktop.org>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user