st/xorg: fix most of the composition modes
authorZack Rusin <zackr@vmware.com>
Sun, 11 Oct 2009 10:08:42 +0000 (06:08 -0400)
committerZack Rusin <zackr@vmware.com>
Thu, 15 Oct 2009 04:06:43 +0000 (00:06 -0400)
src/gallium/state_trackers/xorg/xorg_composite.c

index b39b395..b071921 100644 (file)
@@ -22,7 +22,7 @@ struct xorg_composite_blend {
 #define BLEND_OP_OVER 3
 static const struct xorg_composite_blend xorg_blends[] = {
    { PictOpClear,
-     PIPE_BLENDFACTOR_CONST_COLOR, PIPE_BLENDFACTOR_CONST_ALPHA,
+     PIPE_BLENDFACTOR_ZERO, PIPE_BLENDFACTOR_ZERO,
      PIPE_BLENDFACTOR_ZERO, PIPE_BLENDFACTOR_ZERO },
 
    { PictOpSrc,
@@ -34,20 +34,44 @@ static const struct xorg_composite_blend xorg_blends[] = {
      PIPE_BLENDFACTOR_ONE, PIPE_BLENDFACTOR_ONE },
 
    { PictOpOver,
-     PIPE_BLENDFACTOR_SRC_ALPHA, PIPE_BLENDFACTOR_ONE,
+     PIPE_BLENDFACTOR_ONE, PIPE_BLENDFACTOR_ONE,
      PIPE_BLENDFACTOR_INV_SRC_ALPHA, PIPE_BLENDFACTOR_INV_SRC_ALPHA },
 
    { PictOpOverReverse,
-     PIPE_BLENDFACTOR_SRC_ALPHA, PIPE_BLENDFACTOR_ONE,
-     PIPE_BLENDFACTOR_INV_SRC_ALPHA, PIPE_BLENDFACTOR_INV_SRC_ALPHA },
+     PIPE_BLENDFACTOR_INV_DST_ALPHA, PIPE_BLENDFACTOR_ONE,
+     PIPE_BLENDFACTOR_ONE, PIPE_BLENDFACTOR_INV_SRC_ALPHA },
+
+   { PictOpIn,
+     PIPE_BLENDFACTOR_DST_ALPHA, PIPE_BLENDFACTOR_ONE,
+     PIPE_BLENDFACTOR_ZERO, PIPE_BLENDFACTOR_INV_SRC_ALPHA },
+
+   { PictOpInReverse,
+     PIPE_BLENDFACTOR_ZERO, PIPE_BLENDFACTOR_ONE,
+     PIPE_BLENDFACTOR_SRC_ALPHA, PIPE_BLENDFACTOR_ONE },
+
+   { PictOpOut,
+     PIPE_BLENDFACTOR_INV_DST_ALPHA, PIPE_BLENDFACTOR_ONE,
+     PIPE_BLENDFACTOR_ZERO, PIPE_BLENDFACTOR_INV_SRC_ALPHA },
 
    { PictOpOutReverse,
-     PIPE_BLENDFACTOR_SRC_ALPHA, PIPE_BLENDFACTOR_ONE,
+     PIPE_BLENDFACTOR_ZERO, PIPE_BLENDFACTOR_ONE,
      PIPE_BLENDFACTOR_INV_SRC_ALPHA, PIPE_BLENDFACTOR_INV_SRC_ALPHA },
 
-   { PictOpAdd,
-     PIPE_BLENDFACTOR_SRC_ALPHA, PIPE_BLENDFACTOR_ONE,
+   { PictOpAtop,
+     PIPE_BLENDFACTOR_DST_ALPHA, PIPE_BLENDFACTOR_ONE,
      PIPE_BLENDFACTOR_INV_SRC_ALPHA, PIPE_BLENDFACTOR_INV_SRC_ALPHA },
+
+   { PictOpAtopReverse,
+     PIPE_BLENDFACTOR_INV_DST_ALPHA, PIPE_BLENDFACTOR_ONE,
+     PIPE_BLENDFACTOR_SRC_ALPHA, PIPE_BLENDFACTOR_INV_SRC_ALPHA },
+
+   { PictOpXor,
+     PIPE_BLENDFACTOR_INV_DST_ALPHA, PIPE_BLENDFACTOR_ONE,
+     PIPE_BLENDFACTOR_INV_SRC_ALPHA, PIPE_BLENDFACTOR_ONE },
+
+   { PictOpAdd,
+     PIPE_BLENDFACTOR_ONE, PIPE_BLENDFACTOR_ONE,
+     PIPE_BLENDFACTOR_ONE, PIPE_BLENDFACTOR_ONE },
 };
 
 
@@ -164,7 +188,7 @@ bind_blend_state(struct exa_context *exa, int op,
 
    blend_opt = blend_for_op(op);
 
-   memset(&blend, 0, sizeof(struct pipe_blend_state));
+   memset(&blend, 0, sizeof(struct pipe_blend_state)); 
    blend.blend_enable = 1;
    blend.colormask |= PIPE_MASK_RGBA;