r300g: fix psychedelic colors with SWTCL
[mesa.git] / src / gallium / drivers / r300 / r300_state_inlines.h
index 044d70cbe821d9b382f99f0bb510cd1868687738..715601042fa41b07e1fc90b9ee9b6d70634e9c46 100644 (file)
@@ -255,7 +255,7 @@ static INLINE uint32_t r300_translate_wrap(int wrap)
         case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE:
             return R300_TX_CLAMP_TO_EDGE | R300_TX_MIRRORED;
         case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER:
-            return R300_TX_CLAMP_TO_EDGE | R300_TX_MIRRORED;
+            return R300_TX_CLAMP_TO_BORDER | R300_TX_MIRRORED;
         default:
             fprintf(stderr, "r300: Unknown texture wrap %d", wrap);
             assert(0);
@@ -371,9 +371,10 @@ r300_translate_vertex_data_type(enum pipe_format format) {
     desc = util_format_description(format);
 
     if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN) {
-        fprintf(stderr, "r300: Bad format %s in %s:%d\n", util_format_name(format),
+        fprintf(stderr, "r300: Bad format %s in %s:%d\n", util_format_short_name(format),
             __FUNCTION__, __LINE__);
         assert(0);
+        abort();
     }
 
     switch (desc->channel[0].type) {
@@ -393,8 +394,9 @@ r300_translate_vertex_data_type(enum pipe_format format) {
                     break;
                 default:
                     fprintf(stderr, "r300: Bad format %s in %s:%d\n",
-                        util_format_name(format), __FUNCTION__, __LINE__);
+                        util_format_short_name(format), __FUNCTION__, __LINE__);
                     assert(0);
+                    abort();
             }
             break;
         /* Unsigned ints */
@@ -414,16 +416,18 @@ r300_translate_vertex_data_type(enum pipe_format format) {
                     break;
                 default:
                     fprintf(stderr, "r300: Bad format %s in %s:%d\n",
-                        util_format_name(format), __FUNCTION__, __LINE__);
+                        util_format_short_name(format), __FUNCTION__, __LINE__);
                     fprintf(stderr, "r300: desc->channel[0].size == %d\n",
                         desc->channel[0].size);
                     assert(0);
+                    abort();
             }
             break;
         default:
             fprintf(stderr, "r300: Bad format %s in %s:%d\n",
-                util_format_name(format), __FUNCTION__, __LINE__);
+                util_format_short_name(format), __FUNCTION__, __LINE__);
             assert(0);
+            abort();
     }
 
     if (desc->channel[0].type == UTIL_FORMAT_TYPE_SIGNED) {
@@ -439,20 +443,29 @@ r300_translate_vertex_data_type(enum pipe_format format) {
 static INLINE uint16_t
 r300_translate_vertex_data_swizzle(enum pipe_format format) {
     const struct util_format_description *desc = util_format_description(format);
+    unsigned i, swizzle = 0;
 
     assert(format);
 
     if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN) {
         fprintf(stderr, "r300: Bad format %s in %s:%d\n",
-            util_format_name(format), __FUNCTION__, __LINE__);
+            util_format_short_name(format), __FUNCTION__, __LINE__);
         return 0;
     }
 
-    return ((desc->swizzle[0] << R300_SWIZZLE_SELECT_X_SHIFT) |
-            (desc->swizzle[1] << R300_SWIZZLE_SELECT_Y_SHIFT) |
-            (desc->swizzle[2] << R300_SWIZZLE_SELECT_Z_SHIFT) |
-            (desc->swizzle[3] << R300_SWIZZLE_SELECT_W_SHIFT) |
-            (0xf << R300_WRITE_ENA_SHIFT));
+    for (i = 0; i < desc->nr_channels; i++) {
+        swizzle |=
+            MIN2(desc->swizzle[i], R300_SWIZZLE_SELECT_FP_ONE) << (3*i);
+    }
+    /* Set (0,0,0,1) in unused components. */
+    for (; i < 3; i++) {
+        swizzle |= R300_SWIZZLE_SELECT_FP_ZERO << (3*i);
+    }
+    for (; i < 4; i++) {
+        swizzle |= R300_SWIZZLE_SELECT_FP_ONE << (3*i);
+    }
+
+    return swizzle | (0xf << R300_WRITE_ENA_SHIFT);
 }
 
 #endif /* R300_STATE_INLINES_H */