[Mesa-dev] [PATCH] msaa: Make meta-ops save and restore state of GL_MULTISAMPLE.

Brian Paul brianp at vmware.com
Thu Jun 28 06:51:35 PDT 2012


On 06/27/2012 05:51 PM, Paul Berry wrote:
> The meta-ops _mesa_meta_Clear() and _mesa_meta_glsl_Clear() need to
> ignore the state of GL_SAMPLE_ALPHA_TO_COVERAGE,
> GL_SAMPLE_ALPHA_TO_ONE, GL_SAMPLE_COVERAGE, GL_SAMPLE_COVERAGE_VALUE,
> and GL_SAMPLE_COVERAGE_INVERT when clearing multisampled buffers.  The
> easiest way to accomplish this is to disable GL_MULTISAMPLE during the
> clear meta-ops.
>
> Note: this patch also causes GL_MULTISAMPLE to be disabled during
> _mesa_meta_GenerateMipmap() and _mesa_meta_GetTexImage() (since those
> two meta-ops use MESA_META_ALL).  Arguably this isn't strictly
> necessary, since those meta-ops use their own non-MSAA fbo's, but it
> shouldn't do any harm.
>
> Fixes Piglit tests "EXT_framebuffer_multisample/clear {2,4}
> {color,stencil}" on i965.
> ---
>   src/mesa/drivers/common/meta.c |   17 ++++++++++++++++-
>   src/mesa/drivers/common/meta.h |    1 +
>   2 files changed, 17 insertions(+), 1 deletions(-)
>
> diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c
> index be7141a..5e9d795 100644
> --- a/src/mesa/drivers/common/meta.c
> +++ b/src/mesa/drivers/common/meta.c
> @@ -181,6 +181,9 @@ struct save_state
>      struct gl_feedback Feedback;
>   #endif
>
> +   /** MESA_META_MULTISAMPLE */
> +   GLboolean MultisampleEnabled;
> +
>      /** Miscellaneous (always disabled) */
>      GLboolean Lighting;
>      GLboolean RasterDiscard;
> @@ -733,6 +736,12 @@ _mesa_meta_begin(struct gl_context *ctx, GLbitfield state)
>      }
>   #endif
>
> +   if (state&  MESA_META_MULTISAMPLE) {
> +      save->MultisampleEnabled = ctx->Multisample.Enabled;
> +      if (ctx->Multisample.Enabled)
> +         _mesa_set_enable(ctx, GL_MULTISAMPLE, GL_FALSE);
> +   }
> +
>      /* misc */
>      {
>         save->Lighting = ctx->Light.Enabled;
> @@ -1018,6 +1027,11 @@ _mesa_meta_end(struct gl_context *ctx)
>      }
>   #endif
>
> +   if (state&  MESA_META_MULTISAMPLE) {
> +      if (ctx->Multisample.Enabled != save->MultisampleEnabled)
> +         _mesa_set_enable(ctx, GL_MULTISAMPLE, save->MultisampleEnabled);
> +   }
> +
>      /* misc */
>      if (save->Lighting) {
>         _mesa_set_enable(ctx, GL_LIGHTING, GL_TRUE);
> @@ -1902,7 +1916,8 @@ _mesa_meta_glsl_Clear(struct gl_context *ctx, GLbitfield buffers)
>   	       MESA_META_VERTEX |
>   	       MESA_META_VIEWPORT |
>   	       MESA_META_CLIP |
> -	       MESA_META_CLAMP_FRAGMENT_COLOR);
> +	       MESA_META_CLAMP_FRAGMENT_COLOR |
> +               MESA_META_MULTISAMPLE);
>
>      if (!(buffers&  BUFFER_BITS_COLOR)) {
>         /* We'll use colormask to disable color writes.  Otherwise,
> diff --git a/src/mesa/drivers/common/meta.h b/src/mesa/drivers/common/meta.h
> index 7a80b1d..d8dfb56 100644
> --- a/src/mesa/drivers/common/meta.h
> +++ b/src/mesa/drivers/common/meta.h
> @@ -55,6 +55,7 @@
>   #define MESA_META_CONDITIONAL_RENDER    0x20000
>   #define MESA_META_CLIP                  0x40000
>   #define MESA_META_SELECT_FEEDBACK       0x80000
> +#define MESA_META_MULTISAMPLE          0x100000
>   /**\}*/
>
>   extern void

Looks good.

Reviewed-by: Brian Paul <brianp at vmware.com>


More information about the mesa-dev mailing list