intel: Avoid glBitmap software fallback for blending when no blending occurs.
authorEric Anholt <eric@anholt.net>
Tue, 24 Jun 2008 18:44:42 +0000 (11:44 -0700)
committerEric Anholt <eric@anholt.net>
Tue, 24 Jun 2008 18:44:42 +0000 (11:44 -0700)
Mesa demos tend to leave blending on but in GL_ONE/GL_ZERO, or
GL_SRC_ALPHA/GL_ONE_MINUS_SRC_ALPHA with a source alpha of 1.0.

src/mesa/drivers/dri/i965/intel_pixel_copy.c
src/mesa/drivers/dri/intel/intel_pixel.c
src/mesa/drivers/dri/intel/intel_pixel.h
src/mesa/drivers/dri/intel/intel_pixel_bitmap.c
src/mesa/drivers/dri/intel/intel_pixel_draw.c

index 5725dff3ef49179dd6125082d50e5bc8fd04a3b0..dba4bb137e4ac993b916d1ac229a6523dc8a14e6 100644 (file)
@@ -188,7 +188,7 @@ do_blit_copypixels(GLcontext * ctx,
    /* Copypixels can be more than a straight copy.  Ensure all the
     * extra operations are disabled:
     */
-   if (!intel_check_blit_fragment_ops(ctx) ||
+   if (!intel_check_blit_fragment_ops(ctx, GL_FALSE) ||
        ctx->Pixel.ZoomX != 1.0F || ctx->Pixel.ZoomY != 1.0F)
       return GL_FALSE;
 
index 72eb823bc47010385a4a547578ba658433578d65..6417866b201521363e1595e68e3d95603a6eac16 100644 (file)
 
 #define FILE_DEBUG_FLAG DEBUG_PIXEL
 
+static GLenum
+effective_func(GLenum func, GLboolean src_alpha_is_one)
+{
+   if (src_alpha_is_one) {
+      if (func == GL_SRC_ALPHA)
+        return GL_ONE;
+      if (func == GL_ONE_MINUS_SRC_ALPHA)
+        return GL_ZERO;
+   }
+
+   return func;
+}
+
 /**
  * Check if any fragment operations are in effect which might effect
  * glDraw/CopyPixels.
  */
 GLboolean
-intel_check_blit_fragment_ops(GLcontext * ctx)
+intel_check_blit_fragment_ops(GLcontext * ctx, GLboolean src_alpha_is_one)
 {
    if (ctx->NewState)
       _mesa_update_state(ctx);
@@ -50,7 +63,13 @@ intel_check_blit_fragment_ops(GLcontext * ctx)
       return GL_FALSE;
    }
 
-   if (ctx->Color.BlendEnabled) {
+   if (ctx->Color.BlendEnabled &&
+       (effective_func(ctx->Color.BlendSrcRGB, src_alpha_is_one) != GL_ONE ||
+       effective_func(ctx->Color.BlendDstRGB, src_alpha_is_one) != GL_ZERO ||
+       ctx->Color.BlendEquationRGB != GL_FUNC_ADD ||
+       effective_func(ctx->Color.BlendSrcA, src_alpha_is_one) != GL_ONE ||
+       effective_func(ctx->Color.BlendDstA, src_alpha_is_one) != GL_ZERO ||
+       ctx->Color.BlendEquationA != GL_FUNC_ADD)) {
       DBG("fallback due to blend\n");
       return GL_FALSE;
    }
index ea2319a01f56545fcf6d5d273bb08478c9c35b86..9c899b954c33000ee61accede5e5eab2c0a7bb30 100644 (file)
@@ -32,7 +32,8 @@
 
 void intelInitPixelFuncs(struct dd_function_table *functions);
 
-GLboolean intel_check_blit_fragment_ops(GLcontext * ctx);
+GLboolean intel_check_blit_fragment_ops(GLcontext * ctx,
+                                       GLboolean src_alpha_is_one);
 
 GLboolean intel_check_meta_tex_fragment_ops(GLcontext * ctx);
 
index 4cb68655f2bdb662ab9a615357b5cb5661df6e60..81238acfe4e73c1a51a44c7c0ee151439e1a8488 100644 (file)
@@ -194,7 +194,7 @@ do_blit_bitmap( GLcontext *ctx,
 
    /* Does zoom apply to bitmaps?
     */
-   if (!intel_check_blit_fragment_ops(ctx) ||
+   if (!intel_check_blit_fragment_ops(ctx, tmpColor[3] == 1.0F) ||
        ctx->Pixel.ZoomX != 1.0F || 
        ctx->Pixel.ZoomY != 1.0F)
       return GL_FALSE;
index 2804c8deeaf6faab6a7037a419091f6ba0959228..34813d2aa0da435f2f6155378c284db661faaa3a 100644 (file)
@@ -253,7 +253,7 @@ do_blit_drawpixels(GLcontext * ctx,
       return GL_FALSE;
    }
 
-   if (!intel_check_blit_fragment_ops(ctx)) {
+   if (!intel_check_blit_fragment_ops(ctx, GL_FALSE)) {
       if (INTEL_DEBUG & DEBUG_PIXEL)
          _mesa_printf("%s - bad GL fragment state for blitter\n",
                       __FUNCTION__);