diff options
author | Ian Romanick <[email protected]> | 2017-05-25 23:12:52 -0700 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2017-09-21 10:28:32 -0500 |
commit | 953a3cf0fd9ac5ebfdc0a1bcebead367b4719039 (patch) | |
tree | 69c5fa96798c3d0033aa5f1942422671d8e783e5 /src/mesa/drivers/dri/nouveau | |
parent | 9c871506182f0489813aedd214dde447be78cc4f (diff) |
nv20: Fix GL_CLAMP
v2: Force T and R wrap modes to GL_CLAMP_TO_EDGE for 1D textures.
This fixes a regression in tex1d-2dborder. The test uses a 1D texture
but it provides S and T texture coordinates. Since the T wrap mode
would (correctly) be set to GL_CLAMP, the texture would gradually
blend (incorrectly) with the border color.
I also tried setting NV20_3D_TEX_FORMAT_DIMS_1D instead of
NV20_3D_TEX_FORMAT_DIMS_2D for 1D textures, but that did not help.
It is possible that the same problem exists for 2D textures with the
R-wrap mode, but I don't think there are any piglit tests for that.
No test changes on NV20 (10de:0201).
Signed-off-by: Ian Romanick <[email protected]>
Reviewed-by: Ilia Mirkin <[email protected]>
Reviewed-by: Francisco Jerez <[email protected]>
Diffstat (limited to 'src/mesa/drivers/dri/nouveau')
-rw-r--r-- | src/mesa/drivers/dri/nouveau/nouveau_gldefs.h | 19 | ||||
-rw-r--r-- | src/mesa/drivers/dri/nouveau/nv20_state_tex.c | 16 |
2 files changed, 32 insertions, 3 deletions
diff --git a/src/mesa/drivers/dri/nouveau/nouveau_gldefs.h b/src/mesa/drivers/dri/nouveau/nouveau_gldefs.h index 46ec14ec55d..7df04c1177b 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_gldefs.h +++ b/src/mesa/drivers/dri/nouveau/nouveau_gldefs.h @@ -239,6 +239,25 @@ nvgl_wrap_mode(unsigned wrap) } static inline unsigned +nvgl_wrap_mode_nv20(unsigned wrap) +{ + switch (wrap) { + case GL_REPEAT: + return 0x1; + case GL_MIRRORED_REPEAT: + return 0x2; + case GL_CLAMP: + return 0x5; + case GL_CLAMP_TO_EDGE: + return 0x3; + case GL_CLAMP_TO_BORDER: + return 0x4; + default: + unreachable("Bad GL texture wrap mode"); + } +} + +static inline unsigned nvgl_filter_mode(unsigned filter) { switch (filter) { diff --git a/src/mesa/drivers/dri/nouveau/nv20_state_tex.c b/src/mesa/drivers/dri/nouveau/nv20_state_tex.c index b0a4c9fb097..7972069dcbb 100644 --- a/src/mesa/drivers/dri/nouveau/nv20_state_tex.c +++ b/src/mesa/drivers/dri/nouveau/nv20_state_tex.c @@ -193,9 +193,19 @@ nv20_emit_tex_obj(struct gl_context *ctx, int emit) | NV20_3D_TEX_FORMAT_NO_BORDER | 1 << 16; - tx_wrap = nvgl_wrap_mode(sa->WrapR) << 16 - | nvgl_wrap_mode(sa->WrapT) << 8 - | nvgl_wrap_mode(sa->WrapS) << 0; + switch (t->Target) { + case GL_TEXTURE_1D: + tx_wrap = NV20_3D_TEX_WRAP_R_CLAMP_TO_EDGE + | NV20_3D_TEX_WRAP_T_CLAMP_TO_EDGE + | nvgl_wrap_mode_nv20(sa->WrapS) << 0; + break; + + default: + tx_wrap = nvgl_wrap_mode_nv20(sa->WrapR) << 16 + | nvgl_wrap_mode_nv20(sa->WrapT) << 8 + | nvgl_wrap_mode_nv20(sa->WrapS) << 0; + break; + } tx_filter = nvgl_filter_mode(sa->MagFilter) << 24 | nvgl_filter_mode(sa->MinFilter) << 16 |