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