swrast: fix RGB, RGBA texturing code
authorBrian Paul <brianp@vmware.com>
Thu, 29 Oct 2009 01:46:26 +0000 (19:46 -0600)
committerBrian Paul <brianp@vmware.com>
Thu, 29 Oct 2009 01:46:28 +0000 (19:46 -0600)
Fix backward component ordering for RGB textures.
Only optimize RGBA texture case if running little endian.  This restriction
could be lifted with a little work.

src/mesa/swrast/s_triangle.c

index f417578..5ecc769 100644 (file)
@@ -159,9 +159,9 @@ _swrast_culltriangle( GLcontext *ctx,
       GLint t = FixedToInt(span.intTex[1]) & tmask;                    \
       GLint pos = (t << twidth_log2) + s;                              \
       pos = pos + pos + pos;  /* multiply by 3 */                      \
-      rgb[i][RCOMP] = texture[pos];                                    \
+      rgb[i][RCOMP] = texture[pos+2];                                  \
       rgb[i][GCOMP] = texture[pos+1];                                  \
-      rgb[i][BCOMP] = texture[pos+2];                                  \
+      rgb[i][BCOMP] = texture[pos+0];                                  \
       span.intTex[0] += span.intTexStep[0];                            \
       span.intTex[1] += span.intTexStep[1];                            \
    }                                                                   \
@@ -215,9 +215,9 @@ _swrast_culltriangle( GLcontext *ctx,
          GLint t = FixedToInt(span.intTex[1]) & tmask;                 \
          GLint pos = (t << twidth_log2) + s;                           \
          pos = pos + pos + pos;  /* multiply by 3 */                   \
-         rgb[i][RCOMP] = texture[pos];                                 \
+         rgb[i][RCOMP] = texture[pos+2];                               \
          rgb[i][GCOMP] = texture[pos+1];                               \
-         rgb[i][BCOMP] = texture[pos+2];                               \
+         rgb[i][BCOMP] = texture[pos+0];                               \
          zRow[i] = z;                                                  \
          span.array->mask[i] = 1;                                      \
       }                                                                        \
@@ -1101,7 +1101,13 @@ _swrast_choose_triangle( GLcontext *ctx )
 #if CHAN_BITS != 8
                   USE(general_triangle);
 #else
-                  USE(affine_textured_triangle);
+                  if (format == MESA_FORMAT_RGBA8888 && !_mesa_little_endian())
+                     /* We only handle RGBA8888 correctly on little endian
+                      * in the optimized code above.
+                      */
+                     USE(general_triangle);
+                  else
+                     USE(affine_textured_triangle);
 #endif
               }
            }