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 <stdio.h>
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "state.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "state/cr_statetypes.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "state_internals.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsyncstatic GLint crStateStencilBufferGetIdxAndCount(CRStencilState *s, GLenum face, GLint *pIdx, GLint *pBitsIdx)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync{
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync switch (face)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync case GL_FRONT_AND_BACK:
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync *pIdx = 0;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync *pBitsIdx = CRSTATE_STENCIL_BUFFER_REF_ID_FRONT_AND_BACK;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync return 2;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync case GL_FRONT:
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync *pIdx = CRSTATE_STENCIL_BUFFER_ID_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync *pBitsIdx = CRSTATE_STENCIL_BUFFER_REF_ID_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync return 1;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync case GL_BACK:
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync *pIdx = CRSTATE_STENCIL_BUFFER_ID_BACK;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync *pBitsIdx = CRSTATE_STENCIL_BUFFER_REF_ID_BACK;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync return 1;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync case 0:
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!s->stencilTwoSideEXT || s->activeStencilFace == GL_FRONT)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync /* both front and back */
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync *pIdx = 0;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync *pBitsIdx = CRSTATE_STENCIL_BUFFER_REF_ID_FRONT_AND_BACK;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync return 2;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync *pIdx = CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync *pBitsIdx = CRSTATE_STENCIL_BUFFER_REF_ID_TWO_SIDE_BACK;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync return 1;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync default:
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync crStateError(__LINE__,__FILE__,GL_INVALID_ENUM, "crStateStencilBufferGetIdxAndCount");
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync return 0;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync crError("should never be here!");
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync return 0;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync}
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsyncvoid crStateStencilBufferInit(CRStencilBufferState *s)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync{
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->func = GL_ALWAYS;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->mask = 0xFFFFFFFF;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->ref = 0;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->fail = GL_KEEP;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->passDepthFail = GL_KEEP;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->passDepthPass = GL_KEEP;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync}
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsyncstatic void crStateStencilBufferRefBitsInit(CRContext *ctx, CRStencilBufferRefBits *sb)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync{
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync RESET(sb->func, ctx->bitid);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync RESET(sb->op, ctx->bitid);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync}
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crStateStencilInit(CRContext *ctx)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRStencilState *s = &ctx->stencil;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRStateBits *stateb = GetCurrentBits();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRStencilBits *sb = &(stateb->stencil);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync int i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync s->stencilTest = GL_FALSE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync RESET(sb->enable, ctx->bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->stencilTwoSideEXT = GL_FALSE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync RESET(sb->enableTwoSideEXT, ctx->bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->activeStencilFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync RESET(sb->activeStencilFace, ctx->bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync s->clearValue = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync RESET(sb->clearValue, ctx->bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync s->writeMask = 0xFFFFFFFF;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync RESET(sb->writeMask, ctx->bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync RESET(sb->dirty, ctx->bitid);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync for (i = 0; i < CRSTATE_STENCIL_BUFFER_COUNT; ++i)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync crStateStencilBufferInit(&s->buffers[i]);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync for (i = 0; i < CRSTATE_STENCIL_BUFFER_REF_COUNT; ++i)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync crStateStencilBufferRefBitsInit(ctx, &sb->bufferRefs[i]);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsyncstatic void crStateStencilBufferFunc(CRContext *g, CRStencilBufferState *s, GLenum func, GLint ref, GLuint mask)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->func = func;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->ref = ref;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->mask = mask;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsyncstatic void crStateStencilFuncPerform(GLenum face, GLenum func, GLint ref, GLuint mask)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync{
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CRContext *g = GetCurrentContext();
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CRStencilState *s = &(g->stencil);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CRStateBits *stateb = GetCurrentBits();
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CRStencilBits *sb = &(stateb->stencil);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync GLint idx, bitsIdx, count, i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (g->current.inBeginEnd)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync "glStencilFunc called in begin/end");
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync return;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync FLUSH();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (func != GL_NEVER &&
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync func != GL_LESS &&
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync func != GL_LEQUAL &&
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync func != GL_GREATER &&
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync func != GL_GEQUAL &&
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync func != GL_EQUAL &&
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync func != GL_NOTEQUAL &&
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync func != GL_ALWAYS)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync "glStencilFunc called with bogu func: %d", func);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync return;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync count = crStateStencilBufferGetIdxAndCount(s, face, &idx, &bitsIdx);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (count)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync for (i = idx; i < idx + count; ++i)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync crStateStencilBufferFunc(g, &s->buffers[i], func, ref, mask);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync DIRTY(sb->bufferRefs[bitsIdx].func, g->neg_bitid);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync DIRTY(sb->dirty, g->neg_bitid);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync}
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsyncvoid STATE_APIENTRY crStateStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync{
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!face)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync /* crStateStencilFuncPerform accepts 0 value, while glStencilFuncSeparate does not,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync * filter it out here */
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync crStateError(__LINE__,__FILE__,GL_INVALID_ENUM, "crStateStencilFuncSeparate");
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync return;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync crStateStencilFuncPerform(face, func, ref, mask);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync}
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsyncvoid STATE_APIENTRY crStateStencilFunc(GLenum func, GLint ref, GLuint mask)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync{
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync crStateStencilFuncPerform(0, func, ref, mask);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync}
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsyncstatic void STATE_APIENTRY crStateStencilBufferOp (CRContext *g, CRStencilBufferState *s, GLenum fail, GLenum zfail, GLenum zpass)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync{
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->fail = fail;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->passDepthFail = zfail;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->passDepthPass = zpass;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsyncstatic void crStateStencilOpPerform (GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRStencilState *s = &(g->stencil);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRStateBits *stateb = GetCurrentBits();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRStencilBits *sb = &(stateb->stencil);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync GLint idx, bitsIdx, count, i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glStencilOp called in begin/end");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync FLUSH();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (fail) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_KEEP:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_ZERO:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_REPLACE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INCR:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_DECR:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INVERT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_EXT_stencil_wrap
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INCR_WRAP_EXT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_DECR_WRAP_EXT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glStencilOp called with bogus fail: %d", fail);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (zfail) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_KEEP:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_ZERO:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_REPLACE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INCR:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_DECR:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INVERT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_EXT_stencil_wrap
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INCR_WRAP_EXT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_DECR_WRAP_EXT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glStencilOp called with bogus zfail: %d", zfail);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (zpass) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_KEEP:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_ZERO:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_REPLACE:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INCR:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_DECR:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INVERT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_EXT_stencil_wrap
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_INCR_WRAP_EXT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_DECR_WRAP_EXT:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glStencilOp called with bogus zpass: %d", zpass);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync count = crStateStencilBufferGetIdxAndCount(s, face, &idx, &bitsIdx);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (count)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync for (i = idx; i < idx + count; ++i)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync crStateStencilBufferOp(g, &s->buffers[i], fail, zfail, zpass);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync DIRTY(sb->bufferRefs[bitsIdx].op, g->neg_bitid);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync DIRTY(sb->dirty, g->neg_bitid);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync}
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsyncvoid STATE_APIENTRY crStateStencilOpSeparate (GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync{
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!face)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync /* crStateStencilOpPerform accepts 0 value, while glStencilOpSeparate does not,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync * filter it out here */
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync crStateError(__LINE__,__FILE__,GL_INVALID_ENUM, "crStateStencilOpSeparate");
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync return;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync crStateStencilOpPerform (0, fail, zfail, zpass);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsyncvoid STATE_APIENTRY crStateStencilOp (GLenum fail, GLenum zfail, GLenum zpass)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync{
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync crStateStencilOpPerform (0, fail, zfail, zpass);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateClearStencil (GLint c)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRStencilState *s = &(g->stencil);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRStateBits *stateb = GetCurrentBits();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRStencilBits *sb = &(stateb->stencil);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glClearStencil called in begin/end");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync FLUSH();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync s->clearValue = c;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(sb->clearValue, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(sb->dirty, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY crStateStencilMask (GLuint mask)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRStencilState *s = &(g->stencil);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRStateBits *stateb = GetCurrentBits();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRStencilBits *sb = &(stateb->stencil);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glStencilMask called in begin/end");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync FLUSH();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync s->writeMask = mask;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(sb->writeMask, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync DIRTY(sb->dirty, g->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsyncvoid STATE_APIENTRY crStateActiveStencilFaceEXT (GLenum face)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync{
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CRContext *g = GetCurrentContext();
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CRStencilState *s = &(g->stencil);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CRStateBits *stateb = GetCurrentBits();
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CRStencilBits *sb = &(stateb->stencil);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync switch (face)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync case GL_FRONT:
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync case GL_BACK:
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->activeStencilFace = face;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync break;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync default:
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync crStateError(__LINE__,__FILE__,GL_INVALID_ENUM, "crStateActiveStencilFaceEXT");
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync return;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync DIRTY(sb->activeStencilFace, g->neg_bitid);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync DIRTY(sb->dirty, g->neg_bitid);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync}
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync#ifdef CRSTATE_DEBUG_STENCIL_ERR
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync#define CRSTATE_CLEARERR() do { \
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync while (diff_api.GetError() != GL_NO_ERROR) {} \
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync } while (0)
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync#define CRSTATE_CHECKGLERR(_op) do {\
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync GLenum _glErr; \
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CLEARERR(); \
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync _op; \
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync while ((_glErr = diff_api.GetError()) != GL_NO_ERROR) { Assert(0);} \
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync }while (0)
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync#else
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync#define CRSTATE_CHECKGLERR(_op) do { _op; } while (0)
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync#endif
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#define CR_STATE_STENCIL_FUNC_MATCH(_s1, _i1, _s2, _i2) (\
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync (_s1)->buffers[(_i1)].func == (_s2)->buffers[(_i2)].func && \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync (_s1)->buffers[(_i1)].ref == (_s2)->buffers[(_i2)].ref && \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync (_s1)->buffers[(_i1)].mask == (_s2)->buffers[(_i2)].mask)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#define CR_STATE_STENCIL_FUNC_COPY(_s1, _i1, _s2, _i2) do { \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync (_s1)->buffers[(_i1)].func = (_s2)->buffers[(_i2)].func; \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync (_s1)->buffers[(_i1)].ref = (_s2)->buffers[(_i2)].ref; \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync (_s1)->buffers[(_i1)].mask = (_s2)->buffers[(_i2)].mask; \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync } while (0)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#define CR_STATE_STENCIL_OP_MATCH(_s1, _i1, _s2, _i2) (\
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync (_s1)->buffers[(_i1)].fail == (_s2)->buffers[(_i2)].fail && \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync (_s1)->buffers[(_i1)].passDepthFail == (_s2)->buffers[(_i2)].passDepthFail && \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync (_s1)->buffers[(_i1)].passDepthPass == (_s2)->buffers[(_i2)].passDepthPass)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#define CR_STATE_STENCIL_OP_COPY(_s1, _i1, _s2, _i2) do { \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync (_s1)->buffers[(_i1)].fail = (_s2)->buffers[(_i2)].fail; \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync (_s1)->buffers[(_i1)].passDepthFail = (_s2)->buffers[(_i2)].passDepthFail; \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync (_s1)->buffers[(_i1)].passDepthPass = (_s2)->buffers[(_i2)].passDepthPass; \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync } while (0)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsyncvoid crStateStencilDiff(CRStencilBits *b, CRbitvalue *bitID,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CRContext *fromCtx, CRContext *toCtx)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync{
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CRStencilState *from = &(fromCtx->stencil);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CRStencilState *to = &(toCtx->stencil);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync unsigned int j, i;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync GLenum activeFace;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync GLboolean backIsSet = GL_FALSE, frontIsSet = GL_FALSE, frontBackDirty, frontDirty, backDirty;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync GLchar frontMatch = -1, backMatch = -1, toFrontBackMatch = -1;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CRbitvalue nbitID[CR_MAX_BITARRAY];
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync for (j=0;j<CR_MAX_BITARRAY;j++)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync nbitID[j] = ~bitID[j];
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync i = 0; /* silence compiler */
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (CHECKDIRTY(b->enable, bitID))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync glAble able[2];
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync able[0] = diff_api.Disable;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync able[1] = diff_api.Enable;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (from->stencilTest != to->stencilTest)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync able[to->stencilTest](GL_STENCIL_TEST);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync from->stencilTest = to->stencilTest;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->enable, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (CHECKDIRTY(b->enableTwoSideEXT, bitID))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync glAble able[2];
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync able[0] = diff_api.Disable;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync able[1] = diff_api.Enable;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (from->stencilTwoSideEXT != to->stencilTwoSideEXT)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync able[to->stencilTwoSideEXT](GL_STENCIL_TEST_TWO_SIDE_EXT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync from->stencilTwoSideEXT = to->stencilTwoSideEXT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->enableTwoSideEXT, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (CHECKDIRTY(b->clearValue, bitID))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (from->clearValue != to->clearValue)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ClearStencil (to->clearValue);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync from->clearValue = to->clearValue;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->clearValue, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = to->activeStencilFace;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync /* func */
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontBackDirty = CHECKDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_FRONT_AND_BACK].func, bitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontDirty = CHECKDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_FRONT].func, bitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backDirty = CHECKDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_BACK].func, bitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#define CR_STATE_STENCIL_FUNC_FRONT_MATCH() ( \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontMatch >= 0 ? \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontMatch \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync : (frontMatch = CR_STATE_STENCIL_FUNC_MATCH(from, CRSTATE_STENCIL_BUFFER_ID_FRONT, to, CRSTATE_STENCIL_BUFFER_ID_FRONT)))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#define CR_STATE_STENCIL_FUNC_BACK_MATCH() ( \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backMatch >= 0 ? \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backMatch \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync : (backMatch = CR_STATE_STENCIL_FUNC_MATCH(from, CRSTATE_STENCIL_BUFFER_ID_BACK, to, CRSTATE_STENCIL_BUFFER_ID_BACK)))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#define CR_STATE_STENCIL_FUNC_TO_FRONT_BACK_MATCH() ( \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync toFrontBackMatch >= 0 ? \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync toFrontBackMatch \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync : (toFrontBackMatch = CR_STATE_STENCIL_FUNC_MATCH(to, CRSTATE_STENCIL_BUFFER_ID_FRONT, to, CRSTATE_STENCIL_BUFFER_ID_BACK)))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (frontBackDirty)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!CR_STATE_STENCIL_FUNC_FRONT_MATCH()
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync || !CR_STATE_STENCIL_FUNC_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (CR_STATE_STENCIL_FUNC_TO_FRONT_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.StencilFunc (to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].func,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].ref,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].mask);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CR_STATE_STENCIL_FUNC_COPY(from, CRSTATE_STENCIL_BUFFER_ID_FRONT, to, CRSTATE_STENCIL_BUFFER_ID_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CR_STATE_STENCIL_FUNC_COPY(from, CRSTATE_STENCIL_BUFFER_ID_BACK, to, CRSTATE_STENCIL_BUFFER_ID_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync else if (!CR_STATE_STENCIL_FUNC_FRONT_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.StencilFuncSeparate (GL_FRONT, to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].func,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].ref,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].mask);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CR_STATE_STENCIL_FUNC_COPY(from, CRSTATE_STENCIL_BUFFER_ID_FRONT, to, CRSTATE_STENCIL_BUFFER_ID_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync else if (!CR_STATE_STENCIL_FUNC_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.StencilFuncSeparate (GL_BACK, to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].func,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].ref,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].mask);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CR_STATE_STENCIL_FUNC_COPY(from, CRSTATE_STENCIL_BUFFER_ID_BACK, to, CRSTATE_STENCIL_BUFFER_ID_BACK);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_FRONT_AND_BACK].func, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (frontDirty)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!CR_STATE_STENCIL_FUNC_FRONT_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (CR_STATE_STENCIL_FUNC_TO_FRONT_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!frontIsSet || !backIsSet)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.StencilFunc (to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].func,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].ref,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].mask);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CR_STATE_STENCIL_FUNC_COPY(from, CRSTATE_STENCIL_BUFFER_ID_FRONT, to, CRSTATE_STENCIL_BUFFER_ID_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CR_STATE_STENCIL_FUNC_COPY(from, CRSTATE_STENCIL_BUFFER_ID_BACK, to, CRSTATE_STENCIL_BUFFER_ID_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync else if (!CR_STATE_STENCIL_FUNC_FRONT_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!frontIsSet)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.StencilFuncSeparate (GL_FRONT, to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].func,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].ref,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].mask);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CR_STATE_STENCIL_FUNC_COPY(from, CRSTATE_STENCIL_BUFFER_ID_FRONT, to, CRSTATE_STENCIL_BUFFER_ID_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync else if (!CR_STATE_STENCIL_FUNC_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!backIsSet)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.StencilFuncSeparate (GL_BACK, to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].func,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].ref,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].mask);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CR_STATE_STENCIL_FUNC_COPY(from, CRSTATE_STENCIL_BUFFER_ID_BACK, to, CRSTATE_STENCIL_BUFFER_ID_BACK);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_FRONT].func, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (backDirty)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!CR_STATE_STENCIL_FUNC_FRONT_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (CR_STATE_STENCIL_FUNC_TO_FRONT_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!frontIsSet || !backIsSet)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.StencilFunc (to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].func,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].ref,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].mask);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CR_STATE_STENCIL_FUNC_COPY(from, CRSTATE_STENCIL_BUFFER_ID_FRONT, to, CRSTATE_STENCIL_BUFFER_ID_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CR_STATE_STENCIL_FUNC_COPY(from, CRSTATE_STENCIL_BUFFER_ID_BACK, to, CRSTATE_STENCIL_BUFFER_ID_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync else if (!CR_STATE_STENCIL_FUNC_FRONT_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!frontIsSet)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.StencilFuncSeparate (GL_FRONT, to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].func,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].ref,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].mask);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CR_STATE_STENCIL_FUNC_COPY(from, CRSTATE_STENCIL_BUFFER_ID_FRONT, to, CRSTATE_STENCIL_BUFFER_ID_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync else if (!CR_STATE_STENCIL_FUNC_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!backIsSet)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.StencilFuncSeparate (GL_BACK, to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].func,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].ref,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].mask);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CR_STATE_STENCIL_FUNC_COPY(from, CRSTATE_STENCIL_BUFFER_ID_BACK, to, CRSTATE_STENCIL_BUFFER_ID_BACK);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_BACK].func, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (CHECKDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_TWO_SIDE_BACK].func, bitID))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync if (!CR_STATE_STENCIL_FUNC_MATCH(from, CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK, to, CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_FRONT)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_BACK);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_BACK;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync diff_api.StencilFunc (to->buffers[CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK].func,
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK].ref,
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK].mask);
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CR_STATE_STENCIL_FUNC_COPY(from, CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK, to, CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_TWO_SIDE_BACK].func, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#undef CR_STATE_STENCIL_FUNC_FRONT_MATCH
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#undef CR_STATE_STENCIL_FUNC_BACK_MATCH
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#undef CR_STATE_STENCIL_FUNC_TO_FRONT_BACK_MATCH
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync /* op */
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backIsSet = GL_FALSE, frontIsSet = GL_FALSE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontMatch = -1, backMatch = -1, toFrontBackMatch = -1;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontBackDirty = CHECKDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_FRONT_AND_BACK].op, bitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontDirty = CHECKDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_FRONT].op, bitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backDirty = CHECKDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_BACK].op, bitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#define CR_STATE_STENCIL_OP_FRONT_MATCH() ( \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontMatch >= 0 ? \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontMatch \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync : (frontMatch = CR_STATE_STENCIL_OP_MATCH(from, CRSTATE_STENCIL_BUFFER_ID_FRONT, to, CRSTATE_STENCIL_BUFFER_ID_FRONT)))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#define CR_STATE_STENCIL_OP_BACK_MATCH() ( \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backMatch >= 0 ? \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backMatch \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync : (backMatch = CR_STATE_STENCIL_OP_MATCH(from, CRSTATE_STENCIL_BUFFER_ID_BACK, to, CRSTATE_STENCIL_BUFFER_ID_BACK)))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#define CR_STATE_STENCIL_OP_TO_FRONT_BACK_MATCH() ( \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync toFrontBackMatch >= 0 ? \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync toFrontBackMatch \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync : (toFrontBackMatch = CR_STATE_STENCIL_OP_MATCH(to, CRSTATE_STENCIL_BUFFER_ID_FRONT, to, CRSTATE_STENCIL_BUFFER_ID_BACK)))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (frontBackDirty)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!CR_STATE_STENCIL_OP_FRONT_MATCH()
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync || !CR_STATE_STENCIL_OP_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (CR_STATE_STENCIL_OP_TO_FRONT_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.StencilOp (to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].fail,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthFail,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthPass);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CR_STATE_STENCIL_OP_COPY(from, CRSTATE_STENCIL_BUFFER_ID_FRONT, to, CRSTATE_STENCIL_BUFFER_ID_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CR_STATE_STENCIL_OP_COPY(from, CRSTATE_STENCIL_BUFFER_ID_BACK, to, CRSTATE_STENCIL_BUFFER_ID_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync else if (!CR_STATE_STENCIL_OP_FRONT_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.StencilOpSeparate (GL_FRONT, to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].fail,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthFail,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthPass);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CR_STATE_STENCIL_OP_COPY(from, CRSTATE_STENCIL_BUFFER_ID_FRONT, to, CRSTATE_STENCIL_BUFFER_ID_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync else if (!CR_STATE_STENCIL_OP_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.StencilOpSeparate (GL_BACK, to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].fail,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].passDepthFail,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].passDepthPass);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CR_STATE_STENCIL_OP_COPY(from, CRSTATE_STENCIL_BUFFER_ID_BACK, to, CRSTATE_STENCIL_BUFFER_ID_BACK);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_FRONT_AND_BACK].op, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (frontDirty)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!CR_STATE_STENCIL_OP_FRONT_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (CR_STATE_STENCIL_OP_TO_FRONT_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!frontIsSet || !backIsSet)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.StencilOp (to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].fail,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthFail,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthPass);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CR_STATE_STENCIL_OP_COPY(from, CRSTATE_STENCIL_BUFFER_ID_FRONT, to, CRSTATE_STENCIL_BUFFER_ID_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CR_STATE_STENCIL_OP_COPY(from, CRSTATE_STENCIL_BUFFER_ID_BACK, to, CRSTATE_STENCIL_BUFFER_ID_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync else if (!CR_STATE_STENCIL_OP_FRONT_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!frontIsSet)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.StencilOpSeparate (GL_FRONT, to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].fail,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthFail,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthPass);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CR_STATE_STENCIL_OP_COPY(from, CRSTATE_STENCIL_BUFFER_ID_FRONT, to, CRSTATE_STENCIL_BUFFER_ID_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync else if (!CR_STATE_STENCIL_OP_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!backIsSet)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.StencilOpSeparate (GL_BACK, to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].fail,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].passDepthFail,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].passDepthPass);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CR_STATE_STENCIL_OP_COPY(from, CRSTATE_STENCIL_BUFFER_ID_BACK, to, CRSTATE_STENCIL_BUFFER_ID_BACK);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_FRONT].op, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (backDirty)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!CR_STATE_STENCIL_OP_FRONT_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (CR_STATE_STENCIL_OP_TO_FRONT_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!frontIsSet || !backIsSet)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.StencilOp (to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].fail,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthFail,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthPass);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CR_STATE_STENCIL_OP_COPY(from, CRSTATE_STENCIL_BUFFER_ID_FRONT, to, CRSTATE_STENCIL_BUFFER_ID_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CR_STATE_STENCIL_OP_COPY(from, CRSTATE_STENCIL_BUFFER_ID_BACK, to, CRSTATE_STENCIL_BUFFER_ID_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync else if (!CR_STATE_STENCIL_OP_FRONT_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!frontIsSet)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.StencilOpSeparate (GL_FRONT, to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].fail,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthFail,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthPass);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CR_STATE_STENCIL_OP_COPY(from, CRSTATE_STENCIL_BUFFER_ID_FRONT, to, CRSTATE_STENCIL_BUFFER_ID_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync else if (!CR_STATE_STENCIL_OP_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!backIsSet)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.StencilOpSeparate (GL_BACK, to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].fail,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].passDepthFail,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].passDepthPass);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CR_STATE_STENCIL_OP_COPY(from, CRSTATE_STENCIL_BUFFER_ID_BACK, to, CRSTATE_STENCIL_BUFFER_ID_BACK);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_BACK].op, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (CHECKDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_TWO_SIDE_BACK].op, bitID))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync if (!CR_STATE_STENCIL_OP_MATCH(from, CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK, to, CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_FRONT)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_BACK);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_BACK;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync diff_api.StencilOp (to->buffers[CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK].fail,
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK].passDepthFail,
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK].passDepthPass);
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CR_STATE_STENCIL_OP_COPY(from, CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK, to, CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_TWO_SIDE_BACK].op, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#undef CR_STATE_STENCIL_OP_FRONT_MATCH
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#undef CR_STATE_STENCIL_OP_BACK_MATCH
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#undef CR_STATE_STENCIL_OP_TO_FRONT_BACK_MATCH
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace != to->activeStencilFace)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(activeFace);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (CHECKDIRTY(b->activeStencilFace, bitID))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (from->activeStencilFace != to->activeStencilFace)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync /* we already did it ( see above )*/
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync /* diff_api.ActiveStencilFaceEXT(to->activeStencilFace); */
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync from->activeStencilFace = to->activeStencilFace;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->activeStencilFace, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (CHECKDIRTY(b->writeMask, bitID))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (from->writeMask != to->writeMask)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.StencilMask (to->writeMask);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync from->writeMask = to->writeMask;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->writeMask, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->dirty, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync}
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsyncvoid crStateStencilSwitch(CRStencilBits *b, CRbitvalue *bitID,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CRContext *fromCtx, CRContext *toCtx)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync{
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CRStencilState *from = &(fromCtx->stencil);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CRStencilState *to = &(toCtx->stencil);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync unsigned int j, i;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync GLenum activeFace;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync GLboolean backIsSet = GL_FALSE, frontIsSet = GL_FALSE, frontBackDirty, frontDirty, backDirty;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync GLchar frontMatch = -1, backMatch = -1, toFrontBackMatch = -1;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CRbitvalue nbitID[CR_MAX_BITARRAY];
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync for (j=0;j<CR_MAX_BITARRAY;j++)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync nbitID[j] = ~bitID[j];
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync i = 0; /* silence compiler */
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (CHECKDIRTY(b->enable, bitID))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync glAble able[2];
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync able[0] = diff_api.Disable;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync able[1] = diff_api.Enable;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (from->stencilTest != to->stencilTest)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(able[to->stencilTest](GL_STENCIL_TEST));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync FILLDIRTY(b->enable);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync FILLDIRTY(b->dirty);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->enable, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (CHECKDIRTY(b->enableTwoSideEXT, bitID))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync glAble able[2];
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync able[0] = diff_api.Disable;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync able[1] = diff_api.Enable;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (from->stencilTwoSideEXT != to->stencilTwoSideEXT)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(able[to->stencilTwoSideEXT](GL_STENCIL_TEST_TWO_SIDE_EXT));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync FILLDIRTY(b->enableTwoSideEXT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync FILLDIRTY(b->dirty);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->enableTwoSideEXT, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (CHECKDIRTY(b->clearValue, bitID))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (from->clearValue != to->clearValue)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.ClearStencil (to->clearValue));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync FILLDIRTY(b->clearValue);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync FILLDIRTY(b->dirty);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->clearValue, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = from->activeStencilFace;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync /* func */
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontBackDirty = CHECKDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_FRONT_AND_BACK].func, bitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontDirty = CHECKDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_FRONT].func, bitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backDirty = CHECKDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_BACK].func, bitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#define CR_STATE_STENCIL_FUNC_FRONT_MATCH() ( \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontMatch >= 0 ? \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontMatch \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync : (frontMatch = CR_STATE_STENCIL_FUNC_MATCH(from, CRSTATE_STENCIL_BUFFER_ID_FRONT, to, CRSTATE_STENCIL_BUFFER_ID_FRONT)))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#define CR_STATE_STENCIL_FUNC_BACK_MATCH() ( \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backMatch >= 0 ? \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backMatch \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync : (backMatch = CR_STATE_STENCIL_FUNC_MATCH(from, CRSTATE_STENCIL_BUFFER_ID_BACK, to, CRSTATE_STENCIL_BUFFER_ID_BACK)))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#define CR_STATE_STENCIL_FUNC_TO_FRONT_BACK_MATCH() ( \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync toFrontBackMatch >= 0 ? \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync toFrontBackMatch \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync : (toFrontBackMatch = CR_STATE_STENCIL_FUNC_MATCH(to, CRSTATE_STENCIL_BUFFER_ID_FRONT, to, CRSTATE_STENCIL_BUFFER_ID_BACK)))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (frontBackDirty)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!CR_STATE_STENCIL_FUNC_FRONT_MATCH()
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync || !CR_STATE_STENCIL_FUNC_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (CR_STATE_STENCIL_FUNC_TO_FRONT_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.StencilFunc (to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].func,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].ref,
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].mask));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync else if (!CR_STATE_STENCIL_FUNC_FRONT_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.StencilFuncSeparate (GL_FRONT, to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].func,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].ref,
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].mask));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync else if (!CR_STATE_STENCIL_FUNC_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.StencilFuncSeparate (GL_BACK, to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].func,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].ref,
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].mask));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync FILLDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_FRONT_AND_BACK].func);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync FILLDIRTY(b->dirty);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_FRONT_AND_BACK].func, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (frontDirty)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!CR_STATE_STENCIL_FUNC_FRONT_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (CR_STATE_STENCIL_FUNC_TO_FRONT_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!frontIsSet || !backIsSet)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.StencilFunc (to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].func,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].ref,
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].mask));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync else if (!CR_STATE_STENCIL_FUNC_FRONT_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!frontIsSet)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.StencilFuncSeparate (GL_FRONT, to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].func,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].ref,
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].mask));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync else if (!CR_STATE_STENCIL_FUNC_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!backIsSet)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.StencilFuncSeparate (GL_BACK, to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].func,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].ref,
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].mask));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync FILLDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_FRONT].func);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync FILLDIRTY(b->dirty);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_FRONT].func, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (backDirty)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!CR_STATE_STENCIL_FUNC_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (CR_STATE_STENCIL_FUNC_TO_FRONT_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!frontIsSet || !backIsSet)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.StencilFunc (to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].func,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].ref,
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].mask));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync else if (!CR_STATE_STENCIL_FUNC_FRONT_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!frontIsSet)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.StencilFuncSeparate (GL_FRONT, to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].func,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].ref,
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].mask));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync else if (!CR_STATE_STENCIL_FUNC_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!backIsSet)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync diff_api.ActiveStencilFaceEXT(GL_FRONT);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.StencilFuncSeparate (GL_BACK, to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].func,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].ref,
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].mask));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync FILLDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_BACK].func);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync FILLDIRTY(b->dirty);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_BACK].func, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (CHECKDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_TWO_SIDE_BACK].func, bitID))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync if (!CR_STATE_STENCIL_FUNC_MATCH(from, CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK, to, CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_FRONT)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.ActiveStencilFaceEXT(GL_BACK));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_BACK;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.StencilFunc (to->buffers[CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK].func,
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK].ref,
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK].mask));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync FILLDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_TWO_SIDE_BACK].func);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync FILLDIRTY(b->dirty);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_TWO_SIDE_BACK].func, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#undef CR_STATE_STENCIL_FUNC_FRONT_MATCH
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#undef CR_STATE_STENCIL_FUNC_BACK_MATCH
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#undef CR_STATE_STENCIL_FUNC_TO_FRONT_BACK_MATCH
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync /* op */
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backIsSet = GL_FALSE, frontIsSet = GL_FALSE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontMatch = -1, backMatch = -1, toFrontBackMatch = -1;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontBackDirty = CHECKDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_FRONT_AND_BACK].op, bitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontDirty = CHECKDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_FRONT].op, bitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backDirty = CHECKDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_BACK].op, bitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#define CR_STATE_STENCIL_OP_FRONT_MATCH() ( \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontMatch >= 0 ? \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontMatch \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync : (frontMatch = CR_STATE_STENCIL_OP_MATCH(from, CRSTATE_STENCIL_BUFFER_ID_FRONT, to, CRSTATE_STENCIL_BUFFER_ID_FRONT)))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#define CR_STATE_STENCIL_OP_BACK_MATCH() ( \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backMatch >= 0 ? \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backMatch \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync : (backMatch = CR_STATE_STENCIL_OP_MATCH(from, CRSTATE_STENCIL_BUFFER_ID_BACK, to, CRSTATE_STENCIL_BUFFER_ID_BACK)))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#define CR_STATE_STENCIL_OP_TO_FRONT_BACK_MATCH() ( \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync toFrontBackMatch >= 0 ? \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync toFrontBackMatch \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync : (toFrontBackMatch = CR_STATE_STENCIL_OP_MATCH(to, CRSTATE_STENCIL_BUFFER_ID_FRONT, to, CRSTATE_STENCIL_BUFFER_ID_BACK)))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (frontBackDirty)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!CR_STATE_STENCIL_OP_FRONT_MATCH()
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync || !CR_STATE_STENCIL_OP_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (CR_STATE_STENCIL_OP_TO_FRONT_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.ActiveStencilFaceEXT(GL_FRONT));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.StencilOp (to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].fail,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthFail,
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthPass));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync else if (!CR_STATE_STENCIL_OP_FRONT_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.ActiveStencilFaceEXT(GL_FRONT));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.StencilOpSeparate (GL_FRONT, to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].fail,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthFail,
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthPass));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync else if (!CR_STATE_STENCIL_OP_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.ActiveStencilFaceEXT(GL_FRONT));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.StencilOpSeparate (GL_BACK, to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].fail,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].passDepthFail,
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].passDepthPass));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync FILLDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_FRONT_AND_BACK].op);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync FILLDIRTY(b->dirty);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_FRONT_AND_BACK].op, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (frontDirty)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!CR_STATE_STENCIL_OP_FRONT_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (CR_STATE_STENCIL_OP_TO_FRONT_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!frontIsSet || !backIsSet)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.ActiveStencilFaceEXT(GL_FRONT));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.StencilOp (to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].fail,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthFail,
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthPass));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync else if (!CR_STATE_STENCIL_OP_FRONT_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!frontIsSet)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.ActiveStencilFaceEXT(GL_FRONT));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.StencilOpSeparate (GL_FRONT, to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].fail,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthFail,
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthPass));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync else if (!CR_STATE_STENCIL_OP_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!backIsSet)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.ActiveStencilFaceEXT(GL_FRONT));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.StencilOpSeparate (GL_BACK, to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].fail,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].passDepthFail,
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].passDepthPass));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync FILLDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_FRONT].op);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync FILLDIRTY(b->dirty);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_FRONT].op, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (backDirty)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!CR_STATE_STENCIL_OP_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (CR_STATE_STENCIL_OP_TO_FRONT_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!frontIsSet || !backIsSet)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.ActiveStencilFaceEXT(GL_FRONT));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.StencilOp (to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].fail,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthFail,
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthPass));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync else if (!CR_STATE_STENCIL_OP_FRONT_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!frontIsSet)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.ActiveStencilFaceEXT(GL_FRONT));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.StencilOpSeparate (GL_FRONT, to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].fail,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthFail,
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthPass));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync frontIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync else if (!CR_STATE_STENCIL_OP_BACK_MATCH())
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (!backIsSet)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_BACK)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.ActiveStencilFaceEXT(GL_FRONT));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_FRONT;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.StencilOpSeparate (GL_BACK, to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].fail,
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].passDepthFail,
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK].passDepthPass));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync backIsSet = GL_TRUE;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync FILLDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_BACK].op);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync FILLDIRTY(b->dirty);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_BACK].op, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (CHECKDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_TWO_SIDE_BACK].op, bitID))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync if (!CR_STATE_STENCIL_OP_MATCH(from, CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK, to, CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace == GL_FRONT)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.ActiveStencilFaceEXT(GL_BACK));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync activeFace = GL_BACK;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.StencilOp (to->buffers[CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK].fail,
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK].passDepthFail,
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync to->buffers[CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK].passDepthPass));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync FILLDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_TWO_SIDE_BACK].op);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync FILLDIRTY(b->dirty);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->bufferRefs[CRSTATE_STENCIL_BUFFER_REF_ID_TWO_SIDE_BACK].op, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#undef CR_STATE_STENCIL_OP_FRONT_MATCH
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#undef CR_STATE_STENCIL_OP_BACK_MATCH
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#undef CR_STATE_STENCIL_OP_TO_FRONT_BACK_MATCH
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (activeFace != to->activeStencilFace)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.ActiveStencilFaceEXT(activeFace));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (CHECKDIRTY(b->activeStencilFace, bitID))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (from->activeStencilFace != to->activeStencilFace)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync /* we already did it ( see above )*/
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync /* diff_api.ActiveStencilFaceEXT(to->activeStencilFace); */
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync FILLDIRTY(b->activeStencilFace);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync FILLDIRTY(b->dirty);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->activeStencilFace, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (CHECKDIRTY(b->writeMask, bitID))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (from->writeMask != to->writeMask)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync {
6f4ddfdcdb919a700560dff2ff38433f3ad5269evboxsync CRSTATE_CHECKGLERR(diff_api.StencilMask (to->writeMask));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync FILLDIRTY(b->writeMask);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync FILLDIRTY(b->dirty);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->writeMask, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync }
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync CLEARDIRTY(b->dirty, nbitID);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync}
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync