[Mesa-dev] [PATCH 2/3] softpipe: implement TXF support via get_texel callback

Brian Paul brianp at vmware.com
Thu Aug 25 08:03:55 PDT 2011


On 08/25/2011 08:51 AM, Dave Airlie wrote:
> From: Dave Airlie<airlied at redhat.com>
>
> This just calls the texel fetch functions directly bypassing the sampling,
>
> notes:
> 1: loops inside switch should be more optimal.
> 2: borders can be sampled though only up to border depth, outside that
> its undefined.
>
> Signed-off-by: Dave Airlie<airlied at redhat.com>
> ---
>   src/gallium/drivers/softpipe/sp_tex_sample.c |   67 ++++++++++++++++++++++++++
>   1 files changed, 67 insertions(+), 0 deletions(-)
>
> diff --git a/src/gallium/drivers/softpipe/sp_tex_sample.c b/src/gallium/drivers/softpipe/sp_tex_sample.c
> index 93925f9..0d34557 100644
> --- a/src/gallium/drivers/softpipe/sp_tex_sample.c
> +++ b/src/gallium/drivers/softpipe/sp_tex_sample.c
> @@ -2604,6 +2604,72 @@ sample_get_dims(struct tgsi_sampler *tgsi_sampler, int level,
>       }
>   }
>

I'd put a comment on this function saying it's called for TXF and 
explain how that's different from other tex instructions.


> +static void
> +sample_get_texels(struct tgsi_sampler *tgsi_sampler,
> +	   const int v_i[QUAD_SIZE],
> +	   const int v_j[QUAD_SIZE],
> +	   const int v_k[QUAD_SIZE],
> +	   const int lod[QUAD_SIZE],
> +	   float rgba[NUM_CHANNELS][QUAD_SIZE])
> +{
> +   const struct sp_sampler_variant *samp = sp_sampler_variant(tgsi_sampler);
> +   union tex_tile_address addr;
> +   const struct pipe_resource *texture = samp->view->texture;
> +   int j, c;
> +   float *tx;
> +
> +   addr.value = 0;
> +   /* TODO write a better test for LOD */
> +   addr.bits.level = lod[0];
> +
> +   switch(texture->target) {
> +   case PIPE_TEXTURE_1D:
> +      for (j = 0; j<  QUAD_SIZE; j++) {
> +	 tx = get_texel_2d(samp, addr, v_i[j], 0);
> +	 for (c = 0; c<  4; c++) {
> +	    rgba[c][j] = tx[c];
> +	 }
> +      }
> +      break;
> +   case PIPE_TEXTURE_1D_ARRAY:
> +      for (j = 0; j<  QUAD_SIZE; j++) {
> +	 tx = get_texel_1d_array(samp, addr, v_i[j], v_j[j]);
> +	 for (c = 0; c<  4; c++) {
> +	    rgba[c][j] = tx[c];
> +	 }
> +      }
> +      break;
> +   case PIPE_TEXTURE_2D:
> +   case PIPE_TEXTURE_RECT:
> +      for (j = 0; j<  QUAD_SIZE; j++) {
> +	 tx = get_texel_2d(samp, addr, v_i[j], v_j[j]);
> +	 for (c = 0; c<  4; c++) {
> +	    rgba[c][j] = tx[c];
> +	 }
> +      }
> +      break;
> +   case PIPE_TEXTURE_2D_ARRAY:
> +      for (j = 0; j<  QUAD_SIZE; j++) {
> +	 tx = get_texel_2d_array(samp, addr, v_i[j], v_j[j], v_k[j]);
> +	 for (c = 0; c<  4; c++) {
> +	    rgba[c][j] = tx[c];
> +	 }
> +      }
> +      break;
> +   case PIPE_TEXTURE_3D:
> +      for (j = 0; j<  QUAD_SIZE; j++) {
> +	 tx = get_texel_3d(samp, addr, v_i[j], v_j[j], v_k[j]);
> +	 for (c = 0; c<  4; c++) {
> +	    rgba[c][j] = tx[c];
> +	 }
> +      }
> +      break;
> +   case PIPE_TEXTURE_CUBE: /* TXF can't work on CUBE according to spec */
> +   default:
> +      assert(!"Unknown or CUBE texture type in TXF processing\n");
> +      break;
> +   }
> +}
>   /**
>    * Create a sampler variant for a given set of non-orthogonal state.
>    */
> @@ -2730,5 +2796,6 @@ sp_create_sampler_variant( const struct pipe_sampler_state *sampler,
>      }
>
>      samp->base.get_dims = sample_get_dims;
> +   samp->base.get_texel = sample_get_texels;
>      return samp;
>   }



More information about the mesa-dev mailing list