[Mesa-dev] [PATCH 1/3] tgsi: add TXF support.

Brian Paul brianp at vmware.com
Thu Aug 25 08:02:11 PDT 2011


LGTM, just minor things below.

-Brian

On 08/25/2011 08:51 AM, Dave Airlie wrote:
> From: Dave Airlie<airlied at redhat.com>
>
> This is a straight texel fetch with no filtering or clamping. It uses
> integers to specify the i/j/k (from EXT_gpu_shader4).
>
> To enable this I had to add another hook into the tgsi sampler so that
> we could easily bypass all the filtering sample does.
>
> Signed-off-by: Dave Airlie<airlied at redhat.com>
> ---
>   src/gallium/auxiliary/tgsi/tgsi_exec.c |   52 +++++++++++++++++++++++++++++++-
>   src/gallium/auxiliary/tgsi/tgsi_exec.h |    3 ++
>   2 files changed, 54 insertions(+), 1 deletions(-)
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c b/src/gallium/auxiliary/tgsi/tgsi_exec.c
> index bfddf0d..88c88e2 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_exec.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c
> @@ -1594,6 +1594,9 @@ store_dest(struct tgsi_exec_machine *mach,
>   #define FETCH(VAL,INDEX,CHAN)\
>       fetch_source(mach, VAL,&inst->Src[INDEX], CHAN, TGSI_EXEC_DATA_FLOAT)
>
> +#define IFETCH(VAL,INDEX,CHAN)\
> +    fetch_source(mach, VAL,&inst->Src[INDEX], CHAN, TGSI_EXEC_DATA_INT)
> +
>
>   /**
>    * Execute ARB-style KIL which is predicated by a src register.
> @@ -1920,6 +1923,53 @@ exec_txd(struct tgsi_exec_machine *mach,
>      }
>   }
>
> +
> +static void
> +exec_txf(struct tgsi_exec_machine *mach,
> +	 const struct tgsi_full_instruction *inst)
> +{
> +   struct tgsi_sampler *sampler;
> +   const uint unit = inst->Src[1].Register.Index;
> +   union tgsi_exec_channel r[4];
> +   uint chan;
> +   float rgba[NUM_CHANNELS][QUAD_SIZE];
> +   int j;
> +
> +   IFETCH(&r[3], 0, CHAN_W);
> +
> +   switch(inst->Texture.Texture) {
> +   case TGSI_TEXTURE_3D:
> +   case TGSI_TEXTURE_2D_ARRAY:
> +      IFETCH(&r[2], 0, CHAN_Z);
> +   case TGSI_TEXTURE_2D:
> +   case TGSI_TEXTURE_RECT:
> +   case TGSI_TEXTURE_SHADOW2D:
> +   case TGSI_TEXTURE_SHADOWRECT:
> +   case TGSI_TEXTURE_1D_ARRAY:
> +      IFETCH(&r[1], 0, CHAN_Y);
> +   case TGSI_TEXTURE_1D:
> +   case TGSI_TEXTURE_SHADOW1D:
> +      IFETCH(&r[0], 0, CHAN_X);
> +   }

I'd put /* fall-through */ comments in there and add a default switch 
case with assertion to catch unexpected texture types.


> +
> +   sampler = mach->Samplers[unit];
> +   sampler->get_texel(sampler, r[0].i, r[1].i, r[2].i, r[3].i,
> +		      rgba);

There's no real reason to wrap that line, I think.


> +
> +   for (j = 0; j<  4; j++) {

Maybe s/4/QUAD_SIZE/


> +      r[0].f[j] = rgba[0][j];
> +      r[1].f[j] = rgba[1][j];
> +      r[2].f[j] = rgba[2][j];
> +      r[3].f[j] = rgba[3][j];
> +   }
> +
> +   for (chan = 0; chan<  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);
> +      }
> +   }
> +}
> +
>   static void
>   exec_txq(struct tgsi_exec_machine *mach,
>            const struct tgsi_full_instruction *inst)
> @@ -3742,7 +3792,7 @@ exec_instruction(
>         break;
>
>      case TGSI_OPCODE_TXF:
> -      assert (0);
> +      exec_txf(mach, inst);
>         break;
>
>      case TGSI_OPCODE_TXQ:
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.h b/src/gallium/auxiliary/tgsi/tgsi_exec.h
> index 2162a07..3f6964c 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_exec.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.h
> @@ -92,6 +92,9 @@ struct tgsi_sampler
>                          float rgba[NUM_CHANNELS][QUAD_SIZE]);
>      void (*get_dims)(struct tgsi_sampler *sampler, int level,
>   		    int dims[4]);
> +   void (*get_texel)(struct tgsi_sampler *sampler, const int i[QUAD_SIZE],
> +		     const int j[QUAD_SIZE], const int k[QUAD_SIZE],
> +		     const int lod[QUAD_SIZE], float rgba[NUM_CHANNELS][QUAD_SIZE]);
>   };
>
>   #define TGSI_EXEC_NUM_TEMPS       128



More information about the mesa-dev mailing list