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