mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 13:58:04 +02:00
r600g: clean up aniso state translation
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
parent
b0d4469519
commit
3bc2d967c4
6 changed files with 29 additions and 31 deletions
|
|
@ -561,7 +561,6 @@ static void *evergreen_create_sampler_state(struct pipe_context *ctx,
|
|||
const struct pipe_sampler_state *state)
|
||||
{
|
||||
struct r600_pipe_sampler_state *ss = CALLOC_STRUCT(r600_pipe_sampler_state);
|
||||
unsigned aniso_flag_offset = state->max_anisotropy > 1 ? 2 : 0;
|
||||
|
||||
if (!ss) {
|
||||
return NULL;
|
||||
|
|
@ -574,10 +573,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) | aniso_flag_offset) |
|
||||
S_03C000_XY_MIN_FILTER(r600_tex_filter(state->min_img_filter) | aniso_flag_offset) |
|
||||
S_03C000_XY_MAG_FILTER(eg_tex_filter(state->mag_img_filter, state->max_anisotropy)) |
|
||||
S_03C000_XY_MIN_FILTER(eg_tex_filter(state->min_img_filter, state->max_anisotropy)) |
|
||||
S_03C000_MIP_FILTER(r600_tex_mipfilter(state->min_mip_filter)) |
|
||||
S_03C000_MAX_ANISO(r600_tex_aniso_filter(state->max_anisotropy)) |
|
||||
S_03C000_MAX_ANISO_RATIO(r600_tex_aniso_filter(state->max_anisotropy)) |
|
||||
S_03C000_DEPTH_COMPARE_FUNCTION(r600_tex_compare(state->compare_func)) |
|
||||
S_03C000_BORDER_COLOR_TYPE(ss->border_color_use ? V_03C000_SQ_TEX_BORDER_COLOR_REGISTER : 0);
|
||||
/* R_03C004_SQ_TEX_SAMPLER_WORD1_0 */
|
||||
|
|
@ -852,7 +851,7 @@ evergreen_create_sampler_view_custom(struct pipe_context *ctx,
|
|||
view->tex_resource_words[4] |= S_030010_BASE_LEVEL(first_level);
|
||||
view->tex_resource_words[5] |= S_030014_LAST_LEVEL(last_level);
|
||||
/* aniso max 16 samples */
|
||||
view->tex_resource_words[6] |= S_030018_MAX_ANISO(4);
|
||||
view->tex_resource_words[6] |= S_030018_MAX_ANISO_RATIO(4);
|
||||
}
|
||||
|
||||
view->tex_resource_words[7] = S_03001C_DATA_FORMAT(format) |
|
||||
|
|
|
|||
|
|
@ -1202,11 +1202,11 @@
|
|||
#define G_030014_LAST_ARRAY(x) (((x) >> 17) & 0x1FFF)
|
||||
#define C_030014_LAST_ARRAY 0xC001FFFF
|
||||
#define R_030018_SQ_TEX_RESOURCE_WORD6_0 0x030018
|
||||
/* FMASK_BANK_HEIGHT and MAX_ANISO share the first two bits.
|
||||
/* FMASK_BANK_HEIGHT and MAX_ANISO_RATIO share the first two bits.
|
||||
* The former is only used with MSAA textures. */
|
||||
#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_MAX_ANISO_RATIO(x) (((x) & 0x7) << 0)
|
||||
#define G_030018_MAX_ANISO_RATIO(x) (((x) >> 0) & 0x7)
|
||||
#define C_030018_MAX_ANISO_RATIO 0xFFFFFFF8
|
||||
#define S_030018_FMASK_BANK_HEIGHT(x) (((x) & 0x3) << 0)
|
||||
#define S_030018_PERF_MODULATION(x) (((x) & 0x7) << 3)
|
||||
#define G_030018_PERF_MODULATION(x) (((x) >> 3) & 0x7)
|
||||
|
|
@ -1344,9 +1344,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_MAX_ANISO_RATIO(x) (((x) & 0x7) << 17)
|
||||
#define G_03C000_MAX_ANISO_RATIO(x) (((x) >> 17) & 0x7)
|
||||
#define C_03C000_MAX_ANISO_RATIO 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
|
||||
|
|
|
|||
|
|
@ -746,7 +746,6 @@ void r600_set_sample_locations_constant_buffer(struct r600_context *rctx);
|
|||
uint32_t r600_translate_stencil_op(int s_op);
|
||||
uint32_t r600_translate_fill(uint32_t func);
|
||||
unsigned r600_tex_wrap(unsigned wrap);
|
||||
unsigned r600_tex_filter(unsigned filter);
|
||||
unsigned r600_tex_mipfilter(unsigned filter);
|
||||
unsigned r600_tex_compare(unsigned compare);
|
||||
bool sampler_state_needs_border_color(const struct pipe_sampler_state *state);
|
||||
|
|
|
|||
|
|
@ -558,11 +558,20 @@ static void *r600_create_rs_state(struct pipe_context *ctx,
|
|||
return rs;
|
||||
}
|
||||
|
||||
static unsigned r600_tex_filter(unsigned filter, unsigned max_aniso)
|
||||
{
|
||||
if (filter == PIPE_TEX_FILTER_LINEAR)
|
||||
return max_aniso > 1 ? V_03C000_SQ_TEX_XY_FILTER_ANISO_BILINEAR
|
||||
: V_03C000_SQ_TEX_XY_FILTER_BILINEAR;
|
||||
else
|
||||
return max_aniso > 1 ? V_03C000_SQ_TEX_XY_FILTER_ANISO_POINT
|
||||
: V_03C000_SQ_TEX_XY_FILTER_POINT;
|
||||
}
|
||||
|
||||
static void *r600_create_sampler_state(struct pipe_context *ctx,
|
||||
const struct pipe_sampler_state *state)
|
||||
{
|
||||
struct r600_pipe_sampler_state *ss = CALLOC_STRUCT(r600_pipe_sampler_state);
|
||||
unsigned aniso_flag_offset = state->max_anisotropy > 1 ? 4 : 0;
|
||||
|
||||
if (!ss) {
|
||||
return NULL;
|
||||
|
|
@ -576,10 +585,10 @@ static void *r600_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) | aniso_flag_offset) |
|
||||
S_03C000_XY_MIN_FILTER(r600_tex_filter(state->min_img_filter) | aniso_flag_offset) |
|
||||
S_03C000_XY_MAG_FILTER(r600_tex_filter(state->mag_img_filter, state->max_anisotropy)) |
|
||||
S_03C000_XY_MIN_FILTER(r600_tex_filter(state->min_img_filter, state->max_anisotropy)) |
|
||||
S_03C000_MIP_FILTER(r600_tex_mipfilter(state->min_mip_filter)) |
|
||||
S_03C000_MAX_ANISO(r600_tex_aniso_filter(state->max_anisotropy)) |
|
||||
S_03C000_MAX_ANISO_RATIO(r600_tex_aniso_filter(state->max_anisotropy)) |
|
||||
S_03C000_DEPTH_COMPARE_FUNCTION(r600_tex_compare(state->compare_func)) |
|
||||
S_03C000_BORDER_COLOR_TYPE(ss->border_color_use ? V_03C000_SQ_TEX_BORDER_COLOR_REGISTER : 0);
|
||||
/* R_03C004_SQ_TEX_SAMPLER_WORD1_0 */
|
||||
|
|
|
|||
|
|
@ -2122,17 +2122,6 @@ unsigned r600_tex_wrap(unsigned wrap)
|
|||
}
|
||||
}
|
||||
|
||||
unsigned r600_tex_filter(unsigned filter)
|
||||
{
|
||||
switch (filter) {
|
||||
default:
|
||||
case PIPE_TEX_FILTER_NEAREST:
|
||||
return V_03C000_SQ_TEX_XY_FILTER_POINT;
|
||||
case PIPE_TEX_FILTER_LINEAR:
|
||||
return V_03C000_SQ_TEX_XY_FILTER_BILINEAR;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned r600_tex_mipfilter(unsigned filter)
|
||||
{
|
||||
switch (filter) {
|
||||
|
|
|
|||
|
|
@ -1267,6 +1267,8 @@
|
|||
#define V_03C000_SQ_TEX_XY_FILTER_POINT 0x00000000
|
||||
#define V_03C000_SQ_TEX_XY_FILTER_BILINEAR 0x00000001
|
||||
#define V_03C000_SQ_TEX_XY_FILTER_BICUBIC 0x00000002
|
||||
#define V_03C000_SQ_TEX_XY_FILTER_ANISO_POINT 0x00000004
|
||||
#define V_03C000_SQ_TEX_XY_FILTER_ANISO_BILINEAR 0x00000005
|
||||
#define S_03C000_XY_MIN_FILTER(x) (((x) & 0x7) << 12)
|
||||
#define G_03C000_XY_MIN_FILTER(x) (((x) >> 12) & 0x7)
|
||||
#define C_03C000_XY_MIN_FILTER 0xFFFF8FFF
|
||||
|
|
@ -1279,9 +1281,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_MAX_ANISO(x) (((x) & 0x7) << 19)
|
||||
#define G_03C000_MAX_ANISO(x) (((x) >> 19) & 0x7)
|
||||
#define C_03C000_MAX_ANISO 0xFFB7FFFF
|
||||
#define S_03C000_MAX_ANISO_RATIO(x) (((x) & 0x7) << 19)
|
||||
#define G_03C000_MAX_ANISO_RATIO(x) (((x) >> 19) & 0x7)
|
||||
#define C_03C000_MAX_ANISO_RATIO 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