summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri
diff options
context:
space:
mode:
authorIan Romanick <[email protected]>2017-05-25 23:12:52 -0700
committerIan Romanick <[email protected]>2017-09-21 10:28:32 -0500
commit953a3cf0fd9ac5ebfdc0a1bcebead367b4719039 (patch)
tree69c5fa96798c3d0033aa5f1942422671d8e783e5 /src/mesa/drivers/dri
parent9c871506182f0489813aedd214dde447be78cc4f (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')
-rw-r--r--src/mesa/drivers/dri/nouveau/nouveau_gldefs.h19
-rw-r--r--src/mesa/drivers/dri/nouveau/nv20_state_tex.c16
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