s_triangle.c revision a852378a6289d154364dde440f89a39bbfc33e2d
1a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul/* $Id: s_triangle.c,v 1.5 2000/11/19 23:10:26 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 rasterizers 30e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * When the device driver doesn't implement triangle rasterization Mesa 31e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * will use these functions to draw triangles. 32e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 33e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 34e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 35e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "glheader.h" 36e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "context.h" 37e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "macros.h" 38e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "mem.h" 39e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "mmath.h" 40e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "teximage.h" 41e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "texstate.h" 42e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 43e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_aatriangle.h" 44cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#include "s_context.h" 45e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_depth.h" 46cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#include "s_feedback.h" 47e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_span.h" 48cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#include "s_triangle.h" 49cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 50cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith WhitwellGLboolean gl_cull_triangle( GLcontext *ctx, 51a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 52a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 53a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2 ) 54e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 55cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell GLfloat ex = v1->win[0] - v0->win[0]; 56cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell GLfloat ey = v1->win[1] - v0->win[1]; 57cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell GLfloat fx = v2->win[0] - v0->win[0]; 58cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell GLfloat fy = v2->win[1] - v0->win[1]; 59e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat c = ex*fy-ey*fx; 60e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 611e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell if (c * SWRAST_CONTEXT(ctx)->_backface_sign > 0) 62e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return 0; 63e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 64e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return 1; 65e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 66e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 67e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 68e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 69e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Render a flat-shaded color index triangle. 70e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 71e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void flat_ci_triangle( GLcontext *ctx, 72a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 73a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 74a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2 ) 75e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 76e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1 77c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul#define SETUP_CODE 78e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 79e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y ) \ 80e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { \ 81e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint n = RIGHT-LEFT; \ 82e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint i; \ 83e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLdepth zspan[MAX_WIDTH]; \ 84e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fogspan[MAX_WIDTH]; \ 85e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (n>0) { \ 86e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { \ 87e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zspan[i] = FixedToDepth(ffz); \ 88e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffz += fdzdx; \ 89e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fogspan[i] = fffog / 256; \ 90e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fffog += fdfogdx; \ 91e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 92e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell gl_write_monoindex_span( ctx, n, LEFT, Y, zspan, \ 93c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul fogspan, v0->index, GL_POLYGON ); \ 94e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 95e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 96e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 97e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h" 98e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 99e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 100e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 101e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 102e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 103e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Render a smooth-shaded color index triangle. 104e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 105e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void smooth_ci_triangle( GLcontext *ctx, 106a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 107a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 108a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2 ) 109e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 110e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1 111e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_INDEX 1 112e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 113e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y ) \ 114e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { \ 115e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint n = RIGHT-LEFT; \ 116e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint i; \ 117e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLdepth zspan[MAX_WIDTH]; \ 118e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fogspan[MAX_WIDTH]; \ 119e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint index[MAX_WIDTH]; \ 120e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (n>0) { \ 121e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { \ 122e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zspan[i] = FixedToDepth(ffz); \ 123e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffz += fdzdx; \ 124e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell index[i] = FixedToInt(ffi); \ 125e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffi += fdidx; \ 126e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fogspan[i] = fffog / 256; \ 127e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fffog += fdfogdx; \ 128e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 129e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell gl_write_index_span( ctx, n, LEFT, Y, zspan, fogspan, \ 130e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell index, GL_POLYGON ); \ 131e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 132e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 133e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 134e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h" 135e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 136e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 137e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 138e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 139e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 140e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Render a flat-shaded RGBA triangle. 141e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 142e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void flat_rgba_triangle( GLcontext *ctx, 143a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 144a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 145a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2 ) 146e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 147e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1 148e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 149e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 150c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul#define SETUP_CODE 151e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 152e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y ) \ 153e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { \ 154e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint n = RIGHT-LEFT; \ 155e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint i; \ 156e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLdepth zspan[MAX_WIDTH]; \ 157e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fogspan[MAX_WIDTH]; \ 158e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (n>0) { \ 159e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { \ 160e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zspan[i] = FixedToDepth(ffz); \ 161e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffz += fdzdx; \ 162e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fogspan[i] = fffog / 256; \ 163e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fffog += fdfogdx; \ 164e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 165e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell gl_write_monocolor_span( ctx, n, LEFT, Y, zspan, \ 166c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul fogspan, v0->color, \ 167e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GL_POLYGON ); \ 168e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 169e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 170e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 171e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h" 172e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 173cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell ASSERT(!ctx->Texture._ReallyEnabled); /* texturing must be off */ 174e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ASSERT(ctx->Light.ShadeModel==GL_FLAT); 175e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 176e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 177e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 178e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 179e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 180e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Render a smooth-shaded RGBA triangle. 181e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 182e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void smooth_rgba_triangle( GLcontext *ctx, 183a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 184a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 185a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2 ) 186e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 187cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 188e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1 189e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 190e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_RGB 1 191e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_ALPHA 1 192e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 193e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y ) \ 194e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { \ 195e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint n = RIGHT-LEFT; \ 196e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint i; \ 197e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLdepth zspan[MAX_WIDTH]; \ 198e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan rgba[MAX_WIDTH][4]; \ 199e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fogspan[MAX_WIDTH]; \ 200e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (n>0) { \ 201e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { \ 202e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zspan[i] = FixedToDepth(ffz); \ 203e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][RCOMP] = FixedToInt(ffr); \ 204e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][GCOMP] = FixedToInt(ffg); \ 205e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][BCOMP] = FixedToInt(ffb); \ 206e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][ACOMP] = FixedToInt(ffa); \ 207e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fogspan[i] = fffog / 256; \ 208e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fffog += fdfogdx; \ 209e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffz += fdzdx; \ 210e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffr += fdrdx; \ 211e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffg += fdgdx; \ 212e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffb += fdbdx; \ 213e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffa += fdadx; \ 214e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 215e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell gl_write_rgba_span( ctx, n, LEFT, Y, \ 216e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (CONST GLdepth *) zspan, \ 217e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fogspan, \ 218e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba, GL_POLYGON ); \ 219e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 220e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 221e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 222e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h" 223e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 224cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell ASSERT(!ctx->Texture._ReallyEnabled); /* texturing must be off */ 225e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ASSERT(ctx->Light.ShadeModel==GL_SMOOTH); 226e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 227e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 228e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 229e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 230e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Render an RGB, GL_DECAL, textured triangle. 231e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Interpolate S,T only w/out mipmapping or perspective correction. 232e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 233e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * No fog. 234e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 235cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwellstatic void simple_textured_triangle( GLcontext *ctx, 236a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 237a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 238a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2 ) 239e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 240e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_INT_TEX 1 241e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define S_SCALE twidth 242e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define T_SCALE theight 243e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SETUP_CODE \ 244a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul struct gl_texture_object *obj = ctx->Texture.Unit[0].Current2D; \ 245e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint b = obj->BaseLevel; \ 246e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat twidth = (GLfloat) obj->Image[b]->Width; \ 247e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat theight = (GLfloat) obj->Image[b]->Height; \ 248e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint twidth_log2 = obj->Image[b]->WidthLog2; \ 249e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan *texture = obj->Image[b]->Data; \ 250e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint smask = obj->Image[b]->Width - 1; \ 251e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint tmask = obj->Image[b]->Height - 1; \ 252e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (!texture) { \ 253e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (!_mesa_get_teximages_from_driver(ctx, obj)) \ 254e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return; \ 255e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell texture = obj->Image[b]->Data; \ 256e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ASSERT(texture); \ 257e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 258e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 259e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y ) \ 260e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { \ 261e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell CONST GLint n = RIGHT-LEFT; \ 262e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint i; \ 263e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan rgb[MAX_WIDTH][3]; \ 264e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (n>0) { \ 265e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffs -= FIXED_HALF; /* off-by-one error? */ \ 266e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fft -= FIXED_HALF; \ 267e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { \ 268e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint s = FixedToInt(ffs) & smask; \ 269e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint t = FixedToInt(fft) & tmask; \ 270e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint pos = (t << twidth_log2) + s; \ 271e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell pos = pos + pos + pos; /* multiply by 3 */ \ 272e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgb[i][RCOMP] = texture[pos]; \ 273e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgb[i][GCOMP] = texture[pos+1]; \ 274e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgb[i][BCOMP] = texture[pos+2]; \ 275e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffs += fdsdx; \ 276e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fft += fdtdx; \ 277e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 278e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (*ctx->Driver.WriteRGBSpan)( ctx, n, LEFT, Y, \ 279e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (CONST GLchan (*)[3]) rgb, NULL ); \ 280e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 281e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 282e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 283e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h" 284e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 285e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 286e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 287e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 288e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Render an RGB, GL_DECAL, textured triangle. 289e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Interpolate S,T, GL_LESS depth test, w/out mipmapping or 290e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * perspective correction. 291e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 292e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * No fog. 293e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 294cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwellstatic void simple_z_textured_triangle( GLcontext *ctx, 295a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 296a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 297a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2 ) 298e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 299e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1 300e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 301e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_INT_TEX 1 302e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define S_SCALE twidth 303e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define T_SCALE theight 304e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SETUP_CODE \ 305a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul struct gl_texture_object *obj = ctx->Texture.Unit[0].Current2D; \ 306e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint b = obj->BaseLevel; \ 307e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat twidth = (GLfloat) obj->Image[b]->Width; \ 308e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat theight = (GLfloat) obj->Image[b]->Height; \ 309e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint twidth_log2 = obj->Image[b]->WidthLog2; \ 310e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan *texture = obj->Image[b]->Data; \ 311e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint smask = obj->Image[b]->Width - 1; \ 312e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint tmask = obj->Image[b]->Height - 1; \ 313e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (!texture) { \ 314e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (!_mesa_get_teximages_from_driver(ctx, obj)) \ 315e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return; \ 316e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell texture = obj->Image[b]->Data; \ 317e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ASSERT(texture); \ 318e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 319e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 320e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y ) \ 321e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { \ 322e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell CONST GLint n = RIGHT-LEFT; \ 323e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint i; \ 324e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan rgb[MAX_WIDTH][3]; \ 325e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLubyte mask[MAX_WIDTH]; \ 326e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (void) fffog; \ 327e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (n>0) { \ 328e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffs -= FIXED_HALF; /* off-by-one error? */ \ 329e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fft -= FIXED_HALF; \ 330e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { \ 331e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLdepth z = FixedToDepth(ffz); \ 332e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z < zRow[i]) { \ 333e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint s = FixedToInt(ffs) & smask; \ 334e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint t = FixedToInt(fft) & tmask; \ 335e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint pos = (t << twidth_log2) + s; \ 336e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell pos = pos + pos + pos; /* multiply by 3 */ \ 337e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgb[i][RCOMP] = texture[pos]; \ 338e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgb[i][GCOMP] = texture[pos+1]; \ 339e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgb[i][BCOMP] = texture[pos+2]; \ 340e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zRow[i] = z; \ 341e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 1; \ 342e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 343e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { \ 344e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; \ 345e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 346e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffz += fdzdx; \ 347e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffs += fdsdx; \ 348e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fft += fdtdx; \ 349e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 350e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (*ctx->Driver.WriteRGBSpan)( ctx, n, LEFT, Y, \ 351e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (CONST GLchan (*)[3]) rgb, mask ); \ 352e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 353e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 354e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 355e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h" 356e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 357e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 358e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 359e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 360e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 361e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Render an RGB/RGBA textured triangle without perspective correction. 362e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 363cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwellstatic void affine_textured_triangle( GLcontext *ctx, 364a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 365a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 366a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2 ) 367e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 368e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1 369e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 370e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_RGB 1 371e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_ALPHA 1 372e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_INT_TEX 1 373e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define S_SCALE twidth 374e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define T_SCALE theight 375e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SETUP_CODE \ 376e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell struct gl_texture_unit *unit = ctx->Texture.Unit+0; \ 377a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul struct gl_texture_object *obj = unit->Current2D; \ 378e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint b = obj->BaseLevel; \ 379e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat twidth = (GLfloat) obj->Image[b]->Width; \ 380e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat theight = (GLfloat) obj->Image[b]->Height; \ 381e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint twidth_log2 = obj->Image[b]->WidthLog2; \ 382e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan *texture = obj->Image[b]->Data; \ 383e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint smask = obj->Image[b]->Width - 1; \ 384e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint tmask = obj->Image[b]->Height - 1; \ 385e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint format = obj->Image[b]->Format; \ 386e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint filter = obj->MinFilter; \ 387e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint envmode = unit->EnvMode; \ 388e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint comp, tbytesline, tsize; \ 389e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed er, eg, eb, ea; \ 390e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint tr, tg, tb, ta; \ 391e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (!texture) { \ 392e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (!_mesa_get_teximages_from_driver(ctx, obj)) \ 393e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return; \ 394e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell texture = obj->Image[b]->Data; \ 395e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ASSERT(texture); \ 396e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 397e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (envmode == GL_BLEND || envmode == GL_ADD) { \ 398e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* potential off-by-one error here? (1.0f -> 2048 -> 0) */ \ 399e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell er = FloatToFixed(unit->EnvColor[0]); \ 400e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eg = FloatToFixed(unit->EnvColor[1]); \ 401e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eb = FloatToFixed(unit->EnvColor[2]); \ 402e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ea = FloatToFixed(unit->EnvColor[3]); \ 403e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 404e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (format) { \ 405e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ALPHA: \ 406e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_LUMINANCE: \ 407e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_INTENSITY: \ 408e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell comp = 1; \ 409e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 410e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_LUMINANCE_ALPHA: \ 411e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell comp = 2; \ 412e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 413e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGB: \ 414e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell comp = 3; \ 415e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 416e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGBA: \ 417e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell comp = 4; \ 418e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 419e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: \ 420e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell gl_problem(NULL, "Bad texture format in affine_texture_triangle");\ 421e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return; \ 422e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 423e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tbytesline = obj->Image[b]->Width * comp; \ 424e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tsize = theight * tbytesline; 425cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 426e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 427e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Instead of defining a function for each mode, a test is done 428e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * between the outer and inner loops. This is to reduce code size 429e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * and complexity. Observe that an optimizing compiler kills 430e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * unused variables (for instance tf,sf,ti,si in case of GL_NEAREST). 431e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 432e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 433e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define NEAREST_RGB \ 434e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tr = tex00[0]; \ 435e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tg = tex00[1]; \ 436e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tb = tex00[2]; \ 437e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ta = 0xff 438e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 439e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define LINEAR_RGB \ 440e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tr = (ti * (si * tex00[0] + sf * tex01[0]) + \ 441e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tf * (si * tex10[0] + sf * tex11[0])) >> 2 * FIXED_SHIFT; \ 442e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tg = (ti * (si * tex00[1] + sf * tex01[1]) + \ 443e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tf * (si * tex10[1] + sf * tex11[1])) >> 2 * FIXED_SHIFT; \ 444e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tb = (ti * (si * tex00[2] + sf * tex01[2]) + \ 445e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tf * (si * tex10[2] + sf * tex11[2])) >> 2 * FIXED_SHIFT; \ 446e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ta = 0xff 447e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 448e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define NEAREST_RGBA \ 449e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tr = tex00[0]; \ 450e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tg = tex00[1]; \ 451e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tb = tex00[2]; \ 452e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ta = tex00[3] 453e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 454e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define LINEAR_RGBA \ 455e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tr = (ti * (si * tex00[0] + sf * tex01[0]) + \ 456e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tf * (si * tex10[0] + sf * tex11[0])) >> 2 * FIXED_SHIFT; \ 457e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tg = (ti * (si * tex00[1] + sf * tex01[1]) + \ 458e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tf * (si * tex10[1] + sf * tex11[1])) >> 2 * FIXED_SHIFT; \ 459e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tb = (ti * (si * tex00[2] + sf * tex01[2]) + \ 460e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tf * (si * tex10[2] + sf * tex11[2])) >> 2 * FIXED_SHIFT; \ 461e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ta = (ti * (si * tex00[3] + sf * tex01[3]) + \ 462e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tf * (si * tex10[3] + sf * tex11[3])) >> 2 * FIXED_SHIFT 463e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 464e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define MODULATE \ 465e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dest[0] = ffr * (tr + 1) >> (FIXED_SHIFT + 8); \ 466e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dest[1] = ffg * (tg + 1) >> (FIXED_SHIFT + 8); \ 467e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dest[2] = ffb * (tb + 1) >> (FIXED_SHIFT + 8); \ 468e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dest[3] = ffa * (ta + 1) >> (FIXED_SHIFT + 8) 469e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 470e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DECAL \ 471e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dest[0] = ((0xff - ta) * ffr + ((ta + 1) * tr << FIXED_SHIFT)) >> (FIXED_SHIFT + 8); \ 472e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dest[1] = ((0xff - ta) * ffg + ((ta + 1) * tg << FIXED_SHIFT)) >> (FIXED_SHIFT + 8); \ 473e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dest[2] = ((0xff - ta) * ffb + ((ta + 1) * tb << FIXED_SHIFT)) >> (FIXED_SHIFT + 8); \ 474e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dest[3] = FixedToInt(ffa) 475e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 476e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define BLEND \ 477e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dest[0] = ((0xff - tr) * ffr + (tr + 1) * er) >> (FIXED_SHIFT + 8); \ 478e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dest[1] = ((0xff - tg) * ffg + (tg + 1) * eg) >> (FIXED_SHIFT + 8); \ 479e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dest[2] = ((0xff - tb) * ffb + (tb + 1) * eb) >> (FIXED_SHIFT + 8); \ 480e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dest[3] = ffa * (ta + 1) >> (FIXED_SHIFT + 8) 481e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 482e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define REPLACE \ 483e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dest[0] = tr; \ 484e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dest[1] = tg; \ 485e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dest[2] = tb; \ 486e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dest[3] = ta 487e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 488e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define ADD \ 489e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dest[0] = ((ffr << 8) + (tr + 1) * er) >> (FIXED_SHIFT + 8); \ 490e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dest[1] = ((ffg << 8) + (tg + 1) * eg) >> (FIXED_SHIFT + 8); \ 491e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dest[2] = ((ffb << 8) + (tb + 1) * eb) >> (FIXED_SHIFT + 8); \ 492e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dest[3] = ffa * (ta + 1) >> (FIXED_SHIFT + 8) 493e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 494e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* shortcuts */ 495e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 496e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define NEAREST_RGB_REPLACE NEAREST_RGB;REPLACE 497e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 498e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define NEAREST_RGBA_REPLACE *(GLint *)dest = *(GLint *)tex00 499e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 500e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SPAN1(DO_TEX,COMP) \ 501e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { \ 502e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint s = FixedToInt(ffs) & smask; \ 503e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint t = FixedToInt(fft) & tmask; \ 504e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint pos = (t << twidth_log2) + s; \ 505e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan *tex00 = texture + COMP * pos; \ 506e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zspan[i] = FixedToDepth(ffz); \ 507e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fogspan[i] = fffog / 256; \ 508e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell DO_TEX; \ 509e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fffog += fdfogdx; \ 510e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffz += fdzdx; \ 511e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffr += fdrdx; \ 512e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffg += fdgdx; \ 513e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffb += fdbdx; \ 514e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffa += fdadx; \ 515e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffs += fdsdx; \ 516e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fft += fdtdx; \ 517e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dest += 4; \ 518e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 519e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 520e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SPAN2(DO_TEX,COMP) \ 521e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { \ 522e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint s = FixedToInt(ffs) & smask; \ 523e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint t = FixedToInt(fft) & tmask; \ 524e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint sf = ffs & FIXED_FRAC_MASK; \ 525e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint tf = fft & FIXED_FRAC_MASK; \ 526e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint si = FIXED_FRAC_MASK - sf; \ 527e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint ti = FIXED_FRAC_MASK - tf; \ 528e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint pos = (t << twidth_log2) + s; \ 529e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan *tex00 = texture + COMP * pos; \ 530e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan *tex10 = tex00 + tbytesline; \ 531e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan *tex01 = tex00 + COMP; \ 532e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan *tex11 = tex10 + COMP; \ 533e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (t == tmask) { \ 534e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tex10 -= tsize; \ 535e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tex11 -= tsize; \ 536e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 537e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (s == smask) { \ 538e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tex01 -= tbytesline; \ 539e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tex11 -= tbytesline; \ 540e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 541e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zspan[i] = FixedToDepth(ffz); \ 542e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fogspan[i] = fffog / 256; \ 543e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell DO_TEX; \ 544e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fffog += fdfogdx; \ 545e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffz += fdzdx; \ 546e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffr += fdrdx; \ 547e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffg += fdgdx; \ 548e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffb += fdbdx; \ 549e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffa += fdadx; \ 550e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffs += fdsdx; \ 551e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fft += fdtdx; \ 552e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dest += 4; \ 553e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 554e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 555e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* here comes the heavy part.. (something for the compiler to chew on) */ 556e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y ) \ 557e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { \ 558e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell CONST GLint n = RIGHT-LEFT; \ 559e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint i; \ 560e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLdepth zspan[MAX_WIDTH]; \ 561e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fogspan[MAX_WIDTH]; \ 562e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan rgba[MAX_WIDTH][4]; \ 563e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (n>0) { \ 564e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan *dest = rgba[0]; \ 565e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffs -= FIXED_HALF; /* off-by-one error? */ \ 566e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fft -= FIXED_HALF; \ 567e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (filter) { \ 568e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_NEAREST: \ 569e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (format) { \ 570e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGB: \ 571e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (envmode) { \ 572e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_MODULATE: \ 573e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN1(NEAREST_RGB;MODULATE,3); \ 574e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 575e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DECAL: \ 576e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_REPLACE: \ 577e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN1(NEAREST_RGB_REPLACE,3); \ 578e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 579e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_BLEND: \ 580e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN1(NEAREST_RGB;BLEND,3); \ 581e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 582e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ADD: \ 583e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN1(NEAREST_RGB;ADD,3); \ 584e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 585e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: /* unexpected env mode */ \ 586e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell abort(); \ 587e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 588e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 589e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGBA: \ 590e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch(envmode) { \ 591e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_MODULATE: \ 592e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN1(NEAREST_RGBA;MODULATE,4); \ 593e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 594e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DECAL: \ 595e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN1(NEAREST_RGBA;DECAL,4); \ 596e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 597e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_BLEND: \ 598e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN1(NEAREST_RGBA;BLEND,4); \ 599e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 600e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ADD: \ 601e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN1(NEAREST_RGBA;ADD,4); \ 602e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 603e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_REPLACE: \ 604e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN1(NEAREST_RGBA_REPLACE,4); \ 605e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 606e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: /* unexpected env mode */ \ 607e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell abort(); \ 608e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 609e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 610e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 611e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 612e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_LINEAR: \ 613e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffs -= FIXED_HALF; \ 614e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fft -= FIXED_HALF; \ 615e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (format) { \ 616e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGB: \ 617e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (envmode) { \ 618e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_MODULATE: \ 619e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN2(LINEAR_RGB;MODULATE,3); \ 620e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 621e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DECAL: \ 622e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_REPLACE: \ 623e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN2(LINEAR_RGB;REPLACE,3); \ 624e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 625e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_BLEND: \ 626e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN2(LINEAR_RGB;BLEND,3); \ 627e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 628e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ADD: \ 629e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN2(LINEAR_RGB;ADD,3); \ 630e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 631e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: /* unexpected env mode */ \ 632e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell abort(); \ 633e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 634e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 635e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGBA: \ 636e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (envmode) { \ 637e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_MODULATE: \ 638e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN2(LINEAR_RGBA;MODULATE,4); \ 639e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 640e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DECAL: \ 641e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN2(LINEAR_RGBA;DECAL,4); \ 642e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 643e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_BLEND: \ 644e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN2(LINEAR_RGBA;BLEND,4); \ 645e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 646e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ADD: \ 647e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN2(LINEAR_RGBA;ADD,4); \ 648e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 649e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_REPLACE: \ 650e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN2(LINEAR_RGBA;REPLACE,4); \ 651e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 652e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: /* unexpected env mode */ \ 653e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell abort(); \ 654e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 655e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 656e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 657e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 658e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 659e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell gl_write_rgba_span(ctx, n, LEFT, Y, zspan, \ 660e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fogspan, \ 661e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba, GL_POLYGON); \ 662e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* explicit kill of variables: */ \ 663e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffr = ffg = ffb = ffa = 0; \ 664e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 665e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 666e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 667e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h" 668e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef SPAN1 669e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef SPAN2 670e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 671e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 672e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 673e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 674e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 675e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Render an perspective corrected RGB/RGBA textured triangle. 676e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * The Q (aka V in Mesa) coordinate must be zero such that the divide 677e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * by interpolated Q/W comes out right. 678e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 679e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * This function only renders textured triangles that use GL_NEAREST. 680e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Perspective correction works right. 681e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 682e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * This function written by Klaus Niederkrueger <klaus@math.leidenuniv.nl> 683e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Send all questions and bug reports to him. 684e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 685cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwellstatic void near_persp_textured_triangle(GLcontext *ctx, 686a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 687a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 688a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2 ) 689e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 690e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* The BIAS value is used to shift negative values into positive values. 691e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Without this, negative texture values don't GL_REPEAT correctly at just 692e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * below zero, because (int)-0.5 = 0 = (int)0.5. We're not going to worry 693e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * about texture coords less than -BIAS. This could be fixed by using 694e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * FLOORF etc. instead, but this is slower... 695e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 696e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define BIAS 4096.0F 697e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 698e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1 699e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 700e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_RGB 1 701e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_ALPHA 1 702e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_TEX 1 703e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SETUP_CODE \ 704e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell struct gl_texture_unit *unit = ctx->Texture.Unit+0; \ 705a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul struct gl_texture_object *obj = unit->Current2D; \ 706e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint b = obj->BaseLevel; \ 707e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLfloat twidth = (GLfloat) obj->Image[b]->Width; \ 708e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLfloat theight = (GLfloat) obj->Image[b]->Height; \ 709e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint twidth_log2 = obj->Image[b]->WidthLog2; \ 710e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan *texture = obj->Image[b]->Data; \ 711e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint smask = (obj->Image[b]->Width - 1); \ 712e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint tmask = (obj->Image[b]->Height - 1); \ 713e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint format = obj->Image[b]->Format; \ 714e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint envmode = unit->EnvMode; \ 715e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat sscale, tscale; \ 716e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed er, eg, eb, ea; \ 717e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint tr, tg, tb, ta; \ 718e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (!texture) { \ 719e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (!_mesa_get_teximages_from_driver(ctx, obj)) \ 720e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return; \ 721e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell texture = obj->Image[b]->Data; \ 722e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ASSERT(texture); \ 723e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 724e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (envmode == GL_BLEND || envmode == GL_ADD) { \ 725e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell er = FloatToFixed(unit->EnvColor[0]); \ 726e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eg = FloatToFixed(unit->EnvColor[1]); \ 727e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eb = FloatToFixed(unit->EnvColor[2]); \ 728e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ea = FloatToFixed(unit->EnvColor[3]); \ 729e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 730e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sscale = twidth; \ 731e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tscale = theight; \ 732cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 733e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 734e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define OLD_SPAN(DO_TEX,COMP) \ 735e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { \ 736e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat invQ = 1.0f / vv; \ 737e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint s = (int)(SS * invQ + BIAS) & smask; \ 738e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint t = (int)(TT * invQ + BIAS) & tmask; \ 739e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint pos = COMP * ((t << twidth_log2) + s); \ 740e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan *tex00 = texture + pos; \ 741e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zspan[i] = FixedToDepth(ffz); \ 742e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fogspan[i] = fffog / 256; \ 743e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell DO_TEX; \ 744e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fffog += fdfogdx; \ 745e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffz += fdzdx; \ 746e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffr += fdrdx; \ 747e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffg += fdgdx; \ 748e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffb += fdbdx; \ 749e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffa += fdadx; \ 750e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SS += dSdx; \ 751e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell TT += dTdx; \ 752e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell vv += dvdx; \ 753e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dest += 4; \ 754e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 755e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 756e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define X_Y_TEX_COORD(X, Y) ((((int)(X) & tmask) << twidth_log2) + ((int)(Y) & smask)) 757e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define Y_X_TEX_COORD(X, Y) ((((int)(Y) & tmask) << twidth_log2) + ((int)(X) & smask)) 758e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 759e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SPAN1(DO_TEX, COMP, TEX_COORD) { \ 760e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat x_max = CEILF(x_tex); \ 761e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat y_max = y_tex + (x_max - x_tex) * dy_dx; \ 762e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint j, x_m = (int)x_max; \ 763e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint pos; \ 764e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if ((int)y_max != (int)y_tex) { \ 765e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat x_mid = x_tex + (CEILF(y_tex)-y_tex) * dx_dy; \ 766e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell j = (nominator + vv * x_mid)/(denominator - dvdx*x_mid); \ 767e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell pos = COMP * TEX_COORD(x_tex, y_tex); \ 768e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell DRAW_LINE (DO_TEX); \ 769e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell y_tex = y_max; \ 770e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 771e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell nominator += vv * x_max; \ 772e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell denominator -= dvdx * x_max; \ 773e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell j = nominator / denominator; \ 774e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell pos = COMP * TEX_COORD(x_tex, y_tex); \ 775e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell DRAW_LINE (DO_TEX); \ 776e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell while (i<n) { \ 777e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell y_tex = y_max; \ 778e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell y_max += dy_dx; \ 779e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if ((int)y_max != (int)y_tex) { \ 780e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat x_mid = (CEILF(y_tex)-y_tex) * dx_dy; \ 781e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell j = (nominator + vv * x_mid)/(denominator - dvdx*x_mid); \ 782e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell pos = COMP * TEX_COORD(x_m, y_tex); \ 783e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell DRAW_LINE (DO_TEX); \ 784e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell y_tex = y_max; \ 785e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 786e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell nominator += vv; \ 787e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell denominator -= dvdx; \ 788e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell j = nominator/denominator; \ 789e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell pos = COMP * TEX_COORD(x_m, y_tex); \ 790e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell DRAW_LINE (DO_TEX); \ 791e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell x_m ++; \ 792e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 793e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 794e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 795e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SPAN2(DO_TEX, COMP, TEX_COORD) { \ 796e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat x_max = CEILF (x_tex); \ 797e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat y_max = y_tex + (x_max - x_tex) * dy_dx; \ 798e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint j, x_m = (int) x_max; \ 799e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint pos; \ 800e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if ((int)y_max != (int)y_tex) { \ 801e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat x_mid = x_tex + (FLOORF(y_tex)-y_tex) * dx_dy; \ 802e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell j = (nominator + vv * x_mid)/(denominator - dvdx*x_mid); \ 803e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell pos = COMP * TEX_COORD(x_tex, y_tex); \ 804e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell DRAW_LINE (DO_TEX); \ 805e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell y_tex = y_max; \ 806e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 807e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell nominator += vv * x_max; \ 808e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell denominator -= dvdx * x_max; \ 809e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell j = nominator / denominator; \ 810e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell pos = COMP * TEX_COORD(x_tex, y_tex); \ 811e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell DRAW_LINE (DO_TEX); \ 812e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell while (i<n) { \ 813e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell y_tex = y_max; \ 814e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell y_max += dy_dx; \ 815e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if ((int)y_max != (int)y_tex) { \ 816e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat x_mid = (FLOORF(y_tex)-y_tex) * dx_dy; \ 817e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell j = (nominator + vv * x_mid)/(denominator - dvdx*x_mid);\ 818e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell pos = COMP * TEX_COORD(x_m, y_tex); \ 819e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell DRAW_LINE (DO_TEX); \ 820e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell y_tex = y_max; \ 821e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 822e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell nominator += vv; \ 823e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell denominator -= dvdx; \ 824e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell j = nominator/denominator; \ 825e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell pos = COMP * TEX_COORD(x_m, y_tex); \ 826e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell DRAW_LINE (DO_TEX); \ 827e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell x_m ++; \ 828e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 829e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 830e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 831e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SPAN3(DO_TEX, COMP, TEX_COORD) { \ 832e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat x_min = FLOORF (x_tex); \ 833e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat y_min = y_tex + (x_min - x_tex) * dy_dx; \ 834e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint j, x_m = (int)x_min; \ 835e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint pos; \ 836e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if ((int)y_min != (int)y_tex) { \ 837e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat x_mid = x_tex + (CEILF(y_tex)-y_tex) * dx_dy; \ 838e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell j = (nominator + vv * x_mid)/(denominator - dvdx*x_mid); \ 839e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell pos = COMP * TEX_COORD(x_m, y_tex); \ 840e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell DRAW_LINE (DO_TEX); \ 841e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell y_tex = y_min; \ 842e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 843e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell nominator += vv*x_min; \ 844e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell denominator -= dvdx*x_min; \ 845e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell j = nominator / denominator; \ 846e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell pos = COMP * TEX_COORD(x_m, y_tex); \ 847e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell DRAW_LINE (DO_TEX); \ 848e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell while (i<n) { \ 849e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell x_m --; \ 850e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell y_tex = y_min; \ 851e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell y_min -= dy_dx; \ 852e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if ((int)y_min != (int)y_tex) { \ 853e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat x_mid = (CEILF(y_tex)-y_tex) * dx_dy; \ 854e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell j = (nominator + vv * x_mid)/(denominator - dvdx*x_mid); \ 855e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell pos = COMP * TEX_COORD(x_m, y_tex); \ 856e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell DRAW_LINE (DO_TEX); \ 857e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell y_tex = y_min; \ 858e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 859e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell nominator -= vv; \ 860e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell denominator += dvdx; \ 861e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell j = nominator/denominator; \ 862e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell pos = COMP * TEX_COORD(x_m, y_tex); \ 863e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell DRAW_LINE (DO_TEX); \ 864e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 865e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 866e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 867e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SPAN4(DO_TEX, COMP, TEX_COORD) \ 868e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ \ 869e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat x_min = FLOORF(x_tex); \ 870e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint x_m = (int)x_min; \ 871e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat y_min = y_tex + (x_min - x_tex) * dy_dx; \ 872e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint j; \ 873e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint pos; \ 874e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if ((int)y_min != (int)y_tex) { \ 875e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat x_mid = x_tex + (FLOORF(y_tex)-y_tex) * dx_dy; \ 876e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell j = (nominator + vv * x_mid)/(denominator - dvdx*x_mid); \ 877e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell pos = COMP * TEX_COORD(x_m, y_tex); \ 878e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell DRAW_LINE (DO_TEX); \ 879e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell y_tex = y_min; \ 880e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 881e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell nominator += vv * x_min; \ 882e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell denominator -= dvdx * x_min; \ 883e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell j = nominator / denominator; \ 884e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell pos = COMP * TEX_COORD(x_m, y_tex); \ 885e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell DRAW_LINE (DO_TEX); \ 886e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell while (i<n) { \ 887e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell x_m --; \ 888e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell y_tex = y_min; \ 889e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell y_min -= dy_dx; \ 890e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if ((int)y_min != (int)y_tex) { \ 891e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat x_mid = (FLOORF(y_tex)-y_tex) * dx_dy; \ 892e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell j = (nominator + vv * x_mid)/(denominator - dvdx*x_mid); \ 893e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell pos = COMP * TEX_COORD(x_m, (y_tex)); \ 894e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell DRAW_LINE (DO_TEX); \ 895e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell y_tex = y_min; \ 896e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 897e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell nominator -= vv; \ 898e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell denominator += dvdx; \ 899e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell j = nominator/denominator; \ 900e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell pos = COMP * TEX_COORD(x_m, y_tex); \ 901e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell DRAW_LINE (DO_TEX); \ 902e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 903e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 904e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 905e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DRAW_LINE(DO_TEX) \ 906e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { \ 907e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan *tex00 = texture + pos; \ 908e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (j>n || j<-100000) \ 909e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell j = n; \ 910e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell while (i<j) { \ 911e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zspan[i] = FixedToDepth(ffz); \ 912e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fogspan[i] = fffog / 256; \ 913e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell DO_TEX; \ 914e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fffog += fdfogdx; \ 915e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffz += fdzdx; \ 916e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffr += fdrdx; \ 917e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffg += fdgdx; \ 918e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffb += fdbdx; \ 919e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffa += fdadx; \ 920e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dest += 4; \ 921e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell i++; \ 922e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 923e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 924e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 925e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y ) \ 926e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { \ 927e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint i = 0; \ 928e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint n = RIGHT-LEFT; \ 929e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLdepth zspan[MAX_WIDTH]; \ 930e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fogspan[MAX_WIDTH]; \ 931e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan rgba[MAX_WIDTH][4]; \ 932e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (void)uu; /* please GCC */ \ 933e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (n > 0) { \ 934e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan *dest = rgba[0]; \ 935e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat SS = ss * sscale; \ 936e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat TT = tt * tscale; \ 937e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dSdx = dsdx * sscale; \ 938e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dTdx = dtdx * tscale; \ 939e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat x_tex; \ 940e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat y_tex; \ 941e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dx_tex; \ 942e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dy_tex; \ 943e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (n<5) /* When line very short, setup-time > speed-gain. */ \ 944e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell goto old_span; /* So: take old method */ \ 945e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell x_tex = SS / vv, \ 946e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell y_tex = TT / vv; \ 947e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dx_tex = (SS + n * dSdx) / (vv + n * dvdx) - x_tex, \ 948e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dy_tex = (TT + n * dTdx) / (vv + n * dvdx) - y_tex; \ 949e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Choose between walking over texture or over pixelline: */ \ 950e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* If there are few texels, walk over texture otherwise */ \ 951e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* walk over pixelarray. The quotient on the right side */ \ 952e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* should give the timeratio needed to draw one texel in */ \ 953e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* comparison to one pixel. Depends on CPU. */ \ 954e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (dx_tex*dx_tex + dy_tex*dy_tex < (n*n)/16) { \ 955e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell x_tex += BIAS; \ 956e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell y_tex += BIAS; \ 957e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (dx_tex*dx_tex > dy_tex*dy_tex) { \ 958e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* if (FABSF(dx_tex) > FABSF(dy_tex)) */ \ 959e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat nominator = - SS - vv * BIAS; \ 960e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat denominator = dvdx * BIAS + dSdx; \ 961e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dy_dx; \ 962e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dx_dy; \ 963e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (dy_tex != 0.0f) { \ 964e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dy_dx = dy_tex / dx_tex; \ 965e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dx_dy = 1.0f/dy_dx; \ 966e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 967e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else \ 968e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dy_dx = 0.0f; \ 969e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (dx_tex > 0.0f) { \ 970e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (dy_tex > 0.0f) { \ 971e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (format) { \ 972e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGB: \ 973e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (envmode) { \ 974e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_MODULATE: \ 975e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN1(NEAREST_RGB;MODULATE,3, Y_X_TEX_COORD);\ 976e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 977e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DECAL: \ 978e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_REPLACE: \ 979e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN1(NEAREST_RGB_REPLACE,3, Y_X_TEX_COORD); \ 980e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 981e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_BLEND: \ 982e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN1(NEAREST_RGB;BLEND,3, Y_X_TEX_COORD); \ 983e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 984e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ADD: \ 985e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN1(NEAREST_RGB;ADD,3, Y_X_TEX_COORD); \ 986e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 987e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: /* unexpected env mode */ \ 988e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell abort(); \ 989e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 990e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 991e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGBA: \ 992e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch(envmode) { \ 993e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_MODULATE: \ 994e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN1(NEAREST_RGBA;MODULATE,4, Y_X_TEX_COORD);\ 995e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 996e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DECAL: \ 997e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN1(NEAREST_RGBA;DECAL,4, Y_X_TEX_COORD); \ 998e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 999e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_BLEND: \ 1000e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN1(NEAREST_RGBA;BLEND,4, Y_X_TEX_COORD); \ 1001e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1002e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ADD: \ 1003e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN1(NEAREST_RGBA;ADD,4, Y_X_TEX_COORD); \ 1004e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1005e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_REPLACE: \ 1006e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN1(NEAREST_RGBA_REPLACE,4, Y_X_TEX_COORD);\ 1007e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1008e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: /* unexpected env mode */ \ 1009e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell abort(); \ 1010e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1011e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1012e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1013e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1014e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { /* dy_tex <= 0.0f */ \ 1015e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (format) { \ 1016e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGB: \ 1017e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (envmode) { \ 1018e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_MODULATE: \ 1019e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN2(NEAREST_RGB;MODULATE,3, Y_X_TEX_COORD);\ 1020e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1021e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DECAL: \ 1022e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_REPLACE: \ 1023e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN2(NEAREST_RGB_REPLACE,3, Y_X_TEX_COORD); \ 1024e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1025e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_BLEND: \ 1026e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN2(NEAREST_RGB;BLEND,3, Y_X_TEX_COORD); \ 1027e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1028e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ADD: \ 1029e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN2(NEAREST_RGB;ADD,3, Y_X_TEX_COORD); \ 1030e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1031e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: /* unexpected env mode */ \ 1032e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell abort(); \ 1033e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1034e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1035e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGBA: \ 1036e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch(envmode) { \ 1037e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_MODULATE: \ 1038e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN2(NEAREST_RGBA;MODULATE,4, Y_X_TEX_COORD);\ 1039e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1040e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DECAL: \ 1041e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN2(NEAREST_RGBA;DECAL,4, Y_X_TEX_COORD); \ 1042e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1043e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_BLEND: \ 1044e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN2(NEAREST_RGBA;BLEND,4, Y_X_TEX_COORD); \ 1045e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1046e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ADD: \ 1047e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN2(NEAREST_RGBA;ADD,4, Y_X_TEX_COORD); \ 1048e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1049e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_REPLACE: \ 1050e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN2(NEAREST_RGBA_REPLACE,4, Y_X_TEX_COORD);\ 1051e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1052e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: /* unexpected env mode */ \ 1053e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell abort(); \ 1054e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1055e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1056e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1057e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1058e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1059e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { /* dx_tex < 0.0f */ \ 1060e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (dy_tex > 0.0f) { \ 1061e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (format) { \ 1062e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGB: \ 1063e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (envmode) { \ 1064e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_MODULATE: \ 1065e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN3(NEAREST_RGB;MODULATE,3, Y_X_TEX_COORD);\ 1066e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1067e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DECAL: \ 1068e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_REPLACE: \ 1069e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN3(NEAREST_RGB_REPLACE,3, Y_X_TEX_COORD); \ 1070e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1071e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_BLEND: \ 1072e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN3(NEAREST_RGB;BLEND,3, Y_X_TEX_COORD); \ 1073e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1074e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ADD: \ 1075e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN3(NEAREST_RGB;ADD,3, Y_X_TEX_COORD); \ 1076e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1077e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: /* unexpected env mode */ \ 1078e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell abort(); \ 1079e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1080e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1081e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGBA: \ 1082e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch(envmode) { \ 1083e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_MODULATE: \ 1084e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN3(NEAREST_RGBA;MODULATE,4, Y_X_TEX_COORD);\ 1085e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1086e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DECAL: \ 1087e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN3(NEAREST_RGBA;DECAL,4, Y_X_TEX_COORD); \ 1088e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1089e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_BLEND: \ 1090e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN3(NEAREST_RGBA;BLEND,4, Y_X_TEX_COORD); \ 1091e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1092e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ADD: \ 1093e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN3(NEAREST_RGBA;ADD,4, Y_X_TEX_COORD); \ 1094e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1095e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_REPLACE: \ 1096e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN3(NEAREST_RGBA_REPLACE,4, Y_X_TEX_COORD);\ 1097e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1098e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: /* unexpected env mode */ \ 1099e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell abort(); \ 1100e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1101e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1102e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1103e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1104e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { /* dy_tex <= 0.0f */ \ 1105e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (format) { \ 1106e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGB: \ 1107e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (envmode) { \ 1108e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_MODULATE: \ 1109e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN4(NEAREST_RGB;MODULATE,3, Y_X_TEX_COORD);\ 1110e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1111e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DECAL: \ 1112e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_REPLACE: \ 1113e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN4(NEAREST_RGB_REPLACE,3, Y_X_TEX_COORD); \ 1114e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1115e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_BLEND: \ 1116e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN4(NEAREST_RGB;BLEND,3, Y_X_TEX_COORD); \ 1117e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1118e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ADD: \ 1119e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN4(NEAREST_RGB;ADD,3, Y_X_TEX_COORD); \ 1120e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1121e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: \ 1122e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell abort(); \ 1123e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1124e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1125e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGBA: \ 1126e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch(envmode) { \ 1127e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_MODULATE: \ 1128e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN4(NEAREST_RGBA;MODULATE,4, Y_X_TEX_COORD);\ 1129e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1130e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DECAL: \ 1131e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN4(NEAREST_RGBA;DECAL,4, Y_X_TEX_COORD); \ 1132e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1133e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_BLEND: \ 1134e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN4(NEAREST_RGBA;BLEND,4, Y_X_TEX_COORD); \ 1135e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1136e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ADD: \ 1137e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN4(NEAREST_RGBA;ADD,4, Y_X_TEX_COORD); \ 1138e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1139e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_REPLACE: \ 1140e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN4(NEAREST_RGBA_REPLACE,4, Y_X_TEX_COORD);\ 1141e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1142e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: /* unexpected env mode */ \ 1143e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell abort(); \ 1144e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1145e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1146e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1147e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1148e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1149e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1150e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { /* FABSF(dx_tex) > FABSF(dy_tex) */ \ 1151e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat swap; \ 1152e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dy_dx; \ 1153e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dx_dy; \ 1154e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat nominator, denominator; \ 1155e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (dx_tex == 0.0f /* && dy_tex == 0.0f*/) \ 1156e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell goto old_span; /* case so special, that use old */ \ 1157e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* swap some x-values and y-values */ \ 1158e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SS = TT; \ 1159e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dSdx = dTdx; \ 1160e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell swap = x_tex, x_tex = y_tex, y_tex = swap; \ 1161e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell swap = dx_tex, dx_tex = dy_tex, dy_tex = swap; \ 1162e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell nominator = - SS - vv * BIAS; \ 1163e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell denominator = dvdx * BIAS + dSdx; \ 1164e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (dy_tex != 0.0f) { \ 1165e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dy_dx = dy_tex / dx_tex; \ 1166e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dx_dy = 1.0f/dy_dx; \ 1167e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1168e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else \ 1169e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dy_dx = 0.0f; \ 1170e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (dx_tex > 0.0f) { \ 1171e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (dy_tex > 0.0f) { \ 1172e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (format) { \ 1173e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGB: \ 1174e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (envmode) { \ 1175e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_MODULATE: \ 1176e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN1(NEAREST_RGB;MODULATE,3, X_Y_TEX_COORD);\ 1177e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1178e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DECAL: \ 1179e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_REPLACE: \ 1180e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN1(NEAREST_RGB_REPLACE,3, X_Y_TEX_COORD); \ 1181e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1182e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_BLEND: \ 1183e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN1(NEAREST_RGB;BLEND,3, X_Y_TEX_COORD); \ 1184e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1185e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ADD: \ 1186e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN1(NEAREST_RGB;ADD,3, X_Y_TEX_COORD); \ 1187e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1188e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: /* unexpected env mode */ \ 1189e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell abort(); \ 1190e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1191e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1192e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGBA: \ 1193e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch(envmode) { \ 1194e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_MODULATE: \ 1195e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN1(NEAREST_RGBA;MODULATE,4, X_Y_TEX_COORD);\ 1196e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1197e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DECAL: \ 1198e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN1(NEAREST_RGBA;DECAL,4, X_Y_TEX_COORD); \ 1199e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1200e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_BLEND: \ 1201e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN1(NEAREST_RGBA;BLEND,4, X_Y_TEX_COORD); \ 1202e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1203e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ADD: \ 1204e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN1(NEAREST_RGBA;ADD,4, X_Y_TEX_COORD); \ 1205e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1206e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_REPLACE: \ 1207e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN1(NEAREST_RGBA_REPLACE,4, X_Y_TEX_COORD);\ 1208e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1209e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: \ 1210e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell abort(); \ 1211e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1212e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1213e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1214e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1215e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { /* dy_tex <= 0.0f */ \ 1216e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (format) { \ 1217e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGB: \ 1218e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (envmode) { \ 1219e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_MODULATE: \ 1220e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN2(NEAREST_RGB;MODULATE,3, X_Y_TEX_COORD);\ 1221e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1222e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DECAL: \ 1223e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_REPLACE: \ 1224e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN2(NEAREST_RGB_REPLACE,3, X_Y_TEX_COORD); \ 1225e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1226e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_BLEND: \ 1227e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN2(NEAREST_RGB;BLEND,3, X_Y_TEX_COORD); \ 1228e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1229e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ADD: \ 1230e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN2(NEAREST_RGB;ADD,3, X_Y_TEX_COORD); \ 1231e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1232e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: \ 1233e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell abort(); \ 1234e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1235e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1236e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGBA: \ 1237e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch(envmode) { \ 1238e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_MODULATE: \ 1239e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN2(NEAREST_RGBA;MODULATE,4, X_Y_TEX_COORD);\ 1240e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1241e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DECAL: \ 1242e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN2(NEAREST_RGBA;DECAL,4, X_Y_TEX_COORD); \ 1243e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1244e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_BLEND: \ 1245e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN2(NEAREST_RGBA;BLEND,4, X_Y_TEX_COORD); \ 1246e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1247e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ADD: \ 1248e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN2(NEAREST_RGBA;ADD,4, X_Y_TEX_COORD); \ 1249e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1250e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_REPLACE: \ 1251e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN2(NEAREST_RGBA_REPLACE,4, X_Y_TEX_COORD);\ 1252e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1253e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: \ 1254e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell abort(); \ 1255e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1256e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1257e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1258e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1259e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1260e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { /* dx_tex < 0.0f */ \ 1261e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (dy_tex > 0.0f) { \ 1262e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (format) { \ 1263e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGB: \ 1264e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (envmode) { \ 1265e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_MODULATE: \ 1266e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN3(NEAREST_RGB;MODULATE,3, X_Y_TEX_COORD);\ 1267e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1268e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DECAL: \ 1269e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_REPLACE: \ 1270e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN3(NEAREST_RGB_REPLACE,3, X_Y_TEX_COORD); \ 1271e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1272e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_BLEND: \ 1273e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN3(NEAREST_RGB;BLEND,3, X_Y_TEX_COORD); \ 1274e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1275e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ADD: \ 1276e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN3(NEAREST_RGB;ADD,3, X_Y_TEX_COORD); \ 1277e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1278e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: \ 1279e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell abort(); \ 1280e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1281e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1282e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGBA: \ 1283e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch(envmode) { \ 1284e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_MODULATE: \ 1285e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN3(NEAREST_RGBA;MODULATE,4, X_Y_TEX_COORD);\ 1286e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1287e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DECAL: \ 1288e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN3(NEAREST_RGBA;DECAL,4, X_Y_TEX_COORD); \ 1289e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1290e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_BLEND: \ 1291e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN3(NEAREST_RGBA;BLEND,4, X_Y_TEX_COORD); \ 1292e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1293e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ADD: \ 1294e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN3(NEAREST_RGBA;ADD,4, X_Y_TEX_COORD); \ 1295e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1296e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_REPLACE: \ 1297e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN3(NEAREST_RGBA_REPLACE,4, X_Y_TEX_COORD);\ 1298e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1299e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: \ 1300e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell abort(); \ 1301e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1302e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1303e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1304e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1305e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { /* dy_tex <= 0.0f */ \ 1306e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (format) { \ 1307e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGB: \ 1308e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (envmode) { \ 1309e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_MODULATE: \ 1310e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN4(NEAREST_RGB;MODULATE,3, X_Y_TEX_COORD);\ 1311e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1312e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DECAL: \ 1313e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_REPLACE: \ 1314e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN4(NEAREST_RGB_REPLACE,3, X_Y_TEX_COORD); \ 1315e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1316e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_BLEND: \ 1317e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN4(NEAREST_RGB;BLEND,3, X_Y_TEX_COORD); \ 1318e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1319e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ADD: \ 1320e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN4(NEAREST_RGB;ADD,3, X_Y_TEX_COORD); \ 1321e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1322e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: \ 1323e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell abort(); \ 1324e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1325e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1326e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGBA: \ 1327e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch(envmode) { \ 1328e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_MODULATE: \ 1329e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN4(NEAREST_RGBA;MODULATE,4, X_Y_TEX_COORD);\ 1330e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1331e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DECAL: \ 1332e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN4(NEAREST_RGBA;DECAL,4, X_Y_TEX_COORD); \ 1333e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1334e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_BLEND: \ 1335e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN4(NEAREST_RGBA;BLEND,4, X_Y_TEX_COORD); \ 1336e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1337e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ADD: \ 1338e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN4(NEAREST_RGBA;ADD,4, X_Y_TEX_COORD); \ 1339e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1340e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_REPLACE: \ 1341e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN4(NEAREST_RGBA_REPLACE,4, X_Y_TEX_COORD);\ 1342e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1343e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: \ 1344e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell abort(); \ 1345e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1346e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1347e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1348e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1349e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1350e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1351e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1352e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { \ 1353e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell old_span: \ 1354e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (format) { \ 1355e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGB: \ 1356e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (envmode) { \ 1357e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_MODULATE: \ 1358e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell OLD_SPAN(NEAREST_RGB;MODULATE,3); \ 1359e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1360e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DECAL: \ 1361e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_REPLACE: \ 1362e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell OLD_SPAN(NEAREST_RGB_REPLACE,3); \ 1363e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1364e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_BLEND: \ 1365e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell OLD_SPAN(NEAREST_RGB;BLEND,3); \ 1366e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1367e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ADD: \ 1368e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell OLD_SPAN(NEAREST_RGB;ADD,3); \ 1369e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1370e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: \ 1371e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell abort(); \ 1372e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1373e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1374e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGBA: \ 1375e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch(envmode) { \ 1376e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_MODULATE: \ 1377e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell OLD_SPAN(NEAREST_RGBA;MODULATE,4); \ 1378e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1379e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DECAL: \ 1380e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell OLD_SPAN(NEAREST_RGBA;DECAL,4); \ 1381e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1382e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_BLEND: \ 1383e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell OLD_SPAN(NEAREST_RGBA;BLEND,4); \ 1384e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1385e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ADD: \ 1386e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell OLD_SPAN(NEAREST_RGBA;ADD,4); \ 1387e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1388e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_REPLACE: \ 1389e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell OLD_SPAN(NEAREST_RGBA_REPLACE,4); \ 1390e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1391e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: \ 1392e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell abort(); \ 1393e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1394e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1395e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1396e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1397e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell gl_write_rgba_span( ctx, n, LEFT, Y, zspan, \ 1398e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fogspan, rgba, GL_POLYGON); \ 1399e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffr = ffg = ffb = ffa = 0; \ 1400e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1401e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1402e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1403e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h" 1404e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef OLD_SPAN 1405e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef SPAN1 1406e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef SPAN2 1407e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef SPAN3 1408e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef SPAN4 1409e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef X_Y_TEX_COORD 1410e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef Y_X_TEX_COORD 1411e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef DRAW_LINE 1412e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef BIAS 1413e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 1414e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1415e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1416e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1417e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 1418e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Render an perspective corrected RGB/RGBA textured triangle. 1419e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * The Q (aka V in Mesa) coordinate must be zero such that the divide 1420e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * by interpolated Q/W comes out right. 1421e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 1422e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * This function written by Klaus Niederkrueger <klaus@math.leidenuniv.nl> 1423e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Send all questions and bug reports to him. 1424e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 1425cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwellstatic void lin_persp_textured_triangle( GLcontext *ctx, 1426a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 1427a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 1428a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2 ) 1429e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 1430e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1 1431e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 1432e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_RGB 1 1433e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_ALPHA 1 1434e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_TEX 1 1435e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SETUP_CODE \ 1436e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell struct gl_texture_unit *unit = ctx->Texture.Unit+0; \ 1437a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul struct gl_texture_object *obj = unit->Current2D; \ 1438e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint b = obj->BaseLevel; \ 1439e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLfloat twidth = (GLfloat) obj->Image[b]->Width; \ 1440e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLfloat theight = (GLfloat) obj->Image[b]->Height; \ 1441e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint twidth_log2 = obj->Image[b]->WidthLog2; \ 1442e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan *texture = obj->Image[b]->Data; \ 1443e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint smask = (obj->Image[b]->Width - 1); \ 1444e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint tmask = (obj->Image[b]->Height - 1); \ 1445e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint format = obj->Image[b]->Format; \ 1446e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint envmode = unit->EnvMode; \ 1447e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat sscale, tscale; \ 1448e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint comp, tbytesline, tsize; \ 1449e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed er, eg, eb, ea; \ 1450e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint tr, tg, tb, ta; \ 1451e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (!texture) { \ 1452e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (!_mesa_get_teximages_from_driver(ctx, obj)) \ 1453e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return; \ 1454e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell texture = obj->Image[b]->Data; \ 1455e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ASSERT(texture); \ 1456e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1457e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (envmode == GL_BLEND || envmode == GL_ADD) { \ 1458e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell er = FloatToFixed(unit->EnvColor[0]); \ 1459e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eg = FloatToFixed(unit->EnvColor[1]); \ 1460e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell eb = FloatToFixed(unit->EnvColor[2]); \ 1461e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ea = FloatToFixed(unit->EnvColor[3]); \ 1462e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1463e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (format) { \ 1464e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ALPHA: \ 1465e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_LUMINANCE: \ 1466e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_INTENSITY: \ 1467e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell comp = 1; \ 1468e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1469e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_LUMINANCE_ALPHA: \ 1470e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell comp = 2; \ 1471e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1472e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGB: \ 1473e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell comp = 3; \ 1474e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1475e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGBA: \ 1476e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell comp = 4; \ 1477e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1478e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: \ 1479e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell gl_problem(NULL, "Bad texture format in lin_persp_texture_triangle"); \ 1480e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return; \ 1481e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1482e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sscale = FIXED_SCALE * twidth; \ 1483e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tscale = FIXED_SCALE * theight; \ 1484e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tbytesline = obj->Image[b]->Width * comp; \ 1485e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tsize = theight * tbytesline; 1486cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 1487e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1488e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SPAN(DO_TEX,COMP) \ 1489e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { \ 1490e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat invQ = 1.0f / vv; \ 1491e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed ffs = (int)(SS * invQ); \ 1492e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fft = (int)(TT * invQ); \ 1493e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint s = FixedToInt(ffs) & smask; \ 1494e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint t = FixedToInt(fft) & tmask; \ 1495e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint sf = ffs & FIXED_FRAC_MASK; \ 1496e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint tf = fft & FIXED_FRAC_MASK; \ 1497e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint si = FIXED_FRAC_MASK - sf; \ 1498e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint ti = FIXED_FRAC_MASK - tf; \ 1499e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint pos = COMP * ((t << twidth_log2) + s); \ 1500e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan *tex00 = texture + pos; \ 1501e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan *tex10 = tex00 + tbytesline; \ 1502e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan *tex01 = tex00 + COMP; \ 1503e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan *tex11 = tex10 + COMP; \ 1504e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (t == tmask) { \ 1505e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tex10 -= tsize; \ 1506e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tex11 -= tsize; \ 1507e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1508e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (s == smask) { \ 1509e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tex01 -= tbytesline; \ 1510e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tex11 -= tbytesline; \ 1511e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1512e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zspan[i] = FixedToDepth(ffz); \ 1513e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fogspan[i] = fffog / 256; \ 1514e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell DO_TEX; \ 1515e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fffog += fdfogdx; \ 1516e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffz += fdzdx; \ 1517e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffr += fdrdx; \ 1518e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffg += fdgdx; \ 1519e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffb += fdbdx; \ 1520e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffa += fdadx; \ 1521e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SS += dSdx; \ 1522e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell TT += dTdx; \ 1523e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell vv += dvdx; \ 1524e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dest += 4; \ 1525e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1526e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1527e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y ) \ 1528e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { \ 1529e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint i; \ 1530e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint n = RIGHT-LEFT; \ 1531e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLdepth zspan[MAX_WIDTH]; \ 1532e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fogspan[MAX_WIDTH]; \ 1533e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan rgba[MAX_WIDTH][4]; \ 1534e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (void) uu; /* please GCC */ \ 1535e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (n > 0) { \ 1536e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat SS = ss * sscale; \ 1537e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat TT = tt * tscale; \ 1538e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dSdx = dsdx * sscale; \ 1539e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dTdx = dtdx * tscale; \ 1540e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan *dest = rgba[0]; \ 1541e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SS -= 0.5f * FIXED_SCALE * vv; \ 1542e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell TT -= 0.5f * FIXED_SCALE * vv; \ 1543e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (format) { \ 1544e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGB: \ 1545e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (envmode) { \ 1546e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_MODULATE: \ 1547e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN(LINEAR_RGB;MODULATE,3); \ 1548e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1549e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DECAL: \ 1550e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_REPLACE: \ 1551e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN(LINEAR_RGB;REPLACE,3); \ 1552e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1553e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_BLEND: \ 1554e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN(LINEAR_RGB;BLEND,3); \ 1555e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1556e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ADD: \ 1557e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN(LINEAR_RGB;ADD,3); \ 1558e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1559e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: \ 1560e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell abort(); \ 1561e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1562e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1563e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_RGBA: \ 1564e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (envmode) { \ 1565e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_MODULATE: \ 1566e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN(LINEAR_RGBA;MODULATE,4); \ 1567e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1568e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DECAL: \ 1569e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN(LINEAR_RGBA;DECAL,4); \ 1570e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1571e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_BLEND: \ 1572e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN(LINEAR_RGBA;BLEND,4); \ 1573e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1574e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_REPLACE: \ 1575e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN(LINEAR_RGBA;REPLACE,4); \ 1576e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1577e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ADD: \ 1578e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell SPAN(LINEAR_RGBA;ADD,4); \ 1579e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; \ 1580e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: /* unexpected env mode */ \ 1581e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell abort(); \ 1582e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1583e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1584e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell gl_write_rgba_span( ctx, n, LEFT, Y, zspan, \ 1585e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fogspan, \ 1586e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba, GL_POLYGON ); \ 1587e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffr = ffg = ffb = ffa = 0; \ 1588e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1589e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1590e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1591e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1592e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h" 1593e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef SPAN 1594e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 1595e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1596e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1597e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1598e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 1599e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Render a smooth-shaded, textured, RGBA triangle. 1600e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Interpolate S,T,U with perspective correction, w/out mipmapping. 1601e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Note: we use texture coordinates S,T,U,V instead of S,T,R,Q because 1602e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * R is already used for red. 1603e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 1604cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwellstatic void general_textured_triangle( GLcontext *ctx, 1605a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 1606a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 1607a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2 ) 1608e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 1609e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1 1610e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 1611e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_RGB 1 1612e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_ALPHA 1 1613e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_TEX 1 1614e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SETUP_CODE \ 1615e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT); \ 1616e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint r, g, b, a; \ 1617e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (flat_shade) { \ 1618cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell r = v0->color[0]; \ 1619cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell g = v0->color[1]; \ 1620cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell b = v0->color[2]; \ 1621cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell a = v0->color[3]; \ 1622e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1623e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y ) \ 1624e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { \ 1625e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint i; \ 1626e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint n = RIGHT-LEFT; \ 1627e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLdepth zspan[MAX_WIDTH]; \ 1628e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fogspan[MAX_WIDTH]; \ 1629e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan rgba[MAX_WIDTH][4]; \ 1630e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat s[MAX_WIDTH], t[MAX_WIDTH], u[MAX_WIDTH]; \ 1631e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (n>0) { \ 1632e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (flat_shade) { \ 1633e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { \ 1634e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLdouble invQ = 1.0 / vv; \ 1635e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zspan[i] = FixedToDepth(ffz); \ 1636e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fogspan[i] = fffog / 256; \ 1637e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][RCOMP] = r; \ 1638e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][GCOMP] = g; \ 1639e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][BCOMP] = b; \ 1640e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][ACOMP] = a; \ 1641e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell s[i] = ss*invQ; \ 1642e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell t[i] = tt*invQ; \ 1643e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell u[i] = uu*invQ; \ 1644e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fffog += fdfogdx; \ 1645e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffz += fdzdx; \ 1646e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ss += dsdx; \ 1647e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tt += dtdx; \ 1648e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell uu += dudx; \ 1649e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell vv += dvdx; \ 1650e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1651e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1652e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { \ 1653e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { \ 1654e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLdouble invQ = 1.0 / vv; \ 1655e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zspan[i] = FixedToDepth(ffz); \ 1656e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][RCOMP] = FixedToInt(ffr); \ 1657e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][GCOMP] = FixedToInt(ffg); \ 1658e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][BCOMP] = FixedToInt(ffb); \ 1659e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][ACOMP] = FixedToInt(ffa); \ 1660e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fogspan[i] = fffog / 256; \ 1661e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell s[i] = ss*invQ; \ 1662e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell t[i] = tt*invQ; \ 1663e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell u[i] = uu*invQ; \ 1664e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fffog += fdfogdx; \ 1665e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffz += fdzdx; \ 1666e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffr += fdrdx; \ 1667e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffg += fdgdx; \ 1668e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffb += fdbdx; \ 1669e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffa += fdadx; \ 1670e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ss += dsdx; \ 1671e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tt += dtdx; \ 1672e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell uu += dudx; \ 1673e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell vv += dvdx; \ 1674e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1675e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1676e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell gl_write_texture_span( ctx, n, LEFT, Y, zspan, fogspan, \ 1677e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell s, t, u, NULL, \ 1678e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba, \ 1679e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell NULL, GL_POLYGON ); \ 1680e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1681e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1682e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1683e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h" 1684e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 1685e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1686e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1687e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 1688e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Render a smooth-shaded, textured, RGBA triangle with separate specular 1689e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * color interpolation. 1690e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Interpolate S,T,U with perspective correction, w/out mipmapping. 1691e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Note: we use texture coordinates S,T,U,V instead of S,T,R,Q because 1692e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * R is already used for red. 1693e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 1694cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwellstatic void general_textured_spec_triangle1( GLcontext *ctx, 1695a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 1696a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 1697a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2, 1698e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLdepth zspan[MAX_WIDTH], 1699e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fogspan[MAX_WIDTH], 1700e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan rgba[MAX_WIDTH][4], 1701e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan spec[MAX_WIDTH][4] ) 1702e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 1703e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1 1704e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 1705e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_RGB 1 1706e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_SPEC 1 1707e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_ALPHA 1 1708e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_TEX 1 1709e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SETUP_CODE \ 1710e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT); \ 1711e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint r, g, b, a, sr, sg, sb; \ 1712e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (flat_shade) { \ 1713cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell r = v0->color[0]; \ 1714cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell g = v0->color[1]; \ 1715cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell b = v0->color[2]; \ 1716cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell a = v0->color[3]; \ 1717cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell sr = v0->specular[0]; \ 1718cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell sg = v0->specular[1]; \ 1719cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell sb = v0->specular[2]; \ 1720e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1721e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y ) \ 1722e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { \ 1723e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint i; \ 1724e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint n = RIGHT-LEFT; \ 1725e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat s[MAX_WIDTH], t[MAX_WIDTH], u[MAX_WIDTH]; \ 1726e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (n>0) { \ 1727e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (flat_shade) { \ 1728e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { \ 1729e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLdouble invQ = 1.0 / vv; \ 1730e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zspan[i] = FixedToDepth(ffz); \ 1731e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fogspan[i] = fffog / 256; \ 1732e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][RCOMP] = r; \ 1733e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][GCOMP] = g; \ 1734e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][BCOMP] = b; \ 1735e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][ACOMP] = a; \ 1736e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell spec[i][RCOMP] = sr; \ 1737e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell spec[i][GCOMP] = sg; \ 1738e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell spec[i][BCOMP] = sb; \ 1739e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell s[i] = ss*invQ; \ 1740e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell t[i] = tt*invQ; \ 1741e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell u[i] = uu*invQ; \ 1742e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fffog += fdfogdx; \ 1743e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffz += fdzdx; \ 1744e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ss += dsdx; \ 1745e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tt += dtdx; \ 1746e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell uu += dudx; \ 1747e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell vv += dvdx; \ 1748e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1749e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1750e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { \ 1751e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { \ 1752e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLdouble invQ = 1.0 / vv; \ 1753e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zspan[i] = FixedToDepth(ffz); \ 1754e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fogspan[i] = fffog / 256; \ 1755e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][RCOMP] = FixedToInt(ffr); \ 1756e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][GCOMP] = FixedToInt(ffg); \ 1757e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][BCOMP] = FixedToInt(ffb); \ 1758e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][ACOMP] = FixedToInt(ffa); \ 1759e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell spec[i][RCOMP] = FixedToInt(ffsr); \ 1760e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell spec[i][GCOMP] = FixedToInt(ffsg); \ 1761e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell spec[i][BCOMP] = FixedToInt(ffsb); \ 1762e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell s[i] = ss*invQ; \ 1763e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell t[i] = tt*invQ; \ 1764e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell u[i] = uu*invQ; \ 1765e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fffog += fdfogdx; \ 1766e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffz += fdzdx; \ 1767e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffr += fdrdx; \ 1768e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffg += fdgdx; \ 1769e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffb += fdbdx; \ 1770e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffa += fdadx; \ 1771e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffsr += fdsrdx; \ 1772e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffsg += fdsgdx; \ 1773e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffsb += fdsbdx; \ 1774e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ss += dsdx; \ 1775e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tt += dtdx; \ 1776e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell uu += dudx; \ 1777e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell vv += dvdx; \ 1778e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1779e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1780e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell gl_write_texture_span( ctx, n, LEFT, Y, zspan, \ 1781e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fogspan, \ 1782e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell s, t, u, NULL, rgba, \ 1783e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (CONST GLchan (*)[4]) spec, \ 1784e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GL_POLYGON ); \ 1785e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1786e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1787e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1788e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h" 1789e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 1790e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1791e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1792e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1793e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 1794e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Compute the lambda value for a fragment. (texture level of detail) 1795e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 1796e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic INLINE GLfloat 1797e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellcompute_lambda( GLfloat dsdx, GLfloat dsdy, GLfloat dtdx, GLfloat dtdy, 1798e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat invQ, GLfloat width, GLfloat height ) 1799e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 1800e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dudx = dsdx * invQ * width; 1801e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dudy = dsdy * invQ * width; 1802e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dvdx = dtdx * invQ * height; 1803e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dvdy = dtdy * invQ * height; 1804e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat r1 = dudx * dudx + dudy * dudy; 1805e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat r2 = dvdx * dvdx + dvdy * dvdy; 1806e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat rho2 = r1 + r2; /* used to be: rho2 = MAX2(r1,r2); */ 1807e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* return log base 2 of rho */ 1808e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return log(rho2) * 1.442695 * 0.5; /* 1.442695 = 1/log(2) */ 1809e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 1810e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1811e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1812e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 1813e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Render a smooth-shaded, textured, RGBA triangle. 1814e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Interpolate S,T,U with perspective correction and compute lambda for 1815e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * each fragment. Lambda is used to determine whether to use the 1816e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * minification or magnification filter. If minification and using 1817e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * mipmaps, lambda is also used to select the texture level of detail. 1818e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 1819cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwellstatic void lambda_textured_triangle1( GLcontext *ctx, 1820a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 1821a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 1822a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2, 1823e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat s[MAX_WIDTH], 1824e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat t[MAX_WIDTH], 1825e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat u[MAX_WIDTH] ) 1826e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 1827e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1 1828e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 1829e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_RGB 1 1830e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_ALPHA 1 1831e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_TEX 1 1832e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1833e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SETUP_CODE \ 1834cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell const struct gl_texture_object *obj = ctx->Texture.Unit[0]._Current; \ 1835e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint baseLevel = obj->BaseLevel; \ 1836e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const struct gl_texture_image *texImage = obj->Image[baseLevel]; \ 1837e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLfloat twidth = (GLfloat) texImage->Width; \ 1838e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLfloat theight = (GLfloat) texImage->Height; \ 1839e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT); \ 1840e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint r, g, b, a; \ 1841e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (flat_shade) { \ 1842cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell r = v0->color[0]; \ 1843cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell g = v0->color[1]; \ 1844cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell b = v0->color[2]; \ 1845cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell a = v0->color[3]; \ 1846e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1847e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1848e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y ) \ 1849e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { \ 1850e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint i; \ 1851e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint n = RIGHT-LEFT; \ 1852e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLdepth zspan[MAX_WIDTH]; \ 1853e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fogspan[MAX_WIDTH]; \ 1854e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan rgba[MAX_WIDTH][4]; \ 1855e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat lambda[MAX_WIDTH]; \ 1856e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (n>0) { \ 1857e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (flat_shade) { \ 1858e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { \ 1859e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLdouble invQ = 1.0 / vv; \ 1860e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zspan[i] = FixedToDepth(ffz); \ 1861e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fogspan[i] = fffog / 256; \ 1862e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][RCOMP] = r; \ 1863e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][GCOMP] = g; \ 1864e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][BCOMP] = b; \ 1865e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][ACOMP] = a; \ 1866e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell s[i] = ss*invQ; \ 1867e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell t[i] = tt*invQ; \ 1868e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell u[i] = uu*invQ; \ 1869e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell lambda[i] = compute_lambda( dsdx, dsdy, dtdx, dtdy, \ 1870e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell invQ, twidth, theight );\ 1871e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffz += fdzdx; \ 1872e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fffog += fdfogdx; \ 1873e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ss += dsdx; \ 1874e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tt += dtdx; \ 1875e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell uu += dudx; \ 1876e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell vv += dvdx; \ 1877e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1878e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1879e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { \ 1880e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { \ 1881e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLdouble invQ = 1.0 / vv; \ 1882e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zspan[i] = FixedToDepth(ffz); \ 1883e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fogspan[i] = fffog / 256; \ 1884e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][RCOMP] = FixedToInt(ffr); \ 1885e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][GCOMP] = FixedToInt(ffg); \ 1886e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][BCOMP] = FixedToInt(ffb); \ 1887e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][ACOMP] = FixedToInt(ffa); \ 1888e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell s[i] = ss*invQ; \ 1889e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell t[i] = tt*invQ; \ 1890e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell u[i] = uu*invQ; \ 1891e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell lambda[i] = compute_lambda( dsdx, dsdy, dtdx, dtdy, \ 1892e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell invQ, twidth, theight );\ 1893e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffz += fdzdx; \ 1894e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fffog += fdfogdx; \ 1895e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffr += fdrdx; \ 1896e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffg += fdgdx; \ 1897e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffb += fdbdx; \ 1898e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffa += fdadx; \ 1899e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ss += dsdx; \ 1900e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tt += dtdx; \ 1901e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell uu += dudx; \ 1902e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell vv += dvdx; \ 1903e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1904e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1905e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell gl_write_texture_span( ctx, n, LEFT, Y, zspan, fogspan, \ 1906e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell s, t, u, lambda, \ 1907e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba, NULL, GL_POLYGON ); \ 1908e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1909e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1910e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1911e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h" 1912e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 1913e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1914e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1915e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 1916e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Render a smooth-shaded, textured, RGBA triangle with separate specular 1917e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * interpolation. 1918e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Interpolate S,T,U with perspective correction and compute lambda for 1919e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * each fragment. Lambda is used to determine whether to use the 1920e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * minification or magnification filter. If minification and using 1921e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * mipmaps, lambda is also used to select the texture level of detail. 1922e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 1923cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwellstatic void lambda_textured_spec_triangle1( GLcontext *ctx, 1924a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 1925a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 1926a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2, 1927e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat s[MAX_WIDTH], 1928e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat t[MAX_WIDTH], 1929e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat u[MAX_WIDTH] ) 1930e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 1931e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1 1932e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 1933e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_RGB 1 1934e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_SPEC 1 1935e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_ALPHA 1 1936e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_TEX 1 1937e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1938e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SETUP_CODE \ 1939cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell const struct gl_texture_object *obj = ctx->Texture.Unit[0]._Current; \ 1940e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint baseLevel = obj->BaseLevel; \ 1941e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const struct gl_texture_image *texImage = obj->Image[baseLevel]; \ 1942e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLfloat twidth = (GLfloat) texImage->Width; \ 1943e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLfloat theight = (GLfloat) texImage->Height; \ 1944e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT); \ 1945e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint r, g, b, a, sr, sg, sb; \ 1946e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (flat_shade) { \ 1947cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell r = v0->color[0]; \ 1948cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell g = v0->color[1]; \ 1949cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell b = v0->color[2]; \ 1950cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell a = v0->color[3]; \ 1951cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell sr = v0->specular[0]; \ 1952cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell sg = v0->specular[1]; \ 1953cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell sb = v0->specular[2]; \ 1954e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1955e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1956e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y ) \ 1957e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { \ 1958e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint i; \ 1959e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint n = RIGHT-LEFT; \ 1960e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLdepth zspan[MAX_WIDTH]; \ 1961e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fogspan[MAX_WIDTH]; \ 1962e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan spec[MAX_WIDTH][4]; \ 1963e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan rgba[MAX_WIDTH][4]; \ 1964e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat lambda[MAX_WIDTH]; \ 1965e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (n>0) { \ 1966e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (flat_shade) { \ 1967e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { \ 1968e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLdouble invQ = 1.0 / vv; \ 1969e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zspan[i] = FixedToDepth(ffz); \ 1970e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fogspan[i] = fffog / 256; \ 1971e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][RCOMP] = r; \ 1972e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][GCOMP] = g; \ 1973e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][BCOMP] = b; \ 1974e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][ACOMP] = a; \ 1975e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell spec[i][RCOMP] = sr; \ 1976e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell spec[i][GCOMP] = sg; \ 1977e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell spec[i][BCOMP] = sb; \ 1978e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell s[i] = ss*invQ; \ 1979e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell t[i] = tt*invQ; \ 1980e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell u[i] = uu*invQ; \ 1981e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell lambda[i] = compute_lambda( dsdx, dsdy, dtdx, dtdy, \ 1982e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell invQ, twidth, theight );\ 1983e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fffog += fdfogdx; \ 1984e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffz += fdzdx; \ 1985e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ss += dsdx; \ 1986e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tt += dtdx; \ 1987e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell uu += dudx; \ 1988e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell vv += dvdx; \ 1989e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1990e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 1991e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { \ 1992e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { \ 1993e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLdouble invQ = 1.0 / vv; \ 1994e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zspan[i] = FixedToDepth(ffz); \ 1995e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fogspan[i] = fffog / 256; \ 1996e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][RCOMP] = FixedToInt(ffr); \ 1997e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][GCOMP] = FixedToInt(ffg); \ 1998e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][BCOMP] = FixedToInt(ffb); \ 1999e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][ACOMP] = FixedToInt(ffa); \ 2000e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell spec[i][RCOMP] = FixedToInt(ffsr); \ 2001e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell spec[i][GCOMP] = FixedToInt(ffsg); \ 2002e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell spec[i][BCOMP] = FixedToInt(ffsb); \ 2003e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell s[i] = ss*invQ; \ 2004e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell t[i] = tt*invQ; \ 2005e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell u[i] = uu*invQ; \ 2006e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell lambda[i] = compute_lambda( dsdx, dsdy, dtdx, dtdy, \ 2007e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell invQ, twidth, theight );\ 2008e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fffog += fdfogdx; \ 2009e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffz += fdzdx; \ 2010e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffr += fdrdx; \ 2011e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffg += fdgdx; \ 2012e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffb += fdbdx; \ 2013e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffa += fdadx; \ 2014e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffsr += fdsrdx; \ 2015e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffsg += fdsgdx; \ 2016e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffsb += fdsbdx; \ 2017e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ss += dsdx; \ 2018e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tt += dtdx; \ 2019e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell uu += dudx; \ 2020e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell vv += dvdx; \ 2021e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 2022e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 2023e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell gl_write_texture_span( ctx, n, LEFT, Y, zspan, fogspan, \ 2024e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell s, t, u, lambda, \ 2025e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba, (CONST GLchan (*)[4]) spec, \ 2026e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GL_POLYGON ); \ 2027e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 2028e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2029e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2030e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h" 2031e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 2032e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2033e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2034e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 2035e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * This is the big one! 2036e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Interpolate Z, RGB, Alpha, and two sets of texture coordinates. 2037e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Yup, it's slow. 2038e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 2039cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwellstatic void 2040cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwelllambda_multitextured_triangle1( GLcontext *ctx, 2041a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 2042a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 2043a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2, 2044cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell GLfloat s[MAX_TEXTURE_UNITS][MAX_WIDTH], 2045cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell GLfloat t[MAX_TEXTURE_UNITS][MAX_WIDTH], 2046cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell GLfloat u[MAX_TEXTURE_UNITS][MAX_WIDTH]) 2047e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 2048e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1 2049e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 2050e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_RGB 1 2051e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_ALPHA 1 2052e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_MULTITEX 1 2053e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2054e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SETUP_CODE \ 2055e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan rgba[MAX_WIDTH][4]; \ 2056e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT); \ 2057e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat twidth[MAX_TEXTURE_UNITS], theight[MAX_TEXTURE_UNITS]; \ 2058e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint r, g, b, a; \ 2059e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (flat_shade) { \ 2060cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell r = v0->color[0]; \ 2061cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell g = v0->color[1]; \ 2062cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell b = v0->color[2]; \ 2063cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell a = v0->color[3]; \ 2064e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 2065e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { \ 2066e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint unit; \ 2067e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) { \ 2068cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell if (ctx->Texture.Unit[unit]._ReallyEnabled) { \ 2069cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell const struct gl_texture_object *obj = ctx->Texture.Unit[unit]._Current; \ 2070e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint baseLevel = obj->BaseLevel; \ 2071e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const struct gl_texture_image *texImage = obj->Image[baseLevel]; \ 2072e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell twidth[unit] = (GLfloat) texImage->Width; \ 2073e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell theight[unit] = (GLfloat) texImage->Height; \ 2074e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 2075e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 2076e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2077e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2078e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2079e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2080e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y ) \ 2081e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { \ 2082e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint i; \ 2083e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint n = RIGHT-LEFT; \ 2084e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLdepth zspan[MAX_WIDTH]; \ 2085e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fogspan[MAX_WIDTH]; \ 2086e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat lambda[MAX_TEXTURE_UNITS][MAX_WIDTH]; \ 2087e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (n > 0) { \ 2088e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (flat_shade) { \ 2089e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { \ 2090e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zspan[i] = FixedToDepth(ffz); \ 2091e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fogspan[i] = fffog / 256; \ 2092e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fffog += fdfogdx; \ 2093e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffz += fdzdx; \ 2094e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][RCOMP] = r; \ 2095e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][GCOMP] = g; \ 2096e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][BCOMP] = b; \ 2097e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][ACOMP] = a; \ 2098e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { \ 2099e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint unit; \ 2100e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) { \ 2101cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell if (ctx->Texture.Unit[unit]._ReallyEnabled) { \ 2102e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLdouble invQ = 1.0 / vv[unit]; \ 2103e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell s[unit][i] = ss[unit] * invQ; \ 2104e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell t[unit][i] = tt[unit] * invQ; \ 2105e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell u[unit][i] = uu[unit] * invQ; \ 2106e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell lambda[unit][i] = compute_lambda(dsdx[unit], dsdy[unit],\ 2107e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dtdx[unit], dtdy[unit], invQ, \ 2108e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell twidth[unit], theight[unit] ); \ 2109e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ss[unit] += dsdx[unit]; \ 2110e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tt[unit] += dtdx[unit]; \ 2111e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell uu[unit] += dudx[unit]; \ 2112e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell vv[unit] += dvdx[unit]; \ 2113e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 2114e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 2115e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 2116e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 2117e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 2118e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { /* smooth shade */ \ 2119e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { \ 2120e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zspan[i] = FixedToDepth(ffz); \ 2121e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fogspan[i] = fffog / 256; \ 2122e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffz += fdzdx; \ 2123e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell fffog += fdfogdx; \ 2124e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][RCOMP] = FixedToInt(ffr); \ 2125e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][GCOMP] = FixedToInt(ffg); \ 2126e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][BCOMP] = FixedToInt(ffb); \ 2127e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][ACOMP] = FixedToInt(ffa); \ 2128e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffr += fdrdx; \ 2129e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffg += fdgdx; \ 2130e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffb += fdbdx; \ 2131e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffa += fdadx; \ 2132e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { \ 2133e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint unit; \ 2134e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) { \ 2135cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell if (ctx->Texture.Unit[unit]._ReallyEnabled) { \ 2136e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLdouble invQ = 1.0 / vv[unit]; \ 2137e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell s[unit][i] = ss[unit] * invQ; \ 2138e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell t[unit][i] = tt[unit] * invQ; \ 2139e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell u[unit][i] = uu[unit] * invQ; \ 2140e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell lambda[unit][i] = compute_lambda(dsdx[unit], dsdy[unit],\ 2141e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dtdx[unit], dtdy[unit], invQ, \ 2142e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell twidth[unit], theight[unit] ); \ 2143e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ss[unit] += dsdx[unit]; \ 2144e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell tt[unit] += dtdx[unit]; \ 2145e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell uu[unit] += dudx[unit]; \ 2146e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell vv[unit] += dvdx[unit]; \ 2147e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 2148e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 2149e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 2150e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 2151e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 2152e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell gl_write_multitexture_span( ctx, n, LEFT, Y, zspan, fogspan, \ 2153e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (const GLfloat (*)[MAX_WIDTH]) s, \ 2154e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (const GLfloat (*)[MAX_WIDTH]) t, \ 2155e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (const GLfloat (*)[MAX_WIDTH]) u, \ 2156e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (GLfloat (*)[MAX_WIDTH]) lambda, \ 2157e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba, NULL, GL_POLYGON ); \ 2158e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 2159e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2160e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h" 2161e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 2162e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2163e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2164e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 2165e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * These wrappers are needed to deal with the 32KB / stack frame limit 2166e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * on Mac / PowerPC systems. 2167e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 2168e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2169cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwellstatic void general_textured_spec_triangle(GLcontext *ctx, 2170a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 2171a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 2172a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2 ) 2173e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 2174e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLdepth zspan[MAX_WIDTH]; 2175e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfixed fogspan[MAX_WIDTH]; 2176e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan rgba[MAX_WIDTH][4], spec[MAX_WIDTH][4]; 2177cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell general_textured_spec_triangle1(ctx,v0,v1,v2,zspan,fogspan,rgba,spec); 2178e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 2179e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2180cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwellstatic void lambda_textured_triangle( GLcontext *ctx, 2181a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 2182a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 2183a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2 ) 2184e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 2185e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat s[MAX_WIDTH], t[MAX_WIDTH], u[MAX_WIDTH]; 2186cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell lambda_textured_triangle1(ctx,v0,v1,v2,s,t,u); 2187e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 2188e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2189cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwellstatic void lambda_textured_spec_triangle( GLcontext *ctx, 2190a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 2191a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 2192a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2 ) 2193e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 2194e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat s[MAX_WIDTH]; 2195e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat t[MAX_WIDTH]; 2196e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat u[MAX_WIDTH]; 2197cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell lambda_textured_spec_triangle1(ctx,v0,v1,v2,s,t,u); 2198e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 2199e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2200e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2201cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwellstatic void lambda_multitextured_triangle( GLcontext *ctx, 2202a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 2203a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 2204a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2 ) 2205e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 2206e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2207e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat s[MAX_TEXTURE_UNITS][MAX_WIDTH]; 2208e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat t[MAX_TEXTURE_UNITS][MAX_WIDTH]; 2209e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell DEFMARRAY(GLfloat,u,MAX_TEXTURE_UNITS,MAX_WIDTH); 2210e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell CHECKARRAY(u,return); 2211e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2212cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell lambda_multitextured_triangle1(ctx,v0,v1,v2,s,t,u); 2213e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2214e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell UNDEFARRAY(u); 2215e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 2216e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2217e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2218e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2219cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwellstatic void occlusion_zless_triangle( GLcontext *ctx, 2220a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 2221a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 2222a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2 ) 2223e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 2224e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->OcclusionResult) { 2225e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return; 2226e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2227e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2228e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DO_OCCLUSION_TEST 2229e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1 2230e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 2231e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y ) \ 2232e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell { \ 2233e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint i; \ 2234e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint len = RIGHT-LEFT; \ 2235e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<len;i++) { \ 2236e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLdepth z = FixedToDepth(ffz); \ 2237e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (void) fffog; \ 2238e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z < zRow[i]) { \ 2239e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ctx->OcclusionResult = GL_TRUE; \ 2240e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return; \ 2241e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 2242e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ffz += fdzdx; \ 2243e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } \ 2244e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2245e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h" 2246e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 2247e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2248e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2249e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2250e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2251e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2252e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#if 0 2253e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell# define dputs(s) puts(s) 2254e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#else 2255e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell# define dputs(s) 2256e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 2257e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2258e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2259e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2260e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 2261e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Determine which triangle rendering function to use given the current 2262e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * rendering context. 2263e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 2264e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Please update the summary flag _SWRAST_NEW_TRIANGLE if you add or 2265e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * remove tests to this code. 2266e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 2267e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellvoid 2268cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell_swrast_choose_triangle( GLcontext *ctx ) 2269e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 2270cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell SWcontext *swrast = SWRAST_CONTEXT(ctx); 2271e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLboolean rgbmode = ctx->Visual.RGBAflag; 2272e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2273e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->RenderMode==GL_RENDER) { 2274e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2275e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Polygon.SmoothFlag) { 2276e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell _mesa_set_aa_triangle_function(ctx); 2277cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell ASSERT(swrast->Triangle); 2278e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return; 2279e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2280e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2281e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.OcclusionTest && 2282e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ctx->Depth.Test && 2283e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ctx->Depth.Mask == GL_FALSE && 2284e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ctx->Depth.Func == GL_LESS && 2285e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell !ctx->Stencil.Enabled) { 2286e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if ((rgbmode && 2287e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ctx->Color.ColorMask[0] == 0 && 2288e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ctx->Color.ColorMask[1] == 0 && 2289e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ctx->Color.ColorMask[2] == 0 && 2290e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ctx->Color.ColorMask[3] == 0) 2291e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell || 2292e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (!rgbmode && ctx->Color.IndexMask == 0)) { 2293e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dputs("occlusion_test_triangle"); 2294cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell swrast->Triangle = occlusion_zless_triangle; 2295e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return; 2296e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2297e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2298e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2299cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell if (ctx->Texture._ReallyEnabled) { 2300e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Ugh, we do a _lot_ of tests to pick the best textured tri func */ 2301e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint format, filter; 2302a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const struct gl_texture_object *current2Dtex = ctx->Texture.Unit[0].Current2D; 2303e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const struct gl_texture_image *image; 2304e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* First see if we can used an optimized 2-D texture function */ 2305cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell if (ctx->Texture._ReallyEnabled==TEXTURE0_2D 2306e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell && current2Dtex->WrapS==GL_REPEAT 2307e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell && current2Dtex->WrapT==GL_REPEAT 2308e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell && ((image = current2Dtex->Image[current2Dtex->BaseLevel]) != 0) /* correct! */ 2309e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell && image->Border==0 2310e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell && ((format = image->Format)==GL_RGB || format==GL_RGBA) 2311e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell && (filter = current2Dtex->MinFilter)==current2Dtex->MagFilter 2312e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell && ctx->Light.Model.ColorControl==GL_SINGLE_COLOR 2313e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell && ctx->Texture.Unit[0].EnvMode!=GL_COMBINE_EXT) { 2314e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2315e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Hint.PerspectiveCorrection==GL_FASTEST) { 2316e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2317e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (filter==GL_NEAREST 2318e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell && format==GL_RGB 2319e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell && (ctx->Texture.Unit[0].EnvMode==GL_REPLACE 2320e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell || ctx->Texture.Unit[0].EnvMode==GL_DECAL) 2321cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell && ((swrast->_RasterMask==DEPTH_BIT 2322e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell && ctx->Depth.Func==GL_LESS 2323e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell && ctx->Depth.Mask==GL_TRUE) 2324cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell || swrast->_RasterMask==0) 2325e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell && ctx->Polygon.StippleFlag==GL_FALSE) { 2326e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 2327cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell if (swrast->_RasterMask==DEPTH_BIT) { 2328cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell swrast->Triangle = simple_z_textured_triangle; 2329e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dputs("simple_z_textured_triangle"); 2330e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2331e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 2332cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell swrast->Triangle = simple_textured_triangle; 2333e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dputs("simple_textured_triangle"); 2334e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2335e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2336e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 2337e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Texture.Unit[0].EnvMode==GL_ADD) { 2338cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell swrast->Triangle = general_textured_triangle; 2339e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dputs("general_textured_triangle"); 2340e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2341e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 2342cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell swrast->Triangle = affine_textured_triangle; 2343e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dputs("affine_textured_triangle"); 2344e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2345e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2346e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2347e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 2348e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (filter==GL_NEAREST) { 2349cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell swrast->Triangle = near_persp_textured_triangle; 2350e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dputs("near_persp_textured_triangle"); 2351e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2352e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 2353cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell swrast->Triangle = lin_persp_textured_triangle; 2354e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dputs("lin_persp_textured_triangle"); 2355e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2356e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2357e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2358e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 2359e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* More complicated textures (mipmap, multi-tex, sep specular) */ 2360e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLboolean needLambda; 2361e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* if mag filter != min filter we need to compute lambda */ 2362cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell const struct gl_texture_object *obj = ctx->Texture.Unit[0]._Current; 2363e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (obj && obj->MinFilter != obj->MagFilter) 2364e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell needLambda = GL_TRUE; 2365e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else 2366e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell needLambda = GL_FALSE; 23671e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell if (swrast->_MultiTextureEnabled) { 2368cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell swrast->Triangle = lambda_multitextured_triangle; 2369e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dputs("lambda_multitextured_triangle"); 2370e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2371e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else if ((ctx->Light.Enabled && 2372e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ctx->Light.Model.ColorControl==GL_SEPARATE_SPECULAR_COLOR) 2373e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell || ctx->Fog.ColorSumEnabled) { 2374e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* separate specular color interpolation */ 2375e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (needLambda) { 2376cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell swrast->Triangle = lambda_textured_spec_triangle; 2377e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dputs("lambda_textured_spec_triangle"); 2378e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2379e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 2380cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell swrast->Triangle = general_textured_spec_triangle; 2381e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dputs("general_textured_spec_triangle"); 2382e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2383e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2384e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 2385e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (needLambda) { 2386cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell swrast->Triangle = lambda_textured_triangle; 2387e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dputs("lambda_textured_triangle"); 2388e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2389e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 2390cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell swrast->Triangle = general_textured_triangle; 2391e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dputs("general_textured_triangle"); 2392e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2393e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2394e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2395e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2396e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 2397e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Light.ShadeModel==GL_SMOOTH) { 2398e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* smooth shaded, no texturing, stippled or some raster ops */ 2399e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (rgbmode) { 2400e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dputs("smooth_rgba_triangle"); 2401cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell swrast->Triangle = smooth_rgba_triangle; 2402e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2403e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 2404e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dputs("smooth_ci_triangle"); 2405cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell swrast->Triangle = smooth_ci_triangle; 2406e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2407e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2408e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 2409e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* flat shaded, no texturing, stippled or some raster ops */ 2410e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (rgbmode) { 2411e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dputs("flat_rgba_triangle"); 2412cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell swrast->Triangle = flat_rgba_triangle; 2413e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2414e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 2415e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dputs("flat_ci_triangle"); 2416cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell swrast->Triangle = flat_ci_triangle; 2417e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2418e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2419e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2420e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2421e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else if (ctx->RenderMode==GL_FEEDBACK) { 2422cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell swrast->Triangle = gl_feedback_triangle; 2423e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2424e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 2425e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* GL_SELECT mode */ 2426cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell swrast->Triangle = gl_select_triangle; 2427e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2428e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 2429