r300g: fix blending default state + alpha separate.
authorDave Airlie <airlied@redhat.com>
Sun, 11 Oct 2009 09:12:24 +0000 (19:12 +1000)
committerDave Airlie <airlied@redhat.com>
Sun, 11 Oct 2009 09:30:23 +0000 (19:30 +1000)
this makes the default state same as r300

src/gallium/drivers/r300/r300_state.c

index 88cb9af6fb7bbe00404549ce69edcbf504cd246e..3cef285dee8873dae218b2f97204a8580001cf82 100644 (file)
@@ -46,23 +46,46 @@ static void* r300_create_blend_state(struct pipe_context* pipe,
 {
     struct r300_blend_state* blend = CALLOC_STRUCT(r300_blend_state);
 
+    {
+       unsigned eqRGB = state->rgb_func;
+       unsigned srcRGB = state->rgb_src_factor;
+       unsigned dstRGB = state->rgb_dst_factor;
+
+       unsigned eqA = state->alpha_func;
+       unsigned srcA = state->alpha_src_factor;
+       unsigned dstA = state->alpha_dst_factor;
+
+       if (srcA != srcRGB ||
+           dstA != dstRGB ||
+           eqA != eqRGB) {
+           blend->alpha_blend_control =
+               r300_translate_blend_function(eqA) |
+               (r300_translate_blend_factor(srcA) <<
+                    R300_SRC_BLEND_SHIFT) |
+                (r300_translate_blend_factor(dstA) <<
+                R300_DST_BLEND_SHIFT);
+           blend->blend_control |= R300_ALPHA_BLEND_ENABLE |
+               R300_SEPARATE_ALPHA_ENABLE;
+       } else {
+           blend->alpha_blend_control = R300_COMB_FCN_ADD_CLAMP |
+               (R300_BLEND_GL_ONE << R300_SRC_BLEND_SHIFT) |
+               (R300_BLEND_GL_ZERO << R300_DST_BLEND_SHIFT);
+       }
+    }
     if (state->blend_enable) {
         /* XXX for now, always do separate alpha...
          * is it faster to do it with one reg? */
-        blend->blend_control = R300_ALPHA_BLEND_ENABLE |
-                R300_SEPARATE_ALPHA_ENABLE |
-                R300_READ_ENABLE |
+        blend->blend_control |= R300_READ_ENABLE |
                 r300_translate_blend_function(state->rgb_func) |
                 (r300_translate_blend_factor(state->rgb_src_factor) <<
                     R300_SRC_BLEND_SHIFT) |
                 (r300_translate_blend_factor(state->rgb_dst_factor) <<
                     R300_DST_BLEND_SHIFT);
-        blend->alpha_blend_control =
-                r300_translate_blend_function(state->alpha_func) |
-                (r300_translate_blend_factor(state->alpha_src_factor) <<
-                    R300_SRC_BLEND_SHIFT) |
-                (r300_translate_blend_factor(state->alpha_dst_factor) <<
-                    R300_DST_BLEND_SHIFT);
+    } else {
+       blend->blend_control = 
+           R300_COMB_FCN_ADD_CLAMP |
+           (R300_BLEND_GL_ONE << R300_SRC_BLEND_SHIFT) |
+           (R300_BLEND_GL_ZERO << R300_DST_BLEND_SHIFT);
     }
 
     /* PIPE_LOGICOP_* don't need to be translated, fortunately. */