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