From: Carl-Philip Haensch Date: Fri, 6 May 2011 20:48:08 +0000 (+0200) Subject: r600g: add support for anisotropic filtering X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ad904cdf98be576ba652fe1c16ab722d52365782;p=mesa.git r600g: add support for anisotropic filtering --- diff --git a/src/gallium/drivers/r600/r600_state.c b/src/gallium/drivers/r600/r600_state.c index 3f979cf170f..aeffb9eece5 100644 --- a/src/gallium/drivers/r600/r600_state.c +++ b/src/gallium/drivers/r600/r600_state.c @@ -364,6 +364,17 @@ static void *r600_create_rs_state(struct pipe_context *ctx, return rstate; } + + +static inline unsigned r600_tex_aniso_filter(unsigned filter) +{ + if (filter <= 1) return 0; + if (filter <= 2) return 1; + if (filter <= 4) return 2; + if (filter <= 8) return 3; + /* else */ return 4; +} + static void *r600_create_sampler_state(struct pipe_context *ctx, const struct pipe_sampler_state *state) { @@ -376,13 +387,15 @@ static void *r600_create_sampler_state(struct pipe_context *ctx, rstate->id = R600_PIPE_STATE_SAMPLER; util_pack_color(state->border_color, PIPE_FORMAT_B8G8R8A8_UNORM, &uc); + unsigned aniso_flag_offset = state->max_anisotropy > 1 ? 4 : 0; r600_pipe_state_add_reg(rstate, R_03C000_SQ_TEX_SAMPLER_WORD0_0, S_03C000_CLAMP_X(r600_tex_wrap(state->wrap_s)) | S_03C000_CLAMP_Y(r600_tex_wrap(state->wrap_t)) | S_03C000_CLAMP_Z(r600_tex_wrap(state->wrap_r)) | - S_03C000_XY_MAG_FILTER(r600_tex_filter(state->mag_img_filter)) | - S_03C000_XY_MIN_FILTER(r600_tex_filter(state->min_img_filter)) | + S_03C000_XY_MAG_FILTER(r600_tex_filter(state->mag_img_filter) | aniso_flag_offset) | + S_03C000_XY_MIN_FILTER(r600_tex_filter(state->min_img_filter) | aniso_flag_offset) | S_03C000_MIP_FILTER(r600_tex_mipfilter(state->min_mip_filter)) | + S_03C000_ANISO(r600_tex_aniso_filter(state->max_anisotropy)) | S_03C000_DEPTH_COMPARE_FUNCTION(r600_tex_compare(state->compare_func)) | S_03C000_BORDER_COLOR_TYPE(uc.ui ? V_03C000_SQ_TEX_BORDER_COLOR_REGISTER : 0), 0xFFFFFFFF, NULL); r600_pipe_state_add_reg(rstate, R_03C004_SQ_TEX_SAMPLER_WORD1_0, @@ -492,7 +505,8 @@ static struct pipe_sampler_view *r600_create_sampler_view(struct pipe_context *c S_038014_BASE_ARRAY(state->u.tex.first_layer) | S_038014_LAST_ARRAY(state->u.tex.last_layer), 0xFFFFFFFF, NULL); r600_pipe_state_add_reg(rstate, R_038018_RESOURCE0_WORD6, - S_038018_TYPE(V_038010_SQ_TEX_VTX_VALID_TEXTURE), 0xFFFFFFFF, NULL); + S_038018_TYPE(V_038010_SQ_TEX_VTX_VALID_TEXTURE) | + S_038018_ANISO(4 /* max 16 samples */), 0xFFFFFFFF, NULL); return &resource->base; } diff --git a/src/gallium/drivers/r600/r600d.h b/src/gallium/drivers/r600/r600d.h index 8296b52eb94..c9974625dc3 100644 --- a/src/gallium/drivers/r600/r600d.h +++ b/src/gallium/drivers/r600/r600d.h @@ -1012,6 +1012,9 @@ #define S_038018_MPEG_CLAMP(x) (((x) & 0x3) << 0) #define G_038018_MPEG_CLAMP(x) (((x) >> 0) & 0x3) #define C_038018_MPEG_CLAMP 0xFFFFFFFC +#define S_038018_ANISO(x) (((x) & 0x7) << 2) +#define G_038018_ANISO(x) (((x) >> 2) & 0x7) +#define C_038018_ANISO 0xFFFFFFE3 #define S_038018_PERF_MODULATION(x) (((x) & 0x7) << 5) #define G_038018_PERF_MODULATION(x) (((x) >> 5) & 0x7) #define C_038018_PERF_MODULATION 0xFFFFFF1F @@ -1090,6 +1093,9 @@ #define S_03C000_MIP_FILTER(x) (((x) & 0x3) << 17) #define G_03C000_MIP_FILTER(x) (((x) >> 17) & 0x3) #define C_03C000_MIP_FILTER 0xFFF9FFFF +#define S_03C000_ANISO(x) (((x) & 0x7) << 19) +#define G_03C000_ANISO(x) (((x) >> 19) & 0x7) +#define C_03C000_ANISO 0xFFB7FFFF #define S_03C000_BORDER_COLOR_TYPE(x) (((x) & 0x3) << 22) #define G_03C000_BORDER_COLOR_TYPE(x) (((x) >> 22) & 0x3) #define C_03C000_BORDER_COLOR_TYPE 0xFF3FFFFF @@ -1152,6 +1158,9 @@ #define S_03C008_PERF_Z(x) (((x) & 0x3) << 18) #define G_03C008_PERF_Z(x) (((x) >> 18) & 0x3) #define C_03C008_PERF_Z 0xFFF3FFFF +#define S_03C008_ANISO_BIAS(x) (((x) & 0x3f) << 22) +#define G_03C008_ANISO_BIAS(x) (((x) >> 22) & 0x3f) +#define C_03C008_ANISO_BIAS (~(0x3f << 22)) #define S_03C008_FETCH_4(x) (((x) & 0x1) << 26) #define G_03C008_FETCH_4(x) (((x) >> 26) & 0x1) #define C_03C008_FETCH_4 0xFBFFFFFF