[Mesa-dev] [PATCH 8/9] tgsi: Add code for handling lodq opcode

Roland Scheidegger sroland at vmware.com
Wed Sep 9 11:22:43 PDT 2015


Yes, using a new function is definitely the right way to go imho.
Apart from the things mentioned by Brian, the series looks good to me.

Roland

Am 09.09.2015 um 12:35 schrieb Krzesimir Nowak:
> This introduces new vfunc in tgsi_sampler just for this opcode. I
> decided against extending get_samples vfunc to return the mipmap level
> and LOD - the function's prototype is already too scary and doing the
> sampling for textureQueryLod would be a waste of time.
> ---
>  src/gallium/auxiliary/tgsi/tgsi_exec.c | 44 ++++++++++++++++++++++++++++++++++
>  src/gallium/auxiliary/tgsi/tgsi_exec.h | 10 ++++++++
>  2 files changed, 54 insertions(+)
> 
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c b/src/gallium/auxiliary/tgsi/tgsi_exec.c
> index 9544623..054ad08 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_exec.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c
> @@ -2132,6 +2132,44 @@ exec_tex(struct tgsi_exec_machine *mach,
>     }
>  }
>  
> +static void
> +exec_lodq(struct tgsi_exec_machine *mach,
> +          const struct tgsi_full_instruction *inst)
> +{
> +   uint unit;
> +   int dim;
> +   int i;
> +   union tgsi_exec_channel coords[4];
> +   const union tgsi_exec_channel *args[Elements(coords)];
> +   union tgsi_exec_channel r[2];
> +
> +   unit = fetch_sampler_unit(mach, inst, 1);
> +   dim = tgsi_util_get_texture_coord_dim(inst->Texture.Texture, NULL);
> +   assert(dim <= Elements(coords));
> +   /* fetch coordinates */
> +   for (i = 0; i < dim; i++) {
> +      FETCH(&coords[i], 0, TGSI_CHAN_X + i);
> +      args[i] = &coords[i];
> +   }
> +   for (i = dim; i < Elements(coords); i++) {
> +      args[i] = &ZeroVec;
> +   }
> +   mach->Sampler->query_lod(mach->Sampler, unit, unit,
> +                            args[0]->f,
> +                            args[1]->f,
> +                            args[2]->f,
> +                            args[3]->f,
> +                            tgsi_sampler_lod_none,
> +                            r[0].f,
> +                            r[1].f);
> +
> +   if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) {
> +      store_dest(mach, &r[0], &inst->Dst[0], inst, TGSI_CHAN_X, TGSI_EXEC_DATA_FLOAT);
> +   }
> +   if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) {
> +      store_dest(mach, &r[1], &inst->Dst[0], inst, TGSI_CHAN_Y, TGSI_EXEC_DATA_FLOAT);
> +   }
> +}
>  
>  static void
>  exec_txd(struct tgsi_exec_machine *mach,
> @@ -4378,6 +4416,12 @@ exec_instruction(
>        exec_tex(mach, inst, TEX_MODIFIER_GATHER, 2);
>        break;
>  
> +   case TGSI_OPCODE_LODQ:
> +      /* src[0] = texcoord */
> +      /* src[1] = sampler unit */
> +      exec_lodq(mach, inst);
> +      break;
> +
>     case TGSI_OPCODE_UP2H:
>        assert (0);
>        break;
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.h b/src/gallium/auxiliary/tgsi/tgsi_exec.h
> index 5d56aab..556e0af 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_exec.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.h
> @@ -138,6 +138,16 @@ struct tgsi_sampler
>                       const int j[TGSI_QUAD_SIZE], const int k[TGSI_QUAD_SIZE],
>                       const int lod[TGSI_QUAD_SIZE], const int8_t offset[3],
>                       float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]);
> +   void (*query_lod)(struct tgsi_sampler *tgsi_sampler,
> +                     const unsigned sview_index,
> +                     const unsigned sampler_index,
> +                     const float s[TGSI_QUAD_SIZE],
> +                     const float t[TGSI_QUAD_SIZE],
> +                     const float p[TGSI_QUAD_SIZE],
> +                     const float c0[TGSI_QUAD_SIZE],
> +                     enum tgsi_sampler_control control,
> +                     float mipmap[TGSI_QUAD_SIZE],
> +                     float lod[TGSI_QUAD_SIZE]);
>  };
>  
>  #define TGSI_EXEC_NUM_TEMPS       4096
> 



More information about the mesa-dev mailing list