s_tritemp.h revision c1b97d91c7e38290be85eb1ff56e6c108e1e47ca
1c1b97d91c7e38290be85eb1ff56e6c108e1e47caBrian Paul/* $Id: s_tritemp.h,v 1.6 2000/12/08 00:09:24 brianp Exp $ */ 2e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 3e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 4e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Mesa 3-D graphics library 5e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Version: 3.5 6e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 7e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. 8e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 9e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 10e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * copy of this software and associated documentation files (the "Software"), 11e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * to deal in the Software without restriction, including without limitation 12e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * the rights to use, copy, modify, merge, publish, distribute, sublicense, 13e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * and/or sell copies of the Software, and to permit persons to whom the 14e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Software is furnished to do so, subject to the following conditions: 15e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 16e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * The above copyright notice and this permission notice shall be included 17e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * in all copies or substantial portions of the Software. 18e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 19e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 22e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 23e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 24e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 26e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 27e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 28e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 29e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Triangle Rasterizer Template 30e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 31e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * This file is #include'd to generate custom triangle rasterizers. 32e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 33e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * The following macros may be defined to indicate what auxillary information 34e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * must be interplated across the triangle: 35e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * INTERP_Z - if defined, interpolate Z values 36e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * INTERP_RGB - if defined, interpolate RGB values 37e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * INTERP_SPEC - if defined, interpolate specular RGB values 38e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * INTERP_ALPHA - if defined, interpolate Alpha values 39e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * INTERP_INDEX - if defined, interpolate color index values 40e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * INTERP_INT_TEX - if defined, interpolate integer ST texcoords 41e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * (fast, simple 2-D texture mapping) 42e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * INTERP_TEX - if defined, interpolate set 0 float STRQ texcoords 43e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * NOTE: OpenGL STRQ = Mesa STUV (R was taken for red) 44e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * INTERP_MULTITEX - if defined, interpolate N units of STRQ texcoords 45e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 46e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * When one can directly address pixels in the color buffer the following 47e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * macros can be defined and used to compute pixel addresses during 48e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * rasterization (see pRow): 49e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * PIXEL_TYPE - the datatype of a pixel (GLubyte, GLushort, GLuint) 50e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * BYTES_PER_ROW - number of bytes per row in the color buffer 51e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * PIXEL_ADDRESS(X,Y) - returns the address of pixel at (X,Y) where 52e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Y==0 at bottom of screen and increases upward. 53e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 54e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Similarly, for direct depth buffer access, this type is used for depth 55e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * buffer addressing: 56e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * DEPTH_TYPE - either GLushort or GLuint 57e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 58e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Optionally, one may provide one-time setup code per triangle: 59e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * SETUP_CODE - code which is to be executed once per triangle 60e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 61e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * The following macro MUST be defined: 62e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * INNER_LOOP(LEFT,RIGHT,Y) - code to write a span of pixels. 63e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Something like: 64e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 65e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * for (x=LEFT; x<RIGHT;x++) { 66e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * put_pixel(x,Y); 67e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * // increment fixed point interpolants 68e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * } 69e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 70e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * This code was designed for the origin to be in the lower-left corner. 71e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 72e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Inspired by triangle rasterizer code written by Allen Akin. Thanks Allen! 73e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 74e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 75e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 76cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell/*void triangle( GLcontext *ctx, SWvertex *v0, SWvertex *v1, SWvertex *v2 )*/ 77e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 78e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell typedef struct { 79a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, *v1; /* Y(v0) < Y(v1) */ 80e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dx; /* X(v1) - X(v0) */ 81e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dy; /* Y(v1) - Y(v0) */ 82e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fdxdy; /* dx/dy in fixed-point */ 83e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fsx; /* first sample point x coord */ 84e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fsy; 85e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat adjy; /* adjust from v[0]->fy to fsy, scaled */ 86e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint lines; /* number of lines to be sampled on this edge */ 87e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fx0; /* fixed pt X of lower endpoint */ 88e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } EdgeT; 89e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 90e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_Z 91e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint depthBits = ctx->Visual.DepthBits; 92e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint fixedToDepthShift = depthBits <= 16 ? FIXED_SHIFT : 0; 93e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLfloat maxDepth = ctx->Visual.DepthMaxF; 94e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define FixedToDepth(F) ((F) >> fixedToDepthShift) 95e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 96e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell EdgeT eMaj, eTop, eBot; 97e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat oneOverArea; 98a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *vMin, *vMid, *vMax; /* Y(vMin)<=Y(vMid)<=Y(vMax) */ 991e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell float bf = SWRAST_CONTEXT(ctx)->_backface_sign; 100e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 101e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* find the order of the 3 vertices along the Y axis */ 102e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 103cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell GLfloat y0 = v0->win[1]; 104cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell GLfloat y1 = v1->win[1]; 105cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell GLfloat y2 = v2->win[1]; 106e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 107e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (y0<=y1) { 108e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (y1<=y2) { 109e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell vMin = v0; vMid = v1; vMax = v2; /* y0<=y1<=y2 */ 110e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 111e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else if (y2<=y0) { 112e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell vMin = v2; vMid = v0; vMax = v1; /* y2<=y0<=y1 */ 113e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 114e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 115e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell vMin = v0; vMid = v2; vMax = v1; bf = -bf; /* y0<=y2<=y1 */ 116e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 117e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 118e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 119e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (y0<=y2) { 120e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell vMin = v1; vMid = v0; vMax = v2; bf = -bf; /* y1<=y0<=y2 */ 121e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 122e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else if (y2<=y1) { 123e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell vMin = v2; vMid = v1; vMax = v0; bf = -bf; /* y2<=y1<=y0 */ 124e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 125e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 126e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell vMin = v1; vMid = v2; vMax = v0; /* y1<=y2<=y0 */ 127e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 128e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 129e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 130e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 131e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* vertex/edge relationship */ 132e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eMaj.v0 = vMin; eMaj.v1 = vMax; /*TODO: .v1's not needed */ 133e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eTop.v0 = vMid; eTop.v1 = vMax; 134e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eBot.v0 = vMin; eBot.v1 = vMid; 135e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 136e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* compute deltas for each edge: vertex[v1] - vertex[v0] */ 137cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eMaj.dx = vMax->win[0] - vMin->win[0]; 138cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eMaj.dy = vMax->win[1] - vMin->win[1]; 139cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eTop.dx = vMax->win[0] - vMid->win[0]; 140cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eTop.dy = vMax->win[1] - vMid->win[1]; 141cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eBot.dx = vMid->win[0] - vMin->win[0]; 142cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eBot.dy = vMid->win[1] - vMin->win[1]; 143e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 144e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* compute oneOverArea */ 145e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 146e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLfloat area = eMaj.dx * eBot.dy - eBot.dx * eMaj.dy; 147e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 148e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Do backface culling */ 149e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (area * bf < 0.0) 150e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return; 151e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 152e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (area == 0.0F) 153e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return; 154e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 155e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* check for very tiny triangle */ 15626d729581fcf1991fbcc8320f64fa40d73170e95Brian Paul if (area * area < (0.05F * 0.05F)) /* square to ensure positive value */ 15726d729581fcf1991fbcc8320f64fa40d73170e95Brian Paul oneOverArea = 1.0F / 0.05F; /* a close-enough value */ 158e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else 159e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell oneOverArea = 1.0F / area; 160e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 161e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 162e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifndef DO_OCCLUSION_TEST 163e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ctx->OcclusionResult = GL_TRUE; 164e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 165e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 166e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Edge setup. For a triangle strip these could be reused... */ 167e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 168e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* fixed point Y coordinates */ 169cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell GLfixed vMin_fx = FloatToFixed(vMin->win[0] + 0.5F); 170cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell GLfixed vMin_fy = FloatToFixed(vMin->win[1] - 0.5F); 171cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell GLfixed vMid_fx = FloatToFixed(vMid->win[0] + 0.5F); 172cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell GLfixed vMid_fy = FloatToFixed(vMid->win[1] - 0.5F); 173cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell GLfixed vMax_fy = FloatToFixed(vMax->win[1] - 0.5F); 174e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 175e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eMaj.fsy = FixedCeil(vMin_fy); 17626d729581fcf1991fbcc8320f64fa40d73170e95Brian Paul eMaj.lines = FixedToInt(FixedCeil(vMax_fy - eMaj.fsy)); 177e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (eMaj.lines > 0) { 178e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dxdy = eMaj.dx / eMaj.dy; 179e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eMaj.fdxdy = SignedFloatToFixed(dxdy); 180e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eMaj.adjy = (GLfloat) (eMaj.fsy - vMin_fy); /* SCALED! */ 181e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eMaj.fx0 = vMin_fx; 182e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eMaj.fsx = eMaj.fx0 + (GLfixed) (eMaj.adjy * dxdy); 183e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 184e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 185e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return; /*CULLED*/ 186e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 187e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 188e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eTop.fsy = FixedCeil(vMid_fy); 18926d729581fcf1991fbcc8320f64fa40d73170e95Brian Paul eTop.lines = FixedToInt(FixedCeil(vMax_fy - eTop.fsy)); 190e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (eTop.lines > 0) { 191e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dxdy = eTop.dx / eTop.dy; 192e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eTop.fdxdy = SignedFloatToFixed(dxdy); 193e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eTop.adjy = (GLfloat) (eTop.fsy - vMid_fy); /* SCALED! */ 194e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eTop.fx0 = vMid_fx; 195e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eTop.fsx = eTop.fx0 + (GLfixed) (eTop.adjy * dxdy); 196e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 197e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 198e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eBot.fsy = FixedCeil(vMin_fy); 19926d729581fcf1991fbcc8320f64fa40d73170e95Brian Paul eBot.lines = FixedToInt(FixedCeil(vMid_fy - eBot.fsy)); 200e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (eBot.lines > 0) { 201e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dxdy = eBot.dx / eBot.dy; 202e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eBot.fdxdy = SignedFloatToFixed(dxdy); 203e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eBot.adjy = (GLfloat) (eBot.fsy - vMin_fy); /* SCALED! */ 204e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eBot.fx0 = vMin_fx; 205e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eBot.fsx = eBot.fx0 + (GLfixed) (eBot.adjy * dxdy); 206e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 207e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 208e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 209e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* 210e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Conceptually, we view a triangle as two subtriangles 211e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * separated by a perfectly horizontal line. The edge that is 212e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * intersected by this line is one with maximal absolute dy; we 213e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * call it a ``major'' edge. The other two edges are the 214e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * ``top'' edge (for the upper subtriangle) and the ``bottom'' 215e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * edge (for the lower subtriangle). If either of these two 216e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * edges is horizontal or very close to horizontal, the 217e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * corresponding subtriangle might cover zero sample points; 218e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * we take care to handle such cases, for performance as well 219e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * as correctness. 220e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 221e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * By stepping rasterization parameters along the major edge, 222e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * we can avoid recomputing them at the discontinuity where 223e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * the top and bottom edges meet. However, this forces us to 224e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * be able to scan both left-to-right and right-to-left. 225e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Also, we must determine whether the major edge is at the 226e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * left or right side of the triangle. We do this by 227e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * computing the magnitude of the cross-product of the major 228e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * and top edges. Since this magnitude depends on the sine of 229e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * the angle between the two edges, its sign tells us whether 230e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * we turn to the left or to the right when travelling along 231e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * the major edge to the top edge, and from this we infer 232e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * whether the major edge is on the left or the right. 233e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 234e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Serendipitously, this cross-product magnitude is also a 235e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * value we need to compute the iteration parameter 236e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * derivatives for the triangle, and it can be used to perform 237e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * backface culling because its sign tells us whether the 238e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * triangle is clockwise or counterclockwise. In this code we 239e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * refer to it as ``area'' because it's also proportional to 240e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * the pixel area of the triangle. 241e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 242e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 243e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 244e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint ltor; /* true if scanning left-to-right */ 245e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_Z 246e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dzdx, dzdy; GLfixed fdzdx; 247e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dfogdx, dfogdy; GLfixed fdfogdx; 248e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 249e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_RGB 250e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat drdx, drdy; GLfixed fdrdx; 251e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dgdx, dgdy; GLfixed fdgdx; 252e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dbdx, dbdy; GLfixed fdbdx; 253e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 254e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_SPEC 255e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dsrdx, dsrdy; GLfixed fdsrdx; 256e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dsgdx, dsgdy; GLfixed fdsgdx; 257e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dsbdx, dsbdy; GLfixed fdsbdx; 258e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 259e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_ALPHA 260e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dadx, dady; GLfixed fdadx; 261e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 262e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INDEX 263e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat didx, didy; GLfixed fdidx; 264e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 265e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INT_TEX 266e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dsdx, dsdy; GLfixed fdsdx; 267e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dtdx, dtdy; GLfixed fdtdx; 268e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 269e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_TEX 270e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dsdx, dsdy; 271e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dtdx, dtdy; 272e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dudx, dudy; 273e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dvdx, dvdy; 274e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 275e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_MULTITEX 276e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dsdx[MAX_TEXTURE_UNITS], dsdy[MAX_TEXTURE_UNITS]; 277e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dtdx[MAX_TEXTURE_UNITS], dtdy[MAX_TEXTURE_UNITS]; 278e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dudx[MAX_TEXTURE_UNITS], dudy[MAX_TEXTURE_UNITS]; 279e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dvdx[MAX_TEXTURE_UNITS], dvdy[MAX_TEXTURE_UNITS]; 280e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 281e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 282e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* 283e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Execute user-supplied setup code 284e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 285e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef SETUP_CODE 286e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SETUP_CODE 287e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 288e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 289e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ltor = (oneOverArea < 0.0F); 290e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 291e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* compute d?/dx and d?/dy derivatives */ 292e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_Z 293e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 294e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat eMaj_dz, eBot_dz; 295cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eMaj_dz = vMax->win[2] - vMin->win[2]; 296cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eBot_dz = vMid->win[2] - vMin->win[2]; 297e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dzdx = oneOverArea * (eMaj_dz * eBot.dy - eMaj.dy * eBot_dz); 298e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (dzdx > maxDepth || dzdx < -maxDepth) { 299e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* probably a sliver triangle */ 300e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dzdx = 0.0; 301e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dzdy = 0.0; 302e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 303e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 304e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dzdy = oneOverArea * (eMaj.dx * eBot_dz - eMaj_dz * eBot.dx); 305e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 306e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (depthBits <= 16) 307e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdzdx = SignedFloatToFixed(dzdx); 308e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else 309e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdzdx = (GLint) dzdx; 310e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 311e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 312e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat eMaj_dfog, eBot_dfog; 313cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eMaj_dfog = (vMax->fog - vMin->fog) * 256; 314cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eBot_dfog = (vMid->fog - vMin->fog) * 256; 315e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dfogdx = oneOverArea * (eMaj_dfog * eBot.dy - eMaj.dy * eBot_dfog); 316e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdfogdx = SignedFloatToFixed(dfogdx); 317e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dfogdy = oneOverArea * (eMaj.dx * eBot_dfog - eMaj_dfog * eBot.dx); 318e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 319e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 320e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_RGB 321e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 322e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat eMaj_dr, eBot_dr; 323cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eMaj_dr = (GLint) vMax->color[0] 324cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell - (GLint) vMin->color[0]; 325cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eBot_dr = (GLint) vMid->color[0] 326cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell - (GLint) vMin->color[0]; 327e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell drdx = oneOverArea * (eMaj_dr * eBot.dy - eMaj.dy * eBot_dr); 328e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdrdx = SignedFloatToFixed(drdx); 329e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell drdy = oneOverArea * (eMaj.dx * eBot_dr - eMaj_dr * eBot.dx); 330e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 331e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 332e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat eMaj_dg, eBot_dg; 333cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eMaj_dg = (GLint) vMax->color[1] 334cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell - (GLint) vMin->color[1]; 335cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eBot_dg = (GLint) vMid->color[1] 336cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell - (GLint) vMin->color[1]; 337e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dgdx = oneOverArea * (eMaj_dg * eBot.dy - eMaj.dy * eBot_dg); 338e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdgdx = SignedFloatToFixed(dgdx); 339e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dgdy = oneOverArea * (eMaj.dx * eBot_dg - eMaj_dg * eBot.dx); 340e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 341e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 342e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat eMaj_db, eBot_db; 343cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eMaj_db = (GLint) vMax->color[2] 344cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell - (GLint) vMin->color[2]; 345cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eBot_db = (GLint) vMid->color[2] 346cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell - (GLint) vMin->color[2]; 347e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dbdx = oneOverArea * (eMaj_db * eBot.dy - eMaj.dy * eBot_db); 348e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdbdx = SignedFloatToFixed(dbdx); 349e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dbdy = oneOverArea * (eMaj.dx * eBot_db - eMaj_db * eBot.dx); 350e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 351e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 352e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_SPEC 353e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 354e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat eMaj_dsr, eBot_dsr; 355cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eMaj_dsr = (GLint) vMax->specular[0] 356cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell - (GLint) vMin->specular[0]; 357cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eBot_dsr = (GLint) vMid->specular[0] 358cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell - (GLint) vMin->specular[0]; 359e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dsrdx = oneOverArea * (eMaj_dsr * eBot.dy - eMaj.dy * eBot_dsr); 360e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdsrdx = SignedFloatToFixed(dsrdx); 361e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dsrdy = oneOverArea * (eMaj.dx * eBot_dsr - eMaj_dsr * eBot.dx); 362e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 363e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 364e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat eMaj_dsg, eBot_dsg; 365cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eMaj_dsg = (GLint) vMax->specular[1] 366cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell - (GLint) vMin->specular[1]; 367cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eBot_dsg = (GLint) vMid->specular[1] 368cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell - (GLint) vMin->specular[1]; 369e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dsgdx = oneOverArea * (eMaj_dsg * eBot.dy - eMaj.dy * eBot_dsg); 370e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdsgdx = SignedFloatToFixed(dsgdx); 371e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dsgdy = oneOverArea * (eMaj.dx * eBot_dsg - eMaj_dsg * eBot.dx); 372e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 373e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 374e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat eMaj_dsb, eBot_dsb; 375cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eMaj_dsb = (GLint) vMax->specular[2] 376cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell - (GLint) vMin->specular[2]; 377cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eBot_dsb = (GLint) vMid->specular[2] 378cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell - (GLint) vMin->specular[2]; 379e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dsbdx = oneOverArea * (eMaj_dsb * eBot.dy - eMaj.dy * eBot_dsb); 380e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdsbdx = SignedFloatToFixed(dsbdx); 381e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dsbdy = oneOverArea * (eMaj.dx * eBot_dsb - eMaj_dsb * eBot.dx); 382e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 383e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 384e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_ALPHA 385e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 386e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat eMaj_da, eBot_da; 387cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eMaj_da = (GLint) vMax->color[3] 388cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell - (GLint) vMin->color[3]; 389cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eBot_da = (GLint) vMid->color[3] 390cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell - (GLint) vMin->color[3]; 391e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dadx = oneOverArea * (eMaj_da * eBot.dy - eMaj.dy * eBot_da); 392e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdadx = SignedFloatToFixed(dadx); 393e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dady = oneOverArea * (eMaj.dx * eBot_da - eMaj_da * eBot.dx); 394e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 395e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 396e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INDEX 397e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 398e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat eMaj_di, eBot_di; 399cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eMaj_di = (GLint) vMax->index 400cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell - (GLint) vMin->index; 401cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eBot_di = (GLint) vMid->index 402cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell - (GLint) vMin->index; 403e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell didx = oneOverArea * (eMaj_di * eBot.dy - eMaj.dy * eBot_di); 404e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdidx = SignedFloatToFixed(didx); 405e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell didy = oneOverArea * (eMaj.dx * eBot_di - eMaj_di * eBot.dx); 406e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 407e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 408e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INT_TEX 409e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 410e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat eMaj_ds, eBot_ds; 411cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eMaj_ds = (vMax->texcoord[0][0] - vMin->texcoord[0][0]) * S_SCALE; 412cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eBot_ds = (vMid->texcoord[0][0] - vMin->texcoord[0][0]) * S_SCALE; 413e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dsdx = oneOverArea * (eMaj_ds * eBot.dy - eMaj.dy * eBot_ds); 414e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdsdx = SignedFloatToFixed(dsdx); 415e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dsdy = oneOverArea * (eMaj.dx * eBot_ds - eMaj_ds * eBot.dx); 416e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 417cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell { 418e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat eMaj_dt, eBot_dt; 419cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eMaj_dt = (vMax->texcoord[0][1] - vMin->texcoord[0][1]) * T_SCALE; 420cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eBot_dt = (vMid->texcoord[0][1] - vMin->texcoord[0][1]) * T_SCALE; 421e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dtdx = oneOverArea * (eMaj_dt * eBot.dy - eMaj.dy * eBot_dt); 422e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdtdx = SignedFloatToFixed(dtdx); 423e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dtdy = oneOverArea * (eMaj.dx * eBot_dt - eMaj_dt * eBot.dx); 424e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 425e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 426e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 427e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_TEX 428e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 429cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell GLfloat wMax = vMax->win[3]; 430cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell GLfloat wMin = vMin->win[3]; 431cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell GLfloat wMid = vMid->win[3]; 432e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat eMaj_ds, eBot_ds; 433e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat eMaj_dt, eBot_dt; 434e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat eMaj_du, eBot_du; 435e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat eMaj_dv, eBot_dv; 436e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 437cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eMaj_ds = vMax->texcoord[0][0] * wMax - vMin->texcoord[0][0] * wMin; 438cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eBot_ds = vMid->texcoord[0][0] * wMid - vMin->texcoord[0][0] * wMin; 439e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dsdx = oneOverArea * (eMaj_ds * eBot.dy - eMaj.dy * eBot_ds); 440e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dsdy = oneOverArea * (eMaj.dx * eBot_ds - eMaj_ds * eBot.dx); 441e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 442cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eMaj_dt = vMax->texcoord[0][1] * wMax - vMin->texcoord[0][1] * wMin; 443cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eBot_dt = vMid->texcoord[0][1] * wMid - vMin->texcoord[0][1] * wMin; 444cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell dtdx = oneOverArea * (eMaj_dt * eBot.dy - eMaj.dy * eBot_dt); 445cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell dtdy = oneOverArea * (eMaj.dx * eBot_dt - eMaj_dt * eBot.dx); 446cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 447cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eMaj_du = vMax->texcoord[0][2] * wMax - vMin->texcoord[0][2] * wMin; 448cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eBot_du = vMid->texcoord[0][2] * wMid - vMin->texcoord[0][2] * wMin; 449cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell dudx = oneOverArea * (eMaj_du * eBot.dy - eMaj.dy * eBot_du); 450cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell dudy = oneOverArea * (eMaj.dx * eBot_du - eMaj_du * eBot.dx); 451e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 452e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 453cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eMaj_dv = vMax->texcoord[0][3] * wMax - vMin->texcoord[0][3] * wMin; 454cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eBot_dv = vMid->texcoord[0][3] * wMid - vMin->texcoord[0][3] * wMin; 455cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell dvdx = oneOverArea * (eMaj_dv * eBot.dy - eMaj.dy * eBot_dv); 456cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell dvdy = oneOverArea * (eMaj.dx * eBot_dv - eMaj_dv * eBot.dx); 457e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 458e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 459e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_MULTITEX 460e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 461cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell GLfloat wMax = vMax->win[3]; 462cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell GLfloat wMin = vMin->win[3]; 463cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell GLfloat wMid = vMid->win[3]; 464e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint u; 465e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (u = 0; u < ctx->Const.MaxTextureUnits; u++) { 466cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell if (ctx->Texture.Unit[u]._ReallyEnabled) { 467e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat eMaj_ds, eBot_ds; 468e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat eMaj_dt, eBot_dt; 469e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat eMaj_du, eBot_du; 470e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat eMaj_dv, eBot_dv; 471cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eMaj_ds = vMax->texcoord[u][0] * wMax 472cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell - vMin->texcoord[u][0] * wMin; 473cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eBot_ds = vMid->texcoord[u][0] * wMid 474cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell - vMin->texcoord[u][0] * wMin; 475e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dsdx[u] = oneOverArea * (eMaj_ds * eBot.dy - eMaj.dy * eBot_ds); 476e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dsdy[u] = oneOverArea * (eMaj.dx * eBot_ds - eMaj_ds * eBot.dx); 477e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 478cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eMaj_dt = vMax->texcoord[u][1] * wMax 479c1b97d91c7e38290be85eb1ff56e6c108e1e47caBrian Paul - vMin->texcoord[u][1] * wMin; 480cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eBot_dt = vMid->texcoord[u][1] * wMid 481c1b97d91c7e38290be85eb1ff56e6c108e1e47caBrian Paul - vMin->texcoord[u][1] * wMin; 482cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell dtdx[u] = oneOverArea * (eMaj_dt * eBot.dy - eMaj.dy * eBot_dt); 483cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell dtdy[u] = oneOverArea * (eMaj.dx * eBot_dt - eMaj_dt * eBot.dx); 484cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 485cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eMaj_du = vMax->texcoord[u][2] * wMax 486c1b97d91c7e38290be85eb1ff56e6c108e1e47caBrian Paul - vMin->texcoord[u][2] * wMin; 487cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eBot_du = vMid->texcoord[u][2] * wMid 488c1b97d91c7e38290be85eb1ff56e6c108e1e47caBrian Paul - vMin->texcoord[u][2] * wMin; 489cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell dudx[u] = oneOverArea * (eMaj_du * eBot.dy - eMaj.dy * eBot_du); 490cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell dudy[u] = oneOverArea * (eMaj.dx * eBot_du - eMaj_du * eBot.dx); 491cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 492cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eMaj_dv = vMax->texcoord[u][3] * wMax 493c1b97d91c7e38290be85eb1ff56e6c108e1e47caBrian Paul - vMin->texcoord[u][3] * wMin; 494cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell eBot_dv = vMid->texcoord[u][3] * wMid 495c1b97d91c7e38290be85eb1ff56e6c108e1e47caBrian Paul - vMin->texcoord[u][3] * wMin; 496cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell dvdx[u] = oneOverArea * (eMaj_dv * eBot.dy - eMaj.dy * eBot_dv); 497cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell dvdy[u] = oneOverArea * (eMaj.dx * eBot_dv - eMaj_dv * eBot.dx); 498e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 499e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 500e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 501e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 502e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 503e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* 504e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * We always sample at pixel centers. However, we avoid 505e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * explicit half-pixel offsets in this code by incorporating 506e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * the proper offset in each of x and y during the 507e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * transformation to window coordinates. 508e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 509e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * We also apply the usual rasterization rules to prevent 510e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * cracks and overlaps. A pixel is considered inside a 511e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * subtriangle if it meets all of four conditions: it is on or 512e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * to the right of the left edge, strictly to the left of the 513e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * right edge, on or below the top edge, and strictly above 514e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * the bottom edge. (Some edges may be degenerate.) 515e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 516e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * The following discussion assumes left-to-right scanning 517e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * (that is, the major edge is on the left); the right-to-left 518e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * case is a straightforward variation. 519e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 520e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * We start by finding the half-integral y coordinate that is 521e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * at or below the top of the triangle. This gives us the 522e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * first scan line that could possibly contain pixels that are 523e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * inside the triangle. 524e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 525e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Next we creep down the major edge until we reach that y, 526e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * and compute the corresponding x coordinate on the edge. 527e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Then we find the half-integral x that lies on or just 528e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * inside the edge. This is the first pixel that might lie in 529e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * the interior of the triangle. (We won't know for sure 530e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * until we check the other edges.) 531e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 532e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * As we rasterize the triangle, we'll step down the major 533e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * edge. For each step in y, we'll move an integer number 534e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * of steps in x. There are two possible x step sizes, which 535e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * we'll call the ``inner'' step (guaranteed to land on the 536e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * edge or inside it) and the ``outer'' step (guaranteed to 537e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * land on the edge or outside it). The inner and outer steps 538e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * differ by one. During rasterization we maintain an error 539e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * term that indicates our distance from the true edge, and 540e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * select either the inner step or the outer step, whichever 541e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * gets us to the first pixel that falls inside the triangle. 542e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 543e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * All parameters (z, red, etc.) as well as the buffer 544e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * addresses for color and z have inner and outer step values, 545e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * so that we can increment them appropriately. This method 546e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * eliminates the need to adjust parameters by creeping a 547e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * sub-pixel amount into the triangle at each scanline. 548e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 549e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 550e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 551e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell int subTriangle; 552e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fx, fxLeftEdge, fxRightEdge, fdxLeftEdge, fdxRightEdge; 553e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fdxOuter; 554e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell int idxOuter; 555e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell float dxOuter; 556e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fError, fdError; 557e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell float adjx, adjy; 558e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fy; 559e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell int iy; 560e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef PIXEL_ADDRESS 561e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell PIXEL_TYPE *pRow; 562e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell int dPRowOuter, dPRowInner; /* offset in bytes */ 563e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 564e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_Z 565e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell# ifdef DEPTH_TYPE 566e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell DEPTH_TYPE *zRow; 567e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell int dZRowOuter, dZRowInner; /* offset in bytes */ 568e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell# endif 569e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fz, fdzOuter, fdzInner; 570e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed ffog, fdfogOuter, fdfogInner; 571e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 572e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_RGB 573e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fr, fdrOuter, fdrInner; 574e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fg, fdgOuter, fdgInner; 575e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fb, fdbOuter, fdbInner; 576e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 577e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_SPEC 578e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fsr, fdsrOuter, fdsrInner; 579e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fsg, fdsgOuter, fdsgInner; 580e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fsb, fdsbOuter, fdsbInner; 581e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 582e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_ALPHA 583e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fa, fdaOuter, fdaInner; 584e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 585e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INDEX 586e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fi, fdiOuter, fdiInner; 587e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 588e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INT_TEX 589e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fs, fdsOuter, fdsInner; 590e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed ft, fdtOuter, fdtInner; 591e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 592e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_TEX 593e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat sLeft, dsOuter, dsInner; 594e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat tLeft, dtOuter, dtInner; 595e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat uLeft, duOuter, duInner; 596e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat vLeft, dvOuter, dvInner; 597e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 598e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_MULTITEX 599e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat sLeft[MAX_TEXTURE_UNITS]; 600e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat tLeft[MAX_TEXTURE_UNITS]; 601e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat uLeft[MAX_TEXTURE_UNITS]; 602e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat vLeft[MAX_TEXTURE_UNITS]; 603e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dsOuter[MAX_TEXTURE_UNITS], dsInner[MAX_TEXTURE_UNITS]; 604e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dtOuter[MAX_TEXTURE_UNITS], dtInner[MAX_TEXTURE_UNITS]; 605e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat duOuter[MAX_TEXTURE_UNITS], duInner[MAX_TEXTURE_UNITS]; 606e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dvOuter[MAX_TEXTURE_UNITS], dvInner[MAX_TEXTURE_UNITS]; 607e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 608e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 609e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (subTriangle=0; subTriangle<=1; subTriangle++) { 610e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell EdgeT *eLeft, *eRight; 611e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell int setupLeft, setupRight; 612e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell int lines; 613e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 614e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (subTriangle==0) { 615e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* bottom half */ 616e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ltor) { 617e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eLeft = &eMaj; 618e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eRight = &eBot; 619e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell lines = eRight->lines; 620e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell setupLeft = 1; 621e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell setupRight = 1; 622e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 623e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 624e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eLeft = &eBot; 625e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eRight = &eMaj; 626e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell lines = eLeft->lines; 627e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell setupLeft = 1; 628e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell setupRight = 1; 629e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 630e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 631e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 632e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* top half */ 633e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ltor) { 634e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eLeft = &eMaj; 635e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eRight = &eTop; 636e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell lines = eRight->lines; 637e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell setupLeft = 0; 638e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell setupRight = 1; 639e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 640e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 641e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eLeft = &eTop; 642e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eRight = &eMaj; 643e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell lines = eLeft->lines; 644e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell setupLeft = 1; 645e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell setupRight = 0; 646e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 647e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (lines == 0) 648e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return; 649e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 650e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 651e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (setupLeft && eLeft->lines > 0) { 652a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *vLower; 653e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fsx = eLeft->fsx; 654e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fx = FixedCeil(fsx); 655e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fError = fx - fsx - FIXED_ONE; 656e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fxLeftEdge = fsx - FIXED_EPSILON; 657e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdxLeftEdge = eLeft->fdxdy; 658e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdxOuter = FixedFloor(fdxLeftEdge - FIXED_EPSILON); 659e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdError = fdxOuter - fdxLeftEdge + FIXED_ONE; 660e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell idxOuter = FixedToInt(fdxOuter); 661e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dxOuter = (float) idxOuter; 662e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (void) dxOuter; 663e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 664e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fy = eLeft->fsy; 665e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell iy = FixedToInt(fy); 666e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 667e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell adjx = (float)(fx - eLeft->fx0); /* SCALED! */ 668e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell adjy = eLeft->adjy; /* SCALED! */ 669e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (void) adjx; /* silence compiler warnings */ 670e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (void) adjy; /* silence compiler warnings */ 671e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 672e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell vLower = eLeft->v0; 673e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (void) vLower; /* silence compiler warnings */ 674e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 675e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef PIXEL_ADDRESS 676e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 677e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell pRow = PIXEL_ADDRESS( FixedToInt(fxLeftEdge), iy ); 678e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dPRowOuter = -((int)BYTES_PER_ROW) + idxOuter * sizeof(PIXEL_TYPE); 679e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* negative because Y=0 at bottom and increases upward */ 680e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 681e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 682e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* 683e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Now we need the set of parameter (z, color, etc.) values at 684e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * the point (fx, fy). This gives us properly-sampled parameter 685e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * values that we can step from pixel to pixel. Furthermore, 686e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * although we might have intermediate results that overflow 687e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * the normal parameter range when we step temporarily outside 688e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * the triangle, we shouldn't overflow or underflow for any 689e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * pixel that's actually inside the triangle. 690e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 691e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 692e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_Z 693e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 694cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell GLfloat z0 = vLower->win[2]; 695e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (depthBits <= 16) { 696e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* interpolate fixed-pt values */ 697e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat tmp = (z0 * FIXED_SCALE + 698e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dzdx * adjx + dzdy * adjy) + FIXED_HALF; 699e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (tmp < MAX_GLUINT / 2) 700e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fz = (GLfixed) tmp; 701e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else 702e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fz = MAX_GLUINT / 2; 703e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdzOuter = SignedFloatToFixed(dzdy + dxOuter * dzdx); 704e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 705e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 706e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* interpolate depth values exactly */ 707e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fz = (GLint) (z0 + dzdx*FixedToFloat(adjx) + dzdy*FixedToFloat(adjy)); 708e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdzOuter = (GLint) (dzdy + dxOuter * dzdx); 709e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 710e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell# ifdef DEPTH_TYPE 711e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zRow = (DEPTH_TYPE *) _mesa_zbuffer_address(ctx, FixedToInt(fxLeftEdge), iy); 712e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dZRowOuter = (ctx->DrawBuffer->Width + idxOuter) * sizeof(DEPTH_TYPE); 713e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell# endif 714e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 7151e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell { 7161e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell ffog = FloatToFixed(vLower->fog) * 256 + dfogdx * adjx + dfogdy * adjy + FIXED_HALF; 7171e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell fdfogOuter = SignedFloatToFixed(dfogdy + dxOuter * dfogdx); 7181e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell } 719e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 720e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_RGB 721cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell fr = (GLfixed)(IntToFixed(vLower->color[0]) 722e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell + drdx * adjx + drdy * adjy) + FIXED_HALF; 723e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdrOuter = SignedFloatToFixed(drdy + dxOuter * drdx); 724e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 725cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell fg = (GLfixed)(IntToFixed(vLower->color[1]) 726e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell + dgdx * adjx + dgdy * adjy) + FIXED_HALF; 727e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdgOuter = SignedFloatToFixed(dgdy + dxOuter * dgdx); 728e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 729cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell fb = (GLfixed)(IntToFixed(vLower->color[2]) 730e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell + dbdx * adjx + dbdy * adjy) + FIXED_HALF; 731e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdbOuter = SignedFloatToFixed(dbdy + dxOuter * dbdx); 732e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 733e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_SPEC 734cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell fsr = (GLfixed)(IntToFixed(vLower->specular[0]) 735e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell + dsrdx * adjx + dsrdy * adjy) + FIXED_HALF; 736e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdsrOuter = SignedFloatToFixed(dsrdy + dxOuter * dsrdx); 737e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 738cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell fsg = (GLfixed)(IntToFixed(vLower->specular[1]) 739e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell + dsgdx * adjx + dsgdy * adjy) + FIXED_HALF; 740e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdsgOuter = SignedFloatToFixed(dsgdy + dxOuter * dsgdx); 741e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 742cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell fsb = (GLfixed)(IntToFixed(vLower->specular[2]) 743e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell + dsbdx * adjx + dsbdy * adjy) + FIXED_HALF; 744e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdsbOuter = SignedFloatToFixed(dsbdy + dxOuter * dsbdx); 745e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 746e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_ALPHA 747cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell fa = (GLfixed)(IntToFixed(vLower->color[3]) 748e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell + dadx * adjx + dady * adjy) + FIXED_HALF; 749e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdaOuter = SignedFloatToFixed(dady + dxOuter * dadx); 750e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 751e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INDEX 752cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell fi = (GLfixed)(vLower->index * FIXED_SCALE 753e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell + didx * adjx + didy * adjy) + FIXED_HALF; 754e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdiOuter = SignedFloatToFixed(didy + dxOuter * didx); 755e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 756e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INT_TEX 757e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 758e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat s0, t0; 759cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell s0 = vLower->texcoord[0][0] * S_SCALE; 760e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fs = (GLfixed)(s0 * FIXED_SCALE + dsdx * adjx + dsdy * adjy) + FIXED_HALF; 761e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdsOuter = SignedFloatToFixed(dsdy + dxOuter * dsdx); 762e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 763cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell t0 = vLower->texcoord[0][1] * T_SCALE; 764cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell ft = (GLfixed)(t0 * FIXED_SCALE + dtdx * adjx + dtdy * adjy) + FIXED_HALF; 765cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell fdtOuter = SignedFloatToFixed(dtdy + dxOuter * dtdx); 766e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 767e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 768e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_TEX 769e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 770cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell GLfloat invW = vLower->win[3]; 771e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat s0, t0, u0, v0; 772cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell s0 = vLower->texcoord[0][0] * invW; 773e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sLeft = s0 + (dsdx * adjx + dsdy * adjy) * (1.0F/FIXED_SCALE); 774e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dsOuter = dsdy + dxOuter * dsdx; 775cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell t0 = vLower->texcoord[0][1] * invW; 776cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell tLeft = t0 + (dtdx * adjx + dtdy * adjy) * (1.0F/FIXED_SCALE); 777cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell dtOuter = dtdy + dxOuter * dtdx; 778cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell u0 = vLower->texcoord[0][2] * invW; 779cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell uLeft = u0 + (dudx * adjx + dudy * adjy) * (1.0F/FIXED_SCALE); 780cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell duOuter = dudy + dxOuter * dudx; 781cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell v0 = vLower->texcoord[0][3] * invW; 782e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell vLeft = v0 + (dvdx * adjx + dvdy * adjy) * (1.0F/FIXED_SCALE); 783e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dvOuter = dvdy + dxOuter * dvdx; 784e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 785e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 786e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_MULTITEX 787e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 788e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint u; 789e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (u = 0; u < ctx->Const.MaxTextureUnits; u++) { 790cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell if (ctx->Texture.Unit[u]._ReallyEnabled) { 791cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell GLfloat invW = vLower->win[3]; 792e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat s0, t0, u0, v0; 793cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell s0 = vLower->texcoord[u][0] * invW; 794e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sLeft[u] = s0 + (dsdx[u] * adjx + dsdy[u] * adjy) * (1.0F/FIXED_SCALE); 795e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dsOuter[u] = dsdy[u] + dxOuter * dsdx[u]; 796cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell t0 = vLower->texcoord[u][1] * invW; 797cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell tLeft[u] = t0 + (dtdx[u] * adjx + dtdy[u] * adjy) * (1.0F/FIXED_SCALE); 798cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell dtOuter[u] = dtdy[u] + dxOuter * dtdx[u]; 799cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell u0 = vLower->texcoord[u][2] * invW; 800cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell uLeft[u] = u0 + (dudx[u] * adjx + dudy[u] * adjy) * (1.0F/FIXED_SCALE); 801cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell duOuter[u] = dudy[u] + dxOuter * dudx[u]; 802cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell v0 = vLower->texcoord[u][3] * invW; 803e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell vLeft[u] = v0 + (dvdx[u] * adjx + dvdy[u] * adjy) * (1.0F/FIXED_SCALE); 804e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dvOuter[u] = dvdy[u] + dxOuter * dvdx[u]; 805e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 806e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 807e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 808e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 809e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 810e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } /*if setupLeft*/ 811e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 812e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 813e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (setupRight && eRight->lines>0) { 814e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fxRightEdge = eRight->fsx - FIXED_EPSILON; 815e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdxRightEdge = eRight->fdxdy; 816e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 817e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 818e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (lines==0) { 819e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell continue; 820e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 821e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 822e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 823e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Rasterize setup */ 824e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef PIXEL_ADDRESS 825e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dPRowInner = dPRowOuter + sizeof(PIXEL_TYPE); 826e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 827e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_Z 828e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell# ifdef DEPTH_TYPE 829e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dZRowInner = dZRowOuter + sizeof(DEPTH_TYPE); 830e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell# endif 831e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdzInner = fdzOuter + fdzdx; 832e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdfogInner = fdfogOuter + fdfogdx; 833e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 834e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_RGB 835e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdrInner = fdrOuter + fdrdx; 836e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdgInner = fdgOuter + fdgdx; 837e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdbInner = fdbOuter + fdbdx; 838e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 839e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_SPEC 840e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdsrInner = fdsrOuter + fdsrdx; 841e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdsgInner = fdsgOuter + fdsgdx; 842e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdsbInner = fdsbOuter + fdsbdx; 843e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 844e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_ALPHA 845e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdaInner = fdaOuter + fdadx; 846e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 847e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INDEX 848e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdiInner = fdiOuter + fdidx; 849e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 850e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INT_TEX 851e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdsInner = fdsOuter + fdsdx; 852e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fdtInner = fdtOuter + fdtdx; 853e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 854e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_TEX 855e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dsInner = dsOuter + dsdx; 856e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dtInner = dtOuter + dtdx; 857e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell duInner = duOuter + dudx; 858e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dvInner = dvOuter + dvdx; 859e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 860e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_MULTITEX 861e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 862e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint u; 863e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (u = 0; u < ctx->Const.MaxTextureUnits; u++) { 864cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell if (ctx->Texture.Unit[u]._ReallyEnabled) { 865e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dsInner[u] = dsOuter[u] + dsdx[u]; 866e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dtInner[u] = dtOuter[u] + dtdx[u]; 867e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell duInner[u] = duOuter[u] + dudx[u]; 868e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dvInner[u] = dvOuter[u] + dvdx[u]; 869e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 870e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 871e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 872e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 873e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 874e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell while (lines>0) { 875e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* initialize the span interpolants to the leftmost value */ 876e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* ff = fixed-pt fragment */ 877e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint left = FixedToInt(fxLeftEdge); 878e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint right = FixedToInt(fxRightEdge); 879e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_Z 880e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed ffz = fz; 881e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fffog = ffog; 882e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 883e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_RGB 884e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed ffr = fr, ffg = fg, ffb = fb; 885e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 886e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_SPEC 887e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed ffsr = fsr, ffsg = fsg, ffsb = fsb; 888e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 889e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_ALPHA 890e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed ffa = fa; 891e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 892e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INDEX 893e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed ffi = fi; 894e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 895e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INT_TEX 896e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed ffs = fs, fft = ft; 897e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 898e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_TEX 899e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat ss = sLeft, tt = tLeft, uu = uLeft, vv = vLeft; 900e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 901e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_MULTITEX 902e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat ss[MAX_TEXTURE_UNITS]; 903e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat tt[MAX_TEXTURE_UNITS]; 904e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat uu[MAX_TEXTURE_UNITS]; 905e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat vv[MAX_TEXTURE_UNITS]; 906e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 907e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint u; 908e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (u = 0; u < ctx->Const.MaxTextureUnits; u++) { 909cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell if (ctx->Texture.Unit[u]._ReallyEnabled) { 910e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ss[u] = sLeft[u]; 911e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tt[u] = tLeft[u]; 912e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell uu[u] = uLeft[u]; 913e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell vv[u] = vLeft[u]; 914e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 915e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 916e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 917e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 918e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 919e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_RGB 920e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 921e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* need this to accomodate round-off errors */ 922e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed ffrend = ffr+(right-left-1)*fdrdx; 923e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed ffgend = ffg+(right-left-1)*fdgdx; 924e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed ffbend = ffb+(right-left-1)*fdbdx; 925e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ffrend<0) ffr -= ffrend; 926e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ffgend<0) ffg -= ffgend; 927e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ffbend<0) ffb -= ffbend; 928e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ffr<0) ffr = 0; 929e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ffg<0) ffg = 0; 930e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ffb<0) ffb = 0; 931e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 932e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 933e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_SPEC 934e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 935e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* need this to accomodate round-off errors */ 936e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed ffsrend = ffsr+(right-left-1)*fdsrdx; 937e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed ffsgend = ffsg+(right-left-1)*fdsgdx; 938e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed ffsbend = ffsb+(right-left-1)*fdsbdx; 939e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ffsrend<0) ffsr -= ffsrend; 940e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ffsgend<0) ffsg -= ffsgend; 941e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ffsbend<0) ffsb -= ffsbend; 942e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ffsr<0) ffsr = 0; 943e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ffsg<0) ffsg = 0; 944e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ffsb<0) ffsb = 0; 945e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 946e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 947e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_ALPHA 948e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 949e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed ffaend = ffa+(right-left-1)*fdadx; 950e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ffaend<0) ffa -= ffaend; 951e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ffa<0) ffa = 0; 952e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 953e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 954e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INDEX 955e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ffi<0) ffi = 0; 956e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 957e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 958e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell INNER_LOOP( left, right, iy ); 959e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 960e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* 961e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Advance to the next scan line. Compute the 962e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * new edge coordinates, and adjust the 963e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * pixel-center x coordinate so that it stays 964e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * on or inside the major edge. 965e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 966e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell iy++; 967e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell lines--; 968e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 969e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fxLeftEdge += fdxLeftEdge; 970e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fxRightEdge += fdxRightEdge; 971e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 972e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 973e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fError += fdError; 974e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (fError >= 0) { 975e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fError -= FIXED_ONE; 976e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef PIXEL_ADDRESS 977e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell pRow = (PIXEL_TYPE *) ((GLubyte*)pRow + dPRowOuter); 978e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 979e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_Z 980e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell# ifdef DEPTH_TYPE 981e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zRow = (DEPTH_TYPE *) ((GLubyte*)zRow + dZRowOuter); 982e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell# endif 983e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fz += fdzOuter; 9841e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell ffog += fdfogOuter; 985e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 986e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_RGB 987e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fr += fdrOuter; fg += fdgOuter; fb += fdbOuter; 988e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 989e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_SPEC 990e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fsr += fdsrOuter; fsg += fdsgOuter; fsb += fdsbOuter; 991e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 992e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_ALPHA 993e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fa += fdaOuter; 994e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 995e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INDEX 996e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fi += fdiOuter; 997e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 998e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INT_TEX 999e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fs += fdsOuter; ft += fdtOuter; 1000e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 1001e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_TEX 1002e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sLeft += dsOuter; 1003e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tLeft += dtOuter; 1004e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell uLeft += duOuter; 1005e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell vLeft += dvOuter; 1006e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 1007e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_MULTITEX 1008e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 1009e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint u; 1010e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (u = 0; u < ctx->Const.MaxTextureUnits; u++) { 1011cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell if (ctx->Texture.Unit[u]._ReallyEnabled) { 1012e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sLeft[u] += dsOuter[u]; 1013e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tLeft[u] += dtOuter[u]; 1014e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell uLeft[u] += duOuter[u]; 1015e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell vLeft[u] += dvOuter[u]; 1016e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1017e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1018e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1019e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 1020e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1021e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 1022e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef PIXEL_ADDRESS 1023e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell pRow = (PIXEL_TYPE *) ((GLubyte*)pRow + dPRowInner); 1024e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 1025e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_Z 1026e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell# ifdef DEPTH_TYPE 1027e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zRow = (DEPTH_TYPE *) ((GLubyte*)zRow + dZRowInner); 1028e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell# endif 1029e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fz += fdzInner; 1030e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffog += fdfogInner; 1031e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 1032e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_RGB 1033e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fr += fdrInner; fg += fdgInner; fb += fdbInner; 1034e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 1035e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_SPEC 1036e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fsr += fdsrInner; fsg += fdsgInner; fsb += fdsbInner; 1037e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 1038e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_ALPHA 1039e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fa += fdaInner; 1040e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 1041e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INDEX 1042e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fi += fdiInner; 1043e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 1044e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INT_TEX 1045e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fs += fdsInner; ft += fdtInner; 1046e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 1047e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_TEX 1048e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sLeft += dsInner; 1049e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tLeft += dtInner; 1050e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell uLeft += duInner; 1051e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell vLeft += dvInner; 1052e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 1053e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_MULTITEX 1054e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { 1055e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint u; 1056e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (u = 0; u < ctx->Const.MaxTextureUnits; u++) { 1057cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell if (ctx->Texture.Unit[u]._ReallyEnabled) { 1058e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sLeft[u] += dsInner[u]; 1059e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tLeft[u] += dtInner[u]; 1060e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell uLeft[u] += duInner[u]; 1061e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell vLeft[u] += dvInner[u]; 1062e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1063e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1064e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1065e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 1066e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1067e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } /*while lines>0*/ 1068e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1069e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } /* for subTriangle */ 1070e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1071e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1072e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1073e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 1074e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1075e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef SETUP_CODE 1076e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef INNER_LOOP 1077e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1078e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef PIXEL_TYPE 1079e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef BYTES_PER_ROW 1080e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef PIXEL_ADDRESS 1081e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1082e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef INTERP_Z 1083e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef INTERP_RGB 1084e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef INTERP_SPEC 1085e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef INTERP_ALPHA 1086e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef INTERP_INDEX 1087e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef INTERP_INT_TEX 1088e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef INTERP_TEX 1089e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef INTERP_MULTITEX 1090e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1091e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef S_SCALE 1092e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef T_SCALE 1093e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1094e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef FixedToDepth 1095e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1096e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef DO_OCCLUSION_TEST 1097