X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Fpolygon.c;h=6eee6948336fceda008f78568c886ecca13fa76f;hb=70847eb0a95f1e1b0fbd435aa0ef4091ae5bef88;hp=60af88f9857ca831da6b3beffc74acf73221b673;hpb=6a7ca4ef2cd3f39d3b5e77051cb3f3175e9e60df;p=mesa.git diff --git a/src/mesa/main/polygon.c b/src/mesa/main/polygon.c index 60af88f9857..6eee6948336 100644 --- a/src/mesa/main/polygon.c +++ b/src/mesa/main/polygon.c @@ -29,7 +29,7 @@ #include "glheader.h" -#include "imports.h" + #include "context.h" #include "image.h" #include "enums.h" @@ -50,32 +50,49 @@ * change, flushes the vertices and notifies the driver via * the dd_function_table::CullFace callback. */ -void GLAPIENTRY -_mesa_CullFace( GLenum mode ) +static ALWAYS_INLINE void +cull_face(struct gl_context *ctx, GLenum mode, bool no_error) { - GET_CURRENT_CONTEXT(ctx); - - if (MESA_VERBOSE&VERBOSE_API) - _mesa_debug(ctx, "glCullFace %s\n", _mesa_enum_to_string(mode)); - - if (mode!=GL_FRONT && mode!=GL_BACK && mode!=GL_FRONT_AND_BACK) { - _mesa_error( ctx, GL_INVALID_ENUM, "glCullFace" ); + if (ctx->Polygon.CullFaceMode == mode) return; - } - if (ctx->Polygon.CullFaceMode == mode) + if (!no_error && + mode != GL_FRONT && mode != GL_BACK && mode != GL_FRONT_AND_BACK) { + _mesa_error(ctx, GL_INVALID_ENUM, "glCullFace"); return; + } - FLUSH_VERTICES(ctx, _NEW_POLYGON); + FLUSH_VERTICES(ctx, ctx->DriverFlags.NewPolygonState ? 0 : _NEW_POLYGON); + ctx->NewDriverState |= ctx->DriverFlags.NewPolygonState; ctx->Polygon.CullFaceMode = mode; if (ctx->Driver.CullFace) - ctx->Driver.CullFace( ctx, mode ); + ctx->Driver.CullFace(ctx, mode); +} + + +void GLAPIENTRY +_mesa_CullFace_no_error(GLenum mode) +{ + GET_CURRENT_CONTEXT(ctx); + cull_face(ctx, mode, true); +} + + +void GLAPIENTRY +_mesa_CullFace(GLenum mode) +{ + GET_CURRENT_CONTEXT(ctx); + + if (MESA_VERBOSE & VERBOSE_API) + _mesa_debug(ctx, "glCullFace %s\n", _mesa_enum_to_string(mode)); + + cull_face(ctx, mode, false); } /** - * Define front- and back-facing + * Define front- and back-facing * * \param mode orientation of front-facing polygons. * @@ -85,27 +102,43 @@ _mesa_CullFace( GLenum mode ) * flushes the vertices and notifies the driver via * the dd_function_table::FrontFace callback. */ -void GLAPIENTRY -_mesa_FrontFace( GLenum mode ) +static ALWAYS_INLINE void +front_face(struct gl_context *ctx, GLenum mode, bool no_error) { - GET_CURRENT_CONTEXT(ctx); - - if (MESA_VERBOSE&VERBOSE_API) - _mesa_debug(ctx, "glFrontFace %s\n", _mesa_enum_to_string(mode)); - if (ctx->Polygon.FrontFace == mode) return; - if (mode!=GL_CW && mode!=GL_CCW) { - _mesa_error( ctx, GL_INVALID_ENUM, "glFrontFace" ); + if (!no_error && mode != GL_CW && mode != GL_CCW) { + _mesa_error(ctx, GL_INVALID_ENUM, "glFrontFace"); return; } - FLUSH_VERTICES(ctx, _NEW_POLYGON); + FLUSH_VERTICES(ctx, ctx->DriverFlags.NewPolygonState ? 0 : _NEW_POLYGON); + ctx->NewDriverState |= ctx->DriverFlags.NewPolygonState; ctx->Polygon.FrontFace = mode; if (ctx->Driver.FrontFace) - ctx->Driver.FrontFace( ctx, mode ); + ctx->Driver.FrontFace(ctx, mode); +} + + +void GLAPIENTRY +_mesa_FrontFace_no_error(GLenum mode) +{ + GET_CURRENT_CONTEXT(ctx); + front_face(ctx, mode, true); +} + + +void GLAPIENTRY +_mesa_FrontFace(GLenum mode) +{ + GET_CURRENT_CONTEXT(ctx); + + if (MESA_VERBOSE & VERBOSE_API) + _mesa_debug(ctx, "glFrontFace %s\n", _mesa_enum_to_string(mode)); + + front_face(ctx, mode, false); } @@ -115,58 +148,70 @@ _mesa_FrontFace( GLenum mode ) * \param face the polygons which \p mode applies to. * \param mode how polygons should be rasterized. * - * \sa glPolygonMode(). - * + * \sa glPolygonMode(). + * * Verifies the parameters and updates gl_polygon_attrib::FrontMode and * gl_polygon_attrib::BackMode. On change flushes the vertices and notifies the * driver via the dd_function_table::PolygonMode callback. */ -void GLAPIENTRY -_mesa_PolygonMode( GLenum face, GLenum mode ) +static ALWAYS_INLINE void +polygon_mode(struct gl_context *ctx, GLenum face, GLenum mode, bool no_error) { - GET_CURRENT_CONTEXT(ctx); - - if (MESA_VERBOSE&VERBOSE_API) + if (MESA_VERBOSE & VERBOSE_API) _mesa_debug(ctx, "glPolygonMode %s %s\n", _mesa_enum_to_string(face), _mesa_enum_to_string(mode)); - if (mode!=GL_POINT && mode!=GL_LINE && mode!=GL_FILL) { - _mesa_error( ctx, GL_INVALID_ENUM, "glPolygonMode(mode)" ); - return; + if (!no_error) { + switch (mode) { + case GL_POINT: + case GL_LINE: + case GL_FILL: + break; + case GL_FILL_RECTANGLE_NV: + if (ctx->Extensions.NV_fill_rectangle) + break; + /* fall-through */ + default: + _mesa_error(ctx, GL_INVALID_ENUM, "glPolygonMode(mode)"); + return; + } } switch (face) { case GL_FRONT: - if (ctx->API == API_OPENGL_CORE) { + if (!no_error && 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); + return; + FLUSH_VERTICES(ctx, ctx->DriverFlags.NewPolygonState ? 0 : _NEW_POLYGON); + ctx->NewDriverState |= ctx->DriverFlags.NewPolygonState; 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); + if (ctx->Polygon.FrontMode == mode && ctx->Polygon.BackMode == mode) + return; + FLUSH_VERTICES(ctx, ctx->DriverFlags.NewPolygonState ? 0 : _NEW_POLYGON); + ctx->NewDriverState |= ctx->DriverFlags.NewPolygonState; ctx->Polygon.FrontMode = mode; ctx->Polygon.BackMode = mode; break; case GL_BACK: - if (ctx->API == API_OPENGL_CORE) { + if (!no_error && 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); + return; + FLUSH_VERTICES(ctx, ctx->DriverFlags.NewPolygonState ? 0 : _NEW_POLYGON); + ctx->NewDriverState |= ctx->DriverFlags.NewPolygonState; ctx->Polygon.BackMode = mode; break; default: - _mesa_error( ctx, GL_INVALID_ENUM, "glPolygonMode(face)" ); + if (!no_error) + _mesa_error( ctx, GL_INVALID_ENUM, "glPolygonMode(face)" ); return; } @@ -175,6 +220,22 @@ _mesa_PolygonMode( GLenum face, GLenum mode ) } +void GLAPIENTRY +_mesa_PolygonMode_no_error(GLenum face, GLenum mode) +{ + GET_CURRENT_CONTEXT(ctx); + polygon_mode(ctx, face, mode, true); +} + + +void GLAPIENTRY +_mesa_PolygonMode(GLenum face, GLenum mode) +{ + GET_CURRENT_CONTEXT(ctx); + polygon_mode(ctx, face, mode, false); +} + + /** * Called by glPolygonStipple. */ @@ -186,7 +247,9 @@ _mesa_PolygonStipple(const GLubyte *pattern) if (MESA_VERBOSE & VERBOSE_API) _mesa_debug(ctx, "glPolygonStipple\n"); - FLUSH_VERTICES(ctx, _NEW_POLYGONSTIPPLE); + FLUSH_VERTICES(ctx, ctx->DriverFlags.NewPolygonStipple ? 0 : + _NEW_POLYGONSTIPPLE); + ctx->NewDriverState |= ctx->DriverFlags.NewPolygonStipple; pattern = _mesa_map_validate_pbo_source(ctx, 2, &ctx->Unpack, 32, 32, 1, @@ -244,7 +307,8 @@ _mesa_polygon_offset_clamp(struct gl_context *ctx, ctx->Polygon.OffsetClamp == clamp) return; - FLUSH_VERTICES(ctx, _NEW_POLYGON); + FLUSH_VERTICES(ctx, ctx->DriverFlags.NewPolygonState ? 0 : _NEW_POLYGON); + ctx->NewDriverState |= ctx->DriverFlags.NewPolygonState; ctx->Polygon.OffsetFactor = factor; ctx->Polygon.OffsetUnits = units; ctx->Polygon.OffsetClamp = clamp; @@ -264,34 +328,23 @@ _mesa_PolygonOffset( GLfloat factor, GLfloat units ) _mesa_polygon_offset_clamp(ctx, factor, units, 0.0); } - -void GLAPIENTRY -_mesa_PolygonOffsetEXT( GLfloat factor, GLfloat bias ) -{ - GET_CURRENT_CONTEXT(ctx); - /* XXX mult by DepthMaxF here??? */ - _mesa_PolygonOffset(factor, bias * ctx->DrawBuffer->_DepthMaxF ); -} - void GLAPIENTRY _mesa_PolygonOffsetClampEXT( GLfloat factor, GLfloat units, GLfloat clamp ) { GET_CURRENT_CONTEXT(ctx); - if (!ctx->Extensions.EXT_polygon_offset_clamp) { + if (!ctx->Extensions.ARB_polygon_offset_clamp) { _mesa_error(ctx, GL_INVALID_OPERATION, - "unsupported function (glPolygonOffsetClampEXT) called"); + "unsupported function (%s) called", "glPolygonOffsetClamp"); return; } if (MESA_VERBOSE&VERBOSE_API) - _mesa_debug(ctx, "glPolygonOffsetClampEXT %f %f %f\n", factor, units, clamp); + _mesa_debug(ctx, "glPolygonOffsetClamp %f %f %f\n", factor, units, clamp); _mesa_polygon_offset_clamp(ctx, factor, units, clamp); } - - /**********************************************************************/ /** \name Initialization */ /*@{*/ @@ -310,7 +363,6 @@ void _mesa_init_polygon( struct gl_context * ctx ) ctx->Polygon.CullFlag = GL_FALSE; ctx->Polygon.CullFaceMode = GL_BACK; ctx->Polygon.FrontFace = GL_CCW; - ctx->Polygon._FrontBit = 0; ctx->Polygon.FrontMode = GL_FILL; ctx->Polygon.BackMode = GL_FILL; ctx->Polygon.SmoothFlag = GL_FALSE;