[Mesa-dev] [PATCH] i915g: implement more opcodes.

Marcin Baczyński marbacz at gmail.com
Mon Jun 6 12:51:46 PDT 2011


2011/6/6 Stéphane Marchesin <marcheu at chromium.org>:
> ---
>  src/gallium/drivers/i915/i915_fpc_translate.c |   94 +++++++++++++++++++++---
>  1 files changed, 82 insertions(+), 12 deletions(-)
>
> diff --git a/src/gallium/drivers/i915/i915_fpc_translate.c b/src/gallium/drivers/i915/i915_fpc_translate.c
> index 695a396..51766cd 100644
> --- a/src/gallium/drivers/i915/i915_fpc_translate.c
> +++ b/src/gallium/drivers/i915/i915_fpc_translate.c
> @@ -501,6 +501,17 @@ i915_translate_instruction(struct i915_fp_compile *p,
>                       i915_emit_const4fv(p, cos_constants), 0);
>       break;
>
> +  case TGSI_OPCODE_DP2:
> +      src0 = src_vector(p, &inst->Src[0]);
> +      src1 = src_vector(p, &inst->Src[1]);
> +
> +      i915_emit_arith(p,
> +                      A0_DP3,
> +                      get_result_vector(p, &inst->Dst[0]),
> +                      get_result_flags(inst), 0,
> +                      swizzle(src0, X, Y, ZERO, ZERO), src1, 0);
> +      break;
> +
>    case TGSI_OPCODE_DP3:
>       emit_simple_arith(p, inst, A0_DP3, 2);
>       break;
> @@ -706,7 +717,7 @@ i915_translate_instruction(struct i915_fp_compile *p,
>       i915_emit_arith(p,
>                       A0_RCP,
>                       get_result_vector(p, &inst->Dst[0]),
> -                         get_result_flags(inst), 0,
> +                      get_result_flags(inst), 0,
>                       swizzle(src0, X, X, X, X), 0, 0);
>       break;
>
> @@ -784,13 +795,36 @@ i915_translate_instruction(struct i915_fp_compile *p,
>       }
>       break;
>
> -   case TGSI_OPCODE_SGE:
> -      emit_simple_arith(p, inst, A0_SGE, 2);
> +   case TGSI_OPCODE_SEQ:
> +      /* if we're both >= and <= then we're == */
> +      src0 = src_vector(p, &inst->Src[0]);
> +      src1 = src_vector(p, &inst->Src[1]);
> +      tmp = i915_get_utemp(p);
> +
> +      i915_emit_arith(p,
> +                      A0_SGE,
> +                      tmp, A0_DEST_CHANNEL_ALL, 0,
> +                      src0,
> +                      src1, 0);
> +
> +      i915_emit_arith(p,
> +                      A0_SGE,
> +                      get_result_vector(p, &inst->Dst[0]),
> +                      A0_DEST_CHANNEL_ALL, 0,
> +                      src1,
> +                      src0, 0);
> +
> +      i915_emit_arith(p,
> +                      A0_MUL,
> +                      get_result_vector(p, &inst->Dst[0]),
> +                      A0_DEST_CHANNEL_ALL, 0,
> +                      get_result_vector(p, &inst->Dst[0]),
> +                      tmp, 0);
> +
>       break;
>
> -   case TGSI_OPCODE_SLE:
> -      /* like SGE, but swap reg0, reg1 */
> -      emit_simple_arith_swap2(p, inst, A0_SGE, 2);
> +   case TGSI_OPCODE_SGE:
> +      emit_simple_arith(p, inst, A0_SGE, 2);
>       break;
>
>    case TGSI_OPCODE_SIN:
> @@ -843,6 +877,11 @@ i915_translate_instruction(struct i915_fp_compile *p,
>                       i915_emit_const4fv(p, sin_constants), 0);
>       break;
>
> +   case TGSI_OPCODE_SLE:
> +      /* like SGE, but swap reg0, reg1 */
> +      emit_simple_arith_swap2(p, inst, A0_SGE, 2);
> +      break;
> +
>    case TGSI_OPCODE_SLT:
>       emit_simple_arith(p, inst, A0_SLT, 2);
>       break;
> @@ -852,32 +891,59 @@ i915_translate_instruction(struct i915_fp_compile *p,
>       emit_simple_arith_swap2(p, inst, A0_SLT, 2);
>       break;
>
> -   case TGSI_OPCODE_SEQ:
> -      /* if we're both >= and <= then we're == */
> +   case TGSI_OPCODE_SNE:
> +      /* if we're neither < nor > then we're != */

Quite the opposite, I'd say ;)

>       src0 = src_vector(p, &inst->Src[0]);
>       src1 = src_vector(p, &inst->Src[1]);
>       tmp = i915_get_utemp(p);
>
>       i915_emit_arith(p,
> -                      A0_SGE,
> -                      tmp, A0_DEST_CHANNEL_ALL, 0,
> +                      A0_SLT,
> +                      tmp,
> +                      A0_DEST_CHANNEL_ALL, 0,
>                       src0,
>                       src1, 0);
>
>       i915_emit_arith(p,
> -                      A0_SGE,
> +                      A0_SLT,
>                       get_result_vector(p, &inst->Dst[0]),
>                       A0_DEST_CHANNEL_ALL, 0,
>                       src1,
>                       src0, 0);
>
>       i915_emit_arith(p,
> -                      A0_MUL,
> +                      A0_ADD,
>                       get_result_vector(p, &inst->Dst[0]),
>                       A0_DEST_CHANNEL_ALL, 0,
>                       get_result_vector(p, &inst->Dst[0]),
>                       tmp, 0);
> +      break;
>
> +   case TGSI_OPCODE_SSG:
> +      /* compute (src>0) - (src<0) */
> +      src0 = src_vector(p, &inst->Src[0]);
> +      tmp = i915_get_utemp(p);
> +
> +      i915_emit_arith(p,
> +                      A0_SLT,
> +                      tmp,
> +                      A0_DEST_CHANNEL_ALL, 0,
> +                      src0,
> +                      swizzle(src0, ZERO, ZERO, ZERO, ZERO), 0);
> +
> +      i915_emit_arith(p,
> +                      A0_SLT,
> +                      get_result_vector(p, &inst->Dst[0]),
> +                      A0_DEST_CHANNEL_ALL, 0,
> +                      swizzle(src0, ZERO, ZERO, ZERO, ZERO),
> +                      src0, 0);
> +
> +      i915_emit_arith(p,
> +                      A0_ADD,
> +                      get_result_vector(p, &inst->Dst[0]),
> +                      A0_DEST_CHANNEL_ALL, 0,
> +                      get_result_vector(p, &inst->Dst[0]),
> +                      negate(tmp, 1, 1, 1, 1), 0);
>       break;
>
>    case TGSI_OPCODE_SUB:
> @@ -895,6 +961,10 @@ i915_translate_instruction(struct i915_fp_compile *p,
>       emit_tex(p, inst, T0_TEXLD);
>       break;
>
> +   case TGSI_OPCODE_TRUNC:
> +      emit_simple_arith(p, inst, A0_TRC, 1);
> +      break;
> +
>    case TGSI_OPCODE_TXB:
>       emit_tex(p, inst, T0_TEXLDB);
>       break;
> --
> 1.7.5.3.367.ga9930
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>


More information about the mesa-dev mailing list