finish remaining blend modes
authorBrian <brian.paul@tungstengraphics.com>
Tue, 16 Oct 2007 01:14:40 +0000 (19:14 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Tue, 16 Oct 2007 01:14:40 +0000 (19:14 -0600)
src/mesa/pipe/softpipe/sp_quad_blend.c

index b56e51c1041b3fd1bcb36b1846c15ac40e14c4cb..3af5ab5b29156f8f2fdb54a9e520a44309080583 100755 (executable)
@@ -259,7 +259,14 @@ blend_quad(struct quad_stage *qs, struct quad_header *quad)
       }
       break;
    case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE:
-      assert(0); /* to do */
+      {
+         const float *alpha = quad->outputs.color[3];
+         float diff[4];
+         VEC4_SUB(diff, one, dest[3]);
+         VEC4_MIN(source[0], alpha, diff); /* R */
+         VEC4_MIN(source[1], alpha, diff); /* G */
+         VEC4_MIN(source[2], alpha, diff); /* B */
+      }
       break;
    case PIPE_BLENDFACTOR_CONST_COLOR:
       {
@@ -372,16 +379,67 @@ blend_quad(struct quad_stage *qs, struct quad_header *quad)
    case PIPE_BLENDFACTOR_ONE:
       VEC4_COPY(source[3], quad->outputs.color[3]); /* A */
       break;
+   case PIPE_BLENDFACTOR_SRC_COLOR:
+      /* fall-through */
    case PIPE_BLENDFACTOR_SRC_ALPHA:
       {
          const float *alpha = quad->outputs.color[3];
          VEC4_MUL(source[3], quad->outputs.color[3], alpha); /* A */
       }
       break;
+   case PIPE_BLENDFACTOR_DST_COLOR:
+      /* fall-through */
+   case PIPE_BLENDFACTOR_DST_ALPHA:
+      VEC4_MUL(source[3], quad->outputs.color[3], dest[3]); /* A */
+      break;
+   case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE:
+      {
+         const float *alpha = quad->outputs.color[3];
+         float diff[4];
+         VEC4_SUB(diff, one, dest[3]);
+         VEC4_MIN(source[3], alpha, diff); /* A */
+      }
+      break;
+   case PIPE_BLENDFACTOR_CONST_COLOR:
+      /* fall-through */
+   case PIPE_BLENDFACTOR_CONST_ALPHA:
+      {
+         float comp[4];
+         VEC4_SCALAR(comp, softpipe->blend_color.color[3]); /* A */
+         VEC4_MUL(source[3], quad->outputs.color[3], comp); /* A */
+      }
+      break;
    case PIPE_BLENDFACTOR_ZERO:
       VEC4_COPY(source[3], zero); /* A */
       break;
-      /* XXX fill in remaining terms */
+   case PIPE_BLENDFACTOR_INV_SRC_COLOR:
+      /* fall-through */
+   case PIPE_BLENDFACTOR_INV_SRC_ALPHA:
+      {
+         float inv_alpha[4];
+         VEC4_SUB(inv_alpha, one, quad->outputs.color[3]);
+         VEC4_MUL(source[3], quad->outputs.color[3], inv_alpha); /* A */
+      }
+      break;
+   case PIPE_BLENDFACTOR_INV_DST_COLOR:
+      /* fall-through */
+   case PIPE_BLENDFACTOR_INV_DST_ALPHA:
+      {
+         float inv_alpha[4];
+         VEC4_SUB(inv_alpha, one, dest[3]);
+         VEC4_MUL(source[3], quad->outputs.color[3], inv_alpha); /* A */
+      }
+      break;
+   case PIPE_BLENDFACTOR_INV_CONST_COLOR:
+      /* fall-through */
+   case PIPE_BLENDFACTOR_INV_CONST_ALPHA:
+      {
+         float inv_comp[4];
+         /* A */
+         VEC4_SCALAR(inv_comp, 1.0f - softpipe->blend_color.color[3]);
+         VEC4_MUL(source[3], quad->outputs.color[3], inv_comp);
+      }
+      break;
    default:
       abort();
    }
@@ -394,6 +452,70 @@ blend_quad(struct quad_stage *qs, struct quad_header *quad)
    case PIPE_BLENDFACTOR_ONE:
       /* dest = dest * 1   NO-OP, leave dest as-is */
       break;
+   case PIPE_BLENDFACTOR_SRC_COLOR:
+      VEC4_MUL(dest[0], dest[0], quad->outputs.color[0]); /* R */
+      VEC4_MUL(dest[1], dest[1], quad->outputs.color[1]); /* G */
+      VEC4_MUL(dest[2], dest[2], quad->outputs.color[2]); /* B */
+      break;
+   case PIPE_BLENDFACTOR_SRC_ALPHA:
+      VEC4_MUL(dest[0], dest[0], quad->outputs.color[3]); /* R * A */
+      VEC4_MUL(dest[1], dest[1], quad->outputs.color[3]); /* G * A */
+      VEC4_MUL(dest[2], dest[2], quad->outputs.color[3]); /* B * A */
+      break;
+   case PIPE_BLENDFACTOR_DST_ALPHA:
+      VEC4_MUL(dest[0], dest[0], dest[3]); /* R * A */
+      VEC4_MUL(dest[1], dest[1], dest[3]); /* G * A */
+      VEC4_MUL(dest[2], dest[2], dest[3]); /* B * A */
+      break;
+   case PIPE_BLENDFACTOR_DST_COLOR:
+      VEC4_MUL(dest[0], dest[0], dest[0]); /* R */
+      VEC4_MUL(dest[1], dest[1], dest[1]); /* G */
+      VEC4_MUL(dest[2], dest[2], dest[2]); /* B */
+      break;
+   case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE:
+      assert(0); /* illegal */
+      break;
+   case PIPE_BLENDFACTOR_CONST_COLOR:
+      {
+         float comp[4];
+         VEC4_SCALAR(comp, softpipe->blend_color.color[0]); /* R */
+         VEC4_MUL(dest[0], dest[0], comp); /* R */
+         VEC4_SCALAR(comp, softpipe->blend_color.color[1]); /* G */
+         VEC4_MUL(dest[1], dest[1], comp); /* G */
+         VEC4_SCALAR(comp, softpipe->blend_color.color[2]); /* B */
+         VEC4_MUL(dest[2], dest[2], comp); /* B */
+      }
+      break;
+   case PIPE_BLENDFACTOR_CONST_ALPHA:
+      {
+         float comp[4];
+         VEC4_SCALAR(comp, softpipe->blend_color.color[3]); /* A */
+         VEC4_MUL(dest[0], dest[0], comp); /* R */
+         VEC4_MUL(dest[1], dest[1], comp); /* G */
+         VEC4_MUL(dest[2], dest[2], comp); /* B */
+      }
+      break;
+   case PIPE_BLENDFACTOR_ZERO:
+      VEC4_COPY(dest[0], zero); /* R */
+      VEC4_COPY(dest[1], zero); /* G */
+      VEC4_COPY(dest[2], zero); /* B */
+      break;
+   case PIPE_BLENDFACTOR_SRC1_COLOR:
+   case PIPE_BLENDFACTOR_SRC1_ALPHA:
+      /* XXX what are these? */
+      assert(0);
+      break;
+   case PIPE_BLENDFACTOR_INV_SRC_COLOR:
+      {
+         float inv_comp[4];
+         VEC4_SUB(inv_comp, one, quad->outputs.color[0]); /* R */
+         VEC4_MUL(dest[0], inv_comp, dest[0]); /* R */
+         VEC4_SUB(inv_comp, one, quad->outputs.color[1]); /* G */
+         VEC4_MUL(dest[1], inv_comp, dest[1]); /* G */
+         VEC4_SUB(inv_comp, one, quad->outputs.color[2]); /* B */
+         VEC4_MUL(dest[2], inv_comp, dest[2]); /* B */
+      }
+      break;
    case PIPE_BLENDFACTOR_INV_SRC_ALPHA:
       {
          float one_minus_alpha[QUAD_SIZE];
@@ -403,14 +525,56 @@ blend_quad(struct quad_stage *qs, struct quad_header *quad)
          VEC4_MUL(dest[2], dest[2], one_minus_alpha); /* B */
       }
       break;
-   case PIPE_BLENDFACTOR_ZERO:
-      VEC4_COPY(dest[0], zero); /* R */
-      VEC4_COPY(dest[1], zero); /* G */
-      VEC4_COPY(dest[2], zero); /* B */
+   case PIPE_BLENDFACTOR_INV_DST_ALPHA:
+      {
+         float inv_comp[4];
+         VEC4_SUB(inv_comp, one, quad->outputs.color[3]); /* A */
+         VEC4_MUL(dest[0], inv_comp, dest[0]); /* R */
+         VEC4_MUL(dest[1], inv_comp, dest[1]); /* G */
+         VEC4_MUL(dest[2], inv_comp, dest[2]); /* B */
+      }
+      break;
+   case PIPE_BLENDFACTOR_INV_DST_COLOR:
+      {
+         float inv_comp[4];
+         VEC4_SUB(inv_comp, one, dest[0]); /* R */
+         VEC4_MUL(dest[0], dest[0], inv_comp); /* R */
+         VEC4_SUB(inv_comp, one, dest[1]); /* G */
+         VEC4_MUL(dest[1], dest[1], inv_comp); /* G */
+         VEC4_SUB(inv_comp, one, dest[2]); /* B */
+         VEC4_MUL(dest[2], dest[2], inv_comp); /* B */
+      }
+      break;
+   case PIPE_BLENDFACTOR_INV_CONST_COLOR:
+      {
+         float inv_comp[4];
+         /* R */
+         VEC4_SCALAR(inv_comp, 1.0f - softpipe->blend_color.color[0]);
+         VEC4_MUL(dest[0], dest[0], inv_comp);
+         /* G */
+         VEC4_SCALAR(inv_comp, 1.0f - softpipe->blend_color.color[1]);
+         VEC4_MUL(dest[1], dest[1], inv_comp);
+         /* B */
+         VEC4_SCALAR(inv_comp, 1.0f - softpipe->blend_color.color[2]);
+         VEC4_MUL(dest[2], dest[2], inv_comp);
+      }
+      break;
+   case PIPE_BLENDFACTOR_INV_CONST_ALPHA:
+      {
+         float inv_comp[4];
+         VEC4_SCALAR(inv_comp, 1.0f - softpipe->blend_color.color[3]);
+         VEC4_MUL(dest[0], dest[0], inv_comp);
+         VEC4_MUL(dest[1], dest[1], inv_comp);
+         VEC4_MUL(dest[2], dest[2], inv_comp);
+      }
+      break;
+   case PIPE_BLENDFACTOR_INV_SRC1_COLOR:
+   case PIPE_BLENDFACTOR_INV_SRC1_ALPHA:
+      /* XXX what are these? */
+      assert(0);
       break;
-      /* XXX fill in remaining terms */
    default:
-      abort();
+      assert(0);
    }
    
    /*
@@ -420,6 +584,33 @@ blend_quad(struct quad_stage *qs, struct quad_header *quad)
    case PIPE_BLENDFACTOR_ONE:
       /* dest = dest * 1   NO-OP, leave dest as-is */
       break;
+   case PIPE_BLENDFACTOR_SRC_COLOR:
+      /* fall-through */
+   case PIPE_BLENDFACTOR_SRC_ALPHA:
+      VEC4_MUL(dest[3], dest[3], quad->outputs.color[3]); /* A * A */
+      break;
+   case PIPE_BLENDFACTOR_DST_COLOR:
+      /* fall-through */
+   case PIPE_BLENDFACTOR_DST_ALPHA:
+      VEC4_MUL(dest[3], dest[3], dest[3]); /* A */
+      break;
+   case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE:
+      assert(0); /* illegal */
+      break;
+   case PIPE_BLENDFACTOR_CONST_COLOR:
+      /* fall-through */
+   case PIPE_BLENDFACTOR_CONST_ALPHA:
+      {
+         float comp[4];
+         VEC4_SCALAR(comp, softpipe->blend_color.color[3]); /* A */
+         VEC4_MUL(dest[3], dest[3], comp); /* A */
+      }
+      break;
+   case PIPE_BLENDFACTOR_ZERO:
+      VEC4_COPY(dest[3], zero); /* A */
+      break;
+   case PIPE_BLENDFACTOR_INV_SRC_COLOR:
+      /* fall-through */
    case PIPE_BLENDFACTOR_INV_SRC_ALPHA:
       {
          float one_minus_alpha[QUAD_SIZE];
@@ -427,12 +618,26 @@ blend_quad(struct quad_stage *qs, struct quad_header *quad)
          VEC4_MUL(dest[3], dest[3], one_minus_alpha); /* A */
       }
       break;
-   case PIPE_BLENDFACTOR_ZERO:
-      VEC4_COPY(dest[3], zero); /* A */
+   case PIPE_BLENDFACTOR_INV_DST_COLOR:
+      /* fall-through */
+   case PIPE_BLENDFACTOR_INV_DST_ALPHA:
+      {
+         float inv_comp[4];
+         VEC4_SUB(inv_comp, one, dest[3]); /* A */
+         VEC4_MUL(dest[3], inv_comp, dest[3]); /* A */
+      }
+      break;
+   case PIPE_BLENDFACTOR_INV_CONST_COLOR:
+      /* fall-through */
+   case PIPE_BLENDFACTOR_INV_CONST_ALPHA:
+      {
+         float inv_comp[4];
+         VEC4_SCALAR(inv_comp, 1.0f - softpipe->blend_color.color[3]);
+         VEC4_MUL(dest[3], dest[3], inv_comp);
+      }
       break;
-      /* XXX fill in remaining terms */
    default:
-      abort();
+      assert(0);
    }
    
    /*
@@ -465,7 +670,7 @@ blend_quad(struct quad_stage *qs, struct quad_header *quad)
       VEC4_MAX(quad->outputs.color[2], source[2], dest[2]); /* B */
       break;
    default:
-      abort();
+      assert(0);
    }
    
    /*