summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2010-02-05 07:07:22 +0100
committerCorbin Simpson <[email protected]>2010-02-06 23:25:29 -0800
commitc8b34616b345d7a64d39e0ea3d4f4006af0b9740 (patch)
treeba77bc7424f487a88e252a19b6b0ae1fc37286b7 /src/gallium/drivers
parent93b9d911246e84b5f84714a87df6e28d068521b8 (diff)
r300g: fix color channel masks
glean/maskedClear passes again.
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r--src/gallium/drivers/r300/r300_state.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c
index a5c0869066c..ca4d25aed63 100644
--- a/src/gallium/drivers/r300/r300_state.c
+++ b/src/gallium/drivers/r300/r300_state.c
@@ -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;
}
}