On 24 August 2012 08:49, Ian Romanick <span dir="ltr"><<a href="mailto:idr@freedesktop.org" target="_blank">idr@freedesktop.org</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">
From: Paul Berry <<a href="mailto:stereotype441@gmail.com">stereotype441@gmail.com</a>><br>
<br>
Signed-off-by: Paul Berry <<a href="mailto:stereotype441@gmail.com">stereotype441@gmail.com</a>><br>
Signed-off-by: Ian Romanick <<a href="mailto:ian.d.romanick@intel.com">ian.d.romanick@intel.com</a>><br>
---<br>
 src/mesa/drivers/common/meta.c |  110 +++++++++++++++++++++++----------------<br>
 src/mesa/main/enable.c         |    5 +-<br>
 2 files changed, 68 insertions(+), 47 deletions(-)<br>
<br>
diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c<br>
index 7d7113c..58d6fa6 100644<br>
--- a/src/mesa/drivers/common/meta.c<br>
+++ b/src/mesa/drivers/common/meta.c<br>
@@ -549,8 +549,10 @@ _mesa_meta_begin(struct gl_context *ctx, GLbitfield state)<br>
       save->PolygonCull = ctx->Polygon.CullFlag;<br>
       _mesa_PolygonMode(GL_FRONT_AND_BACK, GL_FILL);<br>
       _mesa_set_enable(ctx, GL_POLYGON_OFFSET_FILL, GL_FALSE);<br>
-      _mesa_set_enable(ctx, GL_POLYGON_SMOOTH, GL_FALSE);<br>
-      _mesa_set_enable(ctx, GL_POLYGON_STIPPLE, GL_FALSE);<br>
+      if (ctx->API == API_OPENGL) {<br>
+         _mesa_set_enable(ctx, GL_POLYGON_SMOOTH, GL_FALSE);<br>
+         _mesa_set_enable(ctx, GL_POLYGON_STIPPLE, GL_FALSE);<br>
+      }<br>
       _mesa_set_enable(ctx, GL_CULL_FACE, GL_FALSE);<br>
    }<br>
<br>
@@ -560,14 +562,14 @@ _mesa_meta_begin(struct gl_context *ctx, GLbitfield state)<br>
    }<br>
<br>
    if (state & MESA_META_SHADER) {<br>
-      if (ctx->Extensions.ARB_vertex_program) {<br>
+      if (ctx->API == API_OPENGL && ctx->Extensions.ARB_vertex_program) {<br>
          save->VertexProgramEnabled = ctx->VertexProgram.Enabled;<br>
          _mesa_reference_vertprog(ctx, &save->VertexProgram,<br>
                                  ctx->VertexProgram.Current);<br>
          _mesa_set_enable(ctx, GL_VERTEX_PROGRAM_ARB, GL_FALSE);<br>
       }<br>
<br>
-      if (ctx->Extensions.ARB_fragment_program) {<br>
+      if (ctx->API == API_OPENGL && ctx->Extensions.ARB_fragment_program) {<br>
          save->FragmentProgramEnabled = ctx->FragmentProgram.Enabled;<br>
          _mesa_reference_fragprog(ctx, &save->FragmentProgram,<br>
                                  ctx->FragmentProgram.Current);<br>
@@ -603,25 +605,27 @@ _mesa_meta_begin(struct gl_context *ctx, GLbitfield state)<br>
       save->EnvMode = ctx->Texture.Unit[0].EnvMode;<br>
<br>
       /* Disable all texture units */<br>
-      for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {<br>
-         save->TexEnabled[u] = ctx->Texture.Unit[u].Enabled;<br>
-         save->TexGenEnabled[u] = ctx->Texture.Unit[u].TexGenEnabled;<br>
-         if (ctx->Texture.Unit[u].Enabled ||<br>
-             ctx->Texture.Unit[u].TexGenEnabled) {<br>
-            _mesa_ActiveTextureARB(GL_TEXTURE0 + u);<br>
-            _mesa_set_enable(ctx, GL_TEXTURE_1D, GL_FALSE);<br>
-            _mesa_set_enable(ctx, GL_TEXTURE_2D, GL_FALSE);<br>
-            _mesa_set_enable(ctx, GL_TEXTURE_3D, GL_FALSE);<br>
-            if (ctx->Extensions.ARB_texture_cube_map)<br>
-               _mesa_set_enable(ctx, GL_TEXTURE_CUBE_MAP, GL_FALSE);<br>
-            if (ctx->Extensions.NV_texture_rectangle)<br>
-               _mesa_set_enable(ctx, GL_TEXTURE_RECTANGLE, GL_FALSE);<br>
-            if (ctx->Extensions.OES_EGL_image_external)<br>
-               _mesa_set_enable(ctx, GL_TEXTURE_EXTERNAL_OES, GL_FALSE);<br>
-            _mesa_set_enable(ctx, GL_TEXTURE_GEN_S, GL_FALSE);<br>
-            _mesa_set_enable(ctx, GL_TEXTURE_GEN_T, GL_FALSE);<br>
-            _mesa_set_enable(ctx, GL_TEXTURE_GEN_R, GL_FALSE);<br>
-            _mesa_set_enable(ctx, GL_TEXTURE_GEN_Q, GL_FALSE);<br>
+      if (ctx->API == API_OPENGL || ctx->API == API_OPENGLES) {<br>
+         for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {<br>
+            save->TexEnabled[u] = ctx->Texture.Unit[u].Enabled;<br>
+            save->TexGenEnabled[u] = ctx->Texture.Unit[u].TexGenEnabled;<br>
+            if (ctx->Texture.Unit[u].Enabled ||<br>
+                ctx->Texture.Unit[u].TexGenEnabled) {<br>
+               _mesa_ActiveTextureARB(GL_TEXTURE0 + u);<br>
+               _mesa_set_enable(ctx, GL_TEXTURE_1D, GL_FALSE);<br>
+               _mesa_set_enable(ctx, GL_TEXTURE_2D, GL_FALSE);<br>
+               _mesa_set_enable(ctx, GL_TEXTURE_3D, GL_FALSE);<br>
+               if (ctx->Extensions.ARB_texture_cube_map)<br>
+                  _mesa_set_enable(ctx, GL_TEXTURE_CUBE_MAP, GL_FALSE);<br>
+               if (ctx->Extensions.NV_texture_rectangle)<br>
+                  _mesa_set_enable(ctx, GL_TEXTURE_RECTANGLE, GL_FALSE);<br>
+               if (ctx->Extensions.OES_EGL_image_external)<br>
+                  _mesa_set_enable(ctx, GL_TEXTURE_EXTERNAL_OES, GL_FALSE);<br>
+               _mesa_set_enable(ctx, GL_TEXTURE_GEN_S, GL_FALSE);<br>
+               _mesa_set_enable(ctx, GL_TEXTURE_GEN_T, GL_FALSE);<br>
+               _mesa_set_enable(ctx, GL_TEXTURE_GEN_R, GL_FALSE);<br>
+               _mesa_set_enable(ctx, GL_TEXTURE_GEN_Q, GL_FALSE);<br>
+            }<br>
          }<br>
       }<br>
<br>
@@ -634,7 +638,9 @@ _mesa_meta_begin(struct gl_context *ctx, GLbitfield state)<br>
       /* set defaults for unit[0] */<br>
       _mesa_ActiveTextureARB(GL_TEXTURE0);<br>
       _mesa_ClientActiveTextureARB(GL_TEXTURE0);<br>
-      _mesa_TexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);<br>
+      if (ctx->API == API_OPENGL || ctx->API == API_OPENGLES) {<br>
+         _mesa_TexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);<br>
+      }<br>
    }<br>
<br>
    if (state & MESA_META_TRANSFORM) {<br>
@@ -842,9 +848,11 @@ _mesa_meta_end(struct gl_context *ctx)<br>
    if (state & MESA_META_RASTERIZATION) {<br>
       _mesa_PolygonMode(GL_FRONT, save->FrontPolygonMode);<br>
       _mesa_PolygonMode(GL_BACK, save->BackPolygonMode);<br>
-      _mesa_set_enable(ctx, GL_POLYGON_STIPPLE, save->PolygonStipple);<br>
+      if (ctx->API == API_OPENGL) {<br>
+         _mesa_set_enable(ctx, GL_POLYGON_STIPPLE, save->PolygonStipple);<br>
+         _mesa_set_enable(ctx, GL_POLYGON_SMOOTH, save->PolygonSmooth);<br>
+      }<br>
       _mesa_set_enable(ctx, GL_POLYGON_OFFSET_FILL, save->PolygonOffset);<br>
-      _mesa_set_enable(ctx, GL_POLYGON_SMOOTH, save->PolygonSmooth);<br>
       _mesa_set_enable(ctx, GL_CULL_FACE, save->PolygonCull);<br>
    }<br>
<br>
@@ -855,7 +863,7 @@ _mesa_meta_end(struct gl_context *ctx)<br>
    }<br>
<br>
    if (state & MESA_META_SHADER) {<br>
-      if (ctx->Extensions.ARB_vertex_program) {<br>
+      if (ctx->API == API_OPENGL && ctx->Extensions.ARB_vertex_program) {<br>
          _mesa_set_enable(ctx, GL_VERTEX_PROGRAM_ARB,<br>
                           save->VertexProgramEnabled);<br>
          _mesa_reference_vertprog(ctx, &ctx->VertexProgram.Current,<br>
@@ -863,7 +871,7 @@ _mesa_meta_end(struct gl_context *ctx)<br>
         _mesa_reference_vertprog(ctx, &save->VertexProgram, NULL);<br>
       }<br>
<br>
-      if (ctx->Extensions.ARB_fragment_program) {<br>
+      if (ctx->API == API_OPENGL && ctx->Extensions.ARB_fragment_program) {<br>
          _mesa_set_enable(ctx, GL_FRAGMENT_PROGRAM_ARB,<br>
                           save->FragmentProgramEnabled);<br>
          _mesa_reference_fragprog(ctx, &ctx->FragmentProgram.Current,<br>
@@ -896,7 +904,7 @@ _mesa_meta_end(struct gl_context *ctx)<br>
<br>
       _mesa_set_enable(ctx, GL_STENCIL_TEST, stencil->Enabled);<br>
       _mesa_ClearStencil(stencil->Clear);<br>
-      if (ctx->Extensions.EXT_stencil_two_side) {<br>
+      if (ctx->API == API_OPENGL && ctx->Extensions.EXT_stencil_two_side) {<br>
          _mesa_set_enable(ctx, GL_STENCIL_TEST_TWO_SIDE_EXT,<br>
                           stencil->TestTwoSide);<br>
          _mesa_ActiveStencilFaceEXT(stencil->ActiveFace<br>
@@ -928,7 +936,9 @@ _mesa_meta_end(struct gl_context *ctx)<br>
       ASSERT(ctx->Texture.CurrentUnit == 0);<br>
<br>
       /* restore texenv for unit[0] */<br>
-      _mesa_TexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, save->EnvMode);<br>
+      if (ctx->API == API_OPENGL || ctx->API == API_OPENGLES) {<br>
+         _mesa_TexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, save->EnvMode);<br>
+      }<br>
<br>
       /* restore texture objects for unit[0] only */<br>
       for (tgt = 0; tgt < NUM_TEXTURE_TARGETS; tgt++) {<br>
@@ -941,16 +951,18 @@ _mesa_meta_end(struct gl_context *ctx)<br>
       }<br>
<br>
       /* Restore fixed function texture enables, texgen */<br>
-      for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {<br>
-        if (ctx->Texture.Unit[u].Enabled != save->TexEnabled[u]) {<br>
-           FLUSH_VERTICES(ctx, _NEW_TEXTURE);<br>
-           ctx->Texture.Unit[u].Enabled = save->TexEnabled[u];<br>
-        }<br>
+      if (ctx->API == API_OPENGL || ctx->API == API_OPENGLES) {<br>
+         for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {<br>
+            if (ctx->Texture.Unit[u].Enabled != save->TexEnabled[u]) {<br>
+               FLUSH_VERTICES(ctx, _NEW_TEXTURE);<br>
+               ctx->Texture.Unit[u].Enabled = save->TexEnabled[u];<br>
+            }<br>
<br>
-        if (ctx->Texture.Unit[u].TexGenEnabled != save->TexGenEnabled[u]) {<br>
-           FLUSH_VERTICES(ctx, _NEW_TEXTURE);<br>
-           ctx->Texture.Unit[u].TexGenEnabled = save->TexGenEnabled[u];<br>
-        }<br>
+            if (ctx->Texture.Unit[u].TexGenEnabled != save->TexGenEnabled[u]) {<br>
+               FLUSH_VERTICES(ctx, _NEW_TEXTURE);<br>
+               ctx->Texture.Unit[u].TexGenEnabled = save->TexGenEnabled[u];<br>
+            }<br>
+         }<br>
       }<br>
<br>
       /* restore current unit state */<br>
@@ -1396,11 +1408,13 @@ blitframebuffer_texture(struct gl_context *ctx,<br>
          _mesa_SamplerParameteri(sampler, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);<br>
<br>
         /* Always do our blits with no sRGB decode or encode.*/<br>
-        if (ctx->Extensions.EXT_texture_sRGB_decode) {<br>
+         if (_mesa_is_desktop_gl(ctx)<br>
+             && ctx->Extensions.EXT_texture_sRGB_decode) {<br>
            _mesa_SamplerParameteri(sampler, GL_TEXTURE_SRGB_DECODE_EXT,<br>
                                GL_SKIP_DECODE_EXT);<br>
         }<br>
-         if (ctx->Extensions.EXT_framebuffer_sRGB) {<br>
+         if (_mesa_is_desktop_gl(ctx)<br>
+             && ctx->Extensions.EXT_framebuffer_sRGB) {<br>
             _mesa_set_enable(ctx, GL_FRAMEBUFFER_SRGB_EXT, GL_FALSE);<br>
          }<br>
<br>
@@ -1461,7 +1475,8 @@ blitframebuffer_texture(struct gl_context *ctx,<br>
             _mesa_TexParameteri(target, GL_TEXTURE_BASE_LEVEL, baseLevelSave);<br>
             _mesa_TexParameteri(target, GL_TEXTURE_MAX_LEVEL, maxLevelSave);<br>
          }<br>
-        if (ctx->Extensions.EXT_framebuffer_sRGB && fbo_srgb_save) {<br>
+         if (_mesa_is_desktop_gl(ctx)<br>
+             && ctx->Extensions.EXT_framebuffer_sRGB && fbo_srgb_save) {<br>
            _mesa_set_enable(ctx, GL_FRAMEBUFFER_SRGB_EXT, GL_TRUE);<br>
         }<br>
<br>
@@ -2696,6 +2711,12 @@ _mesa_meta_check_generate_mipmap_fallback(struct gl_context *ctx, GLenum target,<br>
    GLuint srcLevel;<br>
    GLenum status;<br>
<br>
+   /* HACK: GLES2 doesn't support the fixed function paths that we need to<br>
+    * generate mipmaps<br>
+    */<br>
+   if (ctx->API != API_OPENGL && ctx->API != API_OPENGLES)<br>
+      return GL_TRUE;<br>
+<br>
    /* check for fallbacks */<br>
    if (!ctx->Extensions.EXT_framebuffer_object ||<br>
        target == GL_TEXTURE_3D ||<br>
@@ -3380,11 +3401,10 @@ decompress_texture_image(struct gl_context *ctx,<br>
       _mesa_SamplerParameteri(decompress->Sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST);<br>
       _mesa_SamplerParameteri(decompress->Sampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST);<br>
       /* No sRGB decode or encode.*/<br>
-      if (ctx->Extensions.EXT_texture_sRGB_decode) {<br>
+      if (_mesa_is_desktop_gl(ctx) && ctx->Extensions.EXT_texture_sRGB_decode) {<br>
          _mesa_SamplerParameteri(decompress->Sampler, GL_TEXTURE_SRGB_DECODE_EXT,<br>
                              GL_SKIP_DECODE_EXT);<br>
       }<br>
-<br>
    } else {<br>
       _mesa_BindSampler(ctx->Texture.CurrentUnit, decompress->Sampler);<br>
    }<br>
@@ -3424,7 +3444,7 @@ decompress_texture_image(struct gl_context *ctx,<br>
       }<br>
<br>
       /* No sRGB decode or encode.*/<br>
-      if (ctx->Extensions.EXT_framebuffer_sRGB) {<br>
+      if (_mesa_is_desktop_gl(ctx) && ctx->Extensions.EXT_framebuffer_sRGB) {<br>
          _mesa_set_enable(ctx, GL_FRAMEBUFFER_SRGB_EXT, GL_FALSE);<br>
       }<br>
<br>
diff --git a/src/mesa/main/enable.c b/src/mesa/main/enable.c<br>
index 214f84d..ac1ed9f 100644<br>
--- a/src/mesa/main/enable.c<br>
+++ b/src/mesa/main/enable.c<br>
@@ -764,8 +764,9 @@ _mesa_set_enable(struct gl_context *ctx, GLenum cap, GLboolean state)<br>
<br>
       /* GL_ARB_multisample */<br>
       case GL_MULTISAMPLE_ARB:<br>
-         if (!_mesa_is_desktop_gl(ctx) && ctx->API != API_OPENGLES)<br>
-            goto invalid_enum_error;<br>
+         /* Technically speaking, this should not be allowed for OpenGL ES 2.0<br>
+          * or 3.0.  However, meta really needs it.<br>
+          */<br></blockquote><div><br>With a small change I think we could get correct error handling without breaking Meta.  How about:<br><br>/* Note: Meta needs to disable GL_MULTISAMPLE_ARB, even in OpenGL ES 2.0 and 3.0, so allow it if Meta is in progress. */<br>
if (!_mesa_meta_in_progress(ctx) && !_mesa_is_desktop_gl(ctx) && ctx->API != API_OPENGLES)<br>   goto invalid_enum_error;<br><br>In order to make this work we'll also have to change _mesa_meta_end() so that it decrements ctx->Meta->SaveStackDepth at the *end* of the function rather than the start (that way, _mesa_meta_in_progress() will return true during the time that _mesa_meta_end() is restoring the old state).<br>
 </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
          if (ctx->Multisample.Enabled == state)<br>
             return;<br>
          FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE);<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.7.6.5<br>
<br>
</font></span></blockquote></div><br>