diff options
Diffstat (limited to 'src/VBox/GuestHost/OpenGL/state_tracker/state_polygon.c')
-rw-r--r-- | src/VBox/GuestHost/OpenGL/state_tracker/state_polygon.c | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/src/VBox/GuestHost/OpenGL/state_tracker/state_polygon.c b/src/VBox/GuestHost/OpenGL/state_tracker/state_polygon.c new file mode 100644 index 00000000..b00e8e80 --- /dev/null +++ b/src/VBox/GuestHost/OpenGL/state_tracker/state_polygon.c @@ -0,0 +1,211 @@ +/* Copyright (c) 2001, Stanford University + * All rights reserved + * + * See the file LICENSE.txt for information on redistributing this software. + */ + +#include "cr_mem.h" +#include "state.h" +#include "state/cr_statetypes.h" +#include "state_internals.h" +#include "cr_pixeldata.h" + +void crStatePolygonInit(CRContext *ctx) +{ + CRPolygonState *p = &ctx->polygon; + CRStateBits *sb = GetCurrentBits(); + CRPolygonBits *pb = &(sb->polygon); + int i; + + p->polygonSmooth = GL_FALSE; + p->polygonOffsetFill = GL_FALSE; + p->polygonOffsetLine = GL_FALSE; + p->polygonOffsetPoint = GL_FALSE; + p->polygonStipple = GL_FALSE; + p->cullFace = GL_FALSE; + RESET(pb->enable, ctx->bitid); + + p->offsetFactor = 0; + p->offsetUnits = 0; + RESET(pb->offset, ctx->bitid); + + p->cullFaceMode = GL_BACK; + p->frontFace = GL_CCW; + p->frontMode = GL_FILL; + p->backMode = GL_FILL; + RESET(pb->mode, ctx->bitid); + + for (i=0; i<32; i++) + p->stipple[i] = 0xFFFFFFFF; + RESET(pb->stipple, ctx->bitid); + + RESET(pb->dirty, ctx->bitid); +} + +void STATE_APIENTRY crStateCullFace(GLenum mode) +{ + CRContext *g = GetCurrentContext(); + CRPolygonState *p = &(g->polygon); + CRStateBits *sb = GetCurrentBits(); + CRPolygonBits *pb = &(sb->polygon); + + if (g->current.inBeginEnd) + { + crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION, + "glCullFace called in begin/end"); + return; + } + + FLUSH(); + + if (mode != GL_FRONT && mode != GL_BACK && mode != GL_FRONT_AND_BACK) + { + crStateError(__LINE__, __FILE__, GL_INVALID_ENUM, + "glCullFace called with bogus mode: 0x%x", mode); + return; + } + + p->cullFaceMode = mode; + DIRTY(pb->mode, g->neg_bitid); + DIRTY(pb->dirty, g->neg_bitid); +} + +void STATE_APIENTRY crStateFrontFace (GLenum mode) +{ + CRContext *g = GetCurrentContext(); + CRPolygonState *p = &(g->polygon); + CRStateBits *sb = GetCurrentBits(); + CRPolygonBits *pb = &(sb->polygon); + + if (g->current.inBeginEnd) + { + crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION, + "glFrontFace called in begin/end"); + return; + } + + FLUSH(); + + if (mode != GL_CW && mode != GL_CCW) + { + crStateError(__LINE__, __FILE__, GL_INVALID_ENUM, + "glFrontFace called with bogus mode: 0x%x", mode); + return; + } + + p->frontFace = mode; + DIRTY(pb->mode, g->neg_bitid); + DIRTY(pb->dirty, g->neg_bitid); +} + +void STATE_APIENTRY crStatePolygonMode (GLenum face, GLenum mode) +{ + CRContext *g = GetCurrentContext(); + CRPolygonState *p = &(g->polygon); + CRStateBits *sb = GetCurrentBits(); + CRPolygonBits *pb = &(sb->polygon); + + if (g->current.inBeginEnd) + { + crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION, + "glPolygonMode called in begin/end"); + return; + } + + FLUSH(); + + if (mode != GL_POINT && mode != GL_LINE && mode != GL_FILL) + { + crStateError(__LINE__, __FILE__, GL_INVALID_ENUM, + "glPolygonMode called with bogus mode: 0x%x", mode); + return; + } + + switch (face) { + case GL_FRONT: + p->frontMode = mode; + break; + case GL_FRONT_AND_BACK: + p->frontMode = mode; + RT_FALL_THRU(); + case GL_BACK: + p->backMode = mode; + break; + default: + crStateError(__LINE__, __FILE__, GL_INVALID_ENUM, + "glPolygonMode called with bogus face: 0x%x", face); + return; + } + DIRTY(pb->mode, g->neg_bitid); + DIRTY(pb->dirty, g->neg_bitid); +} + +void STATE_APIENTRY crStatePolygonOffset (GLfloat factor, GLfloat units) +{ + CRContext *g = GetCurrentContext(); + CRPolygonState *p = &(g->polygon); + CRStateBits *sb = GetCurrentBits(); + CRPolygonBits *pb = &(sb->polygon); + + if (g->current.inBeginEnd) + { + crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION, + "glPolygonOffset called in begin/end"); + return; + } + + FLUSH(); + + p->offsetFactor = factor; + p->offsetUnits = units; + + DIRTY(pb->offset, g->neg_bitid); + DIRTY(pb->dirty, g->neg_bitid); +} + +void STATE_APIENTRY crStatePolygonStipple (const GLubyte *p) +{ + CRContext *g = GetCurrentContext(); + CRPolygonState *poly = &(g->polygon); + CRStateBits *sb = GetCurrentBits(); + CRPolygonBits *pb = &(sb->polygon); + + if (g->current.inBeginEnd) + { + crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION, + "glPolygonStipple called in begin/end"); + return; + } + + FLUSH(); + + if (!p && !crStateIsBufferBound(GL_PIXEL_UNPACK_BUFFER_ARB)) + { + crDebug("Void pointer passed to PolygonStipple"); + return; + } + + /** @todo track mask if buffer is bound?*/ + if (!crStateIsBufferBound(GL_PIXEL_UNPACK_BUFFER_ARB)) + { + crMemcpy((char*)poly->stipple, (char*)p, 128); + } + + DIRTY(pb->dirty, g->neg_bitid); + DIRTY(pb->stipple, g->neg_bitid); +} + +void STATE_APIENTRY crStateGetPolygonStipple( GLubyte *b ) +{ + CRContext *g = GetCurrentContext(); + CRPolygonState *poly = &(g->polygon); + + if (g->current.inBeginEnd) + { + crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION, + "glGetPolygonStipple called in begin/end"); + return; + } + + crMemcpy((char*)b, (char*)poly->stipple, 128); +} |