On Wed, Apr 13, 2016 at 4:50 PM, Christian Gmeiner <christian.gmei...@gmail.com> wrote: > Signed-off-by: Christian Gmeiner <christian.gmei...@gmail.com>
btw, Russell sent me a patchset a while back which included FLR/CEIL and some others.. and also properly fixed up LIT in case of lowering FLR.. so I think his patchset was more complete. Perhaps he could resend to mesa-dev? BR, -R > --- > src/gallium/auxiliary/tgsi/tgsi_lowering.c | 54 > ++++++++++++++++++++++++++++++ > src/gallium/auxiliary/tgsi/tgsi_lowering.h | 1 + > 2 files changed, 55 insertions(+) > > diff --git a/src/gallium/auxiliary/tgsi/tgsi_lowering.c > b/src/gallium/auxiliary/tgsi/tgsi_lowering.c > index a3b90bd..cd5bdc2 100644 > --- a/src/gallium/auxiliary/tgsi/tgsi_lowering.c > +++ b/src/gallium/auxiliary/tgsi/tgsi_lowering.c > @@ -258,6 +258,50 @@ transform_dst(struct tgsi_transform_context *tctx, > } > } > > +/* FLR - Floor > + * > + * dst.x = \lfloor src.x\rfloor > + * dst.y = \lfloor src.y\rfloor > + * dst.z = \lfloor src.z\rfloor > + * dst.w = \lfloor src.w\rfloor > + * > + * ; needs: 1 tmp > + * FRC tmpA, src > + * SUB dst, src, tmpA > + */ > +#define FLR_GROW (NINST(1) + NINST(2) - OINST(1)) > +#define FLR_TMP 1 > +static void > +transform_flr(struct tgsi_transform_context *tctx, > + struct tgsi_full_instruction *inst) > +{ > + struct tgsi_lowering_context *ctx = tgsi_lowering_context(tctx); > + struct tgsi_full_dst_register *dst = &inst->Dst[0]; > + struct tgsi_full_src_register *src = &inst->Src[0]; > + struct tgsi_full_instruction new_inst; > + > + if (dst->Register.WriteMask & TGSI_WRITEMASK_XYZW) { > + /* FRC tmpA, src */ > + new_inst = tgsi_default_full_instruction(); > + new_inst.Instruction.Opcode = TGSI_OPCODE_FRC; > + new_inst.Instruction.NumDstRegs = 1; > + reg_dst(&new_inst.Dst[0], &ctx->tmp[A].dst, TGSI_WRITEMASK_XYZW); > + new_inst.Instruction.NumSrcRegs = 1; > + reg_src(&new_inst.Src[0], src, SWIZ(X, Y, Z, W)); > + tctx->emit_instruction(tctx, &new_inst); > + > + /* SUB dst, src, tmpA */ > + new_inst = tgsi_default_full_instruction(); > + new_inst.Instruction.Opcode = TGSI_OPCODE_SUB; > + new_inst.Instruction.NumDstRegs = 1; > + reg_dst(&new_inst.Dst[0], dst, TGSI_WRITEMASK_XYZW); > + new_inst.Instruction.NumSrcRegs = 2; > + reg_src(&new_inst.Src[0], src, SWIZ(X, Y, Z, W)); > + reg_src(&new_inst.Src[1], &ctx->tmp[A].src, SWIZ(X, Y, Z, W)); > + tctx->emit_instruction(tctx, &new_inst); > + } > +} > + > /* XPD - Cross Product > * dst.x = src0.y \times src1.z - src1.y \times src0.z > * dst.y = src0.z \times src1.x - src1.z \times src0.x > @@ -1336,6 +1380,11 @@ transform_instr(struct tgsi_transform_context *tctx, > goto skip; > transform_dst(tctx, inst); > break; > + case TGSI_OPCODE_FLR: > + if (!ctx->config->lower_FLR) > + goto skip; > + transform_flr(tctx, inst); > + break; > case TGSI_OPCODE_XPD: > if (!ctx->config->lower_XPD) > goto skip; > @@ -1460,6 +1509,7 @@ tgsi_transform_lowering(const struct > tgsi_lowering_config *config, > #define OPCS(x) ((config->lower_ ## x) ? info->opcode_count[TGSI_OPCODE_ ## > x] : 0) > /* if there are no instructions to lower, then we are done: */ > if (!(OPCS(DST) || > + OPCS(FLR) || > OPCS(XPD) || > OPCS(SCS) || > OPCS(LRP) || > @@ -1489,6 +1539,10 @@ tgsi_transform_lowering(const struct > tgsi_lowering_config *config, > newlen += DST_GROW * OPCS(DST); > numtmp = MAX2(numtmp, DST_TMP); > } > + if (OPCS(FLR)) { > + newlen += FLR_GROW * OPCS(FLR); > + numtmp = MAX2(numtmp, FLR_TMP); > + } > if (OPCS(XPD)) { > newlen += XPD_GROW * OPCS(XPD); > numtmp = MAX2(numtmp, XPD_TMP); > diff --git a/src/gallium/auxiliary/tgsi/tgsi_lowering.h > b/src/gallium/auxiliary/tgsi/tgsi_lowering.h > index 52c204f..803f84e 100644 > --- a/src/gallium/auxiliary/tgsi/tgsi_lowering.h > +++ b/src/gallium/auxiliary/tgsi/tgsi_lowering.h > @@ -55,6 +55,7 @@ struct tgsi_lowering_config > * enable lowering of TGSI_OPCODE_<opc> > */ > unsigned lower_DST:1; > + unsigned lower_FLR:1; > unsigned lower_XPD:1; > unsigned lower_SCS:1; > unsigned lower_LRP:1; > -- > 2.5.5 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev