2011/6/6 Stéphane Marchesin <[email protected]>: > --- > 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 > [email protected] > http://lists.freedesktop.org/mailman/listinfo/mesa-dev > _______________________________________________ mesa-dev mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-dev
