radeon_maos_vbtmp.h revision a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980
15df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*
25df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Mesa 3-D graphics library
35df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Version:  4.1
45df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
55df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
65df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
75df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a
85df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * copy of this software and associated documentation files (the "Software"),
95df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * to deal in the Software without restriction, including without limitation
105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense,
115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * and/or sell copies of the Software, and to permit persons to whom the
125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Software is furnished to do so, subject to the following conditions:
135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * The above copyright notice and this permission notice shall be included
155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * in all copies or substantial portions of the Software.
165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Authors:
255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *    Keith Whitwell <keith@tungstengraphics.com>
265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#ifndef LOCALVARS
295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define LOCALVARS
305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#endif
315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TCL_DEBUG
335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#ifndef TCL_DEBUG
345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TCL_DEBUG 0
355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#endif
365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void TAG(emit)( GLcontext *ctx,
385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		       GLuint start, GLuint end,
395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		       void *dest )
405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   LOCALVARS
4257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint (*tc0)[4], (*tc1)[4], (*tc2)[4];
4457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   GLfloat (*col)[4], (*spec)[4];
455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat (*fog)[4];
465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint (*norm)[4];
475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint tc0_stride, tc1_stride, col_stride, spec_stride, fog_stride;
485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint tc2_stride, norm_stride;
4957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   GLuint fill_tex = 0;
50a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger   GLuint rqcoordsnoswap = 0;
515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint (*coord)[4];
525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint coord_stride; /* object coordinates */
535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLubyte dummy[4];
545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int i;
555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   union emit_union *v = (union emit_union *)dest;
575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (RADEON_DEBUG & DEBUG_VERTS)
595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "%s\n", __FUNCTION__);
605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   coord = (GLuint (*)[4])VB->ObjPtr->data;
625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   coord_stride = VB->ObjPtr->stride;
635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_TEX2) {
6557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      if (VB->TexCoordPtr[2]) {
6657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 const GLuint t2 = GET_TEXSOURCE(2);
6757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 tc2 = (GLuint (*)[4])VB->TexCoordPtr[t2]->data;
6857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 tc2_stride = VB->TexCoordPtr[t2]->stride;
69a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 if (DO_PTEX && VB->TexCoordPtr[t2]->size < 3) {
70a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 /* since DO_PTEX is only true when we have 3 or more coords
71a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    in the first place we don't really need this right? */
7257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	    fill_tex |= (1<<2);
735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
74a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 else if (DO_PTEX && VB->TexCoordPtr[t2]->size < 4) {
75a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    rqcoordsnoswap |= (1<<2);
76a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 }
7757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      } else {
7857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 tc2 = (GLuint (*)[4])&ctx->Current.Attrib[VERT_ATTRIB_TEX2];
7957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 tc2_stride = 0;
805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_TEX1) {
845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (VB->TexCoordPtr[1]) {
855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 const GLuint t1 = GET_TEXSOURCE(1);
865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tc1 = (GLuint (*)[4])VB->TexCoordPtr[t1]->data;
875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tc1_stride = VB->TexCoordPtr[t1]->stride;
88a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 if (DO_PTEX && VB->TexCoordPtr[t1]->size < 3) {
8957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	    fill_tex |= (1<<1);
905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
91a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 else if (DO_PTEX && VB->TexCoordPtr[t1]->size < 4) {
92a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    rqcoordsnoswap |= (1<<1);
93a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 }
945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
9557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 tc1 = (GLuint (*)[4])&ctx->Current.Attrib[VERT_ATTRIB_TEX1];
965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tc1_stride = 0;
975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_TEX0) {
1015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (VB->TexCoordPtr[0]) {
1025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 const GLuint t0 = GET_TEXSOURCE(0);
1035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tc0_stride = VB->TexCoordPtr[t0]->stride;
1045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tc0 = (GLuint (*)[4])VB->TexCoordPtr[t0]->data;
105a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 if (DO_PTEX && VB->TexCoordPtr[t0]->size < 3) {
10657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	    fill_tex |= (1<<0);
1075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
108a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 else if (DO_PTEX && VB->TexCoordPtr[t0]->size < 4) {
109a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    rqcoordsnoswap |= (1<<0);
110a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 }
1115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
11257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 tc0 = (GLuint (*)[4])&ctx->Current.Attrib[VERT_ATTRIB_TEX0];
1135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tc0_stride = 0;
1145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
1155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_NORM) {
1195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (VB->NormalPtr) {
1205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 norm_stride = VB->NormalPtr->stride;
1215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 norm = (GLuint (*)[4])VB->NormalPtr->data;
1225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
1235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 norm_stride = 0;
1245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 norm = (GLuint (*)[4])&ctx->Current.Attrib[VERT_ATTRIB_NORMAL];
1255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
1265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_RGBA) {
1295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (VB->ColorPtr[0]) {
13057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 col = VB->ColorPtr[0]->data;
13157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 col_stride = VB->ColorPtr[0]->stride;
1325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
13357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 col = (GLfloat (*)[4])ctx->Current.Attrib[VERT_ATTRIB_COLOR0];
1345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 col_stride = 0;
1355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
1365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_SPEC) {
1395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (VB->SecondaryColorPtr[0]) {
14057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 spec = VB->SecondaryColorPtr[0]->data;
14157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 spec_stride = VB->SecondaryColorPtr[0]->stride;
1425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
14357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 spec = (GLfloat (*)[4])ctx->Current.Attrib[VERT_ATTRIB_COLOR1];
1445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 spec_stride = 0;
1455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
1465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_FOG) {
1495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (VB->FogCoordPtr) {
1505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fog = VB->FogCoordPtr->data;
1515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fog_stride = VB->FogCoordPtr->stride;
1525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
1535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fog = (GLfloat (*)[4])&dummy; fog[0][0] = 0.0F;
1545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fog_stride = 0;
1555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
1565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   if (start) {
16057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      coord =  (GLuint (*)[4])((GLubyte *)coord + start * coord_stride);
16157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      if (DO_TEX0)
16257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 tc0 =  (GLuint (*)[4])((GLubyte *)tc0 + start * tc0_stride);
16357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      if (DO_TEX1)
16457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 tc1 =  (GLuint (*)[4])((GLubyte *)tc1 + start * tc1_stride);
16557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      if (DO_TEX2)
16657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 tc2 =  (GLuint (*)[4])((GLubyte *)tc2 + start * tc2_stride);
16757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      if (DO_NORM)
16857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 norm =  (GLuint (*)[4])((GLubyte *)norm + start * norm_stride);
16957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      if (DO_RGBA)
17057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 STRIDE_4F(col, start * col_stride);
17157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      if (DO_SPEC)
17257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 STRIDE_4F(spec, start * spec_stride);
17357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      if (DO_FOG)
17457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 STRIDE_4F(fog, start * fog_stride);
17557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   }
1765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
17857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   {
1795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      for (i=start; i < end; i++) {
18057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
1815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 v[0].ui = coord[0][0];
1825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 v[1].ui = coord[0][1];
1835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 v[2].ui = coord[0][2];
1845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (DO_W) {
1855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v[3].ui = coord[0][3];
1865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v += 4;
1875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
1885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 else
1895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v += 3;
1905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 coord =  (GLuint (*)[4])((GLubyte *)coord +  coord_stride);
1915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (DO_NORM) {
1935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v[0].ui = norm[0][0];
1945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v[1].ui = norm[0][1];
1955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v[2].ui = norm[0][2];
1965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v += 3;
1975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    norm =  (GLuint (*)[4])((GLubyte *)norm +  norm_stride);
1985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
1995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (DO_RGBA) {
20057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	    UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.red, col[0][0]);
20157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	    UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.green, col[0][1]);
20257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	    UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.blue, col[0][2]);
20357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	    UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.alpha, col[0][3]);
20457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	    STRIDE_4F(col, col_stride);
2055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v++;
2065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
2075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (DO_SPEC || DO_FOG) {
2085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if (DO_SPEC) {
20957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	       UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.red, spec[0][0]);
21057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	       UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.green, spec[0][1]);
21157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	       UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.blue, spec[0][2]);
21257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	       STRIDE_4F(spec, spec_stride);
2135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    }
2145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if (DO_FOG) {
21557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	       UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.alpha, fog[0][0]);
21657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	       fog = (GLfloat (*)[4])((GLubyte *)fog + fog_stride);
2175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    }
2185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if (TCL_DEBUG) fprintf(stderr, "%x ", v[0].ui);
2195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v++;
2205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
2215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (DO_TEX0) {
2225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v[0].ui = tc0[0][0];
2235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v[1].ui = tc0[0][1];
2245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if (TCL_DEBUG) fprintf(stderr, "t0: %.2f %.2f ", v[0].f, v[1].f);
2255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if (DO_PTEX) {
22657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	       if (fill_tex & (1<<0))
22757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell		  v[2].f = 1.0;
228a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	       else if (rqcoordsnoswap & (1<<0))
229a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger		  v[2].ui = tc0[0][2];
23057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	       else
23157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell		  v[2].ui = tc0[0][3];
2325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       if (TCL_DEBUG) fprintf(stderr, "%.2f ", v[2].f);
2335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       v += 3;
2345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    }
2355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    else
2365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       v += 2;
2375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    tc0 =  (GLuint (*)[4])((GLubyte *)tc0 +  tc0_stride);
2385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
2395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (DO_TEX1) {
2405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v[0].ui = tc1[0][0];
2415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v[1].ui = tc1[0][1];
2425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if (TCL_DEBUG) fprintf(stderr, "t1: %.2f %.2f ", v[0].f, v[1].f);
2435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if (DO_PTEX) {
24457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	       if (fill_tex & (1<<1))
24557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell		  v[2].f = 1.0;
246a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	       else if (rqcoordsnoswap & (1<<1))
247a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger		  v[2].ui = tc1[0][2];
24857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	       else
24957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell		  v[2].ui = tc1[0][3];
2505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       if (TCL_DEBUG) fprintf(stderr, "%.2f ", v[2].f);
2515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       v += 3;
2525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    }
2535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    else
2545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       v += 2;
2555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    tc1 =  (GLuint (*)[4])((GLubyte *)tc1 +  tc1_stride);
2565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
2575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (DO_TEX2) {
2585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v[0].ui = tc2[0][0];
2595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v[1].ui = tc2[0][1];
2605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if (DO_PTEX) {
26157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	       if (fill_tex & (1<<2))
26257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell		  v[2].f = 1.0;
263a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	       else if (rqcoordsnoswap & (1<<2))
264a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger		  v[2].ui = tc2[0][2];
26557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	       else
26657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell		  v[2].ui = tc2[0][3];
2675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       v += 3;
2685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    }
2695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    else
2705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       v += 2;
2715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    tc2 =  (GLuint (*)[4])((GLubyte *)tc2 +  tc2_stride);
2725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
2735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (TCL_DEBUG) fprintf(stderr, "\n");
2745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
2755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void TAG(init)( void )
2815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
2825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int sz = 3;
2835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_W) sz++;
2845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_NORM) sz += 3;
2855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_RGBA) sz++;
2865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_SPEC || DO_FOG) sz++;
2875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_TEX0) sz += 2;
2885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_TEX0 && DO_PTEX) sz++;
2895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_TEX1) sz += 2;
2905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_TEX1 && DO_PTEX) sz++;
2915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_TEX2) sz += 2;
2925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_TEX2 && DO_PTEX) sz++;
2935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   setup_tab[IDX].emit = TAG(emit);
2955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   setup_tab[IDX].vertex_format = IND;
2965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   setup_tab[IDX].vertex_size = sz;
2975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef IND
3015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TAG
3025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef IDX
303