mesa: create some glBlendFunc*() helper functions
authorTimothy Arceri <tarceri@itsqueeze.com>
Wed, 28 Jun 2017 05:21:51 +0000 (15:21 +1000)
committerTimothy Arceri <tarceri@itsqueeze.com>
Wed, 28 Jun 2017 22:54:11 +0000 (08:54 +1000)
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
src/mesa/main/blend.c

index 3fa9678730d3ef6fd0fde5992e70f10d4012d812..b06ec334062a70944810411b9201c1ba55e16c3b 100644 (file)
@@ -157,20 +157,6 @@ validate_blend_factors(struct gl_context *ctx, const char *func,
 }
 
 
-/**
- * Specify the blending operation.
- *
- * \param sfactor source factor operator.
- * \param dfactor destination factor operator.
- *
- * \sa glBlendFunc, glBlendFuncSeparateEXT
- */
-void GLAPIENTRY
-_mesa_BlendFunc( GLenum sfactor, GLenum dfactor )
-{
-   _mesa_BlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
-}
-
 static GLboolean
 blend_factor_is_dual_src(GLenum factor)
 {
@@ -203,40 +189,23 @@ num_buffers(const struct gl_context *ctx)
 }
 
 
-/**
- * Set the separate blend source/dest factors for all draw buffers.
- *
- * \param sfactorRGB RGB source factor operator.
- * \param dfactorRGB RGB destination factor operator.
- * \param sfactorA alpha source factor operator.
- * \param dfactorA alpha destination factor operator.
- */
-void GLAPIENTRY
-_mesa_BlendFuncSeparate( GLenum sfactorRGB, GLenum dfactorRGB,
-                            GLenum sfactorA, GLenum dfactorA )
+/* Returns true if there was no change */
+static bool
+skip_blend_state_update(const struct gl_context *ctx,
+                        GLenum sfactorRGB, GLenum dfactorRGB,
+                        GLenum sfactorA, GLenum dfactorA)
 {
-   GET_CURRENT_CONTEXT(ctx);
-   const unsigned numBuffers = num_buffers(ctx);
-   unsigned buf;
-   bool changed = false;
-
-   if (MESA_VERBOSE & VERBOSE_API)
-      _mesa_debug(ctx, "glBlendFuncSeparate %s %s %s %s\n",
-                  _mesa_enum_to_string(sfactorRGB),
-                  _mesa_enum_to_string(dfactorRGB),
-                  _mesa_enum_to_string(sfactorA),
-                  _mesa_enum_to_string(dfactorA));
-
    /* Check if we're really changing any state.  If not, return early. */
    if (ctx->Color._BlendFuncPerBuffer) {
+      const unsigned numBuffers = num_buffers(ctx);
+
       /* Check all per-buffer states */
-      for (buf = 0; buf < numBuffers; buf++) {
+      for (unsigned buf = 0; buf < numBuffers; buf++) {
          if (ctx->Color.Blend[buf].SrcRGB != sfactorRGB ||
              ctx->Color.Blend[buf].DstRGB != dfactorRGB ||
              ctx->Color.Blend[buf].SrcA != sfactorA ||
              ctx->Color.Blend[buf].DstA != dfactorA) {
-            changed = true;
-            break;
+            return false;
          }
       }
    }
@@ -246,23 +215,24 @@ _mesa_BlendFuncSeparate( GLenum sfactorRGB, GLenum dfactorRGB,
           ctx->Color.Blend[0].DstRGB != dfactorRGB ||
           ctx->Color.Blend[0].SrcA != sfactorA ||
           ctx->Color.Blend[0].DstA != dfactorA) {
-         changed = true;
+         return false;
       }
    }
 
-   if (!changed)
-      return;
+   return true;
+}
 
-   if (!validate_blend_factors(ctx, "glBlendFuncSeparate",
-                               sfactorRGB, dfactorRGB,
-                               sfactorA, dfactorA)) {
-      return;
-   }
 
+static void
+blend_func_separate(struct gl_context *ctx,
+                    GLenum sfactorRGB, GLenum dfactorRGB,
+                    GLenum sfactorA, GLenum dfactorA)
+{
    FLUSH_VERTICES(ctx, ctx->DriverFlags.NewBlend ? 0 : _NEW_COLOR);
    ctx->NewDriverState |= ctx->DriverFlags.NewBlend;
 
-   for (buf = 0; buf < numBuffers; buf++) {
+   const unsigned numBuffers = num_buffers(ctx);
+   for (unsigned buf = 0; buf < numBuffers; buf++) {
       ctx->Color.Blend[buf].SrcRGB = sfactorRGB;
       ctx->Color.Blend[buf].DstRGB = dfactorRGB;
       ctx->Color.Blend[buf].SrcA = sfactorA;
@@ -270,7 +240,7 @@ _mesa_BlendFuncSeparate( GLenum sfactorRGB, GLenum dfactorRGB,
    }
 
    update_uses_dual_src(ctx, 0);
-   for (buf = 1; buf < numBuffers; buf++) {
+   for (unsigned buf = 1; buf < numBuffers; buf++) {
       ctx->Color.Blend[buf]._UsesDualSrc = ctx->Color.Blend[0]._UsesDualSrc;
    }
 
@@ -283,6 +253,67 @@ _mesa_BlendFuncSeparate( GLenum sfactorRGB, GLenum dfactorRGB,
 }
 
 
+/**
+ * Specify the blending operation.
+ *
+ * \param sfactor source factor operator.
+ * \param dfactor destination factor operator.
+ *
+ * \sa glBlendFunc, glBlendFuncSeparateEXT
+ */
+void GLAPIENTRY
+_mesa_BlendFunc( GLenum sfactor, GLenum dfactor )
+{
+   GET_CURRENT_CONTEXT(ctx);
+
+   if (skip_blend_state_update(ctx, sfactor, dfactor, sfactor, dfactor))
+      return;
+
+   if (!validate_blend_factors(ctx, "glBlendFunc",
+                               sfactor, dfactor, sfactor, dfactor)) {
+      return;
+   }
+
+   blend_func_separate(ctx, sfactor, dfactor, sfactor, dfactor);
+}
+
+
+/**
+ * Set the separate blend source/dest factors for all draw buffers.
+ *
+ * \param sfactorRGB RGB source factor operator.
+ * \param dfactorRGB RGB destination factor operator.
+ * \param sfactorA alpha source factor operator.
+ * \param dfactorA alpha destination factor operator.
+ */
+void GLAPIENTRY
+_mesa_BlendFuncSeparate( GLenum sfactorRGB, GLenum dfactorRGB,
+                            GLenum sfactorA, GLenum dfactorA )
+{
+   GET_CURRENT_CONTEXT(ctx);
+
+   if (MESA_VERBOSE & VERBOSE_API)
+      _mesa_debug(ctx, "glBlendFuncSeparate %s %s %s %s\n",
+                  _mesa_enum_to_string(sfactorRGB),
+                  _mesa_enum_to_string(dfactorRGB),
+                  _mesa_enum_to_string(sfactorA),
+                  _mesa_enum_to_string(dfactorA));
+
+
+
+   if (skip_blend_state_update(ctx, sfactorRGB, dfactorRGB, sfactorA, dfactorA))
+      return;
+
+   if (!validate_blend_factors(ctx, "glBlendFuncSeparate",
+                               sfactorRGB, dfactorRGB,
+                               sfactorA, dfactorA)) {
+      return;
+   }
+
+   blend_func_separate(ctx, sfactorRGB, dfactorRGB, sfactorA, dfactorA);
+}
+
+
 void GLAPIENTRY
 _mesa_BlendFunciARB_no_error(GLuint buf, GLenum sfactor, GLenum dfactor)
 {