[Mesa-stable] [Mesa-dev] [PATCH v2 34/52] st/nine: Implement TEXCOORD special behaviours

Ilia Mirkin imirkin at alum.mit.edu
Sat Jan 10 08:53:22 PST 2015


On Sat, Jan 10, 2015 at 5:44 AM, Axel Davy <axel.davy at 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.davy at ens.fr>
>
> Cc: "10.4" <mesa-stable at 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-stable mailing list