diff options
| -rw-r--r-- | src/mesa/drivers/dri/i965/intel_pixel_copy.c | 2 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/intel/intel_pixel.c | 23 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/intel/intel_pixel.h | 3 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/intel/intel_pixel_bitmap.c | 2 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/intel/intel_pixel_draw.c | 2 | 
5 files changed, 26 insertions, 6 deletions
| diff --git a/src/mesa/drivers/dri/i965/intel_pixel_copy.c b/src/mesa/drivers/dri/i965/intel_pixel_copy.c index 5725dff3ef..dba4bb137e 100644 --- a/src/mesa/drivers/dri/i965/intel_pixel_copy.c +++ b/src/mesa/drivers/dri/i965/intel_pixel_copy.c @@ -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; diff --git a/src/mesa/drivers/dri/intel/intel_pixel.c b/src/mesa/drivers/dri/intel/intel_pixel.c index 72eb823bc4..6417866b20 100644 --- a/src/mesa/drivers/dri/intel/intel_pixel.c +++ b/src/mesa/drivers/dri/intel/intel_pixel.c @@ -35,12 +35,25 @@  #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;     } diff --git a/src/mesa/drivers/dri/intel/intel_pixel.h b/src/mesa/drivers/dri/intel/intel_pixel.h index ea2319a01f..9c899b954c 100644 --- a/src/mesa/drivers/dri/intel/intel_pixel.h +++ b/src/mesa/drivers/dri/intel/intel_pixel.h @@ -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); diff --git a/src/mesa/drivers/dri/intel/intel_pixel_bitmap.c b/src/mesa/drivers/dri/intel/intel_pixel_bitmap.c index 4cb68655f2..81238acfe4 100644 --- a/src/mesa/drivers/dri/intel/intel_pixel_bitmap.c +++ b/src/mesa/drivers/dri/intel/intel_pixel_bitmap.c @@ -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; diff --git a/src/mesa/drivers/dri/intel/intel_pixel_draw.c b/src/mesa/drivers/dri/intel/intel_pixel_draw.c index 2804c8deea..34813d2aa0 100644 --- a/src/mesa/drivers/dri/intel/intel_pixel_draw.c +++ b/src/mesa/drivers/dri/intel/intel_pixel_draw.c @@ -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__); | 
