On 30 August 2012 07:45, Brian Paul <span dir="ltr"><<a href="mailto:brianp@vmware.com" target="_blank">brianp@vmware.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
This partially reverts d638da23d2ec2e9c52655b1ea138249e7f8bcccb.<br>
<br>
With gallium the meta code is not always built so the call to<br>
_meta_in_progress() was unresolved.  Simply special-case the<br>
GL_MULTISAMPLE case in the meta code.  There might be other special<br>
cases in the future given all the differences between legacy GL,<br>
core GL, GLES, etc.<br>
<br>
Fixes <a href="https://bugs.freedesktop.org/show_bug.cgi?id=54234" target="_blank">https://bugs.freedesktop.org/show_bug.cgi?id=54234</a><br>
and <a href="https://bugs.freedesktop.org/show_bug.cgi?id=54239" target="_blank">https://bugs.freedesktop.org/show_bug.cgi?id=54239</a><br></blockquote><div><br>Looks good to me, except that we can't remove _meta_in_progress() entirely (it's still needed by the i965 driver).  I'll reply with a modified patch that builds on i965 in just a moment.<br>
 </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
---<br>
 src/mesa/drivers/common/meta.c |   43 ++++++++++++++++++++++++++++-----------<br>
 src/mesa/drivers/common/meta.h |    3 --<br>
 src/mesa/main/enable.c         |    7 +-----<br>
 3 files changed, 32 insertions(+), 21 deletions(-)<br>
<br>
diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c<br>
index abb7d4e..9a6b72b 100644<br>
--- a/src/mesa/drivers/common/meta.c<br>
+++ b/src/mesa/drivers/common/meta.c<br>
@@ -438,6 +438,35 @@ _mesa_meta_free(struct gl_context *ctx)<br>
<br>
<br>
 /**<br>
+ * This is an alternative to _mesa_set_enable() to handle some special cases.<br>
+ * See comments inside.<br>
+ */<br>
+static void<br>
+meta_set_enable(struct gl_context *ctx, GLenum cap, GLboolean state)<br>
+{<br>
+   switch (cap) {<br>
+   case GL_MULTISAMPLE:<br>
+      /* We need to enable/disable multisample when using GLES but this enum<br>
+       * is not supported there.<br>
+       */<br>
+      if (ctx->Multisample.Enabled == state)<br>
+         return;<br>
+      FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE);<br>
+      ctx->Multisample.Enabled = state;<br>
+      break;<br>
+   default:<br>
+      _mesa_problem(ctx, "Unexpected cap in _meta_set_enable()");<br>
+      return;<br>
+   }<br>
+<br>
+   if (ctx->Driver.Enable) {<br>
+      ctx->Driver.Enable(ctx, cap, state);<br>
+   }<br>
+}<br>
+<br>
+<br>
+<br>
+/**<br>
  * Enter meta state.  This is like a light-weight version of glPushAttrib<br>
  * but it also resets most GL state back to default values.<br>
  *<br>
@@ -755,7 +784,7 @@ _mesa_meta_begin(struct gl_context *ctx, GLbitfield state)<br>
    if (state & MESA_META_MULTISAMPLE) {<br>
       save->MultisampleEnabled = ctx->Multisample.Enabled;<br>
       if (ctx->Multisample.Enabled)<br>
-         _mesa_set_enable(ctx, GL_MULTISAMPLE, GL_FALSE);<br>
+         meta_set_enable(ctx, GL_MULTISAMPLE, GL_FALSE);<br>
    }<br>
<br>
    /* misc */<br>
@@ -1057,7 +1086,7 @@ _mesa_meta_end(struct gl_context *ctx)<br>
<br>
    if (state & MESA_META_MULTISAMPLE) {<br>
       if (ctx->Multisample.Enabled != save->MultisampleEnabled)<br>
-         _mesa_set_enable(ctx, GL_MULTISAMPLE, save->MultisampleEnabled);<br>
+         meta_set_enable(ctx, GL_MULTISAMPLE, save->MultisampleEnabled);<br>
    }<br>
<br>
    /* misc */<br>
@@ -1077,16 +1106,6 @@ _mesa_meta_end(struct gl_context *ctx)<br>
<br>
<br>
 /**<br>
- * Determine whether Mesa is currently in a meta state.<br>
- */<br>
-GLboolean<br>
-_mesa_meta_in_progress(struct gl_context *ctx)<br>
-{<br>
-   return ctx->Meta->SaveStackDepth != 0;<br>
-}<br>
-<br>
-<br>
-/**<br>
  * Convert Z from a normalized value in the range [0, 1] to an object-space<br>
  * Z coordinate in [-1, +1] so that drawing at the new Z position with the<br>
  * default/identity ortho projection results in the original Z value.<br>
diff --git a/src/mesa/drivers/common/meta.h b/src/mesa/drivers/common/meta.h<br>
index d8dfb56..b5783ef 100644<br>
--- a/src/mesa/drivers/common/meta.h<br>
+++ b/src/mesa/drivers/common/meta.h<br>
@@ -70,9 +70,6 @@ _mesa_meta_begin(struct gl_context *ctx, GLbitfield state);<br>
 extern void<br>
 _mesa_meta_end(struct gl_context *ctx);<br>
<br>
-extern GLboolean<br>
-_mesa_meta_in_progress(struct gl_context *ctx);<br>
-<br>
 extern void<br>
 _mesa_meta_BlitFramebuffer(struct gl_context *ctx,<br>
                            GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,<br>
diff --git a/src/mesa/main/enable.c b/src/mesa/main/enable.c<br>
index b713f5f..14eea53 100644<br>
--- a/src/mesa/main/enable.c<br>
+++ b/src/mesa/main/enable.c<br>
@@ -765,13 +765,8 @@ _mesa_set_enable(struct gl_context *ctx, GLenum cap, GLboolean state)<br>
<br>
       /* GL_ARB_multisample */<br>
       case GL_MULTISAMPLE_ARB:<br>
-         /* Technically speaking, this should not be allowed for OpenGL ES 2.0<br>
-          * or 3.0.  However, meta really needs it.<br>
-          */<br>
-         if (!_mesa_meta_in_progress(ctx) && !_mesa_is_desktop_gl(ctx)<br>
-             && ctx->API != API_OPENGLES)<br>
+         if (!_mesa_is_desktop_gl(ctx) && ctx->API != API_OPENGLES)<br>
             goto invalid_enum_error;<br>
-<br>
          if (ctx->Multisample.Enabled == state)<br>
             return;<br>
          FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE);<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.7.3.4<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br>