[Mesa-dev] [PATCH] tgsi: split tgsi_util_get_texture_coord_dim() function into two

Roland Scheidegger sroland at vmware.com
Thu Mar 31 16:53:38 UTC 2016


Am 31.03.2016 um 03:06 schrieb Brian Paul:
> It was kind of overloaded, returning two different things.  Now get
> the index of the shadow reference src register with a new
> tgsi_util_get_shadow_ref_src_index() function.
> 
> To verify the new code, I added some temp/debug code which looped
> over all TGSI_TEXTURE_x values, calling the old function and new and
> checking that the returned indexes matched.
> 
> Also tested piglit "shadow" tests with softpipe/llvmpipe.
> No testing of ilo and radeonsi changes.
> ---
>  src/gallium/auxiliary/tgsi/tgsi_exec.c         |  5 +-
>  src/gallium/auxiliary/tgsi/tgsi_util.c         | 69 ++++++++++++--------------
>  src/gallium/auxiliary/tgsi/tgsi_util.h         |  5 +-
>  src/gallium/drivers/ilo/shader/ilo_shader_fs.c |  4 +-
>  src/gallium/drivers/ilo/shader/ilo_shader_vs.c |  3 +-
>  src/gallium/drivers/radeonsi/si_shader.c       |  7 ++-
>  6 files changed, 46 insertions(+), 47 deletions(-)
> 
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c b/src/gallium/auxiliary/tgsi/tgsi_exec.c
> index 126259f..d731721 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_exec.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c
> @@ -2046,7 +2046,8 @@ exec_tex(struct tgsi_exec_machine *mach,
>     assert(modifier != TEX_MODIFIER_LEVEL_ZERO);
>     assert(inst->Texture.Texture != TGSI_TEXTURE_BUFFER);
>  
> -   dim = tgsi_util_get_texture_coord_dim(inst->Texture.Texture, &shadow_ref);
> +   dim = tgsi_util_get_texture_coord_dim(inst->Texture.Texture);
> +   shadow_ref = tgsi_util_get_shadow_ref_src_index(inst->Texture.Texture);
>  
>     assert(dim <= 4);
>     if (shadow_ref >= 0)
> @@ -2145,7 +2146,7 @@ exec_lodq(struct tgsi_exec_machine *mach,
>     union tgsi_exec_channel r[2];
>  
>     unit = fetch_sampler_unit(mach, inst, 1);
> -   dim = tgsi_util_get_texture_coord_dim(inst->Texture.Texture, NULL);
> +   dim = tgsi_util_get_texture_coord_dim(inst->Texture.Texture);
>     assert(dim <= Elements(coords));
>     /* fetch coordinates */
>     for (i = 0; i < dim; i++) {
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_util.c b/src/gallium/auxiliary/tgsi/tgsi_util.c
> index 5fff3f0..b38c113 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_util.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_util.c
> @@ -375,10 +375,8 @@ tgsi_util_get_src_from_ind(const struct tgsi_ind_register *reg)
>   * sample index.
>   */
>  int
> -tgsi_util_get_texture_coord_dim(int tgsi_tex, int *shadow_or_sample)
> +tgsi_util_get_texture_coord_dim(int tgsi_tex)
>  {
> -   int dim;
> -
>     /*
>      * Depending on the texture target, (src0.xyzw, src1.x) is interpreted
>      * differently:
> @@ -407,8 +405,7 @@ tgsi_util_get_texture_coord_dim(int tgsi_tex, int *shadow_or_sample)
>     case TGSI_TEXTURE_BUFFER:
>     case TGSI_TEXTURE_1D:
>     case TGSI_TEXTURE_SHADOW1D:
> -      dim = 1;
> -      break;
> +      return 1;
>     case TGSI_TEXTURE_2D:
>     case TGSI_TEXTURE_RECT:
>     case TGSI_TEXTURE_1D_ARRAY:
> @@ -416,52 +413,48 @@ tgsi_util_get_texture_coord_dim(int tgsi_tex, int *shadow_or_sample)
>     case TGSI_TEXTURE_SHADOWRECT:
>     case TGSI_TEXTURE_SHADOW1D_ARRAY:
>     case TGSI_TEXTURE_2D_MSAA:
> -      dim = 2;
> -      break;
> +      return 2;
>     case TGSI_TEXTURE_3D:
>     case TGSI_TEXTURE_CUBE:
>     case TGSI_TEXTURE_2D_ARRAY:
>     case TGSI_TEXTURE_SHADOWCUBE:
>     case TGSI_TEXTURE_SHADOW2D_ARRAY:
>     case TGSI_TEXTURE_2D_ARRAY_MSAA:
> -      dim = 3;
> -      break;
> +      return 3;
>     case TGSI_TEXTURE_CUBE_ARRAY:
>     case TGSI_TEXTURE_SHADOWCUBE_ARRAY:
> -      dim = 4;
> -      break;
> +      return 4;
>     default:
>        assert(!"unknown texture target");
> -      dim = 0;
> -      break;
> +      return 0;
>     }
> +}
>  
> -   if (shadow_or_sample) {
> -      switch (tgsi_tex) {
> -      case TGSI_TEXTURE_SHADOW1D:
> -         /* there is a gap */
> -         *shadow_or_sample = 2;
> -         break;
> -      case TGSI_TEXTURE_SHADOW2D:
> -      case TGSI_TEXTURE_SHADOWRECT:
> -      case TGSI_TEXTURE_SHADOWCUBE:
> -      case TGSI_TEXTURE_SHADOW1D_ARRAY:
> -      case TGSI_TEXTURE_SHADOW2D_ARRAY:
> -      case TGSI_TEXTURE_SHADOWCUBE_ARRAY:
> -         *shadow_or_sample = dim;
> -         break;
> -      case TGSI_TEXTURE_2D_MSAA:
> -      case TGSI_TEXTURE_2D_ARRAY_MSAA:
> -         *shadow_or_sample = 3;
> -         break;
> -      default:
> -         /* no shadow nor sample */
> -         *shadow_or_sample = -1;
> -         break;
> -      }
> -   }
>  
> -   return dim;
> +/**
> + * Given a TGSI_TEXTURE_x target, return the src register index for the
> + * shadow reference coordinate.
> + */
> +int
> +tgsi_util_get_shadow_ref_src_index(unsigned tgsi_tex)
> +{
> +   switch (tgsi_tex) {
> +   case TGSI_TEXTURE_SHADOW1D:
> +   case TGSI_TEXTURE_SHADOW2D:
> +   case TGSI_TEXTURE_SHADOWRECT:
> +   case TGSI_TEXTURE_SHADOW1D_ARRAY:
> +      return 2;
> +   case TGSI_TEXTURE_SHADOWCUBE:
> +   case TGSI_TEXTURE_SHADOW2D_ARRAY:
> +   case TGSI_TEXTURE_2D_MSAA:
> +   case TGSI_TEXTURE_2D_ARRAY_MSAA:
> +      return 3;
> +   case TGSI_TEXTURE_SHADOWCUBE_ARRAY:
> +      return 4;
> +   default:
> +      /* no shadow nor sample */
> +      return -1;
> +   }
>  }
>  
>  
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_util.h b/src/gallium/auxiliary/tgsi/tgsi_util.h
> index 6175d95..b360453 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_util.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_util.h
> @@ -80,7 +80,10 @@ struct tgsi_src_register
>  tgsi_util_get_src_from_ind(const struct tgsi_ind_register *reg);
>  
>  int
> -tgsi_util_get_texture_coord_dim(int tgsi_tex, int *shadow_or_sample);
> +tgsi_util_get_texture_coord_dim(int tgsi_tex);
> +
> +int
> +tgsi_util_get_shadow_ref_src_index(unsigned tgsi_tex);
>  
>  boolean
>  tgsi_is_shadow_target(unsigned target);
> diff --git a/src/gallium/drivers/ilo/shader/ilo_shader_fs.c b/src/gallium/drivers/ilo/shader/ilo_shader_fs.c
> index f46126e..6c8f1b5 100644
> --- a/src/gallium/drivers/ilo/shader/ilo_shader_fs.c
> +++ b/src/gallium/drivers/ilo/shader/ilo_shader_fs.c
> @@ -740,7 +740,9 @@ fs_prepare_tgsi_sampling(struct fs_compile_context *fcc,
>        break;
>     }
>  
> -   num_coords = tgsi_util_get_texture_coord_dim(inst->tex.target, &ref_pos);
> +   num_coords = tgsi_util_get_texture_coord_dim(inst->tex.target);
> +   ref_pos = tgsi_util_get_shadow_ref_src_index(inst->tex.target);
> +
>     tsrc_transpose(inst->src[0], coords);
>     bias_or_lod = tsrc_null();
>     ref_or_si = tsrc_null();
> diff --git a/src/gallium/drivers/ilo/shader/ilo_shader_vs.c b/src/gallium/drivers/ilo/shader/ilo_shader_vs.c
> index 0df0afc..2b46d44 100644
> --- a/src/gallium/drivers/ilo/shader/ilo_shader_vs.c
> +++ b/src/gallium/drivers/ilo/shader/ilo_shader_vs.c
> @@ -407,7 +407,8 @@ vs_prepare_tgsi_sampling(struct vs_compile_context *vcc,
>     num_derivs = 0;
>     sampler_src = 1;
>  
> -   num_coords = tgsi_util_get_texture_coord_dim(inst->tex.target, &ref_pos);
> +   num_coords = tgsi_util_get_texture_coord_dim(inst->tex.target);
> +   ref_pos = tgsi_util_get_shadow_ref_src_index(inst->tex.target);
>  
>     /* extract the parameters */
>     switch (inst->opcode) {
> diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
> index 9eb531f..4176e9f 100644
> --- a/src/gallium/drivers/radeonsi/si_shader.c
> +++ b/src/gallium/drivers/radeonsi/si_shader.c
> @@ -2874,8 +2874,7 @@ static LLVMValueRef image_fetch_coords(
>  	struct gallivm_state *gallivm = bld_base->base.gallivm;
>  	LLVMBuilderRef builder = gallivm->builder;
>  	unsigned target = inst->Memory.Texture;
> -	int sample;
> -	unsigned num_coords = tgsi_util_get_texture_coord_dim(target, &sample);
> +	unsigned num_coords = tgsi_util_get_texture_coord_dim(target);
>  	LLVMValueRef coords[4];
>  	LLVMValueRef tmp;
>  	int chan;
> @@ -3387,8 +3386,8 @@ static void tex_fetch_args(
>  	unsigned target = inst->Texture.Texture;
>  	LLVMValueRef coords[5], derivs[6];
>  	LLVMValueRef address[16];
> -	int ref_pos;
> -	unsigned num_coords = tgsi_util_get_texture_coord_dim(target, &ref_pos);
> +	unsigned num_coords = tgsi_util_get_texture_coord_dim(target);
> +	int ref_pos = tgsi_util_get_shadow_ref_src_index(target);
>  	unsigned count = 0;
>  	unsigned chan;
>  	unsigned num_deriv_channels = 0;
> 

Reviewed-by: Roland Scheidegger <sroland at vmware.com>



More information about the mesa-dev mailing list