[Mesa-dev] [PATCH 04/10] mesa: optimize no-change check in _mesa_BlendEquation()

Brian Paul brianp at vmware.com
Wed Oct 14 16:24:36 PDT 2015


Same story as preceeding change to _mesa_BlendFuncSeparate().
---
 src/mesa/main/blend.c | 35 +++++++++++++++++++++++------------
 1 file changed, 23 insertions(+), 12 deletions(-)

diff --git a/src/mesa/main/blend.c b/src/mesa/main/blend.c
index 98d2858..01b6919 100644
--- a/src/mesa/main/blend.c
+++ b/src/mesa/main/blend.c
@@ -345,33 +345,44 @@ void GLAPIENTRY
 _mesa_BlendEquation( GLenum mode )
 {
    GLuint buf, numBuffers;
-   GLboolean changed;
+   bool changed = false;
    GET_CURRENT_CONTEXT(ctx);
 
    if (MESA_VERBOSE & VERBOSE_API)
       _mesa_debug(ctx, "glBlendEquation(%s)\n",
                   _mesa_enum_to_string(mode));
 
-   if (!legal_blend_equation(ctx, mode)) {
-      _mesa_error(ctx, GL_INVALID_ENUM, "glBlendEquation");
-      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 != mode ||
-          ctx->Color.Blend[buf].EquationA != mode) {
-         changed = GL_TRUE;
-         break;
+   if (ctx->Color._BlendEquationPerBuffer) {
+      /* Check all per-buffer states */
+      for (buf = 0; buf < numBuffers; buf++) {
+         if (ctx->Color.Blend[buf].EquationRGB != mode ||
+             ctx->Color.Blend[buf].EquationA != mode) {
+            changed = true;
+            break;
+         }
+      }
+   }
+   else {
+      /* only need to check 0th per-buffer state */
+      if (ctx->Color.Blend[0].EquationRGB != mode ||
+          ctx->Color.Blend[0].EquationA != mode) {
+         changed = true;
       }
    }
+
    if (!changed)
       return;
 
+   if (!legal_blend_equation(ctx, mode)) {
+      _mesa_error(ctx, GL_INVALID_ENUM, "glBlendEquation");
+      return;
+   }
+
    FLUSH_VERTICES(ctx, _NEW_COLOR);
+
    for (buf = 0; buf < numBuffers; buf++) {
       ctx->Color.Blend[buf].EquationRGB = mode;
       ctx->Color.Blend[buf].EquationA = mode;
-- 
1.9.1



More information about the mesa-dev mailing list