softpipe: enable new blend functionality
authorRoland Scheidegger <sroland@vmware.com>
Mon, 25 Jan 2010 19:20:52 +0000 (20:20 +0100)
committerRoland Scheidegger <sroland@vmware.com>
Mon, 25 Jan 2010 19:20:52 +0000 (20:20 +0100)
works with tests/drawbuffers2

src/gallium/drivers/softpipe/sp_quad_blend.c
src/gallium/drivers/softpipe/sp_screen.c

index abca3233149bb54c3ffcc59b85b0fdf6c633fe61..a1fe5192b03897dc9d57679adcda4646a903f0af 100644 (file)
@@ -224,7 +224,8 @@ logicop_quad(struct quad_stage *qs,
 static void
 blend_quad(struct quad_stage *qs, 
            float (*quadColor)[4],
-           float (*dest)[4])
+           float (*dest)[4],
+           unsigned cbuf)
 {
    static const float zero[4] = { 0, 0, 0, 0 };
    static const float one[4] = { 1, 1, 1, 1 };
@@ -234,7 +235,7 @@ blend_quad(struct quad_stage *qs,
    /*
     * Compute src/first term RGB
     */
-   switch (softpipe->blend->rt[0].rgb_src_factor) {
+   switch (softpipe->blend->rt[cbuf].rgb_src_factor) {
    case PIPE_BLENDFACTOR_ONE:
       VEC4_COPY(source[0], quadColor[0]); /* R */
       VEC4_COPY(source[1], quadColor[1]); /* G */
@@ -384,7 +385,7 @@ blend_quad(struct quad_stage *qs,
    /*
     * Compute src/first term A
     */
-   switch (softpipe->blend->rt[0].alpha_src_factor) {
+   switch (softpipe->blend->rt[cbuf].alpha_src_factor) {
    case PIPE_BLENDFACTOR_ONE:
       VEC4_COPY(source[3], quadColor[3]); /* A */
       break;
@@ -453,7 +454,7 @@ blend_quad(struct quad_stage *qs,
    /*
     * Compute dest/second term RGB
     */
-   switch (softpipe->blend->rt[0].rgb_dst_factor) {
+   switch (softpipe->blend->rt[cbuf].rgb_dst_factor) {
    case PIPE_BLENDFACTOR_ONE:
       /* dest = dest * 1   NO-OP, leave dest as-is */
       break;
@@ -593,7 +594,7 @@ blend_quad(struct quad_stage *qs,
    /*
     * Compute dest/second term A
     */
-   switch (softpipe->blend->rt[0].alpha_dst_factor) {
+   switch (softpipe->blend->rt[cbuf].alpha_dst_factor) {
    case PIPE_BLENDFACTOR_ONE:
       /* dest = dest * 1   NO-OP, leave dest as-is */
       break;
@@ -656,7 +657,7 @@ blend_quad(struct quad_stage *qs,
    /*
     * Combine RGB terms
     */
-   switch (softpipe->blend->rt[0].rgb_func) {
+   switch (softpipe->blend->rt[cbuf].rgb_func) {
    case PIPE_BLEND_ADD:
       VEC4_ADD_SAT(quadColor[0], source[0], dest[0]); /* R */
       VEC4_ADD_SAT(quadColor[1], source[1], dest[1]); /* G */
@@ -689,7 +690,7 @@ blend_quad(struct quad_stage *qs,
    /*
     * Combine A terms
     */
-   switch (softpipe->blend->rt[0].alpha_func) {
+   switch (softpipe->blend->rt[cbuf].alpha_func) {
    case PIPE_BLEND_ADD:
       VEC4_ADD_SAT(quadColor[3], source[3], dest[3]); /* A */
       break;
@@ -711,26 +712,24 @@ blend_quad(struct quad_stage *qs,
 }
 
 static void
-colormask_quad(struct quad_stage *qs,
+colormask_quad(unsigned colormask,
                float (*quadColor)[4],
                float (*dest)[4])
 {
-   struct softpipe_context *softpipe = qs->softpipe;
-
    /* R */
-   if (!(softpipe->blend->rt[0].colormask & PIPE_MASK_R))
+   if (!(colormask & PIPE_MASK_R))
       COPY_4V(quadColor[0], dest[0]);
 
    /* G */
-   if (!(softpipe->blend->rt[0].colormask & PIPE_MASK_G))
+   if (!(colormask & PIPE_MASK_G))
       COPY_4V(quadColor[1], dest[1]);
 
    /* B */
-   if (!(softpipe->blend->rt[0].colormask & PIPE_MASK_B))
+   if (!(colormask & PIPE_MASK_B))
       COPY_4V(quadColor[2], dest[2]);
 
    /* A */
-   if (!(softpipe->blend->rt[0].colormask & PIPE_MASK_A))
+   if (!(colormask & PIPE_MASK_A))
       COPY_4V(quadColor[3], dest[3]);
 }
 
@@ -773,12 +772,12 @@ blend_fallback(struct quad_stage *qs,
          if (blend->logicop_enable) {
             logicop_quad( qs, quadColor, dest );
          }
-         else if (blend->rt[0].blend_enable) {
-            blend_quad( qs, quadColor, dest );
+         else if (blend->rt[cbuf].blend_enable) {
+            blend_quad( qs, quadColor, dest, cbuf );
          }
 
-         if (blend->rt[0].colormask != 0xf)
-            colormask_quad( qs, quadColor, dest );
+         if (blend->rt[cbuf].colormask != 0xf)
+            colormask_quad( blend->rt[cbuf].colormask, quadColor, dest);
    
          /* Output color values
           */
index bd3532de4f445f1b90ad4581c5a3c11619e5714a..e36f9ec5dab869ac90d961aa64fc1e3da8d03d0a 100644 (file)
@@ -91,6 +91,10 @@ softpipe_get_param(struct pipe_screen *screen, int param)
       return 1;
    case PIPE_CAP_BLEND_EQUATION_SEPARATE:
       return 1;
+   case PIPE_CAP_INDEP_BLEND_ENABLE:
+      return 1;
+   case PIPE_CAP_INDEP_BLEND_FUNC:
+      return 1;
    default:
       return 0;
    }