r300g: use clamp-to-edge instead of repeat/mirrored-repeat for NPOT textures
authorMarek Olšák <maraeo@gmail.com>
Sat, 10 Apr 2010 17:00:10 +0000 (19:00 +0200)
committerMarek Olšák <maraeo@gmail.com>
Sat, 10 Apr 2010 17:00:10 +0000 (19:00 +0200)
src/gallium/drivers/r300/r300_state_derived.c

index ae54d06372f6fc8a38c94fec0815ba51a8d835f1..ade603a47cf815c463dda0e7f76d70c78bd9efd0 100644 (file)
@@ -493,6 +493,25 @@ static void r300_merge_textures_and_samplers(struct r300_context* r300)
                 /* NPOT textures don't support mip filter, unfortunately.
                  * This prevents incorrect rendering. */
                 texstate->filter[0] &= ~R300_TX_MIN_FILTER_MIP_MASK;
+
+                /* Set repeat or mirrored-repeat to clamp-to-edge. */
+                /* Wrap S. */
+                if ((texstate->filter[0] & R300_TX_WRAP_S_MASK) ==
+                     R300_TX_WRAP_S(R300_TX_REPEAT) ||
+                    (texstate->filter[0] & R300_TX_WRAP_S_MASK) ==
+                     R300_TX_WRAP_S(R300_TX_MIRRORED)) {
+                    texstate->filter[0] &= ~R300_TX_WRAP_S_MASK;
+                    texstate->filter[0] |= R300_TX_WRAP_S(R300_TX_CLAMP_TO_EDGE);
+                }
+
+                /* Wrap T. */
+                if ((texstate->filter[0] & R300_TX_WRAP_T_MASK) ==
+                     R300_TX_WRAP_T(R300_TX_REPEAT) ||
+                    (texstate->filter[0] & R300_TX_WRAP_T_MASK) ==
+                     R300_TX_WRAP_T(R300_TX_MIRRORED)) {
+                    texstate->filter[0] &= ~R300_TX_WRAP_T_MASK;
+                    texstate->filter[0] |= R300_TX_WRAP_T(R300_TX_CLAMP_TO_EDGE);
+                }
             } else {
                 /* determine min/max levels */
                 /* the MAX_MIP level is the largest (finest) one */