1cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell/*
2cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * Mesa 3-D graphics library
3a2ea606377ed5679dc513eabcf2d398216b47d61Michal Krol * Version:  6.5
4cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell *
5a2ea606377ed5679dc513eabcf2d398216b47d61Michal Krol * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
6cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell *
7cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
8cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * copy of this software and associated documentation files (the "Software"),
9cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * to deal in the Software without restriction, including without limitation
10cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * and/or sell copies of the Software, and to permit persons to whom the
12cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * Software is furnished to do so, subject to the following conditions:
13cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell *
14cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * The above copyright notice and this permission notice shall be included
15cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * in all copies or substantial portions of the Software.
16cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell *
17cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell *
2422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * Authors:
2505a4b37707d2c598ea68c05d07a3d65bcbf5a076Brian Paul *    Keith Whitwell <keith@tungstengraphics.com>
26cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */
27cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
28cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
29bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/glheader.h"
30bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/colormac.h"
31bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/macros.h"
32bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/imports.h"
33bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/mtypes.h"
34cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
35cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "math/m_xform.h"
36cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
37cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "t_context.h"
38cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "t_pipeline.h"
39cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
40cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
41cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
42cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstruct vertex_stage_data {
43cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLvector4f eye;
44cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLvector4f clip;
4522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes   GLvector4f proj;
46cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLubyte *clipmask;
47cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLubyte ormask;
48cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLubyte andmask;
49cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell};
50cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
51b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul#define VERTEX_STAGE_DATA(stage) ((struct vertex_stage_data *)stage->privatePtr)
52cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
53cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
54cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
55cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
56cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell/* This function implements cliptesting for user-defined clip planes.
57cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * The clipping of primitives to these planes is implemented in
58286611d99060c38c4cc12f18fde5448213e2a44bIan Romanick * t_render_clip.h.
59cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */
60cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#define USER_CLIPTEST(NAME, SZ)					\
61f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void NAME( struct gl_context *ctx,				\
62cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell		  GLvector4f *clip,				\
63cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell		  GLubyte *clipmask,				\
64cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell		  GLubyte *clipormask,				\
65cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell		  GLubyte *clipandmask )			\
66cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{								\
67cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint p;							\
68cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell								\
69cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   for (p = 0; p < ctx->Const.MaxClipPlanes; p++)		\
70103bc0f75c00dfcf671dc50d8d9666f88a42a59dBrian Paul      if (ctx->Transform.ClipPlanesEnabled & (1 << p)) {	\
71cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 GLuint nr, i;						\
72cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 const GLfloat a = ctx->Transform._ClipUserPlane[p][0];	\
73cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 const GLfloat b = ctx->Transform._ClipUserPlane[p][1];	\
74cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 const GLfloat c = ctx->Transform._ClipUserPlane[p][2];	\
75cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 const GLfloat d = ctx->Transform._ClipUserPlane[p][3];	\
76cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell         GLfloat *coord = (GLfloat *)clip->data;		\
77cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell         GLuint stride = clip->stride;				\
78cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell         GLuint count = clip->count;				\
79cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell								\
80cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 for (nr = 0, i = 0 ; i < count ; i++) {		\
81cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	    GLfloat dp = coord[0] * a + coord[1] * b;		\
82cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	    if (SZ > 2) dp += coord[2] * c;			\
83cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	    if (SZ > 3) dp += coord[3] * d; else dp += d;	\
84cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell								\
85cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	    if (dp < 0) {					\
86cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	       nr++;						\
87cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	       clipmask[i] |= CLIP_USER_BIT;			\
88cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	    }							\
89cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell								\
90cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	    STRIDE_F(coord, stride);				\
91cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 }							\
92cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell								\
93cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 if (nr > 0) {						\
94cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	    *clipormask |= CLIP_USER_BIT;			\
95cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	    if (nr == count) {					\
96cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	       *clipandmask |= CLIP_USER_BIT;			\
97cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	       return;						\
98cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	    }							\
99cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 }							\
100cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      }								\
101cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}
102cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
103cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
10422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth HughesUSER_CLIPTEST(userclip2, 2)
10522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth HughesUSER_CLIPTEST(userclip3, 3)
10622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth HughesUSER_CLIPTEST(userclip4, 4)
107cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
108f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void (*(usercliptab[5]))( struct gl_context *,
109286611d99060c38c4cc12f18fde5448213e2a44bIan Romanick				 GLvector4f *, GLubyte *,
110286611d99060c38c4cc12f18fde5448213e2a44bIan Romanick				 GLubyte *, GLubyte * ) =
111cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{
112b97e478fe90f612041e27852eb8c95f45467bde8Keith Whitwell   NULL,
113b97e478fe90f612041e27852eb8c95f45467bde8Keith Whitwell   NULL,
114cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   userclip2,
115cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   userclip3,
116cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   userclip4
117cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell};
118cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
119cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
1203fed69eb168774d2303e4efb9149f34e55d91b58Brian Paulvoid
121f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergtnl_clip_prepare(struct gl_context *ctx)
1223fed69eb168774d2303e4efb9149f34e55d91b58Brian Paul{
1233fed69eb168774d2303e4efb9149f34e55d91b58Brian Paul   /* Neither the x86 nor sparc asm cliptest functions have been updated
1243fed69eb168774d2303e4efb9149f34e55d91b58Brian Paul    * for ARB_depth_clamp, so force the C paths.
1253fed69eb168774d2303e4efb9149f34e55d91b58Brian Paul    */
1263fed69eb168774d2303e4efb9149f34e55d91b58Brian Paul   if (ctx->Transform.DepthClamp) {
1273fed69eb168774d2303e4efb9149f34e55d91b58Brian Paul      static GLboolean c_funcs_installed = GL_FALSE;
1283fed69eb168774d2303e4efb9149f34e55d91b58Brian Paul      if (!c_funcs_installed) {
1293fed69eb168774d2303e4efb9149f34e55d91b58Brian Paul         init_c_cliptest();
1303fed69eb168774d2303e4efb9149f34e55d91b58Brian Paul         c_funcs_installed = GL_TRUE;
1313fed69eb168774d2303e4efb9149f34e55d91b58Brian Paul      }
1323fed69eb168774d2303e4efb9149f34e55d91b58Brian Paul   }
1333fed69eb168774d2303e4efb9149f34e55d91b58Brian Paul}
1343fed69eb168774d2303e4efb9149f34e55d91b58Brian Paul
1353fed69eb168774d2303e4efb9149f34e55d91b58Brian Paul
136cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
137f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic GLboolean run_vertex_stage( struct gl_context *ctx,
138ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell				   struct tnl_pipeline_stage *stage )
139cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{
140b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul   struct vertex_stage_data *store = (struct vertex_stage_data *)stage->privatePtr;
14122144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes   TNLcontext *tnl = TNL_CONTEXT(ctx);
14222144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes   struct vertex_buffer *VB = &tnl->vb;
14322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes
144a328e469d328f8b6fd5afdfc21d576fa1a2c43fcBrian   if (ctx->VertexProgram._Current)
1456f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell      return GL_TRUE;
1466f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell
1473fed69eb168774d2303e4efb9149f34e55d91b58Brian Paul   tnl_clip_prepare(ctx);
1483fed69eb168774d2303e4efb9149f34e55d91b58Brian Paul
1496f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   if (ctx->_NeedEyeCoords) {
1506f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell      /* Separate modelview transformation:
1516f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell       * Use combined ModelProject to avoid some depth artifacts
152cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell       */
1536f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell      if (ctx->ModelviewMatrixStack.Top->type == MATRIX_IDENTITY)
154165b860da6f16ef4817a4959774a57f57ba3756dEric Anholt	 VB->EyePtr = VB->AttribPtr[_TNL_ATTRIB_POS];
1556f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell      else
1566f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell	 VB->EyePtr = TransformRaw( &store->eye,
1576f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell				    ctx->ModelviewMatrixStack.Top,
158165b860da6f16ef4817a4959774a57f57ba3756dEric Anholt				    VB->AttribPtr[_TNL_ATTRIB_POS]);
1596f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   }
160cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
1616f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   VB->ClipPtr = TransformRaw( &store->clip,
1626f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell			       &ctx->_ModelProjectMatrix,
163165b860da6f16ef4817a4959774a57f57ba3756dEric Anholt			       VB->AttribPtr[_TNL_ATTRIB_POS] );
164cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
1656f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   /* Drivers expect this to be clean to element 4...
1666f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell    */
1676f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   switch (VB->ClipPtr->size) {
1686f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   case 1:
1696f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell      /* impossible */
1706f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   case 2:
1716f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell      _mesa_vector4f_clean_elem( VB->ClipPtr, VB->Count, 2 );
1726f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell      /* fall-through */
1736f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   case 3:
1746f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell      _mesa_vector4f_clean_elem( VB->ClipPtr, VB->Count, 3 );
1756f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell      /* fall-through */
1766f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   case 4:
1776f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell      break;
1786f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   }
179cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
1806f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell
1816f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   /* Cliptest and perspective divide.  Clip functions must clear
1826f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell    * the clipmask.
1836f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell    */
1846f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   store->ormask = 0;
18551faca127005c41277df76bc8eafc8fd64ca0673Brian Paul   store->andmask = CLIP_FRUSTUM_BITS;
1866f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell
1876f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   if (tnl->NeedNdcCoords) {
1886f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell      VB->NdcPtr =
1896f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell	 _mesa_clip_tab[VB->ClipPtr->size]( VB->ClipPtr,
1906f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell					    &store->proj,
1916f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell					    store->clipmask,
1926f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell					    &store->ormask,
193b4922b533155cc139ebafb111502bb55d2ad2ccfEric Anholt					    &store->andmask,
194b4922b533155cc139ebafb111502bb55d2ad2ccfEric Anholt					    !ctx->Transform.DepthClamp );
19522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes   }
196cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   else {
1976f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell      VB->NdcPtr = NULL;
1986f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell      _mesa_clip_np_tab[VB->ClipPtr->size]( VB->ClipPtr,
1996f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell					    NULL,
2006f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell					    store->clipmask,
2016f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell					    &store->ormask,
202b4922b533155cc139ebafb111502bb55d2ad2ccfEric Anholt					    &store->andmask,
203b4922b533155cc139ebafb111502bb55d2ad2ccfEric Anholt					    !ctx->Transform.DepthClamp );
2046f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   }
2056f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell
2066f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   if (store->andmask)
2076f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell      return GL_FALSE;
2086f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell
2096f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell
2106f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   /* Test userclip planes.  This contributes to VB->ClipMask, so
2116f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell    * is essentially required to be in this stage.
2126f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell    */
2136f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   if (ctx->Transform.ClipPlanesEnabled) {
2146f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell      usercliptab[VB->ClipPtr->size]( ctx,
2156f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell				      VB->ClipPtr,
2166f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell				      store->clipmask,
2176f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell				      &store->ormask,
2186f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell				      &store->andmask );
2196f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell
220cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      if (store->andmask)
221cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 return GL_FALSE;
222cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   }
223cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
2246f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   VB->ClipAndMask = store->andmask;
2256f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   VB->ClipOrMask = store->ormask;
2266f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   VB->ClipMask = store->clipmask;
2276f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell
228cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   return GL_TRUE;
229cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}
230cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
231cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
232f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic GLboolean init_vertex_stage( struct gl_context *ctx,
233ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell				    struct tnl_pipeline_stage *stage )
234cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{
23522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
236cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   struct vertex_stage_data *store;
237cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint size = VB->Size;
238cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
239b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul   stage->privatePtr = CALLOC(sizeof(*store));
240cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   store = VERTEX_STAGE_DATA(stage);
241cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (!store)
242cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      return GL_FALSE;
24322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes
24408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul   _mesa_vector4f_alloc( &store->eye, 0, size, 32 );
24508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul   _mesa_vector4f_alloc( &store->clip, 0, size, 32 );
24622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes   _mesa_vector4f_alloc( &store->proj, 0, size, 32 );
247cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
24899ae9e8d7d57ae37629754edd5b1e3716611827fKristian Høgsberg   store->clipmask = (GLubyte *) _mesa_align_malloc(sizeof(GLubyte)*size, 32 );
249cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
250cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (!store->clipmask ||
25122144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes       !store->eye.data ||
25222144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes       !store->clip.data ||
25322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes       !store->proj.data)
254cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      return GL_FALSE;
255cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
2566f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   return GL_TRUE;
257cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}
258cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
259ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstatic void dtr( struct tnl_pipeline_stage *stage )
260cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{
261cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   struct vertex_stage_data *store = VERTEX_STAGE_DATA(stage);
262cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
263cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (store) {
26408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_vector4f_free( &store->eye );
26508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_vector4f_free( &store->clip );
26608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_vector4f_free( &store->proj );
26799ae9e8d7d57ae37629754edd5b1e3716611827fKristian Høgsberg      _mesa_align_free( store->clipmask );
268cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      FREE(store);
269b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul      stage->privatePtr = NULL;
270cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      stage->run = init_vertex_stage;
271cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   }
272cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}
273cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
274cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
275ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellconst struct tnl_pipeline_stage _tnl_vertex_transform_stage =
27622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes{
277cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   "modelview/project/cliptest/divide",
27886b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul   NULL,			/* private data */
2796f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   init_vertex_stage,
280cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   dtr,				/* destructor */
2816f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   NULL,
2826f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   run_vertex_stage		/* run -- initially set to init */
283cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell};
284