[Mesa-dev] [PATCH] gallivm: hook up dx10 sampling opcodes

Brian Paul brianp at vmware.com
Fri Feb 1 12:00:15 PST 2013


On 02/01/2013 12:39 PM, sroland at vmware.com wrote:
> From: Roland Scheidegger<sroland at vmware.com>
>
> They are similar to old-style tex opcodes but with separate sampler and
> texture units (and other arguments in different places).
> Also adjust the debug tgsi dump code.
> ---
>   src/gallium/auxiliary/gallivm/lp_bld_tgsi.h      |    6 +-
>   src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c |  115 ++++++++-
>   src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c  |  291 ++++++++++++++++++++++
>   3 files changed, 406 insertions(+), 6 deletions(-)
>
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
> index 4898849..5d6b737 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
> @@ -68,7 +68,8 @@ enum lp_build_tex_modifier {
>      LP_BLD_TEX_MODIFIER_PROJECTED,
>      LP_BLD_TEX_MODIFIER_LOD_BIAS,
>      LP_BLD_TEX_MODIFIER_EXPLICIT_LOD,
> -   LP_BLD_TEX_MODIFIER_EXPLICIT_DERIV
> +   LP_BLD_TEX_MODIFIER_EXPLICIT_DERIV,
> +   LP_BLD_TEX_MODIFIER_LZ

Could you put a comment on the last one to say what LZ means?


>   };
>
>
> @@ -104,7 +105,8 @@ struct lp_tgsi_texture_info
>   {
>      struct lp_tgsi_channel_info coord[4];
>      unsigned target:8; /* TGSI_TEXTURE_* */
> -   unsigned unit:8;  /* Sampler unit */
> +   unsigned sampler_unit:8;  /* Sampler unit */
> +   unsigned texture_unit:8;  /* Texture unit */
>      unsigned modifier:8; /* LP_BLD_TEX_MODIFIER_* */

Maybe we could just use ubyte instead of bitfields?


>   };
>
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c
> index 1c54ef9..2a445d6 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c
> @@ -140,14 +140,104 @@ analyse_tex(struct analysis_context *ctx,
>         if (modifier == LP_BLD_TEX_MODIFIER_EXPLICIT_DERIV) {
>            /* We don't track explicit derivatives, although we could */
>            indirect = TRUE;
> -         tex_info->unit = inst->Src[3].Register.Index;
> +         tex_info->sampler_unit = inst->Src[3].Register.Index;
> +         tex_info->texture_unit = inst->Src[3].Register.Index;
>         }  else {
>            if (modifier == LP_BLD_TEX_MODIFIER_PROJECTED ||
>                modifier == LP_BLD_TEX_MODIFIER_LOD_BIAS ||
>                modifier == LP_BLD_TEX_MODIFIER_EXPLICIT_LOD) {
>               readmask |= TGSI_WRITEMASK_W;
>            }
> -         tex_info->unit = inst->Src[1].Register.Index;
> +         tex_info->sampler_unit = inst->Src[1].Register.Index;
> +         tex_info->texture_unit = inst->Src[1].Register.Index;
> +      }
> +
> +      for (chan = 0; chan<  4; ++chan) {
> +         struct lp_tgsi_channel_info *chan_info =&tex_info->coord[chan];
> +         if (readmask&  (1<<  chan)) {
> +            analyse_src(ctx, chan_info,&inst->Src[0].Register, chan);
> +            if (chan_info->file != TGSI_FILE_INPUT) {
> +               indirect = TRUE;
> +            }
> +         } else {
> +            memset(chan_info, 0, sizeof *chan_info);
> +         }
> +      }
> +
> +      if (indirect) {
> +         info->indirect_textures = TRUE;
> +      }
> +
> +      ++info->num_texs;
> +   } else {
> +      info->indirect_textures = TRUE;
> +   }
> +}
> +
> +
> +static void
> +analyse_sample(struct analysis_context *ctx,
> +               const struct tgsi_full_instruction *inst,
> +               enum lp_build_tex_modifier modifier)

It would be good to have a comment on this function (and 
analyse_tex()) to say something about what they do.


> +{
> +   struct lp_tgsi_info *info = ctx->info;
> +   unsigned chan;
> +
> +   if (info->num_texs<  Elements(info->tex)) {
> +      struct lp_tgsi_texture_info *tex_info =&info->tex[info->num_texs];
> +      boolean indirect = FALSE;
> +      boolean shadow = FALSE;
> +      unsigned readmask = 0;
> +
> +      tex_info->target = inst->Texture.Texture;
> +      switch (inst->Texture.Texture) {
> +      case TGSI_TEXTURE_SHADOW1D:
> +         shadow = TRUE;
> +         /* Fallthrough */
> +      case TGSI_TEXTURE_1D:
> +         readmask = TGSI_WRITEMASK_X;
> +         break;
> +      case TGSI_TEXTURE_SHADOW1D_ARRAY:
> +      case TGSI_TEXTURE_SHADOW2D:
> +      case TGSI_TEXTURE_SHADOWRECT:
> +         shadow = TRUE;
> +         /* Fallthrough */
> +      case TGSI_TEXTURE_1D_ARRAY:
> +      case TGSI_TEXTURE_2D:
> +      case TGSI_TEXTURE_RECT:
> +         readmask = TGSI_WRITEMASK_XY;
> +         break;
> +      case TGSI_TEXTURE_SHADOW2D_ARRAY:
> +      case TGSI_TEXTURE_SHADOWCUBE:
> +         shadow = TRUE;
> +         /* Fallthrough */
> +      case TGSI_TEXTURE_2D_ARRAY:
> +      case TGSI_TEXTURE_3D:
> +      case TGSI_TEXTURE_CUBE:
> +         readmask = TGSI_WRITEMASK_XYZ;
> +         break;
> +      case TGSI_TEXTURE_SHADOWCUBE_ARRAY:
> +         shadow = TRUE;
> +         /* Fallthrough */
> +      case TGSI_TEXTURE_CUBE_ARRAY:
> +         readmask = TGSI_WRITEMASK_XYZW;
> +         break;
> +      default:
> +         assert(0);
> +         return;
> +      }
> +
> +      tex_info->texture_unit = inst->Src[1].Register.Index;
> +      tex_info->sampler_unit = inst->Src[2].Register.Index;
> +
> +      if (modifier == LP_BLD_TEX_MODIFIER_EXPLICIT_DERIV ||
> +          modifier == LP_BLD_TEX_MODIFIER_LOD_BIAS || shadow) {
> +         /* We don't track insts with additional regs, although we could */
> +         indirect = TRUE;
> +      }  else {
> +         if (modifier == LP_BLD_TEX_MODIFIER_EXPLICIT_LOD) {
> +            readmask |= TGSI_WRITEMASK_W;
> +         }
>         }
>
>         for (chan = 0; chan<  4; ++chan) {
> @@ -229,6 +319,22 @@ analyse_instruction(struct analysis_context *ctx,
>         case TGSI_OPCODE_TXP:
>            analyse_tex(ctx, inst, LP_BLD_TEX_MODIFIER_PROJECTED);
>            break;
> +      case TGSI_OPCODE_SAMPLE:
> +      case TGSI_OPCODE_SAMPLE_C:
> +         analyse_sample(ctx, inst, LP_BLD_TEX_MODIFIER_NONE);
> +         break;
> +      case TGSI_OPCODE_SAMPLE_C_LZ:
> +         analyse_sample(ctx, inst, LP_BLD_TEX_MODIFIER_LZ);
> +         break;
> +      case TGSI_OPCODE_SAMPLE_D:
> +         analyse_sample(ctx, inst, LP_BLD_TEX_MODIFIER_EXPLICIT_DERIV);
> +         break;
> +      case TGSI_OPCODE_SAMPLE_B:
> +         analyse_sample(ctx, inst, LP_BLD_TEX_MODIFIER_LOD_BIAS);
> +         break;
> +      case TGSI_OPCODE_SAMPLE_L:
> +         analyse_sample(ctx, inst, LP_BLD_TEX_MODIFIER_EXPLICIT_LOD);
> +         break;
>         default:
>            break;
>         }
> @@ -355,8 +461,9 @@ dump_info(const struct tgsi_token *tokens,
>               debug_printf(" _");
>            }
>         }
> -      debug_printf(", SAMP[%u], %s\n",
> -                   tex_info->unit,
> +      debug_printf(", RES[%u], SAMP[%u], %s\n",
> +                   tex_info->texture_unit,
> +                   tex_info->sampler_unit,
>                      tgsi_texture_names[tex_info->target]);
>      }
>
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> index 0621fb4..c6801ac 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> @@ -1340,6 +1340,197 @@ emit_tex( struct lp_build_tgsi_soa_context *bld,
>   }
>
>   static void
> +emit_sample(struct lp_build_tgsi_soa_context *bld,
> +            const struct tgsi_full_instruction *inst,
> +            enum lp_build_tex_modifier modifier,
> +            LLVMValueRef *texel)
> +{
> +   LLVMBuilderRef builder = bld->bld_base.base.gallivm->builder;
> +   struct gallivm_state *gallivm = bld->bld_base.base.gallivm;
> +   unsigned texture_unit, sampler_unit;
> +   LLVMValueRef lod_bias, explicit_lod;
> +   LLVMValueRef coords[4];
> +   LLVMValueRef offsets[3] = { NULL };
> +   struct lp_derivatives derivs;
> +   unsigned num_coords, dims;
> +   unsigned i;
> +   boolean compare = FALSE;
> +
> +   if (!bld->sampler) {
> +      _debug_printf("warning: found texture instruction but no sampler generator supplied\n");
> +      for (i = 0; i<  4; i++) {
> +         texel[i] = bld->bld_base.base.undef;
> +      }
> +      return;
> +   }
> +
> +   derivs.ddx_ddy[0] = bld->bld_base.base.undef;
> +   derivs.ddx_ddy[1] = bld->bld_base.base.undef;
> +
> +   switch (inst->Texture.Texture) {
> +   case TGSI_TEXTURE_SHADOW1D:
> +      compare = TRUE;
> +      /* Fallthrough */
> +   case TGSI_TEXTURE_1D:
> +      num_coords = 1;
> +      dims = 1;
> +      break;
> +   case TGSI_TEXTURE_SHADOW1D_ARRAY:
> +      compare = TRUE;
> +      /* Fallthrough */
> +   case TGSI_TEXTURE_1D_ARRAY:
> +      num_coords = 2;
> +      dims = 1;
> +      break;
> +   case TGSI_TEXTURE_SHADOW2D:
> +   case TGSI_TEXTURE_SHADOWRECT:
> +      compare = TRUE;
> +      /* Fallthrough */
> +   case TGSI_TEXTURE_2D:
> +   case TGSI_TEXTURE_RECT:
> +      num_coords = 2;
> +      dims = 2;
> +      break;
> +   case TGSI_TEXTURE_SHADOW2D_ARRAY:
> +   case TGSI_TEXTURE_SHADOWCUBE:
> +      compare = TRUE;
> +      /* Fallthrough */
> +   case TGSI_TEXTURE_2D_ARRAY:
> +   case TGSI_TEXTURE_CUBE:
> +      num_coords = 3;
> +      dims = 2;
> +      break;
> +   case TGSI_TEXTURE_3D:
> +      num_coords = 3;
> +      dims = 3;
> +      break;
> +   case TGSI_TEXTURE_SHADOWCUBE_ARRAY:
> +      compare = TRUE;
> +      /* Fallthrough */
> +   case TGSI_TEXTURE_CUBE_ARRAY:
> +      num_coords = 4;
> +      dims = 3;
> +      break;
> +   default:
> +      assert(0);
> +      return;
> +   }
> +
> +   /* unlike tex opcodes the sampler/texture unit always come from same reg */
> +   texture_unit = inst->Src[1].Register.Index;
> +   sampler_unit = inst->Src[2].Register.Index;

The comment and code don't seem to agree there.

[...]


Otherwise looks good AFAICT.

Reviewed-by: Brian Paul <brianp at vmware.com>


More information about the mesa-dev mailing list