r300g: do not use NPOT fallback for CLAMP wrap modes
authorMarek Olšák <maraeo@gmail.com>
Thu, 15 Apr 2010 07:52:26 +0000 (09:52 +0200)
committerMarek Olšák <maraeo@gmail.com>
Thu, 15 Apr 2010 08:15:34 +0000 (10:15 +0200)
These work just fine.

src/gallium/drivers/r300/r300_fs.c

index ecba8b0..5652faf 100644 (file)
@@ -154,33 +154,39 @@ static void get_external_state(
             state->unit[i].texture_compare_func = s->state.compare_func;
         }
 
+        state->unit[i].non_normalized_coords = !s->state.normalized_coords;
+
         if (texstate->sampler_views[i]) {
             struct r300_texture *t;
             t = (struct r300_texture*)texstate->sampler_views[i]->base.texture;
 
-            state->unit[i].fake_npot = t->uses_pitch;
-        }
-        state->unit[i].non_normalized_coords = !s->state.normalized_coords;
-
-        /* XXX this should probably take into account STR, not just S. */
-        switch (s->state.wrap_s) {
-            case PIPE_TEX_WRAP_REPEAT:
-                state->unit[i].wrap_mode = RC_WRAP_REPEAT;
-                break;
-            case PIPE_TEX_WRAP_CLAMP:
-            case PIPE_TEX_WRAP_CLAMP_TO_EDGE:
-            case PIPE_TEX_WRAP_CLAMP_TO_BORDER:
-                state->unit[i].wrap_mode = RC_WRAP_CLAMP;
-                break;
-            case PIPE_TEX_WRAP_MIRROR_REPEAT:
-            case PIPE_TEX_WRAP_MIRROR_CLAMP:
-            case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE:
-            case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER:
-                state->unit[i].wrap_mode = RC_WRAP_MIRROR;
-                break;
-            default:
-                state->unit[i].wrap_mode = RC_WRAP_NONE;
-                break;
+            /* XXX this should probably take into account STR, not just S. */
+            if (t->uses_pitch) {
+                switch (s->state.wrap_s) {
+                    case PIPE_TEX_WRAP_REPEAT:
+                        state->unit[i].wrap_mode = RC_WRAP_REPEAT;
+                        state->unit[i].fake_npot = TRUE;
+                        break;
+
+                    case PIPE_TEX_WRAP_CLAMP:
+                    case PIPE_TEX_WRAP_CLAMP_TO_EDGE:
+                    case PIPE_TEX_WRAP_CLAMP_TO_BORDER:
+                        state->unit[i].wrap_mode = RC_WRAP_CLAMP;
+                        break;
+
+                    case PIPE_TEX_WRAP_MIRROR_REPEAT:
+                    case PIPE_TEX_WRAP_MIRROR_CLAMP:
+                    case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE:
+                    case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER:
+                        state->unit[i].wrap_mode = RC_WRAP_MIRROR;
+                        state->unit[i].fake_npot = TRUE;
+                        break;
+
+                    default:
+                        state->unit[i].wrap_mode = RC_WRAP_NONE;
+                        break;
+                }
+            }
         }
     }
 }