summaryrefslogtreecommitdiffstats
path: root/src/VBox/GuestHost/OpenGL/state_tracker/state_polygon.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/VBox/GuestHost/OpenGL/state_tracker/state_polygon.c')
-rw-r--r--src/VBox/GuestHost/OpenGL/state_tracker/state_polygon.c211
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);
+}