1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version:  7.1
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software.
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file stencil.c
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Stencil operations.
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: There's some conflict between GL_EXT_stencil_two_side and
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OpenGL 2.0's two-sided stencil feature.
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * With GL_EXT_stencil_two_side, calling glStencilOp/Func/Mask() only the
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * front OR back face state (as set by glActiveStencilFaceEXT) is set.
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * But with OpenGL 2.0, calling glStencilOp/Func/Mask() sets BOTH the
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * front AND back state.
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Also, note that GL_ATI_separate_stencil is different as well:
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glStencilFuncSeparateATI(GLenum frontfunc, GLenum backfunc, ...)  vs.
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glStencilFuncSeparate(GLenum face, GLenum func, ...).
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This problem is solved by keeping three sets of stencil state:
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *  state[0] = GL_FRONT state.
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *  state[1] = OpenGL 2.0 / GL_ATI_separate_stencil GL_BACK state.
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *  state[2] = GL_EXT_stencil_two_side GL_BACK state.
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glheader.h"
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "imports.h"
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "context.h"
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "macros.h"
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "stencil.h"
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mtypes.h"
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvalidate_stencil_op(struct gl_context *ctx, GLenum op)
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (op) {
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_KEEP:
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ZERO:
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_REPLACE:
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INCR:
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DECR:
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INVERT:
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INCR_WRAP:
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DECR_WRAP:
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvalidate_stencil_func(struct gl_context *ctx, GLenum func)
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (func) {
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_NEVER:
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LESS:
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LEQUAL:
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_GREATER:
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_GEQUAL:
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_EQUAL:
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_NOTEQUAL:
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_ALWAYS:
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_TRUE;
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set the clear value for the stencil buffer.
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param s clear value.
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \sa glClearStencil().
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Updates gl_stencil_attrib::Clear. On change
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * flushes the vertices and notifies the driver via
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the dd_function_table::ClearStencil callback.
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_ClearStencil( GLint s )
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Stencil.Clear == (GLuint) s)
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FLUSH_VERTICES(ctx, _NEW_STENCIL);
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.Clear = (GLuint) s;
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set the function and reference value for stencil testing.
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param frontfunc front test function.
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param backfunc back test function.
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ref front and back reference value.
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param mask front and back bitmask.
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \sa glStencilFunc().
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Verifies the parameters and updates the respective values in
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * __struct gl_contextRec::Stencil. On change flushes the vertices and notifies the
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * driver via the dd_function_table::StencilFunc callback.
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_StencilFuncSeparateATI( GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask )
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint stencilMax = (1 << ctx->DrawBuffer->Visual.stencilBits) - 1;
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & VERBOSE_API)
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "glStencilFuncSeparateATI()\n");
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!validate_stencil_func(ctx, frontfunc)) {
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM,
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glStencilFuncSeparateATI(frontfunc)");
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!validate_stencil_func(ctx, backfunc)) {
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM,
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glStencilFuncSeparateATI(backfunc)");
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ref = CLAMP( ref, 0, stencilMax );
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* set both front and back state */
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Stencil.Function[0] == frontfunc &&
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ctx->Stencil.Function[1] == backfunc &&
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ctx->Stencil.ValueMask[0] == mask &&
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ctx->Stencil.ValueMask[1] == mask &&
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ctx->Stencil.Ref[0] == ref &&
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ctx->Stencil.Ref[1] == ref)
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FLUSH_VERTICES(ctx, _NEW_STENCIL);
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.Function[0]  = frontfunc;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.Function[1]  = backfunc;
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.Ref[0]       = ctx->Stencil.Ref[1]       = ref;
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.ValueMask[0] = ctx->Stencil.ValueMask[1] = mask;
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Driver.StencilFuncSeparate) {
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Driver.StencilFuncSeparate(ctx, GL_FRONT,
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      frontfunc, ref, mask);
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Driver.StencilFuncSeparate(ctx, GL_BACK,
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      backfunc, ref, mask);
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set the function and reference value for stencil testing.
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param func test function.
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ref reference value.
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param mask bitmask.
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \sa glStencilFunc().
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Verifies the parameters and updates the respective values in
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * __struct gl_contextRec::Stencil. On change flushes the vertices and notifies the
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * driver via the dd_function_table::StencilFunc callback.
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_StencilFunc( GLenum func, GLint ref, GLuint mask )
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint stencilMax = (1 << ctx->DrawBuffer->Visual.stencilBits) - 1;
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint face = ctx->Stencil.ActiveFace;
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & VERBOSE_API)
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "glStencilFunc()\n");
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!validate_stencil_func(ctx, func)) {
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM, "glStencilFunc(func)");
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ref = CLAMP( ref, 0, stencilMax );
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (face != 0) {
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Stencil.Function[face] == func &&
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          ctx->Stencil.ValueMask[face] == mask &&
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          ctx->Stencil.Ref[face] == ref)
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH_VERTICES(ctx, _NEW_STENCIL);
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Stencil.Function[face] = func;
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Stencil.Ref[face] = ref;
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Stencil.ValueMask[face] = mask;
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Only propagate the change to the driver if EXT_stencil_two_side
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * is enabled.
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Driver.StencilFuncSeparate && ctx->Stencil.TestTwoSide) {
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->Driver.StencilFuncSeparate(ctx, GL_BACK, func, ref, mask);
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* set both front and back state */
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Stencil.Function[0] == func &&
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          ctx->Stencil.Function[1] == func &&
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          ctx->Stencil.ValueMask[0] == mask &&
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          ctx->Stencil.ValueMask[1] == mask &&
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          ctx->Stencil.Ref[0] == ref &&
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          ctx->Stencil.Ref[1] == ref)
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH_VERTICES(ctx, _NEW_STENCIL);
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Stencil.Function[0]  = ctx->Stencil.Function[1]  = func;
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Stencil.Ref[0]       = ctx->Stencil.Ref[1]       = ref;
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Stencil.ValueMask[0] = ctx->Stencil.ValueMask[1] = mask;
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Driver.StencilFuncSeparate) {
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->Driver.StencilFuncSeparate(ctx,
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 ((ctx->Stencil.TestTwoSide)
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  ? GL_FRONT : GL_FRONT_AND_BACK),
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                         func, ref, mask);
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set the stencil writing mask.
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param mask bit-mask to enable/disable writing of individual bits in the
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * stencil planes.
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \sa glStencilMask().
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Updates gl_stencil_attrib::WriteMask. On change flushes the vertices and
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * notifies the driver via the dd_function_table::StencilMask callback.
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_StencilMask( GLuint mask )
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint face = ctx->Stencil.ActiveFace;
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & VERBOSE_API)
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "glStencilMask()\n");
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (face != 0) {
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Only modify the EXT_stencil_two_side back-face state.
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Stencil.WriteMask[face] == mask)
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH_VERTICES(ctx, _NEW_STENCIL);
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Stencil.WriteMask[face] = mask;
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Only propagate the change to the driver if EXT_stencil_two_side
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * is enabled.
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Driver.StencilMaskSeparate && ctx->Stencil.TestTwoSide) {
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->Driver.StencilMaskSeparate(ctx, GL_BACK, mask);
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* set both front and back state */
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Stencil.WriteMask[0] == mask &&
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          ctx->Stencil.WriteMask[1] == mask)
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH_VERTICES(ctx, _NEW_STENCIL);
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Stencil.WriteMask[0] = ctx->Stencil.WriteMask[1] = mask;
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Driver.StencilMaskSeparate) {
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->Driver.StencilMaskSeparate(ctx,
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 ((ctx->Stencil.TestTwoSide)
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  ? GL_FRONT : GL_FRONT_AND_BACK),
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  mask);
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set the stencil test actions.
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param fail action to take when stencil test fails.
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param zfail action to take when stencil test passes, but depth test fails.
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param zpass action to take when stencil test passes and the depth test
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * passes (or depth testing is not enabled).
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \sa glStencilOp().
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Verifies the parameters and updates the respective fields in
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * __struct gl_contextRec::Stencil. On change flushes the vertices and notifies the
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * driver via the dd_function_table::StencilOp callback.
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_StencilOp(GLenum fail, GLenum zfail, GLenum zpass)
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint face = ctx->Stencil.ActiveFace;
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & VERBOSE_API)
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "glStencilOp()\n");
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!validate_stencil_op(ctx, fail)) {
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM, "glStencilOp(sfail)");
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!validate_stencil_op(ctx, zfail)) {
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM, "glStencilOp(zfail)");
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!validate_stencil_op(ctx, zpass)) {
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM, "glStencilOp(zpass)");
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (face != 0) {
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* only set active face state */
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Stencil.ZFailFunc[face] == zfail &&
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          ctx->Stencil.ZPassFunc[face] == zpass &&
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          ctx->Stencil.FailFunc[face] == fail)
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH_VERTICES(ctx, _NEW_STENCIL);
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Stencil.ZFailFunc[face] = zfail;
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Stencil.ZPassFunc[face] = zpass;
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Stencil.FailFunc[face] = fail;
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Only propagate the change to the driver if EXT_stencil_two_side
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * is enabled.
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Driver.StencilOpSeparate && ctx->Stencil.TestTwoSide) {
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->Driver.StencilOpSeparate(ctx, GL_BACK, fail, zfail, zpass);
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* set both front and back state */
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Stencil.ZFailFunc[0] == zfail &&
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          ctx->Stencil.ZFailFunc[1] == zfail &&
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          ctx->Stencil.ZPassFunc[0] == zpass &&
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          ctx->Stencil.ZPassFunc[1] == zpass &&
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          ctx->Stencil.FailFunc[0] == fail &&
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          ctx->Stencil.FailFunc[1] == fail)
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH_VERTICES(ctx, _NEW_STENCIL);
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Stencil.ZFailFunc[0] = ctx->Stencil.ZFailFunc[1] = zfail;
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Stencil.ZPassFunc[0] = ctx->Stencil.ZPassFunc[1] = zpass;
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Stencil.FailFunc[0]  = ctx->Stencil.FailFunc[1]  = fail;
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Driver.StencilOpSeparate) {
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->Driver.StencilOpSeparate(ctx,
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       ((ctx->Stencil.TestTwoSide)
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					? GL_FRONT : GL_FRONT_AND_BACK),
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                       fail, zfail, zpass);
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if _HAVE_FULL_GL
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* GL_EXT_stencil_two_side */
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_ActiveStencilFaceEXT(GLenum face)
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & VERBOSE_API)
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "glActiveStencilFaceEXT()\n");
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->Extensions.EXT_stencil_two_side) {
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION, "glActiveStencilFaceEXT");
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (face == GL_FRONT || face == GL_BACK) {
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH_VERTICES(ctx, _NEW_STENCIL);
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Stencil.ActiveFace = (face == GL_FRONT) ? 0 : 2;
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM, "glActiveStencilFaceEXT(face)");
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OpenGL 2.0 function.
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \todo Make StencilOp() call this function.  And eventually remove the
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ctx->Driver.StencilOp function and use ctx->Driver.StencilOpSeparate
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * instead.
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_StencilOpSeparate(GLenum face, GLenum sfail, GLenum zfail, GLenum zpass)
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean set = GL_FALSE;
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & VERBOSE_API)
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "glStencilOpSeparate()\n");
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!validate_stencil_op(ctx, sfail)) {
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM, "glStencilOpSeparate(sfail)");
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!validate_stencil_op(ctx, zfail)) {
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM, "glStencilOpSeparate(zfail)");
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!validate_stencil_op(ctx, zpass)) {
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM, "glStencilOpSeparate(zpass)");
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (face != GL_FRONT && face != GL_BACK && face != GL_FRONT_AND_BACK) {
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM, "glStencilOpSeparate(face)");
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (face != GL_BACK) {
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* set front */
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Stencil.ZFailFunc[0] != zfail ||
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          ctx->Stencil.ZPassFunc[0] != zpass ||
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          ctx->Stencil.FailFunc[0] != sfail){
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         FLUSH_VERTICES(ctx, _NEW_STENCIL);
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->Stencil.ZFailFunc[0] = zfail;
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->Stencil.ZPassFunc[0] = zpass;
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->Stencil.FailFunc[0] = sfail;
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         set = GL_TRUE;
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (face != GL_FRONT) {
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* set back */
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Stencil.ZFailFunc[1] != zfail ||
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          ctx->Stencil.ZPassFunc[1] != zpass ||
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          ctx->Stencil.FailFunc[1] != sfail) {
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         FLUSH_VERTICES(ctx, _NEW_STENCIL);
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->Stencil.ZFailFunc[1] = zfail;
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->Stencil.ZPassFunc[1] = zpass;
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->Stencil.FailFunc[1] = sfail;
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         set = GL_TRUE;
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (set && ctx->Driver.StencilOpSeparate) {
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Driver.StencilOpSeparate(ctx, face, sfail, zfail, zpass);
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* OpenGL 2.0 */
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint stencilMax = (1 << ctx->DrawBuffer->Visual.stencilBits) - 1;
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & VERBOSE_API)
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "glStencilFuncSeparate()\n");
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (face != GL_FRONT && face != GL_BACK && face != GL_FRONT_AND_BACK) {
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM, "glStencilFuncSeparate(face)");
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!validate_stencil_func(ctx, func)) {
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM, "glStencilFuncSeparate(func)");
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ref = CLAMP(ref, 0, stencilMax);
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FLUSH_VERTICES(ctx, _NEW_STENCIL);
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (face != GL_BACK) {
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* set front */
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Stencil.Function[0] = func;
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Stencil.Ref[0] = ref;
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Stencil.ValueMask[0] = mask;
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (face != GL_FRONT) {
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* set back */
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Stencil.Function[1] = func;
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Stencil.Ref[1] = ref;
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Stencil.ValueMask[1] = mask;
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Driver.StencilFuncSeparate) {
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Driver.StencilFuncSeparate(ctx, face, func, ref, mask);
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* OpenGL 2.0 */
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_StencilMaskSeparate(GLenum face, GLuint mask)
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & VERBOSE_API)
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "glStencilMaskSeparate()\n");
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (face != GL_FRONT && face != GL_BACK && face != GL_FRONT_AND_BACK) {
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM, "glStencilaMaskSeparate(face)");
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FLUSH_VERTICES(ctx, _NEW_STENCIL);
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (face != GL_BACK) {
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Stencil.WriteMask[0] = mask;
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (face != GL_FRONT) {
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Stencil.WriteMask[1] = mask;
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Driver.StencilMaskSeparate) {
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Driver.StencilMaskSeparate(ctx, face, mask);
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Update derived stencil state.
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_update_stencil(struct gl_context *ctx)
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint face = ctx->Stencil._BackFace;
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil._Enabled = (ctx->Stencil.Enabled &&
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            ctx->DrawBuffer->Visual.stencilBits > 0);
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ctx->Stencil._TestTwoSide =
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       ctx->Stencil._Enabled &&
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       (ctx->Stencil.Function[0] != ctx->Stencil.Function[face] ||
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->Stencil.FailFunc[0] != ctx->Stencil.FailFunc[face] ||
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->Stencil.ZPassFunc[0] != ctx->Stencil.ZPassFunc[face] ||
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->Stencil.ZFailFunc[0] != ctx->Stencil.ZFailFunc[face] ||
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->Stencil.Ref[0] != ctx->Stencil.Ref[face] ||
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->Stencil.ValueMask[0] != ctx->Stencil.ValueMask[face] ||
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->Stencil.WriteMask[0] != ctx->Stencil.WriteMask[face]);
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Initialize the context stipple state.
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context.
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Initializes __struct gl_contextRec::Stencil attribute group.
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_init_stencil(struct gl_context *ctx)
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.Enabled = GL_FALSE;
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.TestTwoSide = GL_FALSE;
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.ActiveFace = 0;  /* 0 = GL_FRONT, 2 = GL_BACK */
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.Function[0] = GL_ALWAYS;
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.Function[1] = GL_ALWAYS;
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.Function[2] = GL_ALWAYS;
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.FailFunc[0] = GL_KEEP;
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.FailFunc[1] = GL_KEEP;
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.FailFunc[2] = GL_KEEP;
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.ZPassFunc[0] = GL_KEEP;
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.ZPassFunc[1] = GL_KEEP;
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.ZPassFunc[2] = GL_KEEP;
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.ZFailFunc[0] = GL_KEEP;
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.ZFailFunc[1] = GL_KEEP;
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.ZFailFunc[2] = GL_KEEP;
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.Ref[0] = 0;
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.Ref[1] = 0;
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.Ref[2] = 0;
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.ValueMask[0] = ~0U;
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.ValueMask[1] = ~0U;
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.ValueMask[2] = ~0U;
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.WriteMask[0] = ~0U;
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.WriteMask[1] = ~0U;
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.WriteMask[2] = ~0U;
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil.Clear = 0;
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Stencil._BackFace = 1;
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
607