Putting this function pointer into a struct enables grouping of several related functions in a single place. For now it is just a single function, but the struct will be later extended with a mip_level_func for returning mip level. --- src/gallium/drivers/softpipe/sp_tex_sample.c | 28 +++++++++++++++++----------- src/gallium/drivers/softpipe/sp_tex_sample.h | 5 ++++- 2 files changed, 21 insertions(+), 12 deletions(-)
diff --git a/src/gallium/drivers/softpipe/sp_tex_sample.c b/src/gallium/drivers/softpipe/sp_tex_sample.c index 38bdc93..cd4a659 100644 --- a/src/gallium/drivers/softpipe/sp_tex_sample.c +++ b/src/gallium/drivers/softpipe/sp_tex_sample.c @@ -2515,6 +2515,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}; /** * Do shadow/depth comparisons. @@ -2918,18 +2924,18 @@ sample_mip(struct sp_sampler_view *sp_sview, const struct filter_args *filt_args, float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]) { - mip_filter_func mip_filter; + struct sp_mip *mip = NULL; img_filter_func min_img_filter = NULL; img_filter_func mag_img_filter = NULL; if (filt_args->control == tgsi_sampler_gather) { - mip_filter = mip_filter_nearest; + 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_filter = mip_filter_linear_2d_linear_repeat_POT; + mip = &mip_linear_2d_linear_repeat_POT; } else { - mip_filter = sp_samp->mip_filter; + 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; @@ -2939,8 +2945,8 @@ sample_mip(struct sp_sampler_view *sp_sview, } } - mip_filter(sp_sview, sp_samp, min_img_filter, mag_img_filter, - s, t, p, c0, lod, filt_args, rgba); + mip->filter(sp_sview, sp_samp, min_img_filter, mag_img_filter, + s, t, p, c0, lod, filt_args, rgba); if (sp_samp->base.compare_mode != PIPE_TEX_COMPARE_NONE) { sample_compare(sp_sview, sp_samp, s, t, p, c0, lod, filt_args->control, rgba); @@ -3239,13 +3245,13 @@ softpipe_create_sampler_state(struct pipe_context *pipe, switch (sampler->min_mip_filter) { case PIPE_TEX_MIPFILTER_NONE: if (sampler->min_img_filter == sampler->mag_img_filter) - samp->mip_filter = mip_filter_none_no_filter_select; + samp->mip = mip_none_no_filter_select; else - samp->mip_filter = mip_filter_none; + samp->mip = mip_none; break; case PIPE_TEX_MIPFILTER_NEAREST: - samp->mip_filter = mip_filter_nearest; + samp->mip = mip_nearest; break; case PIPE_TEX_MIPFILTER_LINEAR: @@ -3257,11 +3263,11 @@ softpipe_create_sampler_state(struct pipe_context *pipe, sampler->max_anisotropy <= 1) { samp->min_mag_equal_repeat_linear = TRUE; } - samp->mip_filter = mip_filter_linear; + samp->mip = mip_linear; /* Anisotropic filtering extension. */ if (sampler->max_anisotropy > 1) { - samp->mip_filter = mip_filter_linear_aniso; + samp->mip = mip_linear_aniso; /* Override min_img_filter: * min_img_filter needs to be set to NEAREST since we need to access diff --git a/src/gallium/drivers/softpipe/sp_tex_sample.h b/src/gallium/drivers/softpipe/sp_tex_sample.h index 7d1aafc..78541e1 100644 --- a/src/gallium/drivers/softpipe/sp_tex_sample.h +++ b/src/gallium/drivers/softpipe/sp_tex_sample.h @@ -128,6 +128,9 @@ struct sp_sampler_view }; +struct sp_mip { + mip_filter_func filter; +}; struct sp_sampler { struct pipe_sampler_state base; @@ -144,7 +147,7 @@ struct sp_sampler { wrap_linear_func linear_texcoord_t; wrap_linear_func linear_texcoord_p; - mip_filter_func mip_filter; + struct sp_mip mip; }; -- 2.4.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev