mesa: Only FRONT_AND_BACK is allowed for PolygonMode in core context
authorIan Romanick <ian.d.romanick@intel.com>
Fri, 17 Aug 2012 23:03:06 +0000 (16:03 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Wed, 29 Aug 2012 22:09:36 +0000 (15:09 -0700)
Page 407 (page 423 of the PDF) of the OpenGL 3.0 spec says (in the list
of deprecated functionality):

    "Separate polygon draw mode - PolygonMode face values of FRONT and
    BACK; polygons are always drawn in the same mode, no matter which
    face is being rasterized."

Also modify meta to not use FRONT or BACK in a core context.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
src/mesa/drivers/common/meta.c
src/mesa/main/polygon.c

index 29f35bfb89faaf0e32ff19f73ff95570f6314390..46cda731e1bd067186dd0a712536fd8225c909bf 100644 (file)
@@ -851,8 +851,14 @@ _mesa_meta_end(struct gl_context *ctx)
    }
 
    if (state & MESA_META_RASTERIZATION) {
-      _mesa_PolygonMode(GL_FRONT, save->FrontPolygonMode);
-      _mesa_PolygonMode(GL_BACK, save->BackPolygonMode);
+      /* Core context requires that front and back mode be the same.
+       */
+      if (ctx->API == API_OPENGL_CORE) {
+         _mesa_PolygonMode(GL_FRONT_AND_BACK, save->FrontPolygonMode);
+      } else {
+         _mesa_PolygonMode(GL_FRONT, save->FrontPolygonMode);
+         _mesa_PolygonMode(GL_BACK, save->BackPolygonMode);
+      }
       if (ctx->API == API_OPENGL) {
          _mesa_set_enable(ctx, GL_POLYGON_STIPPLE, save->PolygonStipple);
          _mesa_set_enable(ctx, GL_POLYGON_SMOOTH, save->PolygonSmooth);
index addca0228d5092ebc00c8030da84681d40ff6047..d7d52daa89ef1cddd532323e732c66f100385174 100644 (file)
@@ -143,6 +143,10 @@ _mesa_PolygonMode( GLenum face, GLenum mode )
 
    switch (face) {
    case GL_FRONT:
+      if (ctx->API == API_OPENGL_CORE) {
+         _mesa_error( ctx, GL_INVALID_ENUM, "glPolygonMode(face)" );
+         return;
+      }
       if (ctx->Polygon.FrontMode == mode)
         return;
       FLUSH_VERTICES(ctx, _NEW_POLYGON);
@@ -157,6 +161,10 @@ _mesa_PolygonMode( GLenum face, GLenum mode )
       ctx->Polygon.BackMode = mode;
       break;
    case GL_BACK:
+      if (ctx->API == API_OPENGL_CORE) {
+         _mesa_error( ctx, GL_INVALID_ENUM, "glPolygonMode(face)" );
+         return;
+      }
       if (ctx->Polygon.BackMode == mode)
         return;
       FLUSH_VERTICES(ctx, _NEW_POLYGON);