Mesa (master): mesa: optimize no-change check in _mesa_BlendEquationSeparate()

Brian Paul brianp at kemper.freedesktop.org
Thu Oct 15 13:23:09 UTC 2015


Module: Mesa
Branch: master
Commit: 34de3c4c1635a42c884da3321fc35ef07be34a6e
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=34de3c4c1635a42c884da3321fc35ef07be34a6e

Author: Brian Paul <brianp at vmware.com>
Date:   Wed Oct 14 09:45:36 2015 -0600

mesa: optimize no-change check in _mesa_BlendEquationSeparate()

Reviewed-by: Eric Anholt <eric at anholt.net>

---

 src/mesa/main/blend.c |   41 ++++++++++++++++++++++++++---------------
 1 file changed, 26 insertions(+), 15 deletions(-)

diff --git a/src/mesa/main/blend.c b/src/mesa/main/blend.c
index 01b6919..14742d0 100644
--- a/src/mesa/main/blend.c
+++ b/src/mesa/main/blend.c
@@ -432,7 +432,7 @@ void GLAPIENTRY
 _mesa_BlendEquationSeparate( GLenum modeRGB, GLenum modeA )
 {
    GLuint buf, numBuffers;
-   GLboolean changed;
+   bool changed = false;
    GET_CURRENT_CONTEXT(ctx);
 
    if (MESA_VERBOSE & VERBOSE_API)
@@ -440,6 +440,30 @@ _mesa_BlendEquationSeparate( GLenum modeRGB, GLenum modeA )
                   _mesa_enum_to_string(modeRGB),
                   _mesa_enum_to_string(modeA));
 
+   numBuffers = ctx->Extensions.ARB_draw_buffers_blend
+      ? ctx->Const.MaxDrawBuffers : 1;
+
+   if (ctx->Color._BlendEquationPerBuffer) {
+      /* Check all per-buffer states */
+      for (buf = 0; buf < numBuffers; buf++) {
+         if (ctx->Color.Blend[buf].EquationRGB != modeRGB ||
+             ctx->Color.Blend[buf].EquationA != modeA) {
+            changed = true;
+            break;
+         }
+      }
+   }
+   else {
+      /* only need to check 0th per-buffer state */
+      if (ctx->Color.Blend[0].EquationRGB != modeRGB ||
+          ctx->Color.Blend[0].EquationA != modeA) {
+         changed = true;
+      }
+   }
+
+   if (!changed)
+      return;
+
    if ( (modeRGB != modeA) && !ctx->Extensions.EXT_blend_equation_separate ) {
       _mesa_error(ctx, GL_INVALID_OPERATION,
 		  "glBlendEquationSeparateEXT not supported by driver");
@@ -456,21 +480,8 @@ _mesa_BlendEquationSeparate( GLenum modeRGB, GLenum modeA )
       return;
    }
 
-   numBuffers = ctx->Extensions.ARB_draw_buffers_blend
-      ? ctx->Const.MaxDrawBuffers : 1;
-
-   changed = GL_FALSE;
-   for (buf = 0; buf < numBuffers; buf++) {
-      if (ctx->Color.Blend[buf].EquationRGB != modeRGB ||
-          ctx->Color.Blend[buf].EquationA != modeA) {
-         changed = GL_TRUE;
-         break;
-      }
-   }
-   if (!changed)
-      return;
-
    FLUSH_VERTICES(ctx, _NEW_COLOR);
+
    for (buf = 0; buf < numBuffers; buf++) {
       ctx->Color.Blend[buf].EquationRGB = modeRGB;
       ctx->Color.Blend[buf].EquationA = modeA;




More information about the mesa-commit mailing list