On Sat, Jan 10, 2015 at 5:44 AM, Axel Davy <axel.d...@ens.fr> wrote: > 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. > > Signed-off-by: Axel Davy <axel.d...@ens.fr> > > Cc: "10.4" <mesa-sta...@lists.freedesktop.org> > --- > src/gallium/state_trackers/nine/nine_shader.c | 33 > +++++++++++++++++++++++---- > 1 file changed, 28 insertions(+), 5 deletions(-) > > diff --git a/src/gallium/state_trackers/nine/nine_shader.c > b/src/gallium/state_trackers/nine/nine_shader.c > index b7e0c81..07c35cf 100644 > --- a/src/gallium/state_trackers/nine/nine_shader.c > +++ b/src/gallium/state_trackers/nine/nine_shader.c > @@ -937,6 +937,27 @@ 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); > + ureg_MOV(ureg, tmp, src); > + /* NOTE: app is not allowed to read w with this modifier */ > + ureg_RCP(ureg, ureg_writemask(tmp, NINED3DSP_WRITEMASK_3), > ureg_src(tmp)); > + ureg_MUL(ureg, tmp, ureg_src(tmp), ureg_swizzle(ureg_src(tmp), > NINE_SWIZZLE4(W,W,W,W)));
While not strictly speaking incorrect, you can do this without the mov... tmp.w = RCP(src) tmp.xyzw = MUL(src, tmp.wwww) [and same below] > + src = ureg_src(tmp); > + break; > + case NINED3DSPSM_DZ: > + tmp = tx_scratch(tx); > + ureg_MOV(ureg, tmp, src); > + /* NOTE: app is not allowed to read z with this modifier */ > + ureg_RCP(ureg, ureg_writemask(tmp, NINED3DSP_WRITEMASK_2), > ureg_src(tmp)); > + ureg_MUL(ureg, tmp, ureg_src(tmp), 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, > @@ -979,7 +1000,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); > @@ -2070,7 +2091,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; > } > @@ -2078,11 +2100,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 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev