Series looks good to me. You should add a mention of this in src/gallium/docs/source/tgsi.rst too as it is not an obvious feature.
Jose ----- Original Message ----- > From: Roland Scheidegger <srol...@vmware.com> > > Same as for gallivm (though these don't quite work correctly in softpipe, > so untested). > --- > src/gallium/auxiliary/tgsi/tgsi_exec.c | 40 > ++++++++++++++++++++++++++++---- > 1 file changed, 35 insertions(+), 5 deletions(-) > > diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c > b/src/gallium/auxiliary/tgsi/tgsi_exec.c > index 1f8e62d..3ac6901 100644 > --- a/src/gallium/auxiliary/tgsi/tgsi_exec.c > +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c > @@ -2041,9 +2041,25 @@ exec_txf(struct tgsi_exec_machine *mach, > r[3].f[j] = rgba[3][j]; > } > > - for (chan = 0; chan < TGSI_NUM_CHANNELS; chan++) { > - if (inst->Dst[0].Register.WriteMask & (1 << chan)) { > - store_dest(mach, &r[chan], &inst->Dst[0], inst, chan, > TGSI_EXEC_DATA_FLOAT); > + if (inst->Instruction.Opcode == TGSI_OPCODE_SAMPLE_I) { > + unsigned char swizzles[4]; > + swizzles[0] = inst->Src[1].Register.SwizzleX; > + swizzles[1] = inst->Src[1].Register.SwizzleY; > + swizzles[2] = inst->Src[1].Register.SwizzleZ; > + swizzles[3] = inst->Src[1].Register.SwizzleW; > + > + for (chan = 0; chan < TGSI_NUM_CHANNELS; chan++) { > + if (inst->Dst[0].Register.WriteMask & (1 << chan)) { > + store_dest(mach, &r[swizzles[chan]], > + &inst->Dst[0], inst, chan, TGSI_EXEC_DATA_FLOAT); > + } > + } > + } > + else { > + for (chan = 0; chan < TGSI_NUM_CHANNELS; chan++) { > + if (inst->Dst[0].Register.WriteMask & (1 << chan)) { > + store_dest(mach, &r[chan], &inst->Dst[0], inst, chan, > TGSI_EXEC_DATA_FLOAT); > + } > } > } > } > @@ -2087,6 +2103,7 @@ exec_sample(struct tgsi_exec_machine *mach, > const union tgsi_exec_channel *lod = &ZeroVec; > enum tgsi_sampler_control control = tgsi_sampler_lod_none; > uint chan; > + unsigned char swizzles[4]; > int8_t offsets[3]; > > /* always fetch all 3 offsets, overkill but keeps code simple */ > @@ -2193,9 +2210,15 @@ exec_sample(struct tgsi_exec_machine *mach, > assert(0); > } > > + swizzles[0] = inst->Src[1].Register.SwizzleX; > + swizzles[1] = inst->Src[1].Register.SwizzleY; > + swizzles[2] = inst->Src[1].Register.SwizzleZ; > + swizzles[3] = inst->Src[1].Register.SwizzleW; > + > for (chan = 0; chan < TGSI_NUM_CHANNELS; chan++) { > if (inst->Dst[0].Register.WriteMask & (1 << chan)) { > - store_dest(mach, &r[chan], &inst->Dst[0], inst, chan, > TGSI_EXEC_DATA_FLOAT); > + store_dest(mach, &r[swizzles[chan]], > + &inst->Dst[0], inst, chan, TGSI_EXEC_DATA_FLOAT); > } > } > } > @@ -2209,6 +2232,7 @@ exec_sample_d(struct tgsi_exec_machine *mach, > union tgsi_exec_channel r[4]; > float derivs[3][2][TGSI_QUAD_SIZE]; > uint chan; > + unsigned char swizzles[4]; > int8_t offsets[3]; > > /* always fetch all 3 offsets, overkill but keeps code simple */ > @@ -2268,9 +2292,15 @@ exec_sample_d(struct tgsi_exec_machine *mach, > assert(0); > } > > + swizzles[0] = inst->Src[1].Register.SwizzleX; > + swizzles[1] = inst->Src[1].Register.SwizzleY; > + swizzles[2] = inst->Src[1].Register.SwizzleZ; > + swizzles[3] = inst->Src[1].Register.SwizzleW; > + > for (chan = 0; chan < TGSI_NUM_CHANNELS; chan++) { > if (inst->Dst[0].Register.WriteMask & (1 << chan)) { > - store_dest(mach, &r[chan], &inst->Dst[0], inst, chan, > TGSI_EXEC_DATA_FLOAT); > + store_dest(mach, &r[swizzles[chan]], > + &inst->Dst[0], inst, chan, TGSI_EXEC_DATA_FLOAT); > } > } > } > -- > 1.7.9.5 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev