Merge commit 'origin/perrtblend'
[mesa.git] / src / gallium / drivers / r300 / r300_state.c
index b1c9aebd28029a32304d6a77401d48d099231702..3cdcf94274c041c89110fcf7be67a41137e3039f 100644 (file)
@@ -163,15 +163,15 @@ static void* r300_create_blend_state(struct pipe_context* pipe,
 {
     struct r300_blend_state* blend = CALLOC_STRUCT(r300_blend_state);
 
-    if (state->blend_enable)
+    if (state->rt[0].blend_enable)
     {
-        unsigned eqRGB = state->rgb_func;
-        unsigned srcRGB = state->rgb_src_factor;
-        unsigned dstRGB = state->rgb_dst_factor;
+        unsigned eqRGB = state->rt[0].rgb_func;
+        unsigned srcRGB = state->rt[0].rgb_src_factor;
+        unsigned dstRGB = state->rt[0].rgb_dst_factor;
 
-        unsigned eqA = state->alpha_func;
-        unsigned srcA = state->alpha_src_factor;
-        unsigned dstA = state->alpha_dst_factor;
+        unsigned eqA = state->rt[0].alpha_func;
+        unsigned srcA = state->rt[0].alpha_src_factor;
+        unsigned dstA = state->rt[0].alpha_dst_factor;
 
         /* despite the name, ALPHA_BLEND_ENABLE has nothing to do with alpha,
          * this is just the crappy D3D naming */
@@ -289,16 +289,16 @@ static void* r300_create_blend_state(struct pipe_context* pipe,
     }
 
     /* Color Channel Mask */
-    if (state->colormask & PIPE_MASK_R) {
+    if (state->rt[0].colormask & PIPE_MASK_R) {
         blend->color_channel_mask |= RB3D_COLOR_CHANNEL_MASK_RED_MASK0;
     }
-    if (state->colormask & PIPE_MASK_G) {
+    if (state->rt[0].colormask & PIPE_MASK_G) {
         blend->color_channel_mask |= RB3D_COLOR_CHANNEL_MASK_GREEN_MASK0;
     }
-    if (state->colormask & PIPE_MASK_B) {
+    if (state->rt[0].colormask & PIPE_MASK_B) {
         blend->color_channel_mask |= RB3D_COLOR_CHANNEL_MASK_BLUE_MASK0;
     }
-    if (state->colormask & PIPE_MASK_A) {
+    if (state->rt[0].colormask & PIPE_MASK_A) {
         blend->color_channel_mask |= RB3D_COLOR_CHANNEL_MASK_ALPHA_MASK0;
     }
 
@@ -487,20 +487,30 @@ static void
     struct r300_context* r300 = r300_context(pipe);
     uint32_t zbuffer_bpp = 0;
 
+    r300->fb_state.size = (10 * state->nr_cbufs) +
+        (2 * (4 - state->nr_cbufs)) +
+        (state->zsbuf ? 10 : 0) + 6;
+
+    if (state->nr_cbufs > 4) {
+        debug_printf("r300: Implementation error: Too many MRTs in %s, "
+            "refusing to bind framebuffer state!\n", __FUNCTION__);
+        return;
+    }
+
     if (r300->draw) {
         draw_flush(r300->draw);
     }
 
-    r300->framebuffer_state = *state;
+    r300->fb_state.state = state;
 
     /* Don't rely on the order of states being set for the first time. */
-    r300->dirty_state |= R300_NEW_FRAMEBUFFERS;
-
+    /* XXX wait what */
     r300->blend_state.dirty = TRUE;
     r300->dsa_state.dirty = TRUE;
+    r300->fb_state.dirty = TRUE;
     r300->scissor_state.dirty = TRUE;
 
-    /* Polyfon offset depends on the zbuffer bit depth. */
+    /* Polygon offset depends on the zbuffer bit depth. */
     if (state->zsbuf && r300->polygon_offset_enabled) {
         switch (util_format_get_blocksize(state->zsbuf->texture->format)) {
             case 2: