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 <brianp@vmware.com>
This commit is contained in:
Krzesimir Nowak 2015-09-10 14:15:55 +02:00 committed by Brian Paul
parent b9bc6c42c9
commit 380a3c0804

View file

@ -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) {