Some initial RGB and RGBA floating point texture formats.
[mesa.git] / src / mesa / main / blend.c
index dad5184dd9207e1543afd69727b1c700e51def0c..26d87d136c0cfeeca10e3b65293d39e51b99f180 100644 (file)
  * \param sfactor source factor operator.
  * \param dfactor destination factor operator.
  *
- * \sa glBlendFunc().
- * 
- * Verifies the parameters and updates gl_colorbuffer_attrib.  On a change,
- * flushes the vertices and notifies the driver via
- * dd_function_table::BlendFunc callback.
+ * \sa glBlendFunc, glBlendFuncSeparateEXT
+ *
+ * Swizzles the inputs and calls \c glBlendFuncSeparateEXT.  This is done
+ * using the \c CurrentDispatch table in the context, so this same function
+ * can be used while compiling display lists.  Therefore, there is no need
+ * for the display list code to save and restore this function.
  */
-void
+void GLAPIENTRY
 _mesa_BlendFunc( GLenum sfactor, GLenum dfactor )
 {
-
    GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
-
-   if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE))
-      _mesa_debug(ctx, "glBlendFunc %s %s\n",
-                  _mesa_lookup_enum_by_nr(sfactor),
-                  _mesa_lookup_enum_by_nr(dfactor));
-
-   switch (sfactor) {
-      case GL_SRC_COLOR:
-      case GL_ONE_MINUS_SRC_COLOR:
-         if (!ctx->Extensions.NV_blend_square) {
-            _mesa_error( ctx, GL_INVALID_ENUM, "glBlendFunc(sfactor)" );
-            return;
-         }
-         /* fall-through */
-      case GL_ZERO:
-      case GL_ONE:
-      case GL_DST_COLOR:
-      case GL_ONE_MINUS_DST_COLOR:
-      case GL_SRC_ALPHA:
-      case GL_ONE_MINUS_SRC_ALPHA:
-      case GL_DST_ALPHA:
-      case GL_ONE_MINUS_DST_ALPHA:
-      case GL_SRC_ALPHA_SATURATE:
-      case GL_CONSTANT_COLOR:
-      case GL_ONE_MINUS_CONSTANT_COLOR:
-      case GL_CONSTANT_ALPHA:
-      case GL_ONE_MINUS_CONSTANT_ALPHA:
-         break;
-      default:
-         _mesa_error( ctx, GL_INVALID_ENUM, "glBlendFunc(sfactor)" );
-         return;
-   }
-
-   switch (dfactor) {
-      case GL_DST_COLOR:
-      case GL_ONE_MINUS_DST_COLOR:
-         if (!ctx->Extensions.NV_blend_square) {
-            _mesa_error( ctx, GL_INVALID_ENUM, "glBlendFunc(dfactor)" );
-            return;
-         }
-         /* fall-through */
-      case GL_ZERO:
-      case GL_ONE:
-      case GL_SRC_COLOR:
-      case GL_ONE_MINUS_SRC_COLOR:
-      case GL_SRC_ALPHA:
-      case GL_ONE_MINUS_SRC_ALPHA:
-      case GL_DST_ALPHA:
-      case GL_ONE_MINUS_DST_ALPHA:
-      case GL_CONSTANT_COLOR:
-      case GL_ONE_MINUS_CONSTANT_COLOR:
-      case GL_CONSTANT_ALPHA:
-      case GL_ONE_MINUS_CONSTANT_ALPHA:
-         break;
-      default:
-         _mesa_error( ctx, GL_INVALID_ENUM, "glBlendFunc(dfactor)" );
-         return;
-   }
 
-   if (ctx->Color.BlendDstRGB == dfactor &&
-       ctx->Color.BlendSrcRGB == sfactor &&
-       ctx->Color.BlendDstA == dfactor &&
-       ctx->Color.BlendSrcA == sfactor)
-      return;
-
-   FLUSH_VERTICES(ctx, _NEW_COLOR);
-   ctx->Color.BlendDstRGB = ctx->Color.BlendDstA = dfactor;
-   ctx->Color.BlendSrcRGB = ctx->Color.BlendSrcA = sfactor;
-
-   if (ctx->Driver.BlendFunc)
-      ctx->Driver.BlendFunc( ctx, sfactor, dfactor );
+   (*ctx->CurrentDispatch->BlendFuncSeparateEXT)( sfactor, dfactor,
+                                                 sfactor, dfactor );
 }
 
 
-#if _HAVE_FULL_GL
-
 /**
  * Process GL_EXT_blend_func_separate().
  *
@@ -144,7 +73,7 @@ _mesa_BlendFunc( GLenum sfactor, GLenum dfactor )
  * On a change, flush the vertices and notify the driver via
  * dd_function_table::BlendFuncSeparate.
  */
-void
+void GLAPIENTRY
 _mesa_BlendFuncSeparateEXT( GLenum sfactorRGB, GLenum dfactorRGB,
                             GLenum sfactorA, GLenum dfactorA )
 {
@@ -162,7 +91,7 @@ _mesa_BlendFuncSeparateEXT( GLenum sfactorRGB, GLenum dfactorRGB,
       case GL_SRC_COLOR:
       case GL_ONE_MINUS_SRC_COLOR:
          if (!ctx->Extensions.NV_blend_square) {
-            _mesa_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(sfactorRGB)");
+            _mesa_error(ctx, GL_INVALID_ENUM, "glBlendFunc or glBlendFuncSeparate (sfactorRGB)");
             return;
          }
          /* fall-through */
@@ -181,7 +110,7 @@ _mesa_BlendFuncSeparateEXT( GLenum sfactorRGB, GLenum dfactorRGB,
       case GL_ONE_MINUS_CONSTANT_ALPHA:
          break;
       default:
-         _mesa_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(sfactorRGB)");
+         _mesa_error(ctx, GL_INVALID_ENUM, "glBlendFunc or glBlendFuncSeparate (sfactorRGB)");
          return;
    }
 
@@ -189,7 +118,7 @@ _mesa_BlendFuncSeparateEXT( GLenum sfactorRGB, GLenum dfactorRGB,
       case GL_DST_COLOR:
       case GL_ONE_MINUS_DST_COLOR:
          if (!ctx->Extensions.NV_blend_square) {
-            _mesa_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(dfactorRGB)");
+            _mesa_error(ctx, GL_INVALID_ENUM, "glBlendFunc or glBlendFuncSeparate (dfactorRGB)");
             return;
          }
          /* fall-through */
@@ -207,7 +136,7 @@ _mesa_BlendFuncSeparateEXT( GLenum sfactorRGB, GLenum dfactorRGB,
       case GL_ONE_MINUS_CONSTANT_ALPHA:
          break;
       default:
-         _mesa_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(dfactorRGB)");
+         _mesa_error(ctx, GL_INVALID_ENUM, "glBlendFunc or glBlendFuncSeparate (dfactorRGB)");
          return;
    }
 
@@ -215,7 +144,7 @@ _mesa_BlendFuncSeparateEXT( GLenum sfactorRGB, GLenum dfactorRGB,
       case GL_SRC_COLOR:
       case GL_ONE_MINUS_SRC_COLOR:
          if (!ctx->Extensions.NV_blend_square) {
-            _mesa_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(sfactorA)");
+            _mesa_error(ctx, GL_INVALID_ENUM, "glBlendFunc or glBlendFuncSeparate (sfactorA)");
             return;
          }
          /* fall-through */
@@ -234,7 +163,7 @@ _mesa_BlendFuncSeparateEXT( GLenum sfactorRGB, GLenum dfactorRGB,
       case GL_ONE_MINUS_CONSTANT_ALPHA:
          break;
       default:
-         _mesa_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(sfactorA)");
+         _mesa_error(ctx, GL_INVALID_ENUM, "glBlendFunc or glBlendFuncSeparate (sfactorA)");
          return;
    }
 
@@ -242,7 +171,7 @@ _mesa_BlendFuncSeparateEXT( GLenum sfactorRGB, GLenum dfactorRGB,
       case GL_DST_COLOR:
       case GL_ONE_MINUS_DST_COLOR:
          if (!ctx->Extensions.NV_blend_square) {
-            _mesa_error(ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(dfactorA)");
+            _mesa_error(ctx, GL_INVALID_ENUM, "glBlendFunc or glBlendFuncSeparate (dfactorA)");
             return;
          }
          /* fall-through */
@@ -260,7 +189,7 @@ _mesa_BlendFuncSeparateEXT( GLenum sfactorRGB, GLenum dfactorRGB,
       case GL_ONE_MINUS_CONSTANT_ALPHA:
          break;
       default:
-         _mesa_error( ctx, GL_INVALID_ENUM, "glBlendFuncSeparate(dfactorA)" );
+         _mesa_error( ctx, GL_INVALID_ENUM, "glBlendFunc or glBlendFuncSeparate (dfactorA)" );
          return;
    }
 
@@ -284,8 +213,10 @@ _mesa_BlendFuncSeparateEXT( GLenum sfactorRGB, GLenum dfactorRGB,
 }
 
 
+#if _HAVE_FULL_GL
+
 /* This is really an extension function! */
-void
+void GLAPIENTRY
 _mesa_BlendEquation( GLenum mode )
 {
    GET_CURRENT_CONTEXT(ctx);
@@ -334,8 +265,9 @@ _mesa_BlendEquation( GLenum mode )
    /* This is needed to support 1.1's RGB logic ops AND
     * 1.0's blending logicops.
     */
-   ctx->Color.ColorLogicOpEnabled = (mode==GL_LOGIC_OP &&
-                                    ctx->Color.BlendEnabled);
+   ctx->Color._LogicOpEnabled = (ctx->Color.ColorLogicOpEnabled ||
+                                 (ctx->Color.BlendEnabled &&
+                                  mode == GL_LOGIC_OP));
 
    if (ctx->Driver.BlendEquation)
       (*ctx->Driver.BlendEquation)( ctx, mode );
@@ -358,7 +290,7 @@ _mesa_BlendEquation( GLenum mode )
  * change, flushes the vertices and notifies the driver via
  * dd_function_table::BlendColor callback.
  */
-void
+void GLAPIENTRY
 _mesa_BlendColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha )
 {
    GLfloat tmp[4];
@@ -391,7 +323,7 @@ _mesa_BlendColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha )
  * On a change, flushes the vertices and notifies the driver via
  * dd_function_table::AlphaFunc callback.
  */
-void
+void GLAPIENTRY
 _mesa_AlphaFunc( GLenum func, GLclampf ref )
 {
    GET_CURRENT_CONTEXT(ctx);
@@ -436,7 +368,7 @@ gl_colorbuffer_attrib::LogicOp.
  * On a change, flushes the vertices and notifies the driver via the
  * dd_function_table::LogicOpcode callback.
  */
-void
+void GLAPIENTRY
 _mesa_LogicOp( GLenum opcode )
 {
    GET_CURRENT_CONTEXT(ctx);
@@ -476,7 +408,7 @@ _mesa_LogicOp( GLenum opcode )
 }
 
 #if _HAVE_FULL_GL
-void
+void GLAPIENTRY
 _mesa_IndexMask( GLuint mask )
 {
    GET_CURRENT_CONTEXT(ctx);
@@ -508,7 +440,7 @@ _mesa_IndexMask( GLuint mask )
  * change, flushes the vertices and notifies the driver via the
  * dd_function_table::ColorMask callback.
  */
-void
+void GLAPIENTRY
 _mesa_ColorMask( GLboolean red, GLboolean green,
                  GLboolean blue, GLboolean alpha )
 {
@@ -572,6 +504,7 @@ void _mesa_init_color( GLcontext * ctx )
    ASSIGN_4V( ctx->Color.BlendColor, 0.0, 0.0, 0.0, 0.0 );
    ctx->Color.IndexLogicOpEnabled = GL_FALSE;
    ctx->Color.ColorLogicOpEnabled = GL_FALSE;
+   ctx->Color._LogicOpEnabled = GL_FALSE;
    ctx->Color.LogicOp = GL_COPY;
    ctx->Color.DitherFlag = GL_TRUE;