st_atom_depth.c revision 2b32c7dff51fa9853ba528744bd191400aa4b206
14c9b48dcc510929951516f3cd17b98654ac93a9aBrian/************************************************************************** 24c9b48dcc510929951516f3cd17b98654ac93a9aBrian * 34c9b48dcc510929951516f3cd17b98654ac93a9aBrian * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 44c9b48dcc510929951516f3cd17b98654ac93a9aBrian * All Rights Reserved. 54c9b48dcc510929951516f3cd17b98654ac93a9aBrian * 64c9b48dcc510929951516f3cd17b98654ac93a9aBrian * Permission is hereby granted, free of charge, to any person obtaining a 74c9b48dcc510929951516f3cd17b98654ac93a9aBrian * copy of this software and associated documentation files (the 84c9b48dcc510929951516f3cd17b98654ac93a9aBrian * "Software"), to deal in the Software without restriction, including 94c9b48dcc510929951516f3cd17b98654ac93a9aBrian * without limitation the rights to use, copy, modify, merge, publish, 104c9b48dcc510929951516f3cd17b98654ac93a9aBrian * distribute, sub license, and/or sell copies of the Software, and to 114c9b48dcc510929951516f3cd17b98654ac93a9aBrian * permit persons to whom the Software is furnished to do so, subject to 124c9b48dcc510929951516f3cd17b98654ac93a9aBrian * the following conditions: 134c9b48dcc510929951516f3cd17b98654ac93a9aBrian * 144c9b48dcc510929951516f3cd17b98654ac93a9aBrian * The above copyright notice and this permission notice (including the 154c9b48dcc510929951516f3cd17b98654ac93a9aBrian * next paragraph) shall be included in all copies or substantial portions 164c9b48dcc510929951516f3cd17b98654ac93a9aBrian * of the Software. 174c9b48dcc510929951516f3cd17b98654ac93a9aBrian * 184c9b48dcc510929951516f3cd17b98654ac93a9aBrian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 194c9b48dcc510929951516f3cd17b98654ac93a9aBrian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 204c9b48dcc510929951516f3cd17b98654ac93a9aBrian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 214c9b48dcc510929951516f3cd17b98654ac93a9aBrian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 224c9b48dcc510929951516f3cd17b98654ac93a9aBrian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 234c9b48dcc510929951516f3cd17b98654ac93a9aBrian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 244c9b48dcc510929951516f3cd17b98654ac93a9aBrian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 254c9b48dcc510929951516f3cd17b98654ac93a9aBrian * 264c9b48dcc510929951516f3cd17b98654ac93a9aBrian **************************************************************************/ 274c9b48dcc510929951516f3cd17b98654ac93a9aBrian 284c9b48dcc510929951516f3cd17b98654ac93a9aBrian /* 294c9b48dcc510929951516f3cd17b98654ac93a9aBrian * Authors: 304c9b48dcc510929951516f3cd17b98654ac93a9aBrian * Keith Whitwell <keith@tungstengraphics.com> 314c9b48dcc510929951516f3cd17b98654ac93a9aBrian * Brian Paul 32d6ac959833a8e40a27907940969c622692f749b1Zack Rusin * Zack Rusin 334c9b48dcc510929951516f3cd17b98654ac93a9aBrian */ 344c9b48dcc510929951516f3cd17b98654ac93a9aBrian 354c9b48dcc510929951516f3cd17b98654ac93a9aBrian 364c9b48dcc510929951516f3cd17b98654ac93a9aBrian#include "st_context.h" 374c9b48dcc510929951516f3cd17b98654ac93a9aBrian#include "st_atom.h" 38943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell#include "pipe/p_context.h" 39943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell#include "pipe/p_defines.h" 40339e7ec6805e6de8794514c0a935081b5d36d38fBrian#include "cso_cache/cso_context.h" 414c9b48dcc510929951516f3cd17b98654ac93a9aBrian 424c9b48dcc510929951516f3cd17b98654ac93a9aBrian 434c9b48dcc510929951516f3cd17b98654ac93a9aBrian/** 44b18763141d651ae1112e80bb7ef3e813c8ce1d18Brian * Convert an OpenGL compare mode to a pipe tokens. 45d6ac959833a8e40a27907940969c622692f749b1Zack Rusin */ 46b18763141d651ae1112e80bb7ef3e813c8ce1d18BrianGLuint 47b18763141d651ae1112e80bb7ef3e813c8ce1d18Brianst_compare_func_to_pipe(GLenum func) 48d6ac959833a8e40a27907940969c622692f749b1Zack Rusin{ 49d6ac959833a8e40a27907940969c622692f749b1Zack Rusin /* Same values, just biased */ 50d6ac959833a8e40a27907940969c622692f749b1Zack Rusin assert(PIPE_FUNC_NEVER == GL_NEVER - GL_NEVER); 51d6ac959833a8e40a27907940969c622692f749b1Zack Rusin assert(PIPE_FUNC_LESS == GL_LESS - GL_NEVER); 52d6ac959833a8e40a27907940969c622692f749b1Zack Rusin assert(PIPE_FUNC_EQUAL == GL_EQUAL - GL_NEVER); 53d6ac959833a8e40a27907940969c622692f749b1Zack Rusin assert(PIPE_FUNC_LEQUAL == GL_LEQUAL - GL_NEVER); 54d6ac959833a8e40a27907940969c622692f749b1Zack Rusin assert(PIPE_FUNC_GREATER == GL_GREATER - GL_NEVER); 55d6ac959833a8e40a27907940969c622692f749b1Zack Rusin assert(PIPE_FUNC_NOTEQUAL == GL_NOTEQUAL - GL_NEVER); 56d6ac959833a8e40a27907940969c622692f749b1Zack Rusin assert(PIPE_FUNC_GEQUAL == GL_GEQUAL - GL_NEVER); 57d6ac959833a8e40a27907940969c622692f749b1Zack Rusin assert(PIPE_FUNC_ALWAYS == GL_ALWAYS - GL_NEVER); 58d6ac959833a8e40a27907940969c622692f749b1Zack Rusin assert(func >= GL_NEVER); 59d6ac959833a8e40a27907940969c622692f749b1Zack Rusin assert(func <= GL_ALWAYS); 60d6ac959833a8e40a27907940969c622692f749b1Zack Rusin return func - GL_NEVER; 61d6ac959833a8e40a27907940969c622692f749b1Zack Rusin} 62d6ac959833a8e40a27907940969c622692f749b1Zack Rusin 63d6ac959833a8e40a27907940969c622692f749b1Zack Rusin 64d6ac959833a8e40a27907940969c622692f749b1Zack Rusin/** 65d6ac959833a8e40a27907940969c622692f749b1Zack Rusin * Convert GLenum stencil op tokens to pipe tokens. 66d6ac959833a8e40a27907940969c622692f749b1Zack Rusin */ 67d6ac959833a8e40a27907940969c622692f749b1Zack Rusinstatic GLuint 68b18763141d651ae1112e80bb7ef3e813c8ce1d18Briangl_stencil_op_to_pipe(GLenum func) 69d6ac959833a8e40a27907940969c622692f749b1Zack Rusin{ 70d6ac959833a8e40a27907940969c622692f749b1Zack Rusin switch (func) { 71d6ac959833a8e40a27907940969c622692f749b1Zack Rusin case GL_KEEP: 72d6ac959833a8e40a27907940969c622692f749b1Zack Rusin return PIPE_STENCIL_OP_KEEP; 73d6ac959833a8e40a27907940969c622692f749b1Zack Rusin case GL_ZERO: 74d6ac959833a8e40a27907940969c622692f749b1Zack Rusin return PIPE_STENCIL_OP_ZERO; 75d6ac959833a8e40a27907940969c622692f749b1Zack Rusin case GL_REPLACE: 76d6ac959833a8e40a27907940969c622692f749b1Zack Rusin return PIPE_STENCIL_OP_REPLACE; 77d6ac959833a8e40a27907940969c622692f749b1Zack Rusin case GL_INCR: 78d6ac959833a8e40a27907940969c622692f749b1Zack Rusin return PIPE_STENCIL_OP_INCR; 79d6ac959833a8e40a27907940969c622692f749b1Zack Rusin case GL_DECR: 80d6ac959833a8e40a27907940969c622692f749b1Zack Rusin return PIPE_STENCIL_OP_DECR; 81d6ac959833a8e40a27907940969c622692f749b1Zack Rusin case GL_INCR_WRAP: 82d6ac959833a8e40a27907940969c622692f749b1Zack Rusin return PIPE_STENCIL_OP_INCR_WRAP; 83d6ac959833a8e40a27907940969c622692f749b1Zack Rusin case GL_DECR_WRAP: 84d6ac959833a8e40a27907940969c622692f749b1Zack Rusin return PIPE_STENCIL_OP_DECR_WRAP; 85d6ac959833a8e40a27907940969c622692f749b1Zack Rusin case GL_INVERT: 86d6ac959833a8e40a27907940969c622692f749b1Zack Rusin return PIPE_STENCIL_OP_INVERT; 87d6ac959833a8e40a27907940969c622692f749b1Zack Rusin default: 88b18763141d651ae1112e80bb7ef3e813c8ce1d18Brian assert("invalid GL token in gl_stencil_op_to_pipe()" == NULL); 89d6ac959833a8e40a27907940969c622692f749b1Zack Rusin return 0; 90d6ac959833a8e40a27907940969c622692f749b1Zack Rusin } 91d6ac959833a8e40a27907940969c622692f749b1Zack Rusin} 92d6ac959833a8e40a27907940969c622692f749b1Zack Rusin 93d6ac959833a8e40a27907940969c622692f749b1Zack Rusinstatic void 94bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwellupdate_depth_stencil_alpha(struct st_context *st) 954c9b48dcc510929951516f3cd17b98654ac93a9aBrian{ 96339e7ec6805e6de8794514c0a935081b5d36d38fBrian struct pipe_depth_stencil_alpha_state *dsa = &st->state.depth_stencil; 972b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul GLcontext *ctx = st->ctx; 984c9b48dcc510929951516f3cd17b98654ac93a9aBrian 99339e7ec6805e6de8794514c0a935081b5d36d38fBrian memset(dsa, 0, sizeof(*dsa)); 1004c9b48dcc510929951516f3cd17b98654ac93a9aBrian 1012b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul dsa->depth.enabled = ctx->Depth.Test; 1022b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul dsa->depth.writemask = ctx->Depth.Mask; 1032b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul dsa->depth.func = st_compare_func_to_pipe(ctx->Depth.Func); 1044c9b48dcc510929951516f3cd17b98654ac93a9aBrian 1052b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul if (ctx->Query.CurrentOcclusionObject && 1062b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul ctx->Query.CurrentOcclusionObject->Active) 107339e7ec6805e6de8794514c0a935081b5d36d38fBrian dsa->depth.occlusion_count = 1; 108d6ac959833a8e40a27907940969c622692f749b1Zack Rusin 1092b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul if (ctx->Stencil.Enabled && ctx->Visual.stencilBits > 0) { 110339e7ec6805e6de8794514c0a935081b5d36d38fBrian dsa->stencil[0].enabled = 1; 1112b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul dsa->stencil[0].func = st_compare_func_to_pipe(ctx->Stencil.Function[0]); 1122b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul dsa->stencil[0].fail_op = gl_stencil_op_to_pipe(ctx->Stencil.FailFunc[0]); 1132b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul dsa->stencil[0].zfail_op = gl_stencil_op_to_pipe(ctx->Stencil.ZFailFunc[0]); 1142b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul dsa->stencil[0].zpass_op = gl_stencil_op_to_pipe(ctx->Stencil.ZPassFunc[0]); 1152b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul dsa->stencil[0].ref_value = ctx->Stencil.Ref[0] & 0xff; 1162b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul dsa->stencil[0].valuemask = ctx->Stencil.ValueMask[0] & 0xff; 1172b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul dsa->stencil[0].writemask = ctx->Stencil.WriteMask[0] & 0xff; 1182b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul 1192b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul if (ctx->Stencil._TestTwoSide) { 1202b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul const GLuint back = ctx->Stencil._BackFace; 121339e7ec6805e6de8794514c0a935081b5d36d38fBrian dsa->stencil[1].enabled = 1; 1222b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul dsa->stencil[1].func = st_compare_func_to_pipe(ctx->Stencil.Function[back]); 1232b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul dsa->stencil[1].fail_op = gl_stencil_op_to_pipe(ctx->Stencil.FailFunc[back]); 1242b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul dsa->stencil[1].zfail_op = gl_stencil_op_to_pipe(ctx->Stencil.ZFailFunc[back]); 1252b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul dsa->stencil[1].zpass_op = gl_stencil_op_to_pipe(ctx->Stencil.ZPassFunc[back]); 1262b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul dsa->stencil[1].ref_value = ctx->Stencil.Ref[back] & 0xff; 1272b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul dsa->stencil[1].valuemask = ctx->Stencil.ValueMask[back] & 0xff; 1282b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul dsa->stencil[1].writemask = ctx->Stencil.WriteMask[back] & 0xff; 129d6ac959833a8e40a27907940969c622692f749b1Zack Rusin } 130d453042bc67cc94bb215d229b60e8cd70a80ff8dBrian Paul else { 131d453042bc67cc94bb215d229b60e8cd70a80ff8dBrian Paul dsa->stencil[1] = dsa->stencil[0]; 132cf9b07ea3474cd33e797eeb10b3fd73ad54ae8d5Roland Scheidegger dsa->stencil[1].enabled = 0; 133d453042bc67cc94bb215d229b60e8cd70a80ff8dBrian Paul } 134d6ac959833a8e40a27907940969c622692f749b1Zack Rusin } 135563479552e2f491fb94e7fac5772f3c72cee962aBrian 1362b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul if (ctx->Color.AlphaEnabled) { 137339e7ec6805e6de8794514c0a935081b5d36d38fBrian dsa->alpha.enabled = 1; 1382b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul dsa->alpha.func = st_compare_func_to_pipe(ctx->Color.AlphaFunc); 1392b32c7dff51fa9853ba528744bd191400aa4b206Brian Paul dsa->alpha.ref_value = ctx->Color.AlphaRef; 140bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell } 141bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell 142339e7ec6805e6de8794514c0a935081b5d36d38fBrian cso_set_depth_stencil_alpha(st->cso_context, dsa); 1434c9b48dcc510929951516f3cd17b98654ac93a9aBrian} 1444c9b48dcc510929951516f3cd17b98654ac93a9aBrian 1454c9b48dcc510929951516f3cd17b98654ac93a9aBrian 146bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwellconst struct st_tracked_state st_update_depth_stencil_alpha = { 14754507125e735ffa595e252282eaabf38095c21e1Alan Hourihane "st_update_depth_stencil", /* name */ 14854507125e735ffa595e252282eaabf38095c21e1Alan Hourihane { /* dirty */ 14954507125e735ffa595e252282eaabf38095c21e1Alan Hourihane (_NEW_DEPTH|_NEW_STENCIL|_NEW_COLOR), /* mesa */ 15054507125e735ffa595e252282eaabf38095c21e1Alan Hourihane 0, /* st */ 1514c9b48dcc510929951516f3cd17b98654ac93a9aBrian }, 15254507125e735ffa595e252282eaabf38095c21e1Alan Hourihane update_depth_stencil_alpha /* update */ 1534c9b48dcc510929951516f3cd17b98654ac93a9aBrian}; 154