From 16084cd2cf055849933e19047e604d384da81f8e Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Thu, 10 Sep 2015 14:15:53 +0200 Subject: [PATCH] softpipe: Split compute_lambda_lod into two functions textureQueryLod returns a vec2 with a mipmap information and a LOD. The latter needs to be not clamped. v2: - changed the "not_clamped" part to "unclamped" - corrected "clamp into" to "clamp to" - splitted too long lines Reviewed-by: Brian Paul --- src/gallium/drivers/softpipe/sp_tex_sample.c | 57 ++++++++++++++------ 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/src/gallium/drivers/softpipe/sp_tex_sample.c b/src/gallium/drivers/softpipe/sp_tex_sample.c index 19188b03bb5..30c9cb042ea 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 to 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_unclamped(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; - 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,22 @@ 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 +1903,32 @@ 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_unclamped(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]) { -- 2.30.2