r300g: Independent blend enables only work on r500.
authorCorbin Simpson <MostAwesomeDude@gmail.com>
Sat, 30 Jan 2010 20:33:44 +0000 (12:33 -0800)
committerCorbin Simpson <MostAwesomeDude@gmail.com>
Sat, 30 Jan 2010 20:33:44 +0000 (12:33 -0800)
src/gallium/drivers/r300/r300_screen.c
src/gallium/drivers/r300/r300_state.c

index ae3155c0ed1692710dcc909100ce113fef09c966..fa8ed581dae2711017cd6c03543e4aab71dbdf53 100644 (file)
@@ -152,7 +152,11 @@ static int r300_get_param(struct pipe_screen* pscreen, int param)
                 return 0;
             }
         case PIPE_CAP_INDEP_BLEND_ENABLE:
-            return 1;
+            if (r300screen->caps->is_r500) {
+                return 1;
+            } else {
+                return 0;
+            }
         case PIPE_CAP_INDEP_BLEND_FUNC:
             return 0;
         case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
index 829579955305faf4210c1cad6d078fb074edf34d..a5c0869066c70121c83a1003089782eb8bfa48c7 100644 (file)
@@ -161,6 +161,7 @@ static boolean blend_discard_if_src_alpha_color_1(unsigned srcRGB, unsigned srcA
 static void* r300_create_blend_state(struct pipe_context* pipe,
                                      const struct pipe_blend_state* state)
 {
+    struct r300_screen* r300screen = r300_screen(pipe->screen);
     struct r300_blend_state* blend = CALLOC_STRUCT(r300_blend_state);
 
     if (state->rt[0].blend_enable)
@@ -290,10 +291,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;
-    if (state->independent_blend_enable) {
-        blend->color_channel_mask |= (state->rt[1].colormask << 4);
-        blend->color_channel_mask |= (state->rt[2].colormask << 8);
-        blend->color_channel_mask |= (state->rt[3].colormask << 12);
+    if (r300screen->caps->is_r500 && state->independent_blend_enable) {
+        if (state->rt[1].blend_enable) {
+            blend->color_channel_mask |= (state->rt[1].colormask << 4);
+        }
+        if (state->rt[2].blend_enable) {
+            blend->color_channel_mask |= (state->rt[2].colormask << 8);
+        }
+        if (state->rt[3].blend_enable) {
+            blend->color_channel_mask |= (state->rt[3].colormask << 12);
+        }
     }
 
     if (state->dither) {