diff options
-rw-r--r-- | src/gallium/drivers/ilo/ilo_state_3d_top.c | 71 |
1 files changed, 42 insertions, 29 deletions
diff --git a/src/gallium/drivers/ilo/ilo_state_3d_top.c b/src/gallium/drivers/ilo/ilo_state_3d_top.c index 2fb31325fbf..73f8402be0b 100644 --- a/src/gallium/drivers/ilo/ilo_state_3d_top.c +++ b/src/gallium/drivers/ilo/ilo_state_3d_top.c @@ -1358,20 +1358,14 @@ gen6_translate_tex_filter(unsigned filter) * wrapping mode. */ static int -gen6_translate_tex_wrap(unsigned wrap, bool clamp_to_edge) +gen6_translate_tex_wrap(unsigned wrap) { - /* clamp to edge or border? */ - if (wrap == PIPE_TEX_WRAP_CLAMP) { - wrap = (clamp_to_edge) ? - PIPE_TEX_WRAP_CLAMP_TO_EDGE : PIPE_TEX_WRAP_CLAMP_TO_BORDER; - } - switch (wrap) { + case PIPE_TEX_WRAP_CLAMP: return GEN8_TEXCOORDMODE_HALF_BORDER; case PIPE_TEX_WRAP_REPEAT: return GEN6_TEXCOORDMODE_WRAP; case PIPE_TEX_WRAP_CLAMP_TO_EDGE: return GEN6_TEXCOORDMODE_CLAMP; case PIPE_TEX_WRAP_CLAMP_TO_BORDER: return GEN6_TEXCOORDMODE_CLAMP_BORDER; case PIPE_TEX_WRAP_MIRROR_REPEAT: return GEN6_TEXCOORDMODE_MIRROR; - case PIPE_TEX_WRAP_CLAMP: case PIPE_TEX_WRAP_MIRROR_CLAMP: case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE: case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER: @@ -1418,10 +1412,9 @@ ilo_gpe_init_sampler_cso(const struct ilo_dev_info *dev, int mip_filter, min_filter, mag_filter, max_aniso; int lod_bias, max_lod, min_lod; int wrap_s, wrap_t, wrap_r, wrap_cube; - bool clamp_is_to_edge; uint32_t dw0, dw1, dw3; - ILO_DEV_ASSERT(dev, 6, 7.5); + ILO_DEV_ASSERT(dev, 6, 8); memset(sampler, 0, sizeof(*sampler)); @@ -1498,26 +1491,46 @@ ilo_gpe_init_sampler_cso(const struct ilo_dev_info *dev, mag_filter = min_filter; } - /* - * For nearest filtering, PIPE_TEX_WRAP_CLAMP means - * PIPE_TEX_WRAP_CLAMP_TO_EDGE; for linear filtering, PIPE_TEX_WRAP_CLAMP - * means PIPE_TEX_WRAP_CLAMP_TO_BORDER while additionally clamping the - * texture coordinates to [0.0, 1.0]. - * - * The clamping will be taken care of in the shaders. There are two - * filters here, but let the minification one has a say. - */ - clamp_is_to_edge = (state->min_img_filter == PIPE_TEX_FILTER_NEAREST); - if (!clamp_is_to_edge) { - sampler->saturate_s = (state->wrap_s == PIPE_TEX_WRAP_CLAMP); - sampler->saturate_t = (state->wrap_t == PIPE_TEX_WRAP_CLAMP); - sampler->saturate_r = (state->wrap_r == PIPE_TEX_WRAP_CLAMP); - } - /* determine wrap s/t/r */ - wrap_s = gen6_translate_tex_wrap(state->wrap_s, clamp_is_to_edge); - wrap_t = gen6_translate_tex_wrap(state->wrap_t, clamp_is_to_edge); - wrap_r = gen6_translate_tex_wrap(state->wrap_r, clamp_is_to_edge); + wrap_s = gen6_translate_tex_wrap(state->wrap_s); + wrap_t = gen6_translate_tex_wrap(state->wrap_t); + wrap_r = gen6_translate_tex_wrap(state->wrap_r); + if (ilo_dev_gen(dev) < ILO_GEN(8)) { + /* + * For nearest filtering, PIPE_TEX_WRAP_CLAMP means + * PIPE_TEX_WRAP_CLAMP_TO_EDGE; for linear filtering, + * PIPE_TEX_WRAP_CLAMP means PIPE_TEX_WRAP_CLAMP_TO_BORDER while + * additionally clamping the texture coordinates to [0.0, 1.0]. + * + * PIPE_TEX_WRAP_CLAMP is not supported natively until Gen8. The + * clamping has to be taken care of in the shaders. There are two + * filters here, but let the minification one has a say. + */ + const bool clamp_is_to_edge = + (state->min_img_filter == PIPE_TEX_FILTER_NEAREST); + + if (clamp_is_to_edge) { + if (wrap_s == GEN8_TEXCOORDMODE_HALF_BORDER) + wrap_s = GEN6_TEXCOORDMODE_CLAMP; + if (wrap_t == GEN8_TEXCOORDMODE_HALF_BORDER) + wrap_t = GEN6_TEXCOORDMODE_CLAMP; + if (wrap_r == GEN8_TEXCOORDMODE_HALF_BORDER) + wrap_r = GEN6_TEXCOORDMODE_CLAMP; + } else { + if (wrap_s == GEN8_TEXCOORDMODE_HALF_BORDER) { + wrap_s = GEN6_TEXCOORDMODE_CLAMP_BORDER; + sampler->saturate_s = true; + } + if (wrap_t == GEN8_TEXCOORDMODE_HALF_BORDER) { + wrap_t = GEN6_TEXCOORDMODE_CLAMP_BORDER; + sampler->saturate_t = true; + } + if (wrap_r == GEN8_TEXCOORDMODE_HALF_BORDER) { + wrap_r = GEN6_TEXCOORDMODE_CLAMP_BORDER; + sampler->saturate_r = true; + } + } + } /* * From the Sandy Bridge PRM, volume 4 part 1, page 107: |