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