Enable GL_EXT_blend_subtract and GL_NV_blend_square.
authorIan Romanick <idr@us.ibm.com>
Fri, 4 Jun 2004 00:46:23 +0000 (00:46 +0000)
committerIan Romanick <idr@us.ibm.com>
Fri, 4 Jun 2004 00:46:23 +0000 (00:46 +0000)
GL_EXT_blend_subtract was already enabled via GL_ARB_imaging, but now
one of the added modes is supported in hardware.  GL_NV_blend_square
was tested with progs/tests/blendsquare on an Rage128 Pro with PCI ID
1002:5046.  I know there are some differences with some versions of
the chip.

src/mesa/drivers/dri/r128/r128_context.c
src/mesa/drivers/dri/r128/r128_state.c
src/mesa/drivers/dri/r128/server/r128_reg.h

index 012840effe6a8f886aaeeca4380c25e617710a8d..8075270a8c9f151dbed47808f3d0ad486b86b615 100644 (file)
@@ -74,8 +74,10 @@ static const char * const card_extensions[] =
    "GL_ARB_texture_compression",
    "GL_ARB_texture_env_add",
    "GL_ARB_texture_mirrored_repeat",
+   "GL_EXT_blend_subtract",
    "GL_EXT_texture_edge_clamp",
    "GL_MESA_ycbcr_texture",
+   "GL_NV_blend_square",
    "GL_SGIS_generate_mipmap",
    NULL
 };
index e27e542a7d2ec01fda2998db6dcd5c4c97b86948..f7b30dead2243b62bba4198703ec3321cea9bcc1 100644 (file)
@@ -56,6 +56,76 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
  * Alpha blending
  */
 
+
+/**
+ * Calculate the hardware blend factor setting.  This same function is used
+ * for source and destination of both alpha and RGB.  
+ *
+ * \returns
+ * The hardware register value for the specified blend factor.  This value
+ * will need to be shifted into the correct position for either source or
+ * destination factor.
+ *
+ * \todo
+ * Since the two cases where source and destination are handled differently
+ * are essentially error cases, they should never happen.  Determine if these
+ * cases can be removed.
+ */
+static int blend_factor( r128ContextPtr rmesa, GLenum factor, GLboolean is_src )
+{
+   int   func;
+
+   switch ( factor ) {
+   case GL_ZERO:
+      func = R128_ALPHA_BLEND_ZERO;
+      break;
+   case GL_ONE:
+      func = R128_ALPHA_BLEND_ONE;
+      break;
+
+   case GL_SRC_COLOR:
+      func = R128_ALPHA_BLEND_SRCCOLOR;
+      break;
+   case GL_ONE_MINUS_SRC_COLOR:
+      func = R128_ALPHA_BLEND_INVSRCCOLOR;
+      break;
+   case GL_SRC_ALPHA:
+      func = R128_ALPHA_BLEND_SRCALPHA;
+      break;
+   case GL_ONE_MINUS_SRC_ALPHA:
+      func = R128_ALPHA_BLEND_INVSRCALPHA;
+      break;
+   case GL_SRC_ALPHA_SATURATE:
+      func = (is_src) ? R128_ALPHA_BLEND_SAT : R128_ALPHA_BLEND_ZERO;
+      break;
+
+   case GL_DST_COLOR:
+      func = R128_ALPHA_BLEND_DSTCOLOR;
+      break;
+   case GL_ONE_MINUS_DST_COLOR:
+      func = R128_ALPHA_BLEND_INVDSTCOLOR;
+      break;
+   case GL_DST_ALPHA:
+      func = R128_ALPHA_BLEND_DSTALPHA;
+      break;
+   case GL_ONE_MINUS_DST_ALPHA:
+      func = R128_ALPHA_BLEND_INVDSTALPHA;
+      break;
+
+   case GL_CONSTANT_COLOR:
+   case GL_ONE_MINUS_CONSTANT_COLOR:
+   case GL_CONSTANT_ALPHA:
+   case GL_ONE_MINUS_CONSTANT_ALPHA:
+   default:
+      FALLBACK( rmesa, R128_FALLBACK_BLEND_FUNC, GL_TRUE );
+      func = (is_src) ? R128_ALPHA_BLEND_ONE : R128_ALPHA_BLEND_ZERO;
+      break;
+   }
+   
+   return func;
+}
+
+
 static void r128UpdateAlphaMode( GLcontext *ctx )
 {
    r128ContextPtr rmesa = R128_CONTEXT(ctx);
@@ -105,67 +175,24 @@ static void r128UpdateAlphaMode( GLcontext *ctx )
    FALLBACK( rmesa, R128_FALLBACK_BLEND_FUNC, GL_FALSE );
 
    if ( ctx->Color.BlendEnabled ) {
-      a &= ~(R128_ALPHA_BLEND_SRC_MASK | R128_ALPHA_BLEND_DST_MASK);
-
-      switch ( ctx->Color.BlendSrcRGB ) {
-      case GL_ZERO:
-        a |= R128_ALPHA_BLEND_SRC_ZERO;
-        break;
-      case GL_ONE:
-        a |= R128_ALPHA_BLEND_SRC_ONE;
-        break;
-      case GL_DST_COLOR:
-        a |= R128_ALPHA_BLEND_SRC_DESTCOLOR;
-        break;
-      case GL_ONE_MINUS_DST_COLOR:
-        a |= R128_ALPHA_BLEND_SRC_INVDESTCOLOR;
-        break;
-      case GL_SRC_ALPHA:
-        a |= R128_ALPHA_BLEND_SRC_SRCALPHA;
-        break;
-      case GL_ONE_MINUS_SRC_ALPHA:
-        a |= R128_ALPHA_BLEND_SRC_INVSRCALPHA;
-        break;
-      case GL_DST_ALPHA:
-        a |= R128_ALPHA_BLEND_SRC_DESTALPHA;
-        break;
-      case GL_ONE_MINUS_DST_ALPHA:
-        a |= R128_ALPHA_BLEND_SRC_INVDESTALPHA;
-        break;
-      case GL_SRC_ALPHA_SATURATE:
-        a |= R128_ALPHA_BLEND_SRC_SRCALPHASAT;
-        break;
-      default:
-         FALLBACK( rmesa, R128_FALLBACK_BLEND_FUNC, GL_TRUE );
-      }
-
-      switch ( ctx->Color.BlendDstRGB ) {
-      case GL_ZERO:
-        a |= R128_ALPHA_BLEND_DST_ZERO;
-        break;
-      case GL_ONE:
-        a |= R128_ALPHA_BLEND_DST_ONE;
-        break;
-      case GL_SRC_COLOR:
-        a |= R128_ALPHA_BLEND_DST_SRCCOLOR;
-        break;
-      case GL_ONE_MINUS_SRC_COLOR:
-        a |= R128_ALPHA_BLEND_DST_INVSRCCOLOR;
-        break;
-      case GL_SRC_ALPHA:
-        a |= R128_ALPHA_BLEND_DST_SRCALPHA;
-        break;
-      case GL_ONE_MINUS_SRC_ALPHA:
-        a |= R128_ALPHA_BLEND_DST_INVSRCALPHA;
-        break;
-      case GL_DST_ALPHA:
-        a |= R128_ALPHA_BLEND_DST_DESTALPHA;
+      a &= ~((R128_ALPHA_BLEND_MASK << R128_ALPHA_BLEND_SRC_SHIFT) |
+            (R128_ALPHA_BLEND_MASK << R128_ALPHA_BLEND_DST_SHIFT)
+            | R128_ALPHA_COMB_FCN_MASK);
+
+      a |= blend_factor( rmesa, ctx->Color.BlendSrcRGB, GL_TRUE ) 
+         << R128_ALPHA_BLEND_SRC_SHIFT;
+      a |= blend_factor( rmesa, ctx->Color.BlendDstRGB, GL_FALSE ) 
+         << R128_ALPHA_BLEND_DST_SHIFT;
+
+      switch (ctx->Color.BlendEquationRGB) {
+      case GL_FUNC_ADD:
+        a |= R128_ALPHA_COMB_ADD_CLAMP;
         break;
-      case GL_ONE_MINUS_DST_ALPHA:
-        a |= R128_ALPHA_BLEND_DST_INVDESTALPHA;
+      case GL_FUNC_SUBTRACT:
+        a |= R128_ALPHA_COMB_SUB_SRC_DST_CLAMP;
         break;
       default:
-         FALLBACK( rmesa, R128_FALLBACK_BLEND_FUNC, GL_TRUE );
+        FALLBACK( rmesa, R128_FALLBACK_BLEND_EQ, GL_TRUE );
       }
 
       t |=  R128_ALPHA_ENABLE;
@@ -208,7 +235,7 @@ static void r128DDBlendEquationSeparate( GLcontext *ctx,
 
    /* Can only do blend addition, not min, max, subtract, etc. */
    FALLBACK( R128_CONTEXT(ctx), R128_FALLBACK_BLEND_EQ,
-            modeRGB != GL_FUNC_ADD);
+            (modeRGB != GL_FUNC_ADD) && (modeRGB != GL_FUNC_SUBTRACT));
 
    rmesa->new_state |= R128_NEW_ALPHA;
 }
@@ -1119,8 +1146,8 @@ void r128DDInitState( r128ContextPtr rmesa )
                                          R128_MISC_SCALE_PIX_REPLICATE |
                                          R128_ALPHA_COMB_ADD_CLAMP |
                                          R128_FOG_VERTEX |
-                                         R128_ALPHA_BLEND_SRC_ONE |
-                                         R128_ALPHA_BLEND_DST_ZERO |
+                                         (R128_ALPHA_BLEND_ONE << R128_ALPHA_BLEND_SRC_SHIFT) |
+                                         (R128_ALPHA_BLEND_ZERO << R128_ALPHA_BLEND_DST_SHIFT) |
                                          R128_ALPHA_TEST_ALWAYS);
 
    rmesa->setup.texture_clr_cmp_clr_c = 0x00000000;
@@ -1165,8 +1192,8 @@ void r128DDInitState( r128ContextPtr rmesa )
                                 R128_SCALE_PIX_REPLICATE |
                                 R128_ALPHA_COMB_ADD_CLAMP |
                                 R128_FOG_VERTEX |
-                                R128_ALPHA_BLEND_SRC_ONE |
-                                R128_ALPHA_BLEND_DST_ZERO |
+                                (R128_ALPHA_BLEND_ONE << R128_ALPHA_BLEND_SRC_SHIFT) |
+                                (R128_ALPHA_BLEND_ZERO << R128_ALPHA_BLEND_DST_SHIFT) |
                                 R128_ALPHA_TEST_ALWAYS |
                                 R128_COMPOSITE_SHADOW_CMP_EQUAL |
                                 R128_TEX_MAP_ALPHA_IN_TEXTURE |
index 7ec4004492c9be678e1d0ccfdfa08e728df167ed..00f5041c11dc6d33d31cc9e2f72a7f0f23786c13 100644 (file)
 #       define R128_TEX_CACHE_PALLETE_MODE        (1  << 11)
 #       define R128_ALPHA_COMB_ADD_CLAMP          (0  << 12)
 #       define R128_ALPHA_COMB_ADD_NCLAMP         (1  << 12)
-#       define R128_ALPHA_COMB_SUB_DST_SRC_CLAMP  (2  << 12)
-#       define R128_ALPHA_COMB_SUB_DST_SRC_NCLAMP (3  << 12)
+#       define R128_ALPHA_COMB_SUB_SRC_DST_CLAMP  (2  << 12)
+#       define R128_ALPHA_COMB_SUB_SRC_DST_NCLAMP (3  << 12)
+#       define R128_ALPHA_COMB_FCN_MASK           (3  << 12)
+#       define R128_FOG_VERTEX                    (0  << 14)
 #       define R128_FOG_TABLE                     (1  << 14)
 #       define R128_SIGNED_DST_CLAMP              (1  << 15)
-#       define R128_ALPHA_BLEND_SRC_ZERO          (0  << 16)
-#       define R128_ALPHA_BLEND_SRC_ONE           (1  << 16)
-#       define R128_ALPHA_BLEND_SRC_SRCCOLOR      (2  << 16)
-#       define R128_ALPHA_BLEND_SRC_INVSRCCOLOR   (3  << 16)
-#       define R128_ALPHA_BLEND_SRC_SRCALPHA      (4  << 16)
-#       define R128_ALPHA_BLEND_SRC_INVSRCALPHA   (5  << 16)
-#       define R128_ALPHA_BLEND_SRC_DSTALPHA      (6  << 16)
-#       define R128_ALPHA_BLEND_SRC_INVDSTALPHA   (7  << 16)
-#       define R128_ALPHA_BLEND_SRC_DSTCOLOR      (8  << 16)
-#       define R128_ALPHA_BLEND_SRC_INVDSTCOLOR   (9  << 16)
-#       define R128_ALPHA_BLEND_SRC_SAT           (10 << 16)
-#       define R128_ALPHA_BLEND_SRC_BLEND         (11 << 16)
-#       define R128_ALPHA_BLEND_SRC_INVBLEND      (12 << 16)
-#       define R128_ALPHA_BLEND_DST_ZERO          (0  << 20)
-#       define R128_ALPHA_BLEND_DST_ONE           (1  << 20)
-#       define R128_ALPHA_BLEND_DST_SRCCOLOR      (2  << 20)
-#       define R128_ALPHA_BLEND_DST_INVSRCCOLOR   (3  << 20)
-#       define R128_ALPHA_BLEND_DST_SRCALPHA      (4  << 20)
-#       define R128_ALPHA_BLEND_DST_INVSRCALPHA   (5  << 20)
-#       define R128_ALPHA_BLEND_DST_DSTALPHA      (6  << 20)
-#       define R128_ALPHA_BLEND_DST_INVDSTALPHA   (7  << 20)
-#       define R128_ALPHA_BLEND_DST_DSTCOLOR      (8  << 20)
-#       define R128_ALPHA_BLEND_DST_INVDSTCOLOR   (9  << 20)
+
+#       define R128_ALPHA_BLEND_ZERO              (0 )
+#       define R128_ALPHA_BLEND_ONE               (1 )
+#       define R128_ALPHA_BLEND_SRCCOLOR          (2 )
+#       define R128_ALPHA_BLEND_INVSRCCOLOR       (3 )
+#       define R128_ALPHA_BLEND_SRCALPHA          (4 )
+#       define R128_ALPHA_BLEND_INVSRCALPHA       (5 )
+#       define R128_ALPHA_BLEND_DSTALPHA          (6 )
+#       define R128_ALPHA_BLEND_INVDSTALPHA       (7 )
+#       define R128_ALPHA_BLEND_DSTCOLOR          (8 )
+#       define R128_ALPHA_BLEND_INVDSTCOLOR       (9 )
+#       define R128_ALPHA_BLEND_SAT               (10) /* aka SRCALPHASAT */
+#       define R128_ALPHA_BLEND_BLEND             (11) /* aka BOTHSRCALPHA */
+#       define R128_ALPHA_BLEND_INVBLEND          (12) /* aka BOTHINVSRCALPHA */
+#       define R128_ALPHA_BLEND_MASK              (15)
+
+#       define R128_ALPHA_BLEND_SRC_SHIFT         (16)
+#       define R128_ALPHA_BLEND_DST_SHIFT         (20)
+
 #       define R128_ALPHA_TEST_NEVER              (0  << 24)
 #       define R128_ALPHA_TEST_LESS               (1  << 24)
 #       define R128_ALPHA_TEST_LESSEQUAL          (2  << 24)
 #       define R128_ALPHA_TEST_GREATER            (5  << 24)
 #       define R128_ALPHA_TEST_NEQUAL             (6  << 24)
 #       define R128_ALPHA_TEST_ALWAYS             (7  << 24)
+#       define R128_ALPHA_TEST_MASK               (7  << 24)
 #       define R128_COMPOSITE_SHADOW_CMP_EQUAL    (0  << 28)
 #       define R128_COMPOSITE_SHADOW_CMP_NEQUAL   (1  << 28)
 #       define R128_COMPOSITE_SHADOW              (1  << 29)
 #       define R128_MISC_SCALE_3D_TEXMAP_SHADE      (2  <<  8)
 #       define R128_MISC_SCALE_PIX_BLEND            (0  << 10)
 #       define R128_MISC_SCALE_PIX_REPLICATE        (1  << 10)
-#       define R128_ALPHA_COMB_ADD_CLAMP            (0  << 12)
-#       define R128_ALPHA_COMB_ADD_NO_CLAMP         (1  << 12)
-#       define R128_ALPHA_COMB_SUB_SRC_DST_CLAMP    (2  << 12)
-#       define R128_ALPHA_COMB_SUB_SRC_DST_NO_CLAMP (3  << 12)
-#       define R128_FOG_VERTEX                      (0  << 14)
-#       define R128_FOG_TABLE                       (1  << 14)
-#       define R128_ALPHA_BLEND_SRC_ZERO            (0  << 16)
-#       define R128_ALPHA_BLEND_SRC_ONE             (1  << 16)
-#       define R128_ALPHA_BLEND_SRC_SRCCOLOR        (2  << 16)
-#       define R128_ALPHA_BLEND_SRC_INVSRCCOLOR     (3  << 16)
-#       define R128_ALPHA_BLEND_SRC_SRCALPHA        (4  << 16)
-#       define R128_ALPHA_BLEND_SRC_INVSRCALPHA     (5  << 16)
-#       define R128_ALPHA_BLEND_SRC_DESTALPHA       (6  << 16)
-#       define R128_ALPHA_BLEND_SRC_INVDESTALPHA    (7  << 16)
-#       define R128_ALPHA_BLEND_SRC_DESTCOLOR       (8  << 16)
-#       define R128_ALPHA_BLEND_SRC_INVDESTCOLOR    (9  << 16)
-#       define R128_ALPHA_BLEND_SRC_SRCALPHASAT     (10 << 16)
-#       define R128_ALPHA_BLEND_SRC_BOTHSRCALPHA    (11 << 16)
-#       define R128_ALPHA_BLEND_SRC_BOTHINVSRCALPHA (12 << 16)
-#       define R128_ALPHA_BLEND_SRC_MASK            (15 << 16)
-#       define R128_ALPHA_BLEND_DST_ZERO            (0  << 20)
-#       define R128_ALPHA_BLEND_DST_ONE             (1  << 20)
-#       define R128_ALPHA_BLEND_DST_SRCCOLOR        (2  << 20)
-#       define R128_ALPHA_BLEND_DST_INVSRCCOLOR     (3  << 20)
-#       define R128_ALPHA_BLEND_DST_SRCALPHA        (4  << 20)
-#       define R128_ALPHA_BLEND_DST_INVSRCALPHA     (5  << 20)
-#       define R128_ALPHA_BLEND_DST_DESTALPHA       (6  << 20)
-#       define R128_ALPHA_BLEND_DST_INVDESTALPHA    (7  << 20)
-#       define R128_ALPHA_BLEND_DST_DESTCOLOR       (8  << 20)
-#       define R128_ALPHA_BLEND_DST_INVDESTCOLOR    (9  << 20)
-#       define R128_ALPHA_BLEND_DST_SRCALPHASAT     (10 << 20)
-#       define R128_ALPHA_BLEND_DST_MASK            (15 << 20)
-#       define R128_ALPHA_TEST_NEVER                (0  << 24)
-#       define R128_ALPHA_TEST_LESS                 (1  << 24)
-#       define R128_ALPHA_TEST_LESSEQUAL            (2  << 24)
-#       define R128_ALPHA_TEST_EQUAL                (3  << 24)
-#       define R128_ALPHA_TEST_GREATEREQUAL         (4  << 24)
-#       define R128_ALPHA_TEST_GREATER              (5  << 24)
-#       define R128_ALPHA_TEST_NEQUAL               (6  << 24)
-#       define R128_ALPHA_TEST_ALWAYS               (7  << 24)
-#       define R128_ALPHA_TEST_MASK                 (7  << 24)
+/* Bits [14:12] are the same as R128_SCALE_3D_CNTL */
+/* Bit  [15]    is unknown */
+/* Bits [26:16] are the same as R128_SCALE_3D_CNTL */
+/* Bits [31:27] are unknown */
+
 #define R128_TEXTURE_CLR_CMP_CLR_C        0x1ca4
 #define R128_TEXTURE_CLR_CMP_MSK_C        0x1ca8
 #define R128_FOG_COLOR_C                  0x1cac