[Mesa-dev] [PATCH 3/9] softpipe: Split compute_lambda_lod into two functions

Brian Paul brianp at vmware.com
Wed Sep 9 08:24:35 PDT 2015


On 09/09/2015 04:35 AM, Krzesimir Nowak wrote:
> textureQueryLod returns a vec2 with a mipmap information and a
> LOD. The latter needs to be not clamped.
> ---
>   src/gallium/drivers/softpipe/sp_tex_sample.c | 55 ++++++++++++++++++++--------
>   1 file changed, 39 insertions(+), 16 deletions(-)
>
> diff --git a/src/gallium/drivers/softpipe/sp_tex_sample.c b/src/gallium/drivers/softpipe/sp_tex_sample.c
> index 19188b0..38bdc93 100644
> --- a/src/gallium/drivers/softpipe/sp_tex_sample.c
> +++ b/src/gallium/drivers/softpipe/sp_tex_sample.c
> @@ -1855,24 +1855,23 @@ compute_lod(const struct pipe_sampler_state *sampler,
>   }
>
>
> -/* Calculate level of detail for every fragment.
> +/* Calculate level of detail for every fragment. The computed value is not
> + * clamped into lod_min and lod_max.
>    * \param lod_in per-fragment lod_bias or explicit_lod.
>    * \param lod results per-fragment lod.
>    */
>   static inline void
> -compute_lambda_lod(struct sp_sampler_view *sp_sview,
> -                   struct sp_sampler *sp_samp,
> -                   const float s[TGSI_QUAD_SIZE],
> -                   const float t[TGSI_QUAD_SIZE],
> -                   const float p[TGSI_QUAD_SIZE],
> -                   const float lod_in[TGSI_QUAD_SIZE],
> -                   enum tgsi_sampler_control control,
> -                   float lod[TGSI_QUAD_SIZE])
> +compute_lambda_lod_not_clamped(struct sp_sampler_view *sp_sview,

Not a big deal, but we use "unclamped" in various other places in Gallium.

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


> +                               struct sp_sampler *sp_samp,
> +                               const float s[TGSI_QUAD_SIZE],
> +                               const float t[TGSI_QUAD_SIZE],
> +                               const float p[TGSI_QUAD_SIZE],
> +                               const float lod_in[TGSI_QUAD_SIZE],
> +                               enum tgsi_sampler_control control,
> +                               float lod[TGSI_QUAD_SIZE])
>   {
>      const struct pipe_sampler_state *sampler = &sp_samp->base;
> -   float lod_bias = sampler->lod_bias;
> -   float min_lod = sampler->min_lod;
> -   float max_lod = sampler->max_lod;
> +   const float lod_bias = sampler->lod_bias;
>      float lambda;
>      uint i;
>
> @@ -1881,24 +1880,23 @@ compute_lambda_lod(struct sp_sampler_view *sp_sview,
>         /* XXX FIXME */
>      case tgsi_sampler_derivs_explicit:
>         lambda = sp_sview->compute_lambda(sp_sview, s, t, p) + lod_bias;
> -      lod[0] = lod[1] = lod[2] = lod[3] = CLAMP(lambda, min_lod, max_lod);
> +      lod[0] = lod[1] = lod[2] = lod[3] = lambda;
>         break;
>      case tgsi_sampler_lod_bias:
>         lambda = sp_sview->compute_lambda(sp_sview, s, t, p) + lod_bias;
>         for (i = 0; i < TGSI_QUAD_SIZE; i++) {
>            lod[i] = lambda + lod_in[i];
> -         lod[i] = CLAMP(lod[i], min_lod, max_lod);
>         }
>         break;
>      case tgsi_sampler_lod_explicit:
>         for (i = 0; i < TGSI_QUAD_SIZE; i++) {
> -         lod[i] = CLAMP(lod_in[i] + lod_bias, min_lod, max_lod);
> +         lod[i] = lod_in[i] + lod_bias;
>         }
>         break;
>      case tgsi_sampler_lod_zero:
>      case tgsi_sampler_gather:
>         /* this is all static state in the sampler really need clamp here? */
> -      lod[0] = lod[1] = lod[2] = lod[3] = CLAMP(lod_bias, min_lod, max_lod);
> +      lod[0] = lod[1] = lod[2] = lod[3] = lod_bias;
>         break;
>      default:
>         assert(0);
> @@ -1906,6 +1904,31 @@ compute_lambda_lod(struct sp_sampler_view *sp_sview,
>      }
>   }
>
> +/* Calculate level of detail for every fragment.
> + * \param lod_in per-fragment lod_bias or explicit_lod.
> + * \param lod results per-fragment lod.
> + */
> +static inline void
> +compute_lambda_lod(struct sp_sampler_view *sp_sview,
> +                   struct sp_sampler *sp_samp,
> +                   const float s[TGSI_QUAD_SIZE],
> +                   const float t[TGSI_QUAD_SIZE],
> +                   const float p[TGSI_QUAD_SIZE],
> +                   const float lod_in[TGSI_QUAD_SIZE],
> +                   enum tgsi_sampler_control control,
> +                   float lod[TGSI_QUAD_SIZE])
> +{
> +   const struct pipe_sampler_state *sampler = &sp_samp->base;
> +   const float min_lod = sampler->min_lod;
> +   const float max_lod = sampler->max_lod;
> +   int i;
> +
> +   compute_lambda_lod_not_clamped(sp_sview, sp_samp, s, t, p, lod_in, control, lod);
> +   for (i = 0; i < TGSI_QUAD_SIZE; i++) {
> +      lod[i] = CLAMP(lod[i], min_lod, max_lod);
> +   }
> +}
> +
>   static inline unsigned
>   get_gather_component(const float lod_in[TGSI_QUAD_SIZE])
>   {
>



More information about the mesa-dev mailing list