[Mesa-dev] [PATCH 1/2] softpipe: try to beat new dx10-style sample opcodes into shape

Roland Scheidegger sroland at vmware.com
Tue Feb 5 19:33:03 PST 2013


Hmm that commit message doesn't quite look right, I should have said
explicitly that it doesn't work for ordinary dx10 sampling instructions,
since the tgsi sample interface doesn't pass separate sampler and
sampler_view ids for fetch_texel neither, not just for get_dims and
get_texels (so unlike the latter two there is a sampler associated with
the instruction, but all the resource info will come from the wrong
resource). But anyway the broken code at least seems to look less broken -).

Roland

Am 06.02.2013 04:20, schrieb sroland at vmware.com:
> From: Roland Scheidegger <sroland at vmware.com>
> 
> There were several bugs how this was handled, most opcodes wouldn't even
> have fetched the right arguments.
> Also, the tex "target" is coming from the sampler view, hence it cannot
> have information about shadow comparisons - fortunately this is not only
> sampler state but also needs to have matching instruction, so just use this
> instead to identify shadow comparisons.
> Still untested (compiles...).
> Note that sample_i and sviewinfo are still busted (just assert).
> (The problem is that the interface for doing the opengl-equivalent functions
> txf and txq is tied to the specific the sampler itself but these opcodes
> have no sampler associated with them. Oops...)
> ---
>  src/gallium/auxiliary/tgsi/tgsi_exec.c |  156 ++++++++++++++++++--------------
>  1 file changed, 89 insertions(+), 67 deletions(-)
> 
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c b/src/gallium/auxiliary/tgsi/tgsi_exec.c
> index 9f226c4..6d04cdc 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_exec.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c
> @@ -1733,6 +1733,7 @@ fetch_texel( struct tgsi_sampler *sampler,
>  #define TEX_MODIFIER_PROJECTED      1
>  #define TEX_MODIFIER_LOD_BIAS       2
>  #define TEX_MODIFIER_EXPLICIT_LOD   3
> +#define TEX_MODIFIER_LEVEL_ZERO     4
>  
>  /*
>   * execute a texture instruction.
> @@ -2122,7 +2123,7 @@ exec_txq(struct tgsi_exec_machine *mach,
>  static void
>  exec_sample(struct tgsi_exec_machine *mach,
>              const struct tgsi_full_instruction *inst,
> -            uint modifier)
> +            uint modifier, boolean compare)
>  {
>     const uint resource_unit = inst->Src[1].Register.Index;
>     const uint sampler_unit = inst->Src[2].Register.Index;
> @@ -2131,95 +2132,112 @@ exec_sample(struct tgsi_exec_machine *mach,
>     enum tgsi_sampler_control control;
>     uint chan;
>  
> +   assert(modifier != TEX_MODIFIER_PROJECTED);
> +
>     if (modifier != TEX_MODIFIER_NONE) {
> -      if (modifier == TEX_MODIFIER_LOD_BIAS)
> +      if (modifier == TEX_MODIFIER_LOD_BIAS) {
>           FETCH(&r[3], 3, TGSI_CHAN_X);
> -      else /*TEX_MODIFIER_LOD*/
> +         lod = &r[3];
> +      }
> +      else if (modifier == TEX_MODIFIER_EXPLICIT_LOD) {
>           FETCH(&r[3], 0, TGSI_CHAN_W);
> -
> -      if (modifier != TEX_MODIFIER_PROJECTED) {
>           lod = &r[3];
>        }
> +      else
> +         assert(modifier == TEX_MODIFIER_LEVEL_ZERO);
>     }
>  
> -   if (modifier == TEX_MODIFIER_EXPLICIT_LOD) {
> +   if (modifier == TEX_MODIFIER_EXPLICIT_LOD ||
> +       modifier == TEX_MODIFIER_LEVEL_ZERO) {
>        control = tgsi_sampler_lod_explicit;
>     } else {
>        control = tgsi_sampler_lod_bias;
>     }
>  
> +   FETCH(&r[0], 0, TGSI_CHAN_X);
> +
>     switch (mach->SamplerViews[resource_unit].Resource) {
>     case TGSI_TEXTURE_1D:
> -   case TGSI_TEXTURE_SHADOW1D:
> -      FETCH(&r[0], 0, TGSI_CHAN_X);
> -
> -      if (modifier == TEX_MODIFIER_PROJECTED) {
> -         micro_div(&r[0], &r[0], &r[3]);
> +      if (compare) {
> +         FETCH(&r[2], 3, TGSI_CHAN_X);
> +         fetch_texel(mach->Samplers[sampler_unit],
> +                     &r[0], &ZeroVec, &r[2], lod, &ZeroVec,  /* S, T, P, LOD */
> +                     control,
> +                     &r[0], &r[1], &r[2], &r[3]);     /* R, G, B, A */
> +      }
> +      else {
> +         fetch_texel(mach->Samplers[sampler_unit],
> +                     &r[0], &ZeroVec, &ZeroVec, lod, &ZeroVec,  /* S, T, P, LOD */
> +                     control,
> +                     &r[0], &r[1], &r[2], &r[3]);     /* R, G, B, A */
>        }
> -
> -      fetch_texel(mach->Samplers[sampler_unit],
> -                  &r[0], &ZeroVec, &ZeroVec, lod, &ZeroVec,  /* S, T, P, LOD */
> -                  control,
> -                  &r[0], &r[1], &r[2], &r[3]);     /* R, G, B, A */
>        break;
>  
>     case TGSI_TEXTURE_1D_ARRAY:
>     case TGSI_TEXTURE_2D:
>     case TGSI_TEXTURE_RECT:
> -   case TGSI_TEXTURE_SHADOW1D_ARRAY:
> -   case TGSI_TEXTURE_SHADOW2D:
> -   case TGSI_TEXTURE_SHADOWRECT:
> -      FETCH(&r[0], 0, TGSI_CHAN_X);
>        FETCH(&r[1], 0, TGSI_CHAN_Y);
> -      FETCH(&r[2], 0, TGSI_CHAN_Z);
> -
> -      if (modifier == TEX_MODIFIER_PROJECTED) {
> -         micro_div(&r[0], &r[0], &r[3]);
> -         micro_div(&r[1], &r[1], &r[3]);
> -         micro_div(&r[2], &r[2], &r[3]);
> +      if (compare) {
> +         FETCH(&r[2], 3, TGSI_CHAN_X);
> +         fetch_texel(mach->Samplers[sampler_unit],
> +                     &r[0], &r[1], &r[2], lod, &ZeroVec,     /* S, T, P, LOD */
> +                     control,
> +                     &r[0], &r[1], &r[2], &r[3]);  /* outputs */
> +      }
> +      else {
> +         fetch_texel(mach->Samplers[sampler_unit],
> +                     &r[0], &r[1], &ZeroVec, lod, &ZeroVec,     /* S, T, P, LOD */
> +                     control,
> +                     &r[0], &r[1], &r[2], &r[3]);  /* outputs */
>        }
> -
> -      fetch_texel(mach->Samplers[sampler_unit],
> -                  &r[0], &r[1], &r[2], lod, &ZeroVec,     /* S, T, P, LOD */
> -                  control,
> -                  &r[0], &r[1], &r[2], &r[3]);  /* outputs */
>        break;
>  
>     case TGSI_TEXTURE_2D_ARRAY:
>     case TGSI_TEXTURE_3D:
>     case TGSI_TEXTURE_CUBE:
> -   case TGSI_TEXTURE_CUBE_ARRAY:
> -      FETCH(&r[0], 0, TGSI_CHAN_X);
>        FETCH(&r[1], 0, TGSI_CHAN_Y);
>        FETCH(&r[2], 0, TGSI_CHAN_Z);
> -
> -      if (modifier == TEX_MODIFIER_PROJECTED) {
> -         micro_div(&r[0], &r[0], &r[3]);
> -         micro_div(&r[1], &r[1], &r[3]);
> -         micro_div(&r[2], &r[2], &r[3]);
> +      if(compare) {
> +         FETCH(&r[3], 3, TGSI_CHAN_X);
> +         fetch_texel(mach->Samplers[sampler_unit],
> +                     &r[0], &r[1], &r[2], &r[3], &ZeroVec,
> +                     control,
> +                     &r[0], &r[1], &r[2], &r[3]);
> +      }
> +      else {
> +         fetch_texel(mach->Samplers[sampler_unit],
> +                     &r[0], &r[1], &r[2], lod, &ZeroVec,
> +                     control,
> +                     &r[0], &r[1], &r[2], &r[3]);
>        }
> -
> -      fetch_texel(mach->Samplers[sampler_unit],
> -                  &r[0], &r[1], &r[2], lod, &ZeroVec,
> -                  control,
> -                  &r[0], &r[1], &r[2], &r[3]);
>        break;
>  
> -   case TGSI_TEXTURE_SHADOW2D_ARRAY:
> -   case TGSI_TEXTURE_SHADOWCUBE:
> -      FETCH(&r[0], 0, TGSI_CHAN_X);
> +   case TGSI_TEXTURE_CUBE_ARRAY:
>        FETCH(&r[1], 0, TGSI_CHAN_Y);
>        FETCH(&r[2], 0, TGSI_CHAN_Z);
>        FETCH(&r[3], 0, TGSI_CHAN_W);
> -
> -      assert(modifier != TEX_MODIFIER_PROJECTED);
> -
> -      fetch_texel(mach->Samplers[sampler_unit],
> -                  &r[0], &r[1], &r[2], &r[3], &ZeroVec,
> -                  control,
> -                  &r[0], &r[1], &r[2], &r[3]);
> +      if(compare) {
> +         assert(modifier == TEX_MODIFIER_NONE);
> +         /*
> +          * FIXME: lod bias and explicit lod are prohibited but
> +          * for sample_c_lz we pass the level zero info as explicit
> +          * lod 0.
> +          */
> +         FETCH(&r[4], 3, TGSI_CHAN_X);
> +         fetch_texel(mach->Samplers[sampler_unit],
> +                     &r[0], &r[1], &r[2], &r[3], &r[4],
> +                     control,
> +                     &r[0], &r[1], &r[2], &r[3]);
> +      }
> +      else {
> +         fetch_texel(mach->Samplers[sampler_unit],
> +                     &r[0], &r[1], &r[2], &r[3], lod,
> +                     control,
> +                     &r[0], &r[1], &r[2], &r[3]);
> +      }
>        break;
>  
> +
>     default:
>        assert(0);
>     }
> @@ -2245,8 +2263,6 @@ exec_sample_d(struct tgsi_exec_machine *mach,
>  
>     switch (mach->SamplerViews[resource_unit].Resource) {
>     case TGSI_TEXTURE_1D:
> -   case TGSI_TEXTURE_SHADOW1D:
> -
>        FETCH(&r[0], 0, TGSI_CHAN_X);
>  
>        fetch_texel(mach->Samplers[sampler_unit],
> @@ -2257,23 +2273,17 @@ exec_sample_d(struct tgsi_exec_machine *mach,
>  
>     case TGSI_TEXTURE_2D:
>     case TGSI_TEXTURE_RECT:
> -   case TGSI_TEXTURE_SHADOW2D:
> -   case TGSI_TEXTURE_SHADOWRECT:
> -
>        FETCH(&r[0], 0, TGSI_CHAN_X);
>        FETCH(&r[1], 0, TGSI_CHAN_Y);
> -      FETCH(&r[2], 0, TGSI_CHAN_Z);
>  
>        fetch_texel(mach->Samplers[sampler_unit],
> -                  &r[0], &r[1], &r[2], &ZeroVec, &ZeroVec,   /* inputs */
> +                  &r[0], &r[1], &ZeroVec, &ZeroVec, &ZeroVec,   /* inputs */
>                    tgsi_sampler_lod_bias,
>                    &r[0], &r[1], &r[2], &r[3]);     /* outputs */
>        break;
>  
>     case TGSI_TEXTURE_3D:
>     case TGSI_TEXTURE_CUBE:
> -   case TGSI_TEXTURE_CUBE_ARRAY:
> -
>        FETCH(&r[0], 0, TGSI_CHAN_X);
>        FETCH(&r[1], 0, TGSI_CHAN_Y);
>        FETCH(&r[2], 0, TGSI_CHAN_Z);
> @@ -2284,6 +2294,18 @@ exec_sample_d(struct tgsi_exec_machine *mach,
>                    &r[0], &r[1], &r[2], &r[3]);
>        break;
>  
> +   case TGSI_TEXTURE_CUBE_ARRAY:
> +      FETCH(&r[0], 0, TGSI_CHAN_X);
> +      FETCH(&r[1], 0, TGSI_CHAN_Y);
> +      FETCH(&r[2], 0, TGSI_CHAN_Z);
> +      FETCH(&r[3], 0, TGSI_CHAN_W);
> +
> +      fetch_texel(mach->Samplers[sampler_unit],
> +                  &r[0], &r[1], &r[2], &r[3], &ZeroVec,
> +                  tgsi_sampler_lod_bias,
> +                  &r[0], &r[1], &r[2], &r[3]);
> +      break;
> +
>     default:
>        assert(0);
>     }
> @@ -4192,19 +4214,19 @@ exec_instruction(
>        break;
>  
>     case TGSI_OPCODE_SAMPLE:
> -      exec_sample(mach, inst, TEX_MODIFIER_NONE);
> +      exec_sample(mach, inst, TEX_MODIFIER_NONE, FALSE);
>        break;
>  
>     case TGSI_OPCODE_SAMPLE_B:
> -      exec_sample(mach, inst, TEX_MODIFIER_LOD_BIAS);
> +      exec_sample(mach, inst, TEX_MODIFIER_LOD_BIAS, FALSE);
>        break;
>  
>     case TGSI_OPCODE_SAMPLE_C:
> -      exec_sample(mach, inst, TEX_MODIFIER_NONE);
> +      exec_sample(mach, inst, TEX_MODIFIER_NONE, TRUE);
>        break;
>  
>     case TGSI_OPCODE_SAMPLE_C_LZ:
> -      exec_sample(mach, inst, TEX_MODIFIER_LOD_BIAS);
> +      exec_sample(mach, inst, TEX_MODIFIER_LEVEL_ZERO, TRUE);
>        break;
>  
>     case TGSI_OPCODE_SAMPLE_D:
> @@ -4212,7 +4234,7 @@ exec_instruction(
>        break;
>  
>     case TGSI_OPCODE_SAMPLE_L:
> -      exec_sample(mach, inst, TEX_MODIFIER_EXPLICIT_LOD);
> +      exec_sample(mach, inst, TEX_MODIFIER_EXPLICIT_LOD, FALSE);
>        break;
>  
>     case TGSI_OPCODE_GATHER4:
> 


More information about the mesa-dev mailing list