summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/softpipe
diff options
context:
space:
mode:
authorKrzesimir Nowak <[email protected]>2015-09-10 14:15:53 +0200
committerBrian Paul <[email protected]>2015-09-10 09:45:14 -0600
commit16084cd2cf055849933e19047e604d384da81f8e (patch)
treed0388db7469f070a25715ac386e4ef9e1cb97343 /src/gallium/drivers/softpipe
parentbdc69552ca0268fa489daa215dff7db96fdbeb1d (diff)
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 <[email protected]>
Diffstat (limited to 'src/gallium/drivers/softpipe')
-rw-r--r--src/gallium/drivers/softpipe/sp_tex_sample.c57
1 files 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])
{