msaa: Make meta-ops save and restore state of GL_MULTISAMPLE.
authorPaul Berry <stereotype441@gmail.com>
Wed, 27 Jun 2012 23:16:26 +0000 (16:16 -0700)
committerPaul Berry <stereotype441@gmail.com>
Mon, 2 Jul 2012 21:09:27 +0000 (14:09 -0700)
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.

Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Anuj Phogat <anuj.phogat@gmail.com>
Reviewed-by: Chad Versace <chad.versace@linux.intel.com>
src/mesa/drivers/common/meta.c
src/mesa/drivers/common/meta.h

index 6a533932bfd2438c0f483dfc13415f3f03a65e60..cf2d05337c8c3b05a84a626cd1c2499702e38765 100644 (file)
@@ -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,
index 7a80b1dde4d116e622957c898408558594d7148f..d8dfb56f9b12804ab0b138741c0be22cb962206a 100644 (file)
@@ -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