This function will be later used by textureQueryLod. The img_filter_func are optional, because textureQueryLod will not need them. --- src/gallium/drivers/softpipe/sp_tex_sample.c | 53 +++++++++++++++++++--------- 1 file changed, 37 insertions(+), 16 deletions(-)
diff --git a/src/gallium/drivers/softpipe/sp_tex_sample.c b/src/gallium/drivers/softpipe/sp_tex_sample.c index cd4a659..0a3fc20 100644 --- a/src/gallium/drivers/softpipe/sp_tex_sample.c +++ b/src/gallium/drivers/softpipe/sp_tex_sample.c @@ -2912,6 +2912,42 @@ get_img_filter(const struct sp_sampler_view *sp_sview, } } +/** + * Get mip filter, and optionally both img min filter and img mag filter + */ +static void +get_filters(struct sp_sampler_view *sp_sview, + struct sp_sampler *sp_samp, + enum tgsi_sampler_control control, + struct sp_mip **mip, + img_filter_func *min, + img_filter_func *mag) +{ + assert(mip); + if (control == tgsi_sampler_gather) { + *mip = &mip_nearest; + if (min) + *min = get_img_filter(sp_sview, &sp_samp->base, PIPE_TEX_FILTER_LINEAR, true); + } else if (sp_sview->pot2d & sp_samp->min_mag_equal_repeat_linear) { + *mip = &mip_linear_2d_linear_repeat_POT; + } + else { + *mip = &sp_samp->mip; + if (min || mag) { + img_filter_func tmp_filter = get_img_filter(sp_sview, &sp_samp->base, sp_samp->min_img_filter, false); + if (min) + *min = tmp_filter; + if (mag) { + if (sp_samp->min_mag_equal) { + *mag = tmp_filter; + } + else { + *mag = get_img_filter(sp_sview, &sp_samp->base, sp_samp->base.mag_img_filter, false); + } + } + } + } +} static void sample_mip(struct sp_sampler_view *sp_sview, @@ -2928,22 +2964,7 @@ sample_mip(struct sp_sampler_view *sp_sview, img_filter_func min_img_filter = NULL; img_filter_func mag_img_filter = NULL; - if (filt_args->control == tgsi_sampler_gather) { - mip = &mip_nearest; - min_img_filter = get_img_filter(sp_sview, &sp_samp->base, PIPE_TEX_FILTER_LINEAR, true); - } else if (sp_sview->pot2d & sp_samp->min_mag_equal_repeat_linear) { - mip = &mip_linear_2d_linear_repeat_POT; - } - else { - mip = &sp_samp->mip; - min_img_filter = get_img_filter(sp_sview, &sp_samp->base, sp_samp->min_img_filter, false); - if (sp_samp->min_mag_equal) { - mag_img_filter = min_img_filter; - } - else { - mag_img_filter = get_img_filter(sp_sview, &sp_samp->base, sp_samp->base.mag_img_filter, false); - } - } + get_filters(sp_sview, sp_samp, filt_args->control, &mip, &min_img_filter, &mag_img_filter); mip->filter(sp_sview, sp_samp, min_img_filter, mag_img_filter, s, t, p, c0, lod, filt_args, rgba); -- 2.4.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev