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
37f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void TAG(emit)( struct gl_context *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   int i;
545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   union emit_union *v = (union emit_union *)dest;
565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
574e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen   radeon_print(RADEON_SWRENDER, RADEON_VERBOSE, "%s\n", __FUNCTION__);
585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
59165b860da6f16ef4817a4959774a57f57ba3756dEric Anholt   coord = (GLuint (*)[4])VB->AttribPtr[_TNL_ATTRIB_POS]->data;
60165b860da6f16ef4817a4959774a57f57ba3756dEric Anholt   coord_stride = VB->AttribPtr[_TNL_ATTRIB_POS]->stride;
615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_TEX2) {
63df582ca767a38f185f9b4c449e7ed4266c414ae2Eric Anholt      if (VB->AttribPtr[_TNL_ATTRIB_TEX2]) {
6457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 const GLuint t2 = GET_TEXSOURCE(2);
65df582ca767a38f185f9b4c449e7ed4266c414ae2Eric Anholt	 tc2 = (GLuint (*)[4])VB->AttribPtr[_TNL_ATTRIB_TEX0 + t2]->data;
66df582ca767a38f185f9b4c449e7ed4266c414ae2Eric Anholt	 tc2_stride = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t2]->stride;
67df582ca767a38f185f9b4c449e7ed4266c414ae2Eric Anholt	 if (DO_PTEX && VB->AttribPtr[_TNL_ATTRIB_TEX0 + t2]->size < 3) {
6857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	    fill_tex |= (1<<2);
695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
70df582ca767a38f185f9b4c449e7ed4266c414ae2Eric Anholt	 else if (DO_PTEX && VB->AttribPtr[_TNL_ATTRIB_TEX0 + t2]->size < 4) {
71a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    rqcoordsnoswap |= (1<<2);
72a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 }
7357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      } else {
7457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 tc2 = (GLuint (*)[4])&ctx->Current.Attrib[VERT_ATTRIB_TEX2];
7557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 tc2_stride = 0;
765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_TEX1) {
80df582ca767a38f185f9b4c449e7ed4266c414ae2Eric Anholt      if (VB->AttribPtr[_TNL_ATTRIB_TEX1]) {
815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 const GLuint t1 = GET_TEXSOURCE(1);
82df582ca767a38f185f9b4c449e7ed4266c414ae2Eric Anholt	 tc1 = (GLuint (*)[4])VB->AttribPtr[_TNL_ATTRIB_TEX0 + t1]->data;
83df582ca767a38f185f9b4c449e7ed4266c414ae2Eric Anholt	 tc1_stride = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t1]->stride;
84df582ca767a38f185f9b4c449e7ed4266c414ae2Eric Anholt	 if (DO_PTEX && VB->AttribPtr[_TNL_ATTRIB_TEX0 + t1]->size < 3) {
8557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	    fill_tex |= (1<<1);
865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
87df582ca767a38f185f9b4c449e7ed4266c414ae2Eric Anholt	 else if (DO_PTEX && VB->AttribPtr[_TNL_ATTRIB_TEX0 + t1]->size < 4) {
88a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    rqcoordsnoswap |= (1<<1);
89a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 }
905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
9157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 tc1 = (GLuint (*)[4])&ctx->Current.Attrib[VERT_ATTRIB_TEX1];
925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tc1_stride = 0;
935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_TEX0) {
97df582ca767a38f185f9b4c449e7ed4266c414ae2Eric Anholt      if (VB->AttribPtr[_TNL_ATTRIB_TEX0]) {
985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 const GLuint t0 = GET_TEXSOURCE(0);
99df582ca767a38f185f9b4c449e7ed4266c414ae2Eric Anholt	 tc0_stride = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t0]->stride;
100df582ca767a38f185f9b4c449e7ed4266c414ae2Eric Anholt	 tc0 = (GLuint (*)[4])VB->AttribPtr[_TNL_ATTRIB_TEX0 + t0]->data;
101df582ca767a38f185f9b4c449e7ed4266c414ae2Eric Anholt	 if (DO_PTEX && VB->AttribPtr[_TNL_ATTRIB_TEX0 + t0]->size < 3) {
10257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	    fill_tex |= (1<<0);
1035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
104df582ca767a38f185f9b4c449e7ed4266c414ae2Eric Anholt	 else if (DO_PTEX && VB->AttribPtr[_TNL_ATTRIB_TEX0 + t0]->size < 4) {
105a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	    rqcoordsnoswap |= (1<<0);
106a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	 }
1075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
10857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 tc0 = (GLuint (*)[4])&ctx->Current.Attrib[VERT_ATTRIB_TEX0];
1095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tc0_stride = 0;
1105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
1115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_NORM) {
11522bcb59a95ec833cfd73b300376c918eb6a658f2Eric Anholt      if (VB->AttribPtr[_TNL_ATTRIB_NORMAL]) {
11622bcb59a95ec833cfd73b300376c918eb6a658f2Eric Anholt	 norm_stride = VB->AttribPtr[_TNL_ATTRIB_NORMAL]->stride;
11722bcb59a95ec833cfd73b300376c918eb6a658f2Eric Anholt	 norm = (GLuint (*)[4])VB->AttribPtr[_TNL_ATTRIB_NORMAL]->data;
1185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
1195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 norm_stride = 0;
1205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 norm = (GLuint (*)[4])&ctx->Current.Attrib[VERT_ATTRIB_NORMAL];
1215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
1225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_RGBA) {
1250a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt      if (VB->AttribPtr[_TNL_ATTRIB_COLOR0]) {
1260a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt	 col = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->data;
1270a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt	 col_stride = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->stride;
1285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
12957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 col = (GLfloat (*)[4])ctx->Current.Attrib[VERT_ATTRIB_COLOR0];
1305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 col_stride = 0;
1315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
1325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1342d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger   if (DO_SPEC_OR_FOG) {
1350a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt      if (VB->AttribPtr[_TNL_ATTRIB_COLOR1]) {
1360a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt	 spec = VB->AttribPtr[_TNL_ATTRIB_COLOR1]->data;
1370a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt	 spec_stride = VB->AttribPtr[_TNL_ATTRIB_COLOR1]->stride;
1385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
13957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 spec = (GLfloat (*)[4])ctx->Current.Attrib[VERT_ATTRIB_COLOR1];
1405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 spec_stride = 0;
1415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
1425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1442d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger   if (DO_SPEC_OR_FOG) {
14537c79d4d765b10a79e0cf217cc1e70d3fbb7a0c5Eric Anholt      if (VB->AttribPtr[_TNL_ATTRIB_FOG]) {
14637c79d4d765b10a79e0cf217cc1e70d3fbb7a0c5Eric Anholt	 fog = VB->AttribPtr[_TNL_ATTRIB_FOG]->data;
14737c79d4d765b10a79e0cf217cc1e70d3fbb7a0c5Eric Anholt	 fog_stride = VB->AttribPtr[_TNL_ATTRIB_FOG]->stride;
1485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
1492d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger	 fog = (GLfloat (*)[4])ctx->Current.Attrib[VERT_ATTRIB_FOG];
1505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fog_stride = 0;
1515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
1525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   if (start) {
15657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      coord =  (GLuint (*)[4])((GLubyte *)coord + start * coord_stride);
15757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      if (DO_TEX0)
15857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 tc0 =  (GLuint (*)[4])((GLubyte *)tc0 + start * tc0_stride);
15957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      if (DO_TEX1)
16057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 tc1 =  (GLuint (*)[4])((GLubyte *)tc1 + start * tc1_stride);
16157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      if (DO_TEX2)
16257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 tc2 =  (GLuint (*)[4])((GLubyte *)tc2 + start * tc2_stride);
16357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      if (DO_NORM)
16457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 norm =  (GLuint (*)[4])((GLubyte *)norm + start * norm_stride);
16557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      if (DO_RGBA)
16657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 STRIDE_4F(col, start * col_stride);
16757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      if (DO_SPEC)
16857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 STRIDE_4F(spec, start * spec_stride);
16957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      if (DO_FOG)
17057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 STRIDE_4F(fog, start * fog_stride);
17157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   }
1725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
17457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   {
1755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      for (i=start; i < end; i++) {
17657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
1775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 v[0].ui = coord[0][0];
1785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 v[1].ui = coord[0][1];
1795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 v[2].ui = coord[0][2];
1805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (DO_W) {
1815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v[3].ui = coord[0][3];
1825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v += 4;
1835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
1845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 else
1855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v += 3;
1865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 coord =  (GLuint (*)[4])((GLubyte *)coord +  coord_stride);
1875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (DO_NORM) {
1895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v[0].ui = norm[0][0];
1905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v[1].ui = norm[0][1];
1915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v[2].ui = norm[0][2];
1925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v += 3;
1935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    norm =  (GLuint (*)[4])((GLubyte *)norm +  norm_stride);
1945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
1955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (DO_RGBA) {
19657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	    UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.red, col[0][0]);
19757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	    UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.green, col[0][1]);
19857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	    UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.blue, col[0][2]);
19957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	    UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.alpha, col[0][3]);
20057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	    STRIDE_4F(col, col_stride);
2015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v++;
2025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
2032d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger	 if (DO_SPEC_OR_FOG) {
2045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if (DO_SPEC) {
20557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	       UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.red, spec[0][0]);
20657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	       UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.green, spec[0][1]);
20757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	       UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.blue, spec[0][2]);
20857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	       STRIDE_4F(spec, spec_stride);
2095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    }
2105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if (DO_FOG) {
2112d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger	       UNCLAMPED_FLOAT_TO_UBYTE(v[0].rgba.alpha, radeonComputeFogBlendFactor(ctx, fog[0][0]));
2122d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger	       STRIDE_4F(fog, fog_stride);
2135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    }
2145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if (TCL_DEBUG) fprintf(stderr, "%x ", v[0].ui);
2155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v++;
2165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
2175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (DO_TEX0) {
2185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v[0].ui = tc0[0][0];
2195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v[1].ui = tc0[0][1];
2205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if (TCL_DEBUG) fprintf(stderr, "t0: %.2f %.2f ", v[0].f, v[1].f);
2215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if (DO_PTEX) {
22257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	       if (fill_tex & (1<<0))
22357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell		  v[2].f = 1.0;
224a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	       else if (rqcoordsnoswap & (1<<0))
225a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger		  v[2].ui = tc0[0][2];
22657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	       else
22757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell		  v[2].ui = tc0[0][3];
2285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       if (TCL_DEBUG) fprintf(stderr, "%.2f ", v[2].f);
2295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       v += 3;
2305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    }
2315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    else
2325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       v += 2;
2335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    tc0 =  (GLuint (*)[4])((GLubyte *)tc0 +  tc0_stride);
2345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
2355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (DO_TEX1) {
2365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v[0].ui = tc1[0][0];
2375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v[1].ui = tc1[0][1];
2385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if (TCL_DEBUG) fprintf(stderr, "t1: %.2f %.2f ", v[0].f, v[1].f);
2395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if (DO_PTEX) {
24057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	       if (fill_tex & (1<<1))
24157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell		  v[2].f = 1.0;
242a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	       else if (rqcoordsnoswap & (1<<1))
243a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger		  v[2].ui = tc1[0][2];
24457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	       else
24557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell		  v[2].ui = tc1[0][3];
2465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       if (TCL_DEBUG) fprintf(stderr, "%.2f ", v[2].f);
2475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       v += 3;
2485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    }
2495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    else
2505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       v += 2;
2515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    tc1 =  (GLuint (*)[4])((GLubyte *)tc1 +  tc1_stride);
2525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
2535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (DO_TEX2) {
2545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v[0].ui = tc2[0][0];
2555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    v[1].ui = tc2[0][1];
25630daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger	    if (TCL_DEBUG) fprintf(stderr, "t2: %.2f %.2f ", v[0].f, v[1].f);
2575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if (DO_PTEX) {
25857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	       if (fill_tex & (1<<2))
25957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell		  v[2].f = 1.0;
260a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger	       else if (rqcoordsnoswap & (1<<2))
261a3c8de2fa7fba22647e5b3e8cfb05c85d1a5a980Roland Scheidegger		  v[2].ui = tc2[0][2];
26257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	       else
26357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell		  v[2].ui = tc2[0][3];
26430daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger	       if (TCL_DEBUG) fprintf(stderr, "%.2f ", v[2].f);
2655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       v += 3;
2665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    }
2675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    else
2685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       v += 2;
2695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    tc2 =  (GLuint (*)[4])((GLubyte *)tc2 +  tc2_stride);
2705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
2715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (TCL_DEBUG) fprintf(stderr, "\n");
2725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
2735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void TAG(init)( void )
2795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
2805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int sz = 3;
2815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_W) sz++;
2825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_NORM) sz += 3;
2835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_RGBA) sz++;
2842d61d301171620efe624d83a5457f4094eb49cbaRoland Scheidegger   if (DO_SPEC_OR_FOG) sz++;
2855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_TEX0) sz += 2;
2865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_TEX0 && DO_PTEX) sz++;
2875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_TEX1) sz += 2;
2885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_TEX1 && DO_PTEX) sz++;
2895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_TEX2) sz += 2;
2905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (DO_TEX2 && DO_PTEX) sz++;
2915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   setup_tab[IDX].emit = TAG(emit);
2935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   setup_tab[IDX].vertex_format = IND;
2945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   setup_tab[IDX].vertex_size = sz;
2955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef IND
2995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TAG
3005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef IDX
301