From: Marek Olšák <[email protected]>
---
src/gallium/drivers/radeon/r600_pipe_common.h | 15 +++++++++++++++
src/gallium/drivers/radeonsi/si_state.c | 18 +++---------------
src/gallium/drivers/radeonsi/sid.h | 5 +++++
3 files changed, 23 insertions(+), 15 deletions(-)
diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h
b/src/gallium/drivers/radeon/r600_pipe_common.h
index d929f70..88879b7 100644
--- a/src/gallium/drivers/radeon/r600_pipe_common.h
+++ b/src/gallium/drivers/radeon/r600_pipe_common.h
@@ -676,6 +676,21 @@ static inline bool r600_get_strmout_en(struct
r600_common_context *rctx)
rctx->streamout.prims_gen_query_enabled;
}
+#define SQ_TEX_XY_FILTER_POINT 0x00
+#define SQ_TEX_XY_FILTER_BILINEAR 0x01
+#define SQ_TEX_XY_FILTER_ANISO_POINT 0x02
+#define SQ_TEX_XY_FILTER_ANISO_BILINEAR 0x03
+
+static inline unsigned eg_tex_filter(unsigned filter, unsigned max_aniso)
+{
+ if (filter == PIPE_TEX_FILTER_LINEAR)
+ return max_aniso > 1 ? SQ_TEX_XY_FILTER_ANISO_BILINEAR
+ : SQ_TEX_XY_FILTER_BILINEAR;
+ else
+ return max_aniso > 1 ? SQ_TEX_XY_FILTER_ANISO_POINT
+ : SQ_TEX_XY_FILTER_POINT;
+}
+
static inline unsigned r600_tex_aniso_filter(unsigned filter)
{
if (filter < 2)
diff --git a/src/gallium/drivers/radeonsi/si_state.c
b/src/gallium/drivers/radeonsi/si_state.c
index f5944a3..84c8bc8 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -1684,17 +1684,6 @@ static unsigned si_tex_wrap(unsigned wrap)
}
}
-static unsigned si_tex_filter(unsigned filter)
-{
- switch (filter) {
- default:
- case PIPE_TEX_FILTER_NEAREST:
- return V_008F38_SQ_TEX_XY_FILTER_POINT;
- case PIPE_TEX_FILTER_LINEAR:
- return V_008F38_SQ_TEX_XY_FILTER_BILINEAR;
- }
-}
-
static unsigned si_tex_mipfilter(unsigned filter)
{
switch (filter) {
@@ -3175,7 +3164,6 @@ static void *si_create_sampler_state(struct pipe_context
*ctx,
{
struct si_context *sctx = (struct si_context *)ctx;
struct si_sampler_state *rstate = CALLOC_STRUCT(si_sampler_state);
- unsigned aniso_flag_offset = state->max_anisotropy > 1 ? 2 : 0;
unsigned border_color_type, border_color_index = 0;
if (!rstate) {
@@ -3234,7 +3222,7 @@ static void *si_create_sampler_state(struct pipe_context
*ctx,
rstate->val[0] = (S_008F30_CLAMP_X(si_tex_wrap(state->wrap_s)) |
S_008F30_CLAMP_Y(si_tex_wrap(state->wrap_t)) |
S_008F30_CLAMP_Z(si_tex_wrap(state->wrap_r)) |
- r600_tex_aniso_filter(state->max_anisotropy) << 9 |
+
S_008F30_MAX_ANISO_RATIO(r600_tex_aniso_filter(state->max_anisotropy)) |
S_008F30_DEPTH_COMPARE_FUNC(si_tex_compare(state->compare_func)) |
S_008F30_FORCE_UNNORMALIZED(!state->normalized_coords) |
S_008F30_DISABLE_CUBE_WRAP(!state->seamless_cube_map)
|
@@ -3242,8 +3230,8 @@ static void *si_create_sampler_state(struct pipe_context
*ctx,
rstate->val[1] = (S_008F34_MIN_LOD(S_FIXED(CLAMP(state->min_lod, 0,
15), 8)) |
S_008F34_MAX_LOD(S_FIXED(CLAMP(state->max_lod, 0,
15), 8)));
rstate->val[2] = (S_008F38_LOD_BIAS(S_FIXED(CLAMP(state->lod_bias, -16,
16), 8)) |
-
S_008F38_XY_MAG_FILTER(si_tex_filter(state->mag_img_filter) |
aniso_flag_offset) |
-
S_008F38_XY_MIN_FILTER(si_tex_filter(state->min_img_filter) |
aniso_flag_offset) |
+
S_008F38_XY_MAG_FILTER(eg_tex_filter(state->mag_img_filter,
state->max_anisotropy)) |
+
S_008F38_XY_MIN_FILTER(eg_tex_filter(state->min_img_filter,
state->max_anisotropy)) |
S_008F38_MIP_FILTER(si_tex_mipfilter(state->min_mip_filter)) |
S_008F38_MIP_POINT_PRECLAMP(1) |
S_008F38_DISABLE_LSB_CEIL(1) |
diff --git a/src/gallium/drivers/radeonsi/sid.h
b/src/gallium/drivers/radeonsi/sid.h
index c02a1d2..06f7ece 100644
--- a/src/gallium/drivers/radeonsi/sid.h
+++ b/src/gallium/drivers/radeonsi/sid.h
@@ -2307,6 +2307,9 @@
#define V_008F30_SQ_TEX_MIRROR_ONCE_HALF_BORDER 0x05
#define V_008F30_SQ_TEX_CLAMP_BORDER 0x06
#define V_008F30_SQ_TEX_MIRROR_ONCE_BORDER 0x07
+#define S_008F30_MAX_ANISO_RATIO(x) (((x) &
0x07) << 9)
+#define G_008F30_MAX_ANISO_RATIO(x) (((x) >>
9) & 0x07)
+#define C_008F30_MAX_ANISO_RATIO
0xFFFFF1FF
#define S_008F30_DEPTH_COMPARE_FUNC(x) (((x) &
0x07) << 12)
#define G_008F30_DEPTH_COMPARE_FUNC(x) (((x) >>
12) & 0x07)
#define C_008F30_DEPTH_COMPARE_FUNC
0xFFFF8FFF
@@ -2371,6 +2374,8 @@
#define C_008F38_XY_MIN_FILTER
0xFF3FFFFF
#define V_008F38_SQ_TEX_XY_FILTER_POINT 0x00
#define V_008F38_SQ_TEX_XY_FILTER_BILINEAR 0x01
+#define V_008F38_SQ_TEX_XY_FILTER_ANISO_POINT 0x02
+#define V_008F38_SQ_TEX_XY_FILTER_ANISO_BILINEAR 0x03
#define S_008F38_Z_FILTER(x) (((x) &
0x03) << 24)
#define G_008F38_Z_FILTER(x) (((x) >>
24) & 0x03)
#define C_008F38_Z_FILTER
0xFCFFFFFF
--
2.5.0
_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev