r300g: fix color channel masks
authorMarek Olšák <maraeo@gmail.com>
Fri, 5 Feb 2010 06:07:22 +0000 (07:07 +0100)
committerCorbin Simpson <MostAwesomeDude@gmail.com>
Sun, 7 Feb 2010 07:25:29 +0000 (23:25 -0800)
glean/maskedClear passes again.

src/gallium/drivers/r300/r300_state.c

index a5c0869066c70121c83a1003089782eb8bfa48c7..ca4d25aed63c84d026cd56335ec8b0001ae99cc0 100644 (file)
@@ -155,6 +155,15 @@ static boolean blend_discard_if_src_alpha_color_1(unsigned srcRGB, unsigned srcA
             dstA == PIPE_BLENDFACTOR_ONE);
 }
 
+static unsigned bgra_cmask(unsigned mask)
+{
+    /* Gallium uses RGBA color ordering while R300 expects BGRA. */
+
+    return ((mask & PIPE_MASK_R) << 2) |
+           ((mask & PIPE_MASK_B) >> 2) |
+           (mask & (PIPE_MASK_G | PIPE_MASK_A));
+}
+
 /* Create a new blend state based on the CSO blend state.
  *
  * This encompasses alpha blending, logic/raster ops, and blend dithering. */
@@ -290,16 +299,16 @@ static void* r300_create_blend_state(struct pipe_context* pipe,
     }
 
     /* Color channel masks for all MRTs. */
-    blend->color_channel_mask = state->rt[0].colormask;
+    blend->color_channel_mask = bgra_cmask(state->rt[0].colormask);
     if (r300screen->caps->is_r500 && state->independent_blend_enable) {
         if (state->rt[1].blend_enable) {
-            blend->color_channel_mask |= (state->rt[1].colormask << 4);
+            blend->color_channel_mask |= bgra_cmask(state->rt[1].colormask) << 4;
         }
         if (state->rt[2].blend_enable) {
-            blend->color_channel_mask |= (state->rt[2].colormask << 8);
+            blend->color_channel_mask |= bgra_cmask(state->rt[2].colormask) << 8;
         }
         if (state->rt[3].blend_enable) {
-            blend->color_channel_mask |= (state->rt[3].colormask << 12);
+            blend->color_channel_mask |= bgra_cmask(state->rt[3].colormask) << 12;
         }
     }