diff options
author | Krzesimir Nowak <[email protected]> | 2015-09-10 14:15:55 +0200 |
---|---|---|
committer | Brian Paul <[email protected]> | 2015-09-10 09:45:14 -0600 |
commit | 380a3c08049e5a3b0b1a891e3288b001c535d62f (patch) | |
tree | 028c3822551d63c00b66f7982d1ff88fcea459ce | |
parent | b9bc6c42c96773a5784897c55da5387045c0e9b3 (diff) |
softpipe: Split code getting a filter into separate function
This function will be later used by textureQueryLod. The
img_filter_func are optional, because textureQueryLod will not need
them.
v2:
- adapted to changes in previous commit (renames)
- simplified conditions a bit
- updated docs
- splitted too long lines
Reviewed-by: Brian Paul <[email protected]>
-rw-r--r-- | src/gallium/drivers/softpipe/sp_tex_sample.c | 58 |
1 files changed, 41 insertions, 17 deletions
diff --git a/src/gallium/drivers/softpipe/sp_tex_sample.c b/src/gallium/drivers/softpipe/sp_tex_sample.c index 8f7cb1a3972..4bfb300e08d 100644 --- a/src/gallium/drivers/softpipe/sp_tex_sample.c +++ b/src/gallium/drivers/softpipe/sp_tex_sample.c @@ -2929,6 +2929,43 @@ get_img_filter(const struct sp_sampler_view *sp_sview, } } +/** + * Get mip filter funcs, and optionally both img min filter and img mag + * filter. Note that both img filter function pointers must be either non-NULL + * or NULL. + */ +static void +get_filters(struct sp_sampler_view *sp_sview, + struct sp_sampler *sp_samp, + enum tgsi_sampler_control control, + const struct sp_filter_funcs **funcs, + img_filter_func *min, + img_filter_func *mag) +{ + assert(funcs); + if (control == tgsi_sampler_gather) { + *funcs = &funcs_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) { + *funcs = &funcs_linear_2d_linear_repeat_POT; + } else { + *funcs = sp_samp->filter_funcs; + if (min) { + assert(mag); + *min = get_img_filter(sp_sview, &sp_samp->base, + sp_samp->min_img_filter, false); + if (sp_samp->min_mag_equal) { + *mag = *min; + } 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, @@ -2945,28 +2982,15 @@ 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) { - funcs = &funcs_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) { - funcs = &funcs_linear_2d_linear_repeat_POT; - } - else { - funcs = sp_samp->filter_funcs; - 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, + &funcs, &min_img_filter, &mag_img_filter); funcs->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); + sample_compare(sp_sview, sp_samp, s, t, p, c0, + lod, filt_args->control, rgba); } if (sp_sview->need_swizzle && filt_args->control != tgsi_sampler_gather) { |