15df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
25df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*
35df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Mesa 3-D graphics library
45df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Version:  3.5
55df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
65df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
75df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
85df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a
95df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * copy of this software and associated documentation files (the "Software"),
105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * to deal in the Software without restriction, including without limitation
115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense,
125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * and/or sell copies of the Software, and to permit persons to whom the
135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Software is furnished to do so, subject to the following conditions:
145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * The above copyright notice and this permission notice shall be included
165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * in all copies or substantial portions of the Software.
175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Authors:
265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *    Keith Whitwell <keith@tungstengraphics.com>
275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "math/m_translate.h"
295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#if (HAVE_HW_VIEWPORT)
315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define UNVIEWPORT_VARS
325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define UNVIEWPORT_X(x) x
335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define UNVIEWPORT_Y(x) x
345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define UNVIEWPORT_Z(x) x
355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#endif
365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#ifndef LOCALVARS
385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define LOCALVARS
395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#endif
405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#ifndef CHECK_HW_DIVIDE
425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define CHECK_HW_DIVIDE 1
435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#endif
445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* These don't need to be duplicated, but there's currently nowhere
465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * really convenient to put them.  Need to build some actual .o files in
475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * this directory?
485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
49f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void copy_pv_rgba4_spec5( struct gl_context *ctx, GLuint edst, GLuint esrc )
505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   LOCALVARS
525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLubyte *verts = GET_VERTEX_STORE();
53844cdaf461e3e181bcf1d4c0ba79ef5c4140cb4eKeith Whitwell   GLuint size = GET_VERTEX_SIZE();
54844cdaf461e3e181bcf1d4c0ba79ef5c4140cb4eKeith Whitwell   GLuint *dst = (GLuint *)(verts + (edst * size));
55844cdaf461e3e181bcf1d4c0ba79ef5c4140cb4eKeith Whitwell   GLuint *src = (GLuint *)(verts + (esrc * size));
565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   dst[4] = src[4];
575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   dst[5] = src[5];
585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
60f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void copy_pv_rgba4( struct gl_context *ctx, GLuint edst, GLuint esrc )
615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   LOCALVARS
635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLubyte *verts = GET_VERTEX_STORE();
64844cdaf461e3e181bcf1d4c0ba79ef5c4140cb4eKeith Whitwell   GLuint size = GET_VERTEX_SIZE();
65844cdaf461e3e181bcf1d4c0ba79ef5c4140cb4eKeith Whitwell   GLuint *dst = (GLuint *)(verts + (edst * size));
66844cdaf461e3e181bcf1d4c0ba79ef5c4140cb4eKeith Whitwell   GLuint *src = (GLuint *)(verts + (esrc * size));
675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   dst[4] = src[4];
685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
70f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void copy_pv_rgba3( struct gl_context *ctx, GLuint edst, GLuint esrc )
715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   LOCALVARS
735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLubyte *verts = GET_VERTEX_STORE();
74844cdaf461e3e181bcf1d4c0ba79ef5c4140cb4eKeith Whitwell   GLuint size = GET_VERTEX_SIZE();
75844cdaf461e3e181bcf1d4c0ba79ef5c4140cb4eKeith Whitwell   GLuint *dst = (GLuint *)(verts + (edst * size));
76844cdaf461e3e181bcf1d4c0ba79ef5c4140cb4eKeith Whitwell   GLuint *src = (GLuint *)(verts + (esrc * size));
775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   dst[3] = src[3];
785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
81f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid TAG(translate_vertex)(struct gl_context *ctx,
825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			   const VERTEX *src,
835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			   SWvertex *dst)
845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   LOCALVARS
865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint format = GET_VERTEX_FORMAT();
875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLfloat *s = ctx->Viewport._WindowMap.m;
885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   UNVIEWPORT_VARS;
895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (format == TINY_VERTEX_FORMAT) {
915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (HAVE_HW_VIEWPORT) {
929e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian	 dst->attrib[FRAG_ATTRIB_WPOS][0] = s[0]  * src->v.x + s[12];
939e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian	 dst->attrib[FRAG_ATTRIB_WPOS][1] = s[5]  * src->v.y + s[13];
949e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian	 dst->attrib[FRAG_ATTRIB_WPOS][2] = s[10] * src->v.z + s[14];
959e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian	 dst->attrib[FRAG_ATTRIB_WPOS][3] = 1.0;
965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
979e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian	 dst->attrib[FRAG_ATTRIB_WPOS][0] = UNVIEWPORT_X( src->v.x );
989e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian	 dst->attrib[FRAG_ATTRIB_WPOS][1] = UNVIEWPORT_Y( src->v.y );
999e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian	 dst->attrib[FRAG_ATTRIB_WPOS][2] = UNVIEWPORT_Z( src->v.z );
1009e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian	 dst->attrib[FRAG_ATTRIB_WPOS][3] = 1.0;
1015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
1025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      dst->color[0] = src->tv.color.red;
1045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      dst->color[1] = src->tv.color.green;
1055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      dst->color[2] = src->tv.color.blue;
1065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      dst->color[3] = src->tv.color.alpha;
1075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else {
1095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (HAVE_HW_VIEWPORT) {
1105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (HAVE_HW_DIVIDE && CHECK_HW_DIVIDE) {
1115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    GLfloat oow = 1.0 / src->v.w;
1129e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian	    dst->attrib[FRAG_ATTRIB_WPOS][0] = s[0]  * src->v.x * oow + s[12];
1139e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian	    dst->attrib[FRAG_ATTRIB_WPOS][1] = s[5]  * src->v.y * oow + s[13];
1149e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian	    dst->attrib[FRAG_ATTRIB_WPOS][2] = s[10] * src->v.z * oow + s[14];
1159e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian	    dst->attrib[FRAG_ATTRIB_WPOS][3] = oow;
1165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 } else {
1179e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian	    dst->attrib[FRAG_ATTRIB_WPOS][0] = s[0]  * src->v.x + s[12];
1189e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian	    dst->attrib[FRAG_ATTRIB_WPOS][1] = s[5]  * src->v.y + s[13];
1199e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian	    dst->attrib[FRAG_ATTRIB_WPOS][2] = s[10] * src->v.z + s[14];
1209e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian	    dst->attrib[FRAG_ATTRIB_WPOS][3] = src->v.w;
1215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
1225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
1239e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian	 dst->attrib[FRAG_ATTRIB_WPOS][0] = UNVIEWPORT_X( src->v.x );
1249e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian	 dst->attrib[FRAG_ATTRIB_WPOS][1] = UNVIEWPORT_Y( src->v.y );
1259e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian	 dst->attrib[FRAG_ATTRIB_WPOS][2] = UNVIEWPORT_Z( src->v.z );
1269e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian	 dst->attrib[FRAG_ATTRIB_WPOS][3] = src->v.w;
1275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
1285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      dst->color[0] = src->v.color.red;
1305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      dst->color[1] = src->v.color.green;
1315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      dst->color[2] = src->v.color.blue;
1325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      dst->color[3] = src->v.color.alpha;
1335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1349e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      dst->attrib[FRAG_ATTRIB_COL1][0] = UBYTE_TO_FLOAT(src->v.specular.red);
1359e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      dst->attrib[FRAG_ATTRIB_COL1][1] = UBYTE_TO_FLOAT(src->v.specular.green);
1369e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      dst->attrib[FRAG_ATTRIB_COL1][2] = UBYTE_TO_FLOAT(src->v.specular.blue);
1375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1389e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      dst->attrib[FRAG_ATTRIB_FOGC][0] = UBYTE_TO_FLOAT(src->v.specular.alpha);
1395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (HAVE_PTEX_VERTICES &&
1415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	  ((HAVE_TEX2_VERTICES && format == PROJ_TEX3_VERTEX_FORMAT) ||
1425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	   (format == PROJ_TEX1_VERTEX_FORMAT))) {
1435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
144cc6a08b2a01c1ac774eaf0ca22eca325f82a064bBrian	 dst->attrib[FRAG_ATTRIB_TEX0][0] = src->pv.u0;
145cc6a08b2a01c1ac774eaf0ca22eca325f82a064bBrian	 dst->attrib[FRAG_ATTRIB_TEX0][1] = src->pv.v0;
146cc6a08b2a01c1ac774eaf0ca22eca325f82a064bBrian	 dst->attrib[FRAG_ATTRIB_TEX0][3] = src->pv.q0;
1475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
148cc6a08b2a01c1ac774eaf0ca22eca325f82a064bBrian	 dst->attrib[FRAG_ATTRIB_TEX1][0] = src->pv.u1;
149cc6a08b2a01c1ac774eaf0ca22eca325f82a064bBrian	 dst->attrib[FRAG_ATTRIB_TEX1][1] = src->pv.v1;
150cc6a08b2a01c1ac774eaf0ca22eca325f82a064bBrian	 dst->attrib[FRAG_ATTRIB_TEX1][3] = src->pv.q1;
1515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (HAVE_TEX2_VERTICES) {
153cc6a08b2a01c1ac774eaf0ca22eca325f82a064bBrian	    dst->attrib[FRAG_ATTRIB_TEX2][0] = src->pv.u2;
154cc6a08b2a01c1ac774eaf0ca22eca325f82a064bBrian	    dst->attrib[FRAG_ATTRIB_TEX2][1] = src->pv.v2;
155cc6a08b2a01c1ac774eaf0ca22eca325f82a064bBrian	    dst->attrib[FRAG_ATTRIB_TEX2][3] = src->pv.q2;
1565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
1575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (HAVE_TEX3_VERTICES) {
159cc6a08b2a01c1ac774eaf0ca22eca325f82a064bBrian	    dst->attrib[FRAG_ATTRIB_TEX3][0] = src->pv.u3;
160cc6a08b2a01c1ac774eaf0ca22eca325f82a064bBrian	    dst->attrib[FRAG_ATTRIB_TEX3][1] = src->pv.v3;
161cc6a08b2a01c1ac774eaf0ca22eca325f82a064bBrian	    dst->attrib[FRAG_ATTRIB_TEX3][3] = src->pv.q3;
1625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
1635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
1645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else {
165cc6a08b2a01c1ac774eaf0ca22eca325f82a064bBrian	 dst->attrib[FRAG_ATTRIB_TEX0][0] = src->v.u0;
166cc6a08b2a01c1ac774eaf0ca22eca325f82a064bBrian	 dst->attrib[FRAG_ATTRIB_TEX0][1] = src->v.v0;
167cc6a08b2a01c1ac774eaf0ca22eca325f82a064bBrian	 dst->attrib[FRAG_ATTRIB_TEX0][3] = 1.0;
1685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
169cc6a08b2a01c1ac774eaf0ca22eca325f82a064bBrian	 dst->attrib[FRAG_ATTRIB_TEX1][0] = src->v.u1;
170cc6a08b2a01c1ac774eaf0ca22eca325f82a064bBrian	 dst->attrib[FRAG_ATTRIB_TEX1][1] = src->v.v1;
171cc6a08b2a01c1ac774eaf0ca22eca325f82a064bBrian	 dst->attrib[FRAG_ATTRIB_TEX1][3] = 1.0;
1725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (HAVE_TEX2_VERTICES) {
174cc6a08b2a01c1ac774eaf0ca22eca325f82a064bBrian	    dst->attrib[FRAG_ATTRIB_TEX2][0] = src->v.u2;
175cc6a08b2a01c1ac774eaf0ca22eca325f82a064bBrian	    dst->attrib[FRAG_ATTRIB_TEX2][1] = src->v.v2;
176cc6a08b2a01c1ac774eaf0ca22eca325f82a064bBrian	    dst->attrib[FRAG_ATTRIB_TEX2][3] = 1.0;
1775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
1785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (HAVE_TEX3_VERTICES) {
180cc6a08b2a01c1ac774eaf0ca22eca325f82a064bBrian	    dst->attrib[FRAG_ATTRIB_TEX3][0] = src->v.u3;
181cc6a08b2a01c1ac774eaf0ca22eca325f82a064bBrian	    dst->attrib[FRAG_ATTRIB_TEX3][1] = src->v.v3;
182cc6a08b2a01c1ac774eaf0ca22eca325f82a064bBrian	    dst->attrib[FRAG_ATTRIB_TEX3][3] = 1.0;
1835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
1845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
1855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
187af2aa8e9cf88a9ee3ec338eddc9a47bf2f142cb7Brian   dst->pointSize = ctx->Point.Size;
1885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
1895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
191079554a480f62674b27cea5ff8bb655589e06166Brian Paul/* prototype to silence warning */
192f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid TAG(print_vertex)( struct gl_context *ctx, const VERTEX *v );
193079554a480f62674b27cea5ff8bb655589e06166Brian Paul
1945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
195f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid TAG(print_vertex)( struct gl_context *ctx, const VERTEX *v )
1965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
1975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   LOCALVARS
1985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint format = GET_VERTEX_FORMAT();
1995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   fprintf(stderr, "(%x) ", format);
2015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch (format) {
2035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#if HAVE_TINY_VERTICES
2045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case TINY_VERTEX_FORMAT:
2055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "xyz %.4f,%.4f,%.4f rgba %x:%x:%x:%x\n",
2065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.x, v->v.y, v->v.z,
2075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->tv.color.red,
2085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->tv.color.green,
2095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->tv.color.blue,
2105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->tv.color.alpha);
2115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#endif
2135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#if HAVE_NOTEX_VERTICES
2145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case NOTEX_VERTEX_FORMAT:
2155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "xyzw %.4f,%.4f,%.4f,%.4f rgba %x:%x:%x:%x spec %x:%x:%x:%x\n",
2165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.x, v->v.y, v->v.z, v->v.w,
2175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.color.red,
2185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.color.green,
2195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.color.blue,
2205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.color.alpha,
2215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.specular.red,
2225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.specular.green,
2235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.specular.blue,
2245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.specular.alpha);
2255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#endif
2275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#if HAVE_TEX0_VERTICES
2285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case TEX0_VERTEX_FORMAT:
2295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "xyzw %.4f,%.4f,%.4f,%.4f rgba %x:%x:%x:%x st %.4f,%.4f\n",
2305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.x, v->v.y, v->v.z, v->v.w,
2315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.color.red,
2325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.color.green,
2335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.color.blue,
2345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.color.alpha,
2355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.u0,
2365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.v0);
2375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#endif
2395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#if HAVE_TEX1_VERTICES
2405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case TEX1_VERTEX_FORMAT:
2415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "xyzw %.4f,%.4f,%.4f,%.4f rgba %x:%x:%x:%x st %.4f,%.4f st %.4f,%.4f\n",
2425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.x, v->v.y, v->v.z, v->v.w,
2435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.color.red,
2445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.color.green,
2455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.color.blue,
2465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.color.alpha,
2475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.u0,
2485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.v0,
2495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.u1,
2505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.u2);
2515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#endif
2535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#if HAVE_PTEX_VERTICES
2545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case PROJ_TEX1_VERTEX_FORMAT:
2555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "xyzw %.4f,%.4f,%.4f,%.4f rgba %x:%x:%x:%x stq %.4f,%.4f,%.4f stq %.4f,%.4f,%.4f\n",
2565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.x, v->v.y, v->v.z, v->v.w,
2575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.color.red,
2585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.color.green,
2595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.color.blue,
2605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->v.color.alpha,
2615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->pv.u0,
2625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->pv.v0,
2635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->pv.q0,
2645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->pv.u1,
2655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->pv.v1,
2665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      v->pv.q1);
2675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#endif
2695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
2705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "???\n");
2715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   fprintf(stderr, "\n");
2755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Interpolate the elements of the VB not included in typical hardware
2805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * vertices.
2815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
2825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * NOTE: All these arrays are guarenteed by tnl to be writeable and
2835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * have good stride.
2845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
2855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#ifndef INTERP_QUALIFIER
2865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define INTERP_QUALIFIER static
2875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#endif
2885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
289ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell#define GET_COLOR(ptr, idx) ((ptr)->data[idx])
2905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
292f9995b30756140724f41daf963fa06167912be7fKristian HøgsbergINTERP_QUALIFIER void TAG(interp_extras)( struct gl_context *ctx,
2935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul					  GLfloat t,
2945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul					  GLuint dst, GLuint out, GLuint in,
2955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul					  GLboolean force_boundary )
2965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
2975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   LOCALVARS
2985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
2995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3000a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt   if (VB->BackfaceColorPtr) {
3010a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt      assert(VB->BackfaceColorPtr->stride == 4 * sizeof(GLfloat));
302ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell
303ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell      INTERP_4F( t,
3040a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt		    GET_COLOR(VB->BackfaceColorPtr, dst),
3050a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt		    GET_COLOR(VB->BackfaceColorPtr, out),
3060a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt		    GET_COLOR(VB->BackfaceColorPtr, in) );
3075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3080a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt      if (VB->BackfaceSecondaryColorPtr) {
309ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell	 INTERP_3F( t,
3100a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt		       GET_COLOR(VB->BackfaceSecondaryColorPtr, dst),
3110a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt		       GET_COLOR(VB->BackfaceSecondaryColorPtr, out),
3120a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt		       GET_COLOR(VB->BackfaceSecondaryColorPtr, in) );
3135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
3145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (VB->EdgeFlag) {
3175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      VB->EdgeFlag[dst] = VB->EdgeFlag[out] || force_boundary;
3185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   INTERP_VERTEX(ctx, t, dst, out, in, force_boundary);
3215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
323f9995b30756140724f41daf963fa06167912be7fKristian HøgsbergINTERP_QUALIFIER void TAG(copy_pv_extras)( struct gl_context *ctx,
3245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul					   GLuint dst, GLuint src )
3255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   LOCALVARS
3275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
3285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3290a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt   if (VB->BackfaceColorPtr) {
3300a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt      COPY_4FV( GET_COLOR(VB->BackfaceColorPtr, dst),
3310a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt		GET_COLOR(VB->BackfaceColorPtr, src) );
3325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3330a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt      if (VB->BackfaceSecondaryColorPtr) {
3340a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt	 COPY_4FV( GET_COLOR(VB->BackfaceSecondaryColorPtr, dst),
3350a9187801505130738ae947c69cafa8a1dd118d1Eric Anholt		   GET_COLOR(VB->BackfaceSecondaryColorPtr, src) );
3365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
3375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   COPY_PV_VERTEX(ctx, dst, src);
3405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef INTERP_QUALIFIER
3445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef GET_COLOR
3455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef IND
3475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TAG
348