1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software. 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors: 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Keith Whitwell <keith@tungstengraphics.com> 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Brian Paul 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Zack Rusin 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <assert.h> 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "st_context.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "st_atom.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_context.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "cso_cache/cso_context.h" 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convert an OpenGL compare mode to a pipe tokens. 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLuint 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgst_compare_func_to_pipe(GLenum func) 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Same values, just biased */ 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org STATIC_ASSERT(PIPE_FUNC_NEVER == GL_NEVER - GL_NEVER); 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org STATIC_ASSERT(PIPE_FUNC_LESS == GL_LESS - GL_NEVER); 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org STATIC_ASSERT(PIPE_FUNC_EQUAL == GL_EQUAL - GL_NEVER); 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org STATIC_ASSERT(PIPE_FUNC_LEQUAL == GL_LEQUAL - GL_NEVER); 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org STATIC_ASSERT(PIPE_FUNC_GREATER == GL_GREATER - GL_NEVER); 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org STATIC_ASSERT(PIPE_FUNC_NOTEQUAL == GL_NOTEQUAL - GL_NEVER); 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org STATIC_ASSERT(PIPE_FUNC_GEQUAL == GL_GEQUAL - GL_NEVER); 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org STATIC_ASSERT(PIPE_FUNC_ALWAYS == GL_ALWAYS - GL_NEVER); 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(func >= GL_NEVER); 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(func <= GL_ALWAYS); 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return func - GL_NEVER; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convert GLenum stencil op tokens to pipe tokens. 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLuint 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggl_stencil_op_to_pipe(GLenum func) 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (func) { 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_KEEP: 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_STENCIL_OP_KEEP; 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ZERO: 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_STENCIL_OP_ZERO; 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_REPLACE: 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_STENCIL_OP_REPLACE; 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INCR: 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_STENCIL_OP_INCR; 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DECR: 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_STENCIL_OP_DECR; 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INCR_WRAP: 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_STENCIL_OP_INCR_WRAP; 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DECR_WRAP: 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_STENCIL_OP_DECR_WRAP; 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INVERT: 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_STENCIL_OP_INVERT; 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert("invalid GL token in gl_stencil_op_to_pipe()" == NULL); 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgupdate_depth_stencil_alpha(struct st_context *st) 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_depth_stencil_alpha_state *dsa = &st->state.depth_stencil; 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_stencil_ref sr; 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_context *ctx = st->ctx; 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(dsa, 0, sizeof(*dsa)); 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&sr, 0, sizeof(sr)); 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Depth.Test && ctx->DrawBuffer->Visual.depthBits > 0) { 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->depth.enabled = 1; 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->depth.writemask = ctx->Depth.Mask; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->depth.func = st_compare_func_to_pipe(ctx->Depth.Func); 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Stencil.Enabled && ctx->DrawBuffer->Visual.stencilBits > 0) { 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[0].enabled = 1; 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[0].func = st_compare_func_to_pipe(ctx->Stencil.Function[0]); 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[0].fail_op = gl_stencil_op_to_pipe(ctx->Stencil.FailFunc[0]); 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[0].zfail_op = gl_stencil_op_to_pipe(ctx->Stencil.ZFailFunc[0]); 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[0].zpass_op = gl_stencil_op_to_pipe(ctx->Stencil.ZPassFunc[0]); 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[0].valuemask = ctx->Stencil.ValueMask[0] & 0xff; 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[0].writemask = ctx->Stencil.WriteMask[0] & 0xff; 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sr.ref_value[0] = ctx->Stencil.Ref[0] & 0xff; 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Stencil._TestTwoSide) { 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint back = ctx->Stencil._BackFace; 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[1].enabled = 1; 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[1].func = st_compare_func_to_pipe(ctx->Stencil.Function[back]); 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[1].fail_op = gl_stencil_op_to_pipe(ctx->Stencil.FailFunc[back]); 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[1].zfail_op = gl_stencil_op_to_pipe(ctx->Stencil.ZFailFunc[back]); 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[1].zpass_op = gl_stencil_op_to_pipe(ctx->Stencil.ZPassFunc[back]); 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[1].valuemask = ctx->Stencil.ValueMask[back] & 0xff; 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[1].writemask = ctx->Stencil.WriteMask[back] & 0xff; 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sr.ref_value[1] = ctx->Stencil.Ref[back] & 0xff; 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* This should be unnecessary. Drivers must not expect this to 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * contain valid data, except the enabled bit 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[1] = dsa->stencil[0]; 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->stencil[1].enabled = 0; 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sr.ref_value[1] = sr.ref_value[0]; 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Color.AlphaEnabled) { 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->alpha.enabled = 1; 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->alpha.func = st_compare_func_to_pipe(ctx->Color.AlphaFunc); 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsa->alpha.ref_value = ctx->Color.AlphaRefUnclamped; 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_depth_stencil_alpha(st->cso_context, dsa); 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso_set_stencil_ref(st->cso_context, &sr); 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst struct st_tracked_state st_update_depth_stencil_alpha = { 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "st_update_depth_stencil", /* name */ 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { /* dirty */ 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (_NEW_DEPTH|_NEW_STENCIL|_NEW_COLOR), /* mesa */ 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, /* st */ 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }, 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org update_depth_stencil_alpha /* update */ 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 161