+ boolean write_all =
+ softpipe->fs_variant->info.properties[TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS];
+
+ for (cbuf = 0; cbuf < softpipe->framebuffer.nr_cbufs; cbuf++) {
+ if (softpipe->framebuffer.cbufs[cbuf]) {
+ /* which blend/mask state index to use: */
+ const uint blend_buf = blend->independent_blend_enable ? cbuf : 0;
+ float dest[4][TGSI_QUAD_SIZE];
+ struct softpipe_cached_tile *tile
+ = sp_get_cached_tile(softpipe->cbuf_cache[cbuf],
+ quads[0]->input.x0,
+ quads[0]->input.y0, quads[0]->input.layer);
+ const boolean clamp = bqs->clamp[cbuf];
+ const float *blend_color;
+ const boolean dual_source_blend = util_blend_state_is_dual(blend, cbuf);
+ uint q, i, j;
+
+ if (clamp)
+ blend_color = softpipe->blend_color_clamped.color;
+ else
+ blend_color = softpipe->blend_color.color;
+
+ for (q = 0; q < nr; q++) {
+ struct quad_header *quad = quads[q];
+ float (*quadColor)[4];
+ float (*quadColor2)[4] = NULL;
+ float temp_quad_color[TGSI_QUAD_SIZE][4];
+ const int itx = (quad->input.x0 & (TILE_SIZE-1));
+ const int ity = (quad->input.y0 & (TILE_SIZE-1));
+
+ if (write_all) {
+ for (j = 0; j < TGSI_QUAD_SIZE; j++) {
+ for (i = 0; i < 4; i++) {
+ temp_quad_color[i][j] = quad->output.color[0][i][j];
+ }
+ }
+ quadColor = temp_quad_color;
+ } else {
+ quadColor = quad->output.color[cbuf];
+ if (dual_source_blend)
+ quadColor2 = quad->output.color[cbuf + 1];
+ }