These functions will be used by textureQueryLod. --- src/gallium/drivers/softpipe/sp_tex_sample.c | 100 +++++++++++++++++++++++++-- src/gallium/drivers/softpipe/sp_tex_sample.h | 7 ++ 2 files changed, 101 insertions(+), 6 deletions(-)
diff --git a/src/gallium/drivers/softpipe/sp_tex_sample.c b/src/gallium/drivers/softpipe/sp_tex_sample.c index cdec984..6e639e0 100644 --- a/src/gallium/drivers/softpipe/sp_tex_sample.c +++ b/src/gallium/drivers/softpipe/sp_tex_sample.c @@ -1937,6 +1937,38 @@ get_gather_component(const float lod_in[TGSI_QUAD_SIZE]) } static void +clamp_lod(const struct sp_sampler_view *sp_sview, + const struct sp_sampler *sp_samp, + const float lod[TGSI_QUAD_SIZE], + float clamped[TGSI_QUAD_SIZE]) +{ + const float min_lod = sp_samp->base.min_lod; + const float max_lod = sp_samp->base.max_lod; + const float min_level = sp_sview->base.u.tex.first_level; + const float max_level = sp_sview->base.u.tex.last_level; + int i; + + for (i = 0; i < TGSI_QUAD_SIZE; i++) { + float cl = lod[i]; + + cl = CLAMP(cl, min_lod, max_lod); + /* XXX: Is min_level ever different from 0? + */ + cl = CLAMP(cl, 0, max_level - min_level); + clamped[i] = cl; + } +} + +static void +mip_level_linear(struct sp_sampler_view *sp_sview, + struct sp_sampler *sp_samp, + const float lod[TGSI_QUAD_SIZE], + float level[TGSI_QUAD_SIZE]) +{ + clamp_lod(sp_sview, sp_samp, lod, level); +} + +static void mip_filter_linear(struct sp_sampler_view *sp_sview, struct sp_sampler *sp_samp, img_filter_func min_filter, @@ -1998,6 +2030,23 @@ mip_filter_linear(struct sp_sampler_view *sp_sview, } +static void +mip_level_nearest(struct sp_sampler_view *sp_sview, + struct sp_sampler *sp_samp, + const float lod[TGSI_QUAD_SIZE], + float level[TGSI_QUAD_SIZE]) +{ + const int first_level = sp_sview->base.u.tex.first_level; + int j; + + clamp_lod(sp_sview, sp_samp, lod, level); + for (j = 0; j < TGSI_QUAD_SIZE; j++) + /* TODO: It should rather be: + * level[j] = first_level + ceil(level[j] + 0.5F) - 1.0F; + */ + level[j] = first_level + (int)(level[j] + 0.5F); +} + /** * Compute nearest mipmap level from texcoords. * Then sample the texture level for four elements of a quad. @@ -2050,6 +2099,19 @@ mip_filter_nearest(struct sp_sampler_view *sp_sview, static void +mip_level_none(struct sp_sampler_view *sp_sview, + struct sp_sampler *sp_samp, + const float lod[TGSI_QUAD_SIZE], + float level[TGSI_QUAD_SIZE]) +{ + int j; + + for (j = 0; j < TGSI_QUAD_SIZE; j++) { + level[j] = sp_sview->base.u.tex.first_level; + } +} + +static void mip_filter_none(struct sp_sampler_view *sp_sview, struct sp_sampler *sp_samp, img_filter_func min_filter, @@ -2088,6 +2150,15 @@ mip_filter_none(struct sp_sampler_view *sp_sview, static void +mip_level_none_no_filter_select(struct sp_sampler_view *sp_sview, + struct sp_sampler *sp_samp, + const float lod[TGSI_QUAD_SIZE], + float level[TGSI_QUAD_SIZE]) +{ + mip_level_none(sp_sview, sp_samp, lod, level); +} + +static void mip_filter_none_no_filter_select(struct sp_sampler_view *sp_sview, struct sp_sampler *sp_samp, img_filter_func min_filter, @@ -2339,6 +2410,15 @@ img_filter_2d_ewa(struct sp_sampler_view *sp_sview, } +static void +mip_level_linear_aniso(struct sp_sampler_view *sp_sview, + struct sp_sampler *sp_samp, + const float lod[TGSI_QUAD_SIZE], + float level[TGSI_QUAD_SIZE]) +{ + mip_level_linear(sp_sview, sp_samp, lod, level); +} + /** * Sample 2D texture using an anisotropic filter. */ @@ -2450,6 +2530,14 @@ mip_filter_linear_aniso(struct sp_sampler_view *sp_sview, } } +static void +mip_level_linear_2d_linear_repeat_POT(struct sp_sampler_view *sp_sview, + struct sp_sampler *sp_samp, + const float lod[TGSI_QUAD_SIZE], + float level[TGSI_QUAD_SIZE]) +{ + mip_level_linear(sp_sview, sp_samp, lod, level); +} /** * Specialized version of mip_filter_linear with hard-wired calls to @@ -2515,12 +2603,12 @@ mip_filter_linear_2d_linear_repeat_POT( } } -static struct sp_mip mip_linear = {mip_filter_linear}; -static struct sp_mip mip_nearest = {mip_filter_nearest}; -static struct sp_mip mip_none = {mip_filter_none}; -static struct sp_mip mip_none_no_filter_select = {mip_filter_none_no_filter_select}; -static struct sp_mip mip_linear_aniso = {mip_filter_linear_aniso}; -static struct sp_mip mip_linear_2d_linear_repeat_POT = {mip_filter_linear_2d_linear_repeat_POT}; +static struct sp_mip mip_linear = {mip_level_linear, mip_filter_linear}; +static struct sp_mip mip_nearest = {mip_level_nearest, mip_filter_nearest}; +static struct sp_mip mip_none = {mip_level_none, mip_filter_none}; +static struct sp_mip mip_none_no_filter_select = {mip_level_none_no_filter_select, mip_filter_none_no_filter_select}; +static struct sp_mip mip_linear_aniso = {mip_level_linear_aniso, mip_filter_linear_aniso}; +static struct sp_mip mip_linear_2d_linear_repeat_POT = {mip_level_linear_2d_linear_repeat_POT, mip_filter_linear_2d_linear_repeat_POT}; /** * Do shadow/depth comparisons. diff --git a/src/gallium/drivers/softpipe/sp_tex_sample.h b/src/gallium/drivers/softpipe/sp_tex_sample.h index 7739f59..89cf9d1 100644 --- a/src/gallium/drivers/softpipe/sp_tex_sample.h +++ b/src/gallium/drivers/softpipe/sp_tex_sample.h @@ -87,6 +87,12 @@ typedef void (*mip_filter_func)(struct sp_sampler_view *sp_sview, float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]); +typedef void (*mip_level_func)(struct sp_sampler_view *sp_sview, + struct sp_sampler *sp_samp, + const float lod[TGSI_QUAD_SIZE], + float level[TGSI_QUAD_SIZE]); + + typedef void (*convert_func)(struct sp_sampler_view *sp_sview, struct sp_sampler *sp_samp, const float s[TGSI_QUAD_SIZE], @@ -129,6 +135,7 @@ struct sp_sampler_view }; struct sp_mip { + mip_level_func level; mip_filter_func filter; }; -- 2.4.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev