mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-05 13:20:10 +01:00
r600g: anisotropic filtering support for evergreen hw
Signed-off-by: Jerome Glisse <jglisse@redhat.com>
This commit is contained in:
parent
ad904cdf98
commit
b9e8ea6a27
5 changed files with 31 additions and 23 deletions
|
|
@ -310,6 +310,7 @@ static void *evergreen_create_sampler_state(struct pipe_context *ctx,
|
|||
{
|
||||
struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state);
|
||||
union util_color uc;
|
||||
unsigned aniso_flag_offset = state->max_anisotropy > 1 ? 2 : 0;
|
||||
|
||||
if (rstate == NULL) {
|
||||
return NULL;
|
||||
|
|
@ -321,9 +322,10 @@ static void *evergreen_create_sampler_state(struct pipe_context *ctx,
|
|||
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_MAX_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,
|
||||
|
|
@ -429,7 +431,9 @@ static struct pipe_sampler_view *evergreen_create_sampler_view(struct pipe_conte
|
|||
S_030014_LAST_LEVEL(state->u.tex.last_level) |
|
||||
S_030014_BASE_ARRAY(0) |
|
||||
S_030014_LAST_ARRAY(0), 0xffffffff, NULL);
|
||||
r600_pipe_state_add_reg(rstate, R_030018_RESOURCE0_WORD6, 0x0, 0xFFFFFFFF, NULL);
|
||||
r600_pipe_state_add_reg(rstate, R_030018_RESOURCE0_WORD6,
|
||||
S_030018_MAX_ANISO(4 /* max 16 samples */),
|
||||
0xFFFFFFFF, NULL);
|
||||
r600_pipe_state_add_reg(rstate, R_03001C_RESOURCE0_WORD7,
|
||||
S_03001C_DATA_FORMAT(format) |
|
||||
S_03001C_TYPE(V_03001C_SQ_TEX_VTX_VALID_TEXTURE), 0xFFFFFFFF, NULL);
|
||||
|
|
|
|||
|
|
@ -1027,6 +1027,9 @@
|
|||
#define G_030014_LAST_ARRAY(x) (((x) >> 17) & 0x1FFF)
|
||||
#define C_030014_LAST_ARRAY 0xC001FFFF
|
||||
#define R_030018_SQ_TEX_RESOURCE_WORD6_0 0x030018
|
||||
#define S_030018_MAX_ANISO(x) (((x) & 0x7) << 0)
|
||||
#define G_030018_MAX_ANISO(x) (((x) >> 0) & 0x7)
|
||||
#define C_030018_MAX_ANISO 0xFFFFFFF8
|
||||
#define S_030018_PERF_MODULATION(x) (((x) & 0x7) << 3)
|
||||
#define G_030018_PERF_MODULATION(x) (((x) >> 3) & 0x7)
|
||||
#define C_030018_PERF_MODULATION 0xFFFFFFC7
|
||||
|
|
@ -1141,6 +1144,9 @@
|
|||
#define S_03C000_MIP_FILTER(x) (((x) & 0x3) << 15)
|
||||
#define G_03C000_MIP_FILTER(x) (((x) >> 15) & 0x3)
|
||||
#define C_03C000_MIP_FILTER 0xFFFE7FFF
|
||||
#define S_03C000_MAX_ANISO(x) (((x) & 0x7) << 17)
|
||||
#define G_03C000_MAX_ANISO(x) (((x) >> 17) & 0x7)
|
||||
#define C_03C000_MAX_ANISO 0xFFF1FFFF
|
||||
#define S_03C000_BORDER_COLOR_TYPE(x) (((x) & 0x3) << 20)
|
||||
#define G_03C000_BORDER_COLOR_TYPE(x) (((x) >> 20) & 0x3)
|
||||
#define C_03C000_BORDER_COLOR_TYPE 0xFFCFFFFF
|
||||
|
|
|
|||
|
|
@ -317,4 +317,13 @@ static INLINE u32 S_FIXED(float value, u32 frac_bits)
|
|||
}
|
||||
#define ALIGN_DIVUP(x, y) (((x) + (y) - 1) / (y))
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -364,22 +364,12 @@ 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)
|
||||
{
|
||||
struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state);
|
||||
union util_color uc;
|
||||
unsigned aniso_flag_offset = state->max_anisotropy > 1 ? 4 : 0;
|
||||
|
||||
if (rstate == NULL) {
|
||||
return NULL;
|
||||
|
|
@ -387,7 +377,6 @@ 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)) |
|
||||
|
|
@ -395,7 +384,7 @@ static void *r600_create_sampler_state(struct pipe_context *ctx,
|
|||
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_MAX_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,
|
||||
|
|
@ -506,7 +495,7 @@ static struct pipe_sampler_view *r600_create_sampler_view(struct pipe_context *c
|
|||
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) |
|
||||
S_038018_ANISO(4 /* max 16 samples */), 0xFFFFFFFF, NULL);
|
||||
S_038018_MAX_ANISO(4 /* max 16 samples */), 0xFFFFFFFF, NULL);
|
||||
|
||||
return &resource->base;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1012,9 +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_MAX_ANISO(x) (((x) & 0x7) << 2)
|
||||
#define G_038018_MAX_ANISO(x) (((x) >> 2) & 0x7)
|
||||
#define C_038018_MAX_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
|
||||
|
|
@ -1093,9 +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_MAX_ANISO(x) (((x) & 0x7) << 19)
|
||||
#define G_03C000_MAX_ANISO(x) (((x) >> 19) & 0x7)
|
||||
#define C_03C000_MAX_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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue