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