Comment out __FUNCTION__ usage.
[mesa.git] / src / mesa / main / polygon.c
index f93ab1956656f9252d6911a4a2998068584f115b..910b8a35933bf490100c5601b74b189196b66114 100644 (file)
@@ -1,21 +1,21 @@
-/* $Id: polygon.c,v 1.7 1999/11/11 01:22:27 brianp Exp $ */
+/* $Id: polygon.c,v 1.21 2001/03/22 00:36:27 gareth Exp $ */
 
 /*
  * Mesa 3-D graphics library
- * Version:  3.3
- * 
- * Copyright (C) 1999  Brian Paul   All Rights Reserved.
- * 
+ * Version:  3.5
+ *
+ * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  * and/or sell copies of the Software, and to permit persons to whom the
  * Software is furnished to do so, subject to the following conditions:
- * 
+ *
  * The above copyright notice and this permission notice shall be included
  * in all copies or substantial portions of the Software.
- * 
+ *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
@@ -35,7 +35,7 @@
 #include "macros.h"
 #include "mem.h"
 #include "polygon.h"
-#include "types.h"
+#include "mtypes.h"
 #endif
 
 
@@ -44,18 +44,21 @@ void
 _mesa_CullFace( GLenum mode )
 {
    GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glCullFace");
+   ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    if (MESA_VERBOSE&VERBOSE_API)
-      fprintf(stderr, "glCullFace %s\n", gl_lookup_enum_by_nr(mode));
+      fprintf(stderr, "glCullFace %s\n", _mesa_lookup_enum_by_nr(mode));
 
    if (mode!=GL_FRONT && mode!=GL_BACK && mode!=GL_FRONT_AND_BACK) {
-      gl_error( ctx, GL_INVALID_ENUM, "glCullFace" );
+      _mesa_error( ctx, GL_INVALID_ENUM, "glCullFace" );
       return;
    }
 
+   if (ctx->Polygon.CullFaceMode == mode)
+      return;
+
+   FLUSH_VERTICES(ctx, _NEW_POLYGON);
    ctx->Polygon.CullFaceMode = mode;
-   ctx->NewState |= NEW_POLYGON;
 
    if (ctx->Driver.CullFace)
       ctx->Driver.CullFace( ctx, mode );
@@ -67,19 +70,23 @@ void
 _mesa_FrontFace( GLenum mode )
 {
    GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glFrontFace");
+   ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    if (MESA_VERBOSE&VERBOSE_API)
-      fprintf(stderr, "glFrontFace %s\n", gl_lookup_enum_by_nr(mode));
+      fprintf(stderr, "glFrontFace %s\n", _mesa_lookup_enum_by_nr(mode));
 
    if (mode!=GL_CW && mode!=GL_CCW) {
-      gl_error( ctx, GL_INVALID_ENUM, "glFrontFace" );
+      _mesa_error( ctx, GL_INVALID_ENUM, "glFrontFace" );
       return;
    }
 
+   if (ctx->Polygon.FrontFace == mode)
+      return;
+
+   FLUSH_VERTICES(ctx, _NEW_POLYGON);
    ctx->Polygon.FrontFace = mode;
-   ctx->Polygon.FrontBit = (GLboolean) (mode == GL_CW);
-   ctx->NewState |= NEW_POLYGON;
+
+   ctx->Polygon._FrontBit = (GLboolean) (mode == GL_CW);
 
    if (ctx->Driver.FrontFace)
       ctx->Driver.FrontFace( ctx, mode );
@@ -91,39 +98,47 @@ void
 _mesa_PolygonMode( GLenum face, GLenum mode )
 {
    GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glPolygonMode");
+   ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    if (MESA_VERBOSE&VERBOSE_API)
-      fprintf(stderr, "glPolygonMode %s %s\n", 
-             gl_lookup_enum_by_nr(face),
-             gl_lookup_enum_by_nr(mode));
+      fprintf(stderr, "glPolygonMode %s %s\n",
+             _mesa_lookup_enum_by_nr(face),
+             _mesa_lookup_enum_by_nr(mode));
 
-   if (face!=GL_FRONT && face!=GL_BACK && face!=GL_FRONT_AND_BACK) {
-      gl_error( ctx, GL_INVALID_ENUM, "glPolygonMode(face)" );
-      return;
-   }
-   else if (mode!=GL_POINT && mode!=GL_LINE && mode!=GL_FILL) {
-      gl_error( ctx, GL_INVALID_ENUM, "glPolygonMode(mode)" );
+   if (mode!=GL_POINT && mode!=GL_LINE && mode!=GL_FILL) {
+      _mesa_error( ctx, GL_INVALID_ENUM, "glPolygonMode(mode)" );
       return;
    }
 
-   if (face==GL_FRONT || face==GL_FRONT_AND_BACK) {
+   switch (face) {
+   case GL_FRONT:
+      if (ctx->Polygon.FrontMode == mode)
+        return;
+      FLUSH_VERTICES(ctx, _NEW_POLYGON);
+      ctx->Polygon.FrontMode = mode;
+      break;
+   case GL_FRONT_AND_BACK:
+      if (ctx->Polygon.FrontMode == mode &&
+         ctx->Polygon.BackMode == mode)
+        return;
+      FLUSH_VERTICES(ctx, _NEW_POLYGON);
       ctx->Polygon.FrontMode = mode;
-   }
-   if (face==GL_BACK || face==GL_FRONT_AND_BACK) {
       ctx->Polygon.BackMode = mode;
+      break;
+   case GL_BACK:
+      if (ctx->Polygon.BackMode == mode)
+        return;
+      FLUSH_VERTICES(ctx, _NEW_POLYGON);
+      ctx->Polygon.BackMode = mode;
+      break;
+   default:
+      _mesa_error( ctx, GL_INVALID_ENUM, "glPolygonMode(face)" );
+      return;
    }
 
-   /* Compute a handy "shortcut" value: */
-   ctx->TriangleCaps &= ~DD_TRI_UNFILLED;
-   ctx->Polygon.Unfilled = GL_FALSE;
-
-   if (ctx->Polygon.FrontMode!=GL_FILL || ctx->Polygon.BackMode!=GL_FILL) {
-      ctx->Polygon.Unfilled = GL_TRUE;
-      ctx->TriangleCaps |= DD_TRI_UNFILLED;
-   }
-
-   ctx->NewState |= (NEW_POLYGON | NEW_RASTER_OPS);
+   ctx->_TriangleCaps &= ~DD_TRI_UNFILLED;
+   if (ctx->Polygon.FrontMode!=GL_FILL || ctx->Polygon.BackMode!=GL_FILL)
+      ctx->_TriangleCaps |= DD_TRI_UNFILLED;
 
    if (ctx->Driver.PolygonMode) {
       (*ctx->Driver.PolygonMode)( ctx, face, mode );
@@ -132,24 +147,20 @@ _mesa_PolygonMode( GLenum face, GLenum mode )
 
 
 
-/*
- * NOTE:  stipple pattern has already been unpacked.
- */
 void
-_mesa_PolygonStipple( const GLubyte *mask )
+_mesa_PolygonStipple( const GLubyte *pattern )
 {
    GET_CURRENT_CONTEXT(ctx);
-   GLuint *pattern = (GLuint *) mask;  /* XXX verify */
-   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glPolygonStipple");
+   ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    if (MESA_VERBOSE&VERBOSE_API)
       fprintf(stderr, "glPolygonStipple\n");
 
-   MEMCPY( ctx->PolygonStipple, pattern, 32 * 4 );
+   FLUSH_VERTICES(ctx, _NEW_POLYGONSTIPPLE);
+   _mesa_unpack_polygon_stipple(pattern, ctx->PolygonStipple, &ctx->Unpack);
 
-   if (ctx->Polygon.StippleFlag) {
-      ctx->NewState |= NEW_RASTER_OPS;
-   }
+   if (ctx->Driver.PolygonStipple)
+      ctx->Driver.PolygonStipple( ctx, (const GLubyte *) ctx->PolygonStipple );
 }
 
 
@@ -158,12 +169,12 @@ void
 _mesa_GetPolygonStipple( GLubyte *dest )
 {
    GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glPolygonOffset");
+   ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    if (MESA_VERBOSE&VERBOSE_API)
       fprintf(stderr, "glGetPolygonStipple\n");
 
-   gl_pack_polygon_stipple( ctx, ctx->PolygonStipple, dest );
+   _mesa_pack_polygon_stipple(ctx->PolygonStipple, dest, &ctx->Pack);
 }
 
 
@@ -172,19 +183,29 @@ void
 _mesa_PolygonOffset( GLfloat factor, GLfloat units )
 {
    GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glPolygonOffset");
+   ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    if (MESA_VERBOSE&VERBOSE_API)
       fprintf(stderr, "glPolygonOffset %f %f\n", factor, units);
 
+   if (ctx->Polygon.OffsetFactor == factor &&
+       ctx->Polygon.OffsetUnits == units)
+      return;
+
+   FLUSH_VERTICES(ctx, _NEW_POLYGON);
    ctx->Polygon.OffsetFactor = factor;
    ctx->Polygon.OffsetUnits = units;
+   ctx->Polygon.OffsetMRD = units * ctx->MRD;
+
+   if (ctx->Driver.PolygonOffset)
+      ctx->Driver.PolygonOffset( ctx, factor, units );
 }
 
 
+
 void
 _mesa_PolygonOffsetEXT( GLfloat factor, GLfloat bias )
 {
-   _mesa_PolygonOffset(factor, bias * DEPTH_SCALE );
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_PolygonOffset(factor, bias * ctx->DepthMaxF );
 }
-