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