[Mesa-dev] [PATCH 2/2] tgsi: handle texel swizzles correctly for d3d10-style sample opcodes

Jose Fonseca jfonseca at vmware.com
Sat Jul 27 03:44:57 PDT 2013


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 <sroland at 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
> 


More information about the mesa-dev mailing list