s_span.c revision 79c2f534916046fab91f53ebd37f705bd25f7dcb
179c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul/* $Id: s_span.c,v 1.31 2002/02/04 15:59:29 brianp Exp $ */ 2e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 3e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 4e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Mesa 3-D graphics library 59927f1978da8530416f699d084dda099720e43e6Brian Paul * Version: 4.1 622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * 79927f1978da8530416f699d084dda099720e43e6Brian Paul * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. 822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * 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: 1522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * 16e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * The above copyright notice and this permission notice shall be included 17e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * in all copies or substantial portions of the Software. 1822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * 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 2879c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul/** 2979c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul * \file vpstate.c 3079c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul * \brief Span processing functions used by all rasterization functions. 3179c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul * This is where all the per-fragment tests are performed 3279c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul * \author Brian Paul 33e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 34e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 35e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "glheader.h" 36e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "colormac.h" 3771340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul#include "context.h" 38e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "macros.h" 39e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "mem.h" 40e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 41e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_alpha.h" 42e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_alphabuf.h" 43e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_blend.h" 44cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#include "s_context.h" 45e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_depth.h" 46e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_fog.h" 47e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_logic.h" 48e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_masking.h" 49e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_span.h" 50e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_stencil.h" 51e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_texture.h" 52e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 532a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul 5479c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul/** 552a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul * Init span's Z interpolation values to the RasterPos Z. 562a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul * Used during setup for glDraw/CopyPixels. 572a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul */ 582a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paulvoid 592a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul_mesa_span_default_z( GLcontext *ctx, struct sw_span *span ) 602a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul{ 612a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul if (ctx->Visual.depthBits <= 16) 622a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->z = FloatToFixed(ctx->Current.RasterPos[2] * ctx->DepthMax); 632a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul else 642a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->z = (GLint) (ctx->Current.RasterPos[2] * ctx->DepthMax); 652a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->zStep = 0; 662a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->interpMask |= SPAN_Z; 672a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul} 682a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul 692a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul 7079c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul/** 712a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul * Init span's fog interpolation values to the RasterPos fog. 722a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul * Used during setup for glDraw/CopyPixels. 732a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul */ 742a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paulvoid 752a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul_mesa_span_default_fog( GLcontext *ctx, struct sw_span *span ) 762a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul{ 772a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul if (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT) 782a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->fog = _mesa_z_to_fogfactor(ctx, ctx->Current.RasterFogCoord); 792a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul else 802a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->fog = _mesa_z_to_fogfactor(ctx, ctx->Current.RasterDistance); 812a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->fogStep = 0; 822a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->interpMask |= SPAN_FOG; 832a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul} 842a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul 852a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul 8679c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul/** 872a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul * Init span's color or index interpolation values to the RasterPos color. 882a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul * Used during setup for glDraw/CopyPixels. 892a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul */ 902a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paulvoid 912a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul_mesa_span_default_color( GLcontext *ctx, struct sw_span *span ) 922a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul{ 932a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul if (ctx->Visual.rgbMode) { 942a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLchan r, g, b, a; 952a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul UNCLAMPED_FLOAT_TO_CHAN(r, ctx->Current.RasterColor[0]); 962a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul UNCLAMPED_FLOAT_TO_CHAN(g, ctx->Current.RasterColor[1]); 972a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul UNCLAMPED_FLOAT_TO_CHAN(b, ctx->Current.RasterColor[2]); 982a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul UNCLAMPED_FLOAT_TO_CHAN(a, ctx->Current.RasterColor[3]); 992a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul#if CHAN_TYPE == GL_FLOAT 1002a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->red = r; 1012a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->green = g; 1022a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->blue = b; 1032a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->alpha = a; 1042a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul#else 1052a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->red = IntToFixed(r); 1062a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->green = IntToFixed(g); 1072a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->blue = IntToFixed(b); 1082a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->alpha = IntToFixed(a); 1092a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul#endif 1102a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->redStep = 0; 1112a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->greenStep = 0; 1122a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->blueStep = 0; 1132a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->alphaStep = 0; 1142a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->interpMask |= SPAN_RGBA; 1152a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 1162a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul else { 1172a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->index = IntToFixed(ctx->Current.RasterIndex); 1182a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->indexStep = 0; 1192a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->interpMask |= SPAN_INDEX; 1202a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 1212a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul} 1222a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul 1232a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul 1242a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul/* Fill in the span.color.rgba array from the interpolation values */ 1252a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paulstatic void 1262a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paulinterpolate_colors(GLcontext *ctx, struct sw_span *span) 1272a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul{ 1282a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfixed r = span->red; 1292a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfixed g = span->green; 1302a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfixed b = span->blue; 1312a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfixed a = span->alpha; 1322a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLint dr = span->redStep; 1332a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLint dg = span->greenStep; 1342a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLint db = span->blueStep; 1352a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLint da = span->alphaStep; 1362a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLuint n = span->end; 1372a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLchan (*rgba)[4] = span->color.rgba; 1382a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLuint i; 1392a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul 1402a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul ASSERT(span->interpMask & SPAN_RGBA); 1412a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul 1422a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul if (span->interpMask & SPAN_FLAT) { 1432a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul /* constant color */ 1442a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLchan color[4]; 1452a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul color[RCOMP] = FixedToChan(r); 1462a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul color[GCOMP] = FixedToChan(g); 1472a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul color[BCOMP] = FixedToChan(b); 1482a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul color[ACOMP] = FixedToChan(a); 1492a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul for (i = 0; i < n; i++) { 1502a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul COPY_CHAN4(span->color.rgba[i], color); 1512a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 1522a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 1532a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul else { 1542a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul /* interpolate */ 1552a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul for (i = 0; i < n; i++) { 1562a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul rgba[i][RCOMP] = FixedToChan(r); 1572a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul rgba[i][GCOMP] = FixedToChan(g); 1582a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul rgba[i][BCOMP] = FixedToChan(b); 1592a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul rgba[i][ACOMP] = FixedToChan(a); 1602a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul r += dr; 1612a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul g += dg; 1622a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul b += db; 1632a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul a += da; 1642a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 1652a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 1662a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->arrayMask |= SPAN_RGBA; 1672a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul} 1682a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul 1692a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul 1702a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul/* Fill in the span.color.index array from the interpolation values */ 1712a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paulstatic void 1722a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paulinterpolate_indexes(GLcontext *ctx, struct sw_span *span) 1732a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul{ 1742a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfixed index = span->index; 1752a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLint indexStep = span->indexStep; 1762a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLuint n = span->end; 1772a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLuint *indexes = span->color.index; 1782a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLuint i; 1792a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul ASSERT(span->interpMask & SPAN_INDEX); 1802a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul 1812a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul if ((span->interpMask & SPAN_FLAT) || (indexStep == 0)) { 1822a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul /* constant color */ 1832a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul index = FixedToInt(index); 1842a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul for (i = 0; i < n; i++) { 1852a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul indexes[i] = index; 1862a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 1872a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 1882a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul else { 1892a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul /* interpolate */ 1902a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul for (i = 0; i < n; i++) { 1912a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul indexes[i] = FixedToInt(index); 1922a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul index += indexStep; 1932a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 1942a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 1952a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->arrayMask |= SPAN_INDEX; 1962a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul} 1972a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul 1982a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul 1992a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul/* Fill in the span.specArray array from the interpolation values */ 2002a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paulstatic void 2012a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paulinterpolate_specular(GLcontext *ctx, struct sw_span *span) 2022a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul{ 2032a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul if (span->interpMask & SPAN_FLAT) { 2042a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul /* constant color */ 2052a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLchan r = FixedToChan(span->specRed); 2062a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLchan g = FixedToChan(span->specGreen); 2072a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLchan b = FixedToChan(span->specBlue); 2082a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLuint i; 2092a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul for (i = 0; i < span->end; i++) { 2102a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->specArray[i][RCOMP] = r; 2112a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->specArray[i][GCOMP] = g; 2122a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->specArray[i][BCOMP] = b; 2132a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 2142a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 2152a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul else { 2162a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul /* interpolate */ 2172a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul#if CHAN_TYPE == GL_FLOAT 2182a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfloat r = span->specRed; 2192a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfloat g = span->specGreen; 2202a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfloat b = span->specBlue; 2212a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul#else 2222a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfixed r = span->specRed; 2232a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfixed g = span->specGreen; 2242a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfixed b = span->specBlue; 2252a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul#endif 2262a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLuint i; 2272a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul for (i = 0; i < span->end; i++) { 2282a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->specArray[i][RCOMP] = FixedToChan(r); 2292a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->specArray[i][GCOMP] = FixedToChan(g); 2302a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->specArray[i][BCOMP] = FixedToChan(b); 2312a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul r += span->specRedStep; 2322a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul g += span->specGreenStep; 2332a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul b += span->specBlueStep; 2342a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 2352a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 2362a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->arrayMask |= SPAN_SPEC; 2372a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul} 2382a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul 2392a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul 2402a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul/* Fill in the span.zArray array from the interpolation values */ 2412a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paulstatic void 2422a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paulinterpolate_z(GLcontext *ctx, struct sw_span *span) 2432a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul{ 2442a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLuint n = span->end; 2452a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLuint i; 2462a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul 2472a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul ASSERT(span->interpMask & SPAN_Z); 2482a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul 2492a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul if (ctx->Visual.depthBits <= 16) { 2502a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfixed zval = span->z; 2512a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul for (i = 0; i < n; i++) { 2522a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->zArray[i] = FixedToInt(zval); 2532a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul zval += span->zStep; 2542a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 2552a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 2562a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul else { 2572a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul /* Deep Z buffer, no fixed->int shift */ 2582a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfixed zval = span->z; 2592a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul for (i = 0; i < n; i++) { 2602a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->zArray[i] = zval; 2612a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul zval += span->zStep; 2622a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 2632a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 2642a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->arrayMask |= SPAN_Z; 2652a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul} 2662a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul 2672a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul 2682a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul 2692a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul/* Fill in the span.texcoords array from the interpolation values */ 2702a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paulstatic void 2712a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paulinterpolate_texcoords(GLcontext *ctx, struct sw_span *span) 2722a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul{ 2732a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul ASSERT(span->interpMask & SPAN_TEXTURE); 2742a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul 2752a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul if (ctx->Texture._ReallyEnabled & ~TEXTURE0_ANY) { 2762a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul if (span->interpMask & SPAN_LAMBDA) { 2772a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul /* multitexture, lambda */ 2782a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLuint u; 2792a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul for (u = 0; u < ctx->Const.MaxTextureUnits; u++) { 2802a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul if (ctx->Texture.Unit[u]._ReallyEnabled) { 2812a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLfloat ds = span->texStep[u][0]; 2822a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLfloat dt = span->texStep[u][1]; 2832a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLfloat dr = span->texStep[u][2]; 2842a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLfloat dq = span->texStep[u][3]; 2852a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfloat s = span->tex[u][0]; 2862a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfloat t = span->tex[u][1]; 2872a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfloat r = span->tex[u][2]; 2882a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfloat q = span->tex[u][3]; 2892a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLuint i; 2902a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul for (i = 0; i < span->end; i++) { 2912a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLfloat invQ = (q == 0.0F) ? 1.0F : (1.0F / q); 2922a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->texcoords[u][i][0] = s * invQ; 2932a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->texcoords[u][i][1] = t * invQ; 2942a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->texcoords[u][i][2] = r * invQ; 2952a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->lambda[u][i] = (GLfloat) 2962a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul (log(span->rho[u] * invQ * invQ) * 1.442695F * 0.5F); 2972a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul s += ds; 2982a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul t += dt; 2992a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul r += dr; 3002a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul q += dq; 3012a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 3022a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 3032a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 3042a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->arrayMask |= SPAN_LAMBDA; 3052a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 3062a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul else { 3072a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul /* multitexture, no lambda */ 3082a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLuint u; 3092a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul for (u = 0; u < ctx->Const.MaxTextureUnits; u++) { 3102a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul if (ctx->Texture.Unit[u]._ReallyEnabled) { 3112a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLfloat ds = span->texStep[u][0]; 3122a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLfloat dt = span->texStep[u][1]; 3132a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLfloat dr = span->texStep[u][2]; 3142a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLfloat dq = span->texStep[u][3]; 3152a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfloat s = span->tex[u][0]; 3162a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfloat t = span->tex[u][1]; 3172a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfloat r = span->tex[u][2]; 3182a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfloat q = span->tex[u][3]; 3192a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLuint i; 3202a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul for (i = 0; i < span->end; i++) { 3212a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLfloat invQ = (q == 0.0F) ? 1.0F : (1.0F / q); 3222a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->texcoords[u][i][0] = s * invQ; 3232a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->texcoords[u][i][1] = t * invQ; 3242a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->texcoords[u][i][2] = r * invQ; 3252a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul s += ds; 3262a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul t += dt; 3272a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul r += dr; 3282a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul q += dq; 3292a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 3302a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 3312a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 3322a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 3332a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 3342a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul else { 3352a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul if (span->interpMask & SPAN_LAMBDA) { 3362a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul /* just texture unit 0, with lambda */ 3372a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLfloat ds = span->texStep[0][0]; 3382a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLfloat dt = span->texStep[0][1]; 3392a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLfloat dr = span->texStep[0][2]; 3402a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLfloat dq = span->texStep[0][3]; 3412a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfloat s = span->tex[0][0]; 3422a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfloat t = span->tex[0][1]; 3432a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfloat r = span->tex[0][2]; 3442a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfloat q = span->tex[0][3]; 3452a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLuint i; 3462a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul for (i = 0; i < span->end; i++) { 3472a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLfloat invQ = (q == 0.0F) ? 1.0F : (1.0F / q); 3482a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->texcoords[0][i][0] = s * invQ; 3492a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->texcoords[0][i][1] = t * invQ; 3502a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->texcoords[0][i][2] = r * invQ; 3512a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->lambda[0][i] = (GLfloat) 3522a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul (log(span->rho[0] * invQ * invQ) * 1.442695F * 0.5F); 3532a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul s += ds; 3542a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul t += dt; 3552a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul r += dr; 3562a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul q += dq; 3572a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 3582a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->arrayMask |= SPAN_LAMBDA; 3592a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 3602a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul else { 361733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* just texture 0, without lambda */ 3622a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLfloat ds = span->texStep[0][0]; 3632a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLfloat dt = span->texStep[0][1]; 3642a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLfloat dr = span->texStep[0][2]; 3652a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLfloat dq = span->texStep[0][3]; 3662a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfloat s = span->tex[0][0]; 3672a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfloat t = span->tex[0][1]; 3682a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfloat r = span->tex[0][2]; 3692a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLfloat q = span->tex[0][3]; 3702a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLuint i; 3712a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul for (i = 0; i < span->end; i++) { 3722a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLfloat invQ = (q == 0.0F) ? 1.0F : (1.0F / q); 3732a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->texcoords[0][i][0] = s * invQ; 3742a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->texcoords[0][i][1] = t * invQ; 3752a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->texcoords[0][i][2] = r * invQ; 3762a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul s += ds; 3772a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul t += dt; 3782a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul r += dr; 3792a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul q += dq; 3802a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 3812a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 3822a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 38310f30eb43835c57c00783390a02d72daf4f78e26Brian Paul} 384e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 385e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 38679c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul/** 387e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Apply the current polygon stipple pattern to a span of pixels. 388e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 3895071b0812fc73bcba92e2b6fcbad2f53f063fc32Brian Paulstatic void 390733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paulstipple_polygon_span( GLcontext *ctx, struct sw_span *span ) 39110f30eb43835c57c00783390a02d72daf4f78e26Brian Paul{ 39210f30eb43835c57c00783390a02d72daf4f78e26Brian Paul const GLuint highbit = 0x80000000; 393733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul const GLuint stipple = ctx->PolygonStipple[span->y % 32]; 394733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul GLuint i, m; 395733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul 396733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul ASSERT(ctx->Polygon.StippleFlag); 397733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul ASSERT((span->arrayMask & SPAN_XY) == 0); 39810f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 39910f30eb43835c57c00783390a02d72daf4f78e26Brian Paul m = highbit >> (GLuint) (span->x % 32); 40010f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 40110f30eb43835c57c00783390a02d72daf4f78e26Brian Paul for (i = 0; i < span->end; i++) { 40210f30eb43835c57c00783390a02d72daf4f78e26Brian Paul if ((m & stipple) == 0) { 40310f30eb43835c57c00783390a02d72daf4f78e26Brian Paul span->mask[i] = 0; 40410f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 40510f30eb43835c57c00783390a02d72daf4f78e26Brian Paul m = m >> 1; 40610f30eb43835c57c00783390a02d72daf4f78e26Brian Paul if (m == 0) { 40710f30eb43835c57c00783390a02d72daf4f78e26Brian Paul m = highbit; 40810f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 40910f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 4102ef866d1fc0a5cc5ef8543d65744dfd4da4dbbafBrian Paul span->writeAll = GL_FALSE; 41110f30eb43835c57c00783390a02d72daf4f78e26Brian Paul} 41210f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 413e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 41479c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul/** 415733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul * Clip a pixel span to the current buffer/window boundaries: 416733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul * DrawBuffer->_Xmin, _Xmax, _Ymin, _Ymax. This will accomplish 417733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul * window clipping and scissoring. 418733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul * Return: GL_TRUE some pixels still visible 41910f30eb43835c57c00783390a02d72daf4f78e26Brian Paul * GL_FALSE nothing visible 42010f30eb43835c57c00783390a02d72daf4f78e26Brian Paul */ 42110f30eb43835c57c00783390a02d72daf4f78e26Brian Paulstatic GLuint 422733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paulclip_span( GLcontext *ctx, struct sw_span *span ) 42310f30eb43835c57c00783390a02d72daf4f78e26Brian Paul{ 424733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul const GLint xmin = ctx->DrawBuffer->_Xmin; 425733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul const GLint xmax = ctx->DrawBuffer->_Xmax; 426733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul const GLint ymin = ctx->DrawBuffer->_Ymin; 427733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul const GLint ymax = ctx->DrawBuffer->_Ymax; 428733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul 429733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (span->arrayMask & SPAN_XY) { 430733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* arrays of x/y pixel coords */ 431733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul const GLint *x = span->xArray; 432733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul const GLint *y = span->yArray; 433733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul const GLint n = span->end; 434733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul GLubyte *mask = span->mask; 435733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul GLint i; 436b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul if (span->arrayMask & SPAN_MASK) { 437b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul /* note: using & intead of && to reduce branches */ 438b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul for (i = 0; i < n; i++) { 439b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul mask[i] &= (x[i] >= xmin) & (x[i] < xmax) 440b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul & (y[i] >= ymin) & (y[i] < ymax); 441b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 442b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 443b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul else { 444b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul /* note: using & intead of && to reduce branches */ 445b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul for (i = 0; i < n; i++) { 446b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul mask[i] = (x[i] >= xmin) & (x[i] < xmax) 447b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul & (y[i] >= ymin) & (y[i] < ymax); 448b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 44910f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 450733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul return GL_TRUE; /* some pixels visible */ 45110f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 452733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul else { 453733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* horizontal span of pixels */ 454733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul const GLint x = span->x; 455733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul const GLint y = span->y; 456733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul const GLint n = span->end; 457733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul 458733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* Trivial rejection tests */ 459733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (y < ymin || y >= ymax || x + n <= xmin || x >= xmax) { 460733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->end = 0; 461733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul return GL_FALSE; /* all pixels clipped */ 462733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul } 46310f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 464733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* Clip to the left */ 465733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (x < xmin) { 466733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul ASSERT(x + n > xmin); 467733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->writeAll = GL_FALSE; 468733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul BZERO(span->mask, (xmin - x) * sizeof(GLubyte)); 46910f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 470733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul 471733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* Clip to right */ 472733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (x + n > xmax) { 473733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul ASSERT(x < xmax); 474733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->end = xmax - x; 47510f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 47610f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 477733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul return GL_TRUE; /* some pixels visible */ 478733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul } 47910f30eb43835c57c00783390a02d72daf4f78e26Brian Paul} 48010f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 48110f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 482e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 48379c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul/** 484e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Draw to more than one color buffer (or none). 485e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 4865071b0812fc73bcba92e2b6fcbad2f53f063fc32Brian Paulstatic void 487733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paulmulti_write_index_span( GLcontext *ctx, struct sw_span *span ) 488e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 489709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell SWcontext *swrast = SWRAST_CONTEXT(ctx); 490e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint bufferBit; 491e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 492e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* loop over four possible dest color buffers */ 493e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (bufferBit = 1; bufferBit <= 8; bufferBit = bufferBit << 1) { 494e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (bufferBit & ctx->Color.DrawDestMask) { 495e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint indexTmp[MAX_WIDTH]; 496733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul ASSERT(span->end < MAX_WIDTH); 497e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 498e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (bufferBit == FRONT_LEFT_BIT) 499e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (void) (*ctx->Driver.SetDrawBuffer)( ctx, GL_FRONT_LEFT); 500e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else if (bufferBit == FRONT_RIGHT_BIT) 501e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (void) (*ctx->Driver.SetDrawBuffer)( ctx, GL_FRONT_RIGHT); 502e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else if (bufferBit == BACK_LEFT_BIT) 503e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (void) (*ctx->Driver.SetDrawBuffer)( ctx, GL_BACK_LEFT); 504e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else 505e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (void) (*ctx->Driver.SetDrawBuffer)( ctx, GL_BACK_RIGHT); 506e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 507e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* make copy of incoming indexes */ 508733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul MEMCPY( indexTmp, span->color.index, span->end * sizeof(GLuint) ); 509733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul 510e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Color.IndexLogicOpEnabled) { 511733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul _mesa_logicop_ci_span(ctx, span, indexTmp); 512e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 513733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul 5147956292a765910077f50352d7cd0174e1e66d26cBrian Paul if (ctx->Color.IndexMask != 0xffffffff) { 515733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul _mesa_mask_index_span(ctx, span, indexTmp); 516733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul } 517733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul 518733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (span->arrayMask & SPAN_XY) { 519733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* array of pixel coords */ 520733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul (*swrast->Driver.WriteCI32Pixels)(ctx, span->end, 521733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->xArray, span->yArray, 522733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul indexTmp, span->mask); 523733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul } 524733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul else { 525733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* horizontal run of pixels */ 526733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul (*swrast->Driver.WriteCI32Span)(ctx, span->end, span->x, span->y, 527733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul indexTmp, span->mask); 528e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 529e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 530e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 531e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 532e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* restore default dest buffer */ 533e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (void) (*ctx->Driver.SetDrawBuffer)( ctx, ctx->Color.DriverDrawBuffer); 534e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 535e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 536e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 53779c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul/** 53810f30eb43835c57c00783390a02d72daf4f78e26Brian Paul * Draw to more than one RGBA color buffer (or none). 539f1e236987829393c81dc86ea19cb49eefe190317Brian Paul * All fragment operations, up to (but not) blending/logicop should 540f1e236987829393c81dc86ea19cb49eefe190317Brian Paul * have been done first. 54110f30eb43835c57c00783390a02d72daf4f78e26Brian Paul */ 54210f30eb43835c57c00783390a02d72daf4f78e26Brian Paulstatic void 543733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paulmulti_write_rgba_span( GLcontext *ctx, struct sw_span *span ) 54410f30eb43835c57c00783390a02d72daf4f78e26Brian Paul{ 54510f30eb43835c57c00783390a02d72daf4f78e26Brian Paul const GLuint colorMask = *((GLuint *) ctx->Color.ColorMask); 54610f30eb43835c57c00783390a02d72daf4f78e26Brian Paul GLuint bufferBit; 54710f30eb43835c57c00783390a02d72daf4f78e26Brian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 54810f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 549733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul ASSERT(colorMask != 0x0); 550733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul 55110f30eb43835c57c00783390a02d72daf4f78e26Brian Paul if (ctx->Color.DrawBuffer == GL_NONE) 55210f30eb43835c57c00783390a02d72daf4f78e26Brian Paul return; 55310f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 55410f30eb43835c57c00783390a02d72daf4f78e26Brian Paul /* loop over four possible dest color buffers */ 55510f30eb43835c57c00783390a02d72daf4f78e26Brian Paul for (bufferBit = 1; bufferBit <= 8; bufferBit = bufferBit << 1) { 55610f30eb43835c57c00783390a02d72daf4f78e26Brian Paul if (bufferBit & ctx->Color.DrawDestMask) { 55710f30eb43835c57c00783390a02d72daf4f78e26Brian Paul GLchan rgbaTmp[MAX_WIDTH][4]; 558733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul ASSERT(span->end < MAX_WIDTH); 55910f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 56010f30eb43835c57c00783390a02d72daf4f78e26Brian Paul if (bufferBit == FRONT_LEFT_BIT) { 56110f30eb43835c57c00783390a02d72daf4f78e26Brian Paul (void) (*ctx->Driver.SetDrawBuffer)( ctx, GL_FRONT_LEFT); 56210f30eb43835c57c00783390a02d72daf4f78e26Brian Paul ctx->DrawBuffer->Alpha = ctx->DrawBuffer->FrontLeftAlpha; 56310f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 56410f30eb43835c57c00783390a02d72daf4f78e26Brian Paul else if (bufferBit == FRONT_RIGHT_BIT) { 56510f30eb43835c57c00783390a02d72daf4f78e26Brian Paul (void) (*ctx->Driver.SetDrawBuffer)( ctx, GL_FRONT_RIGHT); 56610f30eb43835c57c00783390a02d72daf4f78e26Brian Paul ctx->DrawBuffer->Alpha = ctx->DrawBuffer->FrontRightAlpha; 56710f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 56810f30eb43835c57c00783390a02d72daf4f78e26Brian Paul else if (bufferBit == BACK_LEFT_BIT) { 56910f30eb43835c57c00783390a02d72daf4f78e26Brian Paul (void) (*ctx->Driver.SetDrawBuffer)( ctx, GL_BACK_LEFT); 57010f30eb43835c57c00783390a02d72daf4f78e26Brian Paul ctx->DrawBuffer->Alpha = ctx->DrawBuffer->BackLeftAlpha; 57110f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 57210f30eb43835c57c00783390a02d72daf4f78e26Brian Paul else { 57310f30eb43835c57c00783390a02d72daf4f78e26Brian Paul (void) (*ctx->Driver.SetDrawBuffer)( ctx, GL_BACK_RIGHT); 57410f30eb43835c57c00783390a02d72daf4f78e26Brian Paul ctx->DrawBuffer->Alpha = ctx->DrawBuffer->BackRightAlpha; 57510f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 57610f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 57710f30eb43835c57c00783390a02d72daf4f78e26Brian Paul /* make copy of incoming colors */ 578733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul MEMCPY( rgbaTmp, span->color.rgba, 4 * span->end * sizeof(GLchan) ); 57910f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 58010f30eb43835c57c00783390a02d72daf4f78e26Brian Paul if (ctx->Color.ColorLogicOpEnabled) { 581733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul _mesa_logicop_rgba_span(ctx, span, rgbaTmp); 58210f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 58310f30eb43835c57c00783390a02d72daf4f78e26Brian Paul else if (ctx->Color.BlendEnabled) { 584733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul _mesa_blend_span(ctx, span, rgbaTmp); 58510f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 586733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul 587733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (colorMask != 0xffffffff) { 588733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul _mesa_mask_rgba_span(ctx, span, rgbaTmp); 58910f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 59010f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 591733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (span->arrayMask & SPAN_XY) { 592733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* array of pixel coords */ 593733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul (*swrast->Driver.WriteRGBAPixels)(ctx, span->end, 594733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->xArray, span->yArray, 595733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul (const GLchan (*)[4]) rgbaTmp, 596733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->mask); 597733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (SWRAST_CONTEXT(ctx)->_RasterMask & ALPHABUF_BIT) { 598733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul _mesa_write_alpha_pixels(ctx, span->end, 599733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->xArray, span->yArray, 600733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul (const GLchan (*)[4]) rgbaTmp, 601733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->mask); 602733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul } 603733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul } 604733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul else { 605733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* horizontal run of pixels */ 606733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul (*swrast->Driver.WriteRGBASpan)(ctx, span->end, span->x, span->y, 607733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul (const GLchan (*)[4]) rgbaTmp, 608733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->mask); 609733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (swrast->_RasterMask & ALPHABUF_BIT) { 610733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul _mesa_write_alpha_span(ctx, span->end, span->x, span->y, 611733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul (const GLchan (*)[4]) rgbaTmp, 612733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->mask); 613733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul } 61410f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 61510f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 61610f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 61710f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 61810f30eb43835c57c00783390a02d72daf4f78e26Brian Paul /* restore default dest buffer */ 61910f30eb43835c57c00783390a02d72daf4f78e26Brian Paul (void) (*ctx->Driver.SetDrawBuffer)( ctx, ctx->Color.DriverDrawBuffer ); 62010f30eb43835c57c00783390a02d72daf4f78e26Brian Paul} 62110f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 62210f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 623e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 62479c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul/** 6257956292a765910077f50352d7cd0174e1e66d26cBrian Paul * This function may modify any of the array values in the span. 6267956292a765910077f50352d7cd0174e1e66d26cBrian Paul * span->interpMask and span->arrayMask may be changed but will be restored 6277956292a765910077f50352d7cd0174e1e66d26cBrian Paul * to their original values before returning. 62810f30eb43835c57c00783390a02d72daf4f78e26Brian Paul */ 62910f30eb43835c57c00783390a02d72daf4f78e26Brian Paulvoid 6302a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul_mesa_write_index_span( GLcontext *ctx, struct sw_span *span, 6312a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLenum primitive) 63210f30eb43835c57c00783390a02d72daf4f78e26Brian Paul{ 63310f30eb43835c57c00783390a02d72daf4f78e26Brian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 6347956292a765910077f50352d7cd0174e1e66d26cBrian Paul const GLuint origInterpMask = span->interpMask; 6352a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLuint origArrayMask = span->arrayMask; 63610f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 637733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul ASSERT(span->end <= MAX_WIDTH); 638733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul ASSERT((span->interpMask | span->arrayMask) & SPAN_INDEX); 6397956292a765910077f50352d7cd0174e1e66d26cBrian Paul ASSERT((span->interpMask & span->arrayMask) == 0); 6407956292a765910077f50352d7cd0174e1e66d26cBrian Paul 641733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (span->arrayMask & SPAN_MASK) { 642733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* mask was initialized by caller, probably glBitmap */ 643733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->writeAll = GL_FALSE; 644733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul } 645733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul else { 646733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul MEMSET(span->mask, 1, span->end); 647733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->writeAll = GL_TRUE; 64810f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 64910f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 650733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* Clipping */ 651733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if ((swrast->_RasterMask & CLIP_BIT) || (primitive == GL_BITMAP) 652b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul || (primitive == GL_POINT) || (primitive == GL_LINE)) { 653733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (!clip_span(ctx, span)) { 65486ca15ece74ccb5a8f4d566a4b2c8024b178d73bBrian Paul return; 655e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 656e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 657e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 658b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#ifdef DEBUG 659b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul if (span->arrayMask & SPAN_XY) { 660b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul int i; 661b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul for (i = 0; i < span->end; i++) { 662b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul if (span->mask[i]) { 663b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul assert(span->xArray[i] >= ctx->DrawBuffer->_Xmin); 664b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul assert(span->xArray[i] < ctx->DrawBuffer->_Xmax); 665b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul assert(span->yArray[i] >= ctx->DrawBuffer->_Ymin); 666b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul assert(span->yArray[i] < ctx->DrawBuffer->_Ymax); 667b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 668b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 669b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 670b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#endif 671b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul 672e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Polygon Stippling */ 673733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (ctx->Polygon.StippleFlag && primitive == GL_POLYGON) { 67410f30eb43835c57c00783390a02d72daf4f78e26Brian Paul stipple_polygon_span(ctx, span); 675e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 676e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 6777956292a765910077f50352d7cd0174e1e66d26cBrian Paul /* Depth test and stencil */ 6787956292a765910077f50352d7cd0174e1e66d26cBrian Paul if (ctx->Depth.Test || ctx->Stencil.Enabled) { 6797956292a765910077f50352d7cd0174e1e66d26cBrian Paul if (span->interpMask & SPAN_Z) 6807956292a765910077f50352d7cd0174e1e66d26cBrian Paul interpolate_z(ctx, span); 68110f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 6827956292a765910077f50352d7cd0174e1e66d26cBrian Paul if (ctx->Stencil.Enabled) { 68379c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul if (!_mesa_stencil_and_ztest_span(ctx, span)) { 6847956292a765910077f50352d7cd0174e1e66d26cBrian Paul span->arrayMask = origArrayMask; 6857956292a765910077f50352d7cd0174e1e66d26cBrian Paul return; 6867956292a765910077f50352d7cd0174e1e66d26cBrian Paul } 6872a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 6887956292a765910077f50352d7cd0174e1e66d26cBrian Paul else { 6897956292a765910077f50352d7cd0174e1e66d26cBrian Paul ASSERT(ctx->Depth.Test); 69079c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul if (!_mesa_depth_test_span(ctx, span)) { 6917956292a765910077f50352d7cd0174e1e66d26cBrian Paul span->arrayMask = origArrayMask; 6927956292a765910077f50352d7cd0174e1e66d26cBrian Paul return; 6937956292a765910077f50352d7cd0174e1e66d26cBrian Paul } 6942a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 69510f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 69610f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 69710f30eb43835c57c00783390a02d72daf4f78e26Brian Paul /* if we get here, something passed the depth test */ 69810f30eb43835c57c00783390a02d72daf4f78e26Brian Paul ctx->OcclusionResult = GL_TRUE; 69910f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 7007956292a765910077f50352d7cd0174e1e66d26cBrian Paul /* we have to wait until after occlusion to do this test */ 7017956292a765910077f50352d7cd0174e1e66d26cBrian Paul if (ctx->Color.DrawBuffer == GL_NONE || ctx->Color.IndexMask == 0) { 70210f30eb43835c57c00783390a02d72daf4f78e26Brian Paul /* write no pixels */ 7032a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->arrayMask = origArrayMask; 70410f30eb43835c57c00783390a02d72daf4f78e26Brian Paul return; 70510f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 70610f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 7077956292a765910077f50352d7cd0174e1e66d26cBrian Paul /* Interpolate the color indexes if needed */ 7087956292a765910077f50352d7cd0174e1e66d26cBrian Paul if (span->interpMask & SPAN_INDEX) { 7092a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul interpolate_indexes(ctx, span); 7107956292a765910077f50352d7cd0174e1e66d26cBrian Paul /* clear the bit - this allows the WriteMonoCISpan optimization below */ 7117956292a765910077f50352d7cd0174e1e66d26cBrian Paul span->interpMask &= ~SPAN_INDEX; 7127956292a765910077f50352d7cd0174e1e66d26cBrian Paul } 71310f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 7147956292a765910077f50352d7cd0174e1e66d26cBrian Paul /* Fog */ 7156e1666437ea091ecc50ab2b56d87129318f641d2Brian Paul /* XXX try to simplify the fog code! */ 7162a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul if (ctx->Fog.Enabled) { 7172a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul if ((span->arrayMask & SPAN_FOG) && !swrast->_PreferPixelFog) 7187956292a765910077f50352d7cd0174e1e66d26cBrian Paul _mesa_fog_ci_pixels_with_array( ctx, span, span->fogArray, 7197956292a765910077f50352d7cd0174e1e66d26cBrian Paul span->color.index); 7202a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul else if ((span->interpMask & SPAN_FOG) && !swrast->_PreferPixelFog) 7217956292a765910077f50352d7cd0174e1e66d26cBrian Paul _mesa_fog_ci_pixels( ctx, span, span->color.index); 7222a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul else 7237956292a765910077f50352d7cd0174e1e66d26cBrian Paul _mesa_depth_fog_ci_pixels( ctx, span, span->color.index); 724e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 725e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 7262a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul /* Antialias coverage application */ 7272a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul if (span->arrayMask & SPAN_COVERAGE) { 7282a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLuint i; 7297956292a765910077f50352d7cd0174e1e66d26cBrian Paul GLuint *index = span->color.index; 73010f30eb43835c57c00783390a02d72daf4f78e26Brian Paul for (i = 0; i < span->end; i++) { 7312a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul ASSERT(span->coverage[i] < 16); 7322a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul index[i] = (index[i] & ~0xf) | ((GLuint) (span->coverage[i])); 7335071b0812fc73bcba92e2b6fcbad2f53f063fc32Brian Paul } 7342a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul } 7355071b0812fc73bcba92e2b6fcbad2f53f063fc32Brian Paul 7362a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul if (swrast->_RasterMask & MULTI_DRAW_BIT) { 7372a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul /* draw to zero or two or more buffers */ 738733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul multi_write_index_span(ctx, span); 739e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 740e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 7412a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul /* normal situation: draw to exactly one buffer */ 7422a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul if (ctx->Color.IndexLogicOpEnabled) { 743733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul _mesa_logicop_ci_span(ctx, span, span->color.index); 74410f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 7452a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul 7467956292a765910077f50352d7cd0174e1e66d26cBrian Paul if (ctx->Color.IndexMask != 0xffffffff) { 747733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul _mesa_mask_index_span(ctx, span, span->color.index); 748e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 7492a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul 7502a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul /* write pixels */ 751733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (span->arrayMask & SPAN_XY) { 752733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* array of pixel coords */ 753733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if ((span->interpMask & SPAN_INDEX) && span->indexStep == 0) { 754733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* all pixels have same color index */ 755733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul (*swrast->Driver.WriteMonoCIPixels)(ctx, span->end, 756733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->xArray, span->yArray, 757733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul FixedToInt(span->index), 758733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->mask); 759733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul } 760733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul else { 761733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul (*swrast->Driver.WriteCI32Pixels)(ctx, span->end, span->xArray, 762733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->yArray, span->color.index, 763733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->mask ); 764733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul } 7657956292a765910077f50352d7cd0174e1e66d26cBrian Paul } 7667956292a765910077f50352d7cd0174e1e66d26cBrian Paul else { 767733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* horizontal run of pixels */ 768733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if ((span->interpMask & SPAN_INDEX) && span->indexStep == 0) { 769733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* all pixels have same color index */ 770733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul (*swrast->Driver.WriteMonoCISpan)(ctx, span->end, span->x, span->y, 771733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul FixedToInt(span->index), 772733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->mask); 773733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul } 774733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul else { 775733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul (*swrast->Driver.WriteCI32Span)(ctx, span->end, span->x, span->y, 776733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->color.index, span->mask); 777733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul } 7787956292a765910077f50352d7cd0174e1e66d26cBrian Paul } 779e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 7802a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul 7817956292a765910077f50352d7cd0174e1e66d26cBrian Paul span->interpMask = origInterpMask; 7822a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->arrayMask = origArrayMask; 783e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 784e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 785e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 78679c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul/** 7877956292a765910077f50352d7cd0174e1e66d26cBrian Paul * This function may modify any of the array values in the span. 7887956292a765910077f50352d7cd0174e1e66d26cBrian Paul * span->interpMask and span->arrayMask may be changed but will be restored 7897956292a765910077f50352d7cd0174e1e66d26cBrian Paul * to their original values before returning. 7905d2621928823a06006c1586efe78fe8bf65a7e1fBrian Paul */ 7915071b0812fc73bcba92e2b6fcbad2f53f063fc32Brian Paulvoid 79210f30eb43835c57c00783390a02d72daf4f78e26Brian Paul_mesa_write_rgba_span( GLcontext *ctx, struct sw_span *span, 7932a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul GLenum primitive) 794e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 795cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell SWcontext *swrast = SWRAST_CONTEXT(ctx); 7967956292a765910077f50352d7cd0174e1e66d26cBrian Paul const GLuint colorMask = *((GLuint *) ctx->Color.ColorMask); 7977956292a765910077f50352d7cd0174e1e66d26cBrian Paul const GLuint origInterpMask = span->interpMask; 7982a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul const GLuint origArrayMask = span->arrayMask; 7997956292a765910077f50352d7cd0174e1e66d26cBrian Paul GLboolean monoColor; 8007956292a765910077f50352d7cd0174e1e66d26cBrian Paul 801733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul ASSERT(span->end <= MAX_WIDTH); 8027956292a765910077f50352d7cd0174e1e66d26cBrian Paul ASSERT((span->interpMask & span->arrayMask) == 0); 803ceb39f4f8dc4863fde17d668c752533a2184476eBrian Paul ASSERT((span->interpMask | span->arrayMask) & SPAN_RGBA); 804733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (ctx->Fog.Enabled) 805733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul ASSERT((span->interpMask | span->arrayMask) & SPAN_FOG); 806733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul 807733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* 808733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul printf("%s() interp 0x%x array 0x%x p=0x%x\n", __FUNCTION__, span->interpMask, span->arrayMask, primitive); 809733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul */ 810e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 811733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (span->arrayMask & SPAN_MASK) { 812733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* mask was initialized by caller, probably glBitmap */ 813733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->writeAll = GL_FALSE; 814733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul } 815733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul else { 816733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul MEMSET(span->mask, 1, span->end); 817733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->writeAll = GL_TRUE; 818733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul } 819e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 8207956292a765910077f50352d7cd0174e1e66d26cBrian Paul /* Determine if we have mono-chromatic colors */ 8217956292a765910077f50352d7cd0174e1e66d26cBrian Paul monoColor = (span->interpMask & SPAN_RGBA) && 8227956292a765910077f50352d7cd0174e1e66d26cBrian Paul span->redStep == 0 && span->greenStep == 0 && 8237956292a765910077f50352d7cd0174e1e66d26cBrian Paul span->blueStep == 0 && span->alphaStep == 0; 8247956292a765910077f50352d7cd0174e1e66d26cBrian Paul 825733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* Clipping */ 826733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if ((swrast->_RasterMask & CLIP_BIT) || (primitive == GL_BITMAP) 827b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul || (primitive == GL_POINT) || (primitive == GL_LINE)) { 828733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (!clip_span(ctx, span)) { 82986ca15ece74ccb5a8f4d566a4b2c8024b178d73bBrian Paul return; 830e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 831e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 832e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 833b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#ifdef DEBUG 834b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul if (span->arrayMask & SPAN_XY) { 835b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul int i; 836b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul for (i = 0; i < span->end; i++) { 837b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul if (span->mask[i]) { 838b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul assert(span->xArray[i] >= ctx->DrawBuffer->_Xmin); 839b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul assert(span->xArray[i] < ctx->DrawBuffer->_Xmax); 840b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul assert(span->yArray[i] >= ctx->DrawBuffer->_Ymin); 841b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul assert(span->yArray[i] < ctx->DrawBuffer->_Ymax); 842b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 843b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 844b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 845b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#endif 846b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul 847e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Polygon Stippling */ 8487956292a765910077f50352d7cd0174e1e66d26cBrian Paul if (ctx->Polygon.StippleFlag && primitive == GL_POLYGON) { 8497956292a765910077f50352d7cd0174e1e66d26cBrian Paul stipple_polygon_span(ctx, span); 85010f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 85110f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 852e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Do the alpha test */ 853e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Color.AlphaEnabled) { 854ceb39f4f8dc4863fde17d668c752533a2184476eBrian Paul if (!_mesa_alpha_test(ctx, span)) { 8557956292a765910077f50352d7cd0174e1e66d26cBrian Paul span->interpMask = origInterpMask; 8562a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul span->arrayMask = origArrayMask; 857e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return; 858e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 85910f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 86010f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 861f1e236987829393c81dc86ea19cb49eefe190317Brian Paul /* Stencil and Z testing */ 862f1e236987829393c81dc86ea19cb49eefe190317Brian Paul if (ctx->Stencil.Enabled || ctx->Depth.Test) { 863f1e236987829393c81dc86ea19cb49eefe190317Brian Paul if (span->interpMask & SPAN_Z) 864f1e236987829393c81dc86ea19cb49eefe190317Brian Paul interpolate_z(ctx, span); 865f1e236987829393c81dc86ea19cb49eefe190317Brian Paul 866f1e236987829393c81dc86ea19cb49eefe190317Brian Paul if (ctx->Stencil.Enabled) { 867f1e236987829393c81dc86ea19cb49eefe190317Brian Paul if (!_mesa_stencil_and_ztest_span(ctx, span)) { 8687956292a765910077f50352d7cd0174e1e66d26cBrian Paul span->interpMask = origInterpMask; 869f1e236987829393c81dc86ea19cb49eefe190317Brian Paul span->arrayMask = origArrayMask; 870f1e236987829393c81dc86ea19cb49eefe190317Brian Paul return; 87110f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 87210f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 87310f30eb43835c57c00783390a02d72daf4f78e26Brian Paul else { 874f1e236987829393c81dc86ea19cb49eefe190317Brian Paul ASSERT(ctx->Depth.Test); 875f1e236987829393c81dc86ea19cb49eefe190317Brian Paul ASSERT(span->arrayMask & SPAN_Z); 876f1e236987829393c81dc86ea19cb49eefe190317Brian Paul /* regular depth testing */ 877f1e236987829393c81dc86ea19cb49eefe190317Brian Paul if (!_mesa_depth_test_span(ctx, span)) { 8787956292a765910077f50352d7cd0174e1e66d26cBrian Paul span->interpMask = origInterpMask; 879f1e236987829393c81dc86ea19cb49eefe190317Brian Paul span->arrayMask = origArrayMask; 880f1e236987829393c81dc86ea19cb49eefe190317Brian Paul return; 88110f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 88210f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 883e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 884e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 885e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* if we get here, something passed the depth test */ 886e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ctx->OcclusionResult = GL_TRUE; 887e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 8887956292a765910077f50352d7cd0174e1e66d26cBrian Paul /* can't abort span-writing until after occlusion testing */ 8897956292a765910077f50352d7cd0174e1e66d26cBrian Paul if (colorMask == 0x0) { 8907956292a765910077f50352d7cd0174e1e66d26cBrian Paul span->interpMask = origInterpMask; 8917956292a765910077f50352d7cd0174e1e66d26cBrian Paul span->arrayMask = origArrayMask; 8927956292a765910077f50352d7cd0174e1e66d26cBrian Paul return; 8937956292a765910077f50352d7cd0174e1e66d26cBrian Paul } 8947956292a765910077f50352d7cd0174e1e66d26cBrian Paul 895ceb39f4f8dc4863fde17d668c752533a2184476eBrian Paul /* Now we may need to interpolate the colors */ 896ceb39f4f8dc4863fde17d668c752533a2184476eBrian Paul if ((span->interpMask & SPAN_RGBA) && (span->arrayMask & SPAN_RGBA) == 0) { 897ceb39f4f8dc4863fde17d668c752533a2184476eBrian Paul interpolate_colors(ctx, span); 898ceb39f4f8dc4863fde17d668c752533a2184476eBrian Paul /* clear the bit - this allows the WriteMonoCISpan optimization below */ 899ceb39f4f8dc4863fde17d668c752533a2184476eBrian Paul span->interpMask &= ~SPAN_RGBA; 900ceb39f4f8dc4863fde17d668c752533a2184476eBrian Paul } 901ceb39f4f8dc4863fde17d668c752533a2184476eBrian Paul 9026e1666437ea091ecc50ab2b56d87129318f641d2Brian Paul /* Fog */ 9036e1666437ea091ecc50ab2b56d87129318f641d2Brian Paul /* XXX try to simplify the fog code! */ 904b38ad54c41aec2d08fdd26a4a8ea4dcdca8b1dfdBrian Paul if (ctx->Fog.Enabled) { 905733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if ((span->arrayMask & SPAN_FOG) && !swrast->_PreferPixelFog) { 9067956292a765910077f50352d7cd0174e1e66d26cBrian Paul _mesa_fog_rgba_pixels_with_array(ctx, span, span->fogArray, 9077956292a765910077f50352d7cd0174e1e66d26cBrian Paul span->color.rgba); 908733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul } 909733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul else if ((span->interpMask & SPAN_FOG) && !swrast->_PreferPixelFog) { 9107956292a765910077f50352d7cd0174e1e66d26cBrian Paul _mesa_fog_rgba_pixels(ctx, span, span->color.rgba); 911733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul } 912f1e236987829393c81dc86ea19cb49eefe190317Brian Paul else { 913f1e236987829393c81dc86ea19cb49eefe190317Brian Paul if ((span->interpMask & SPAN_Z) && (span->arrayMask & SPAN_Z) == 0) 914f1e236987829393c81dc86ea19cb49eefe190317Brian Paul interpolate_z(ctx, span); 9157956292a765910077f50352d7cd0174e1e66d26cBrian Paul _mesa_depth_fog_rgba_pixels(ctx, span, span->color.rgba); 916f1e236987829393c81dc86ea19cb49eefe190317Brian Paul } 9177956292a765910077f50352d7cd0174e1e66d26cBrian Paul monoColor = GL_FALSE; 918b38ad54c41aec2d08fdd26a4a8ea4dcdca8b1dfdBrian Paul } 919b38ad54c41aec2d08fdd26a4a8ea4dcdca8b1dfdBrian Paul 9205071b0812fc73bcba92e2b6fcbad2f53f063fc32Brian Paul /* Antialias coverage application */ 9212a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul if (span->arrayMask & SPAN_COVERAGE) { 9227956292a765910077f50352d7cd0174e1e66d26cBrian Paul GLchan (*rgba)[4] = span->color.rgba; 9235071b0812fc73bcba92e2b6fcbad2f53f063fc32Brian Paul GLuint i; 92410f30eb43835c57c00783390a02d72daf4f78e26Brian Paul for (i = 0; i < span->end; i++) { 92510f30eb43835c57c00783390a02d72daf4f78e26Brian Paul rgba[i][ACOMP] = (GLchan) (rgba[i][ACOMP] * span->coverage[i]); 9265071b0812fc73bcba92e2b6fcbad2f53f063fc32Brian Paul } 9277956292a765910077f50352d7cd0174e1e66d26cBrian Paul monoColor = GL_FALSE; 9285071b0812fc73bcba92e2b6fcbad2f53f063fc32Brian Paul } 9295071b0812fc73bcba92e2b6fcbad2f53f063fc32Brian Paul 930cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell if (swrast->_RasterMask & MULTI_DRAW_BIT) { 931733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul multi_write_rgba_span(ctx, span); 932e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 933e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 934e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* normal: write to exactly one buffer */ 935733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul#if 1 936e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Color.ColorLogicOpEnabled) { 937733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul _mesa_logicop_rgba_span(ctx, span, span->color.rgba); 9387956292a765910077f50352d7cd0174e1e66d26cBrian Paul monoColor = GL_FALSE; 939e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 940e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else if (ctx->Color.BlendEnabled) { 941733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul _mesa_blend_span(ctx, span, span->color.rgba); 9427956292a765910077f50352d7cd0174e1e66d26cBrian Paul monoColor = GL_FALSE; 943e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 944733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul#endif 945e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Color component masking */ 9467956292a765910077f50352d7cd0174e1e66d26cBrian Paul if (colorMask != 0xffffffff) { 947733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul _mesa_mask_rgba_span(ctx, span, span->color.rgba); 9487956292a765910077f50352d7cd0174e1e66d26cBrian Paul monoColor = GL_FALSE; 949e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 950e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 951e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* write pixels */ 952733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (span->arrayMask & SPAN_XY) { 953733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* array of pixel coords */ 954733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* XXX test for mono color */ 955733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul (*swrast->Driver.WriteRGBAPixels)(ctx, span->end, span->xArray, 956733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->yArray, (const GLchan (*)[4]) span->color.rgba, span->mask); 957733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (SWRAST_CONTEXT(ctx)->_RasterMask & ALPHABUF_BIT) { 958733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul _mesa_write_alpha_pixels(ctx, span->end, 959733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->xArray, span->yArray, 960733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul (const GLchan (*)[4]) span->color.rgba, 961733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->mask); 962733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul } 963e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 964e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 965733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* horizontal run of pixels */ 966733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (monoColor) { 967733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* all pixels have same color */ 968733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul GLchan color[4]; 969733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul color[RCOMP] = FixedToChan(span->red); 970733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul color[GCOMP] = FixedToChan(span->green); 971733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul color[BCOMP] = FixedToChan(span->blue); 972733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul color[ACOMP] = FixedToChan(span->alpha); 973733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul (*swrast->Driver.WriteMonoRGBASpan)(ctx, span->end, span->x, 974733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->y, color, span->mask); 975733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* XXX software alpha buffer writes! */ 976733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul } 977733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul else { 978733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* each pixel is a different color */ 979733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul (*swrast->Driver.WriteRGBASpan)(ctx, span->end, span->x, span->y, 9807956292a765910077f50352d7cd0174e1e66d26cBrian Paul (const GLchan (*)[4]) span->color.rgba, 981733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->writeAll ? ((const GLubyte *) NULL) : span->mask); 982733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (swrast->_RasterMask & ALPHABUF_BIT) { 983733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul _mesa_write_alpha_span(ctx, span->end, span->x, span->y, 9847956292a765910077f50352d7cd0174e1e66d26cBrian Paul (const GLchan (*)[4]) span->color.rgba, 985733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->writeAll ? ((const GLubyte *) NULL) : span->mask); 986733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul } 987733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul } 988e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 989e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 990e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 9917956292a765910077f50352d7cd0174e1e66d26cBrian Paul span->interpMask = origInterpMask; 9927956292a765910077f50352d7cd0174e1e66d26cBrian Paul span->arrayMask = origArrayMask; 9937956292a765910077f50352d7cd0174e1e66d26cBrian Paul} 994e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 995e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 99679c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul/** 997e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Add specular color to base color. This is used only when 998f1e236987829393c81dc86ea19cb49eefe190317Brian Paul * GL_LIGHT_MODEL_COLOR_CONTROL = GL_SEPARATE_SPECULAR_COLOR. 999e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 10005071b0812fc73bcba92e2b6fcbad2f53f063fc32Brian Paulstatic void 1001f1e236987829393c81dc86ea19cb49eefe190317Brian Pauladd_colors(GLuint n, GLchan rgba[][4], GLchan specular[][4] ) 1002e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 1003e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 1004f1e236987829393c81dc86ea19cb49eefe190317Brian Paul for (i = 0; i < n; i++) { 10054fa5c1966a985f81c615a9f5ef2f64dd466b252aBrian Paul#if CHAN_TYPE == GL_FLOAT 10064fa5c1966a985f81c615a9f5ef2f64dd466b252aBrian Paul /* no clamping */ 1007f1e236987829393c81dc86ea19cb49eefe190317Brian Paul rgba[i][RCOMP] += specular[i][RCOMP]; 1008f1e236987829393c81dc86ea19cb49eefe190317Brian Paul rgba[i][GCOMP] += specular[i][GCOMP]; 1009f1e236987829393c81dc86ea19cb49eefe190317Brian Paul rgba[i][BCOMP] += specular[i][BCOMP]; 10104fa5c1966a985f81c615a9f5ef2f64dd466b252aBrian Paul#else 1011f1e236987829393c81dc86ea19cb49eefe190317Brian Paul GLint r = rgba[i][RCOMP] + specular[i][RCOMP]; 1012f1e236987829393c81dc86ea19cb49eefe190317Brian Paul GLint g = rgba[i][GCOMP] + specular[i][GCOMP]; 1013f1e236987829393c81dc86ea19cb49eefe190317Brian Paul GLint b = rgba[i][BCOMP] + specular[i][BCOMP]; 1014e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][RCOMP] = (GLchan) MIN2(r, CHAN_MAX); 1015e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][GCOMP] = (GLchan) MIN2(g, CHAN_MAX); 1016e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][BCOMP] = (GLchan) MIN2(b, CHAN_MAX); 10174fa5c1966a985f81c615a9f5ef2f64dd466b252aBrian Paul#endif 1018e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1019e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 1020e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1021e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 102279c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul/** 1023f1e236987829393c81dc86ea19cb49eefe190317Brian Paul * This function may modify any of the array values in the span. 10247956292a765910077f50352d7cd0174e1e66d26cBrian Paul * span->interpMask and span->arrayMask may be changed but will be restored 10257956292a765910077f50352d7cd0174e1e66d26cBrian Paul * to their original values before returning. 102678940758e90069ceaca2b6cddb6438488fbad5ccBrian Paul */ 102778940758e90069ceaca2b6cddb6438488fbad5ccBrian Paulvoid 102878940758e90069ceaca2b6cddb6438488fbad5ccBrian Paul_mesa_write_texture_span( GLcontext *ctx, struct sw_span *span, 1029f1e236987829393c81dc86ea19cb49eefe190317Brian Paul GLenum primitive ) 103078940758e90069ceaca2b6cddb6438488fbad5ccBrian Paul{ 103178940758e90069ceaca2b6cddb6438488fbad5ccBrian Paul const GLuint colorMask = *((GLuint *) ctx->Color.ColorMask); 103278940758e90069ceaca2b6cddb6438488fbad5ccBrian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 1033f1e236987829393c81dc86ea19cb49eefe190317Brian Paul const GLuint origArrayMask = span->arrayMask; 1034f1e236987829393c81dc86ea19cb49eefe190317Brian Paul 1035733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul ASSERT(span->end <= MAX_WIDTH); 10367956292a765910077f50352d7cd0174e1e66d26cBrian Paul ASSERT((span->interpMask & span->arrayMask) == 0); 1037f1e236987829393c81dc86ea19cb49eefe190317Brian Paul ASSERT(ctx->Texture._ReallyEnabled); 103878940758e90069ceaca2b6cddb6438488fbad5ccBrian Paul 1039ceb39f4f8dc4863fde17d668c752533a2184476eBrian Paul /* 1040ceb39f4f8dc4863fde17d668c752533a2184476eBrian Paul printf("%s() interp 0x%x array 0x%x\n", __FUNCTION__, span->interpMask, span->arrayMask); 1041ceb39f4f8dc4863fde17d668c752533a2184476eBrian Paul */ 1042ceb39f4f8dc4863fde17d668c752533a2184476eBrian Paul 1043733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (span->arrayMask & SPAN_MASK) { 1044733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* mask was initialized by caller, probably glBitmap */ 1045733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->writeAll = GL_FALSE; 1046733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul } 1047733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul else { 1048733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul MEMSET(span->mask, 1, span->end); 1049733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->writeAll = GL_TRUE; 105078940758e90069ceaca2b6cddb6438488fbad5ccBrian Paul } 105178940758e90069ceaca2b6cddb6438488fbad5ccBrian Paul 1052733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* Clipping */ 1053733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if ((swrast->_RasterMask & CLIP_BIT) || (primitive == GL_BITMAP) 1054b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul || (primitive == GL_POINT) || (primitive == GL_LINE)) { 1055733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (!clip_span(ctx, span)) { 1056733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul return; 105778940758e90069ceaca2b6cddb6438488fbad5ccBrian Paul } 105878940758e90069ceaca2b6cddb6438488fbad5ccBrian Paul } 105978940758e90069ceaca2b6cddb6438488fbad5ccBrian Paul 1060b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#ifdef DEBUG 1061b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul if (span->arrayMask & SPAN_XY) { 1062b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul int i; 1063b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul for (i = 0; i < span->end; i++) { 1064b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul if (span->mask[i]) { 1065b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul assert(span->xArray[i] >= ctx->DrawBuffer->_Xmin); 1066b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul assert(span->xArray[i] < ctx->DrawBuffer->_Xmax); 1067b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul assert(span->yArray[i] >= ctx->DrawBuffer->_Ymin); 1068b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul assert(span->yArray[i] < ctx->DrawBuffer->_Ymax); 1069b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 1070b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 1071b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 1072b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#endif 1073b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul 107478940758e90069ceaca2b6cddb6438488fbad5ccBrian Paul /* Polygon Stippling */ 1075733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (ctx->Polygon.StippleFlag && primitive == GL_POLYGON) { 1076733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul stipple_polygon_span(ctx, span); 107778940758e90069ceaca2b6cddb6438488fbad5ccBrian Paul } 107878940758e90069ceaca2b6cddb6438488fbad5ccBrian Paul 1079f1e236987829393c81dc86ea19cb49eefe190317Brian Paul /* Need texture coordinates now */ 1080f1e236987829393c81dc86ea19cb49eefe190317Brian Paul if ((span->interpMask & SPAN_TEXTURE) 1081f1e236987829393c81dc86ea19cb49eefe190317Brian Paul && (span->arrayMask & SPAN_TEXTURE) == 0) 1082f1e236987829393c81dc86ea19cb49eefe190317Brian Paul interpolate_texcoords(ctx, span); 108378940758e90069ceaca2b6cddb6438488fbad5ccBrian Paul 108478940758e90069ceaca2b6cddb6438488fbad5ccBrian Paul /* Texture with alpha test */ 108578940758e90069ceaca2b6cddb6438488fbad5ccBrian Paul if (ctx->Color.AlphaEnabled) { 1086f1e236987829393c81dc86ea19cb49eefe190317Brian Paul 1087f1e236987829393c81dc86ea19cb49eefe190317Brian Paul /* Now we need the rgba array, fill it in if needed */ 1088f1e236987829393c81dc86ea19cb49eefe190317Brian Paul if ((span->interpMask & SPAN_RGBA) && (span->arrayMask & SPAN_RGBA) == 0) 1089f1e236987829393c81dc86ea19cb49eefe190317Brian Paul interpolate_colors(ctx, span); 1090f1e236987829393c81dc86ea19cb49eefe190317Brian Paul 109178940758e90069ceaca2b6cddb6438488fbad5ccBrian Paul /* Texturing without alpha is done after depth-testing which 1092f1e236987829393c81dc86ea19cb49eefe190317Brian Paul * gives a potential speed-up. 1093f1e236987829393c81dc86ea19cb49eefe190317Brian Paul */ 1094f1e236987829393c81dc86ea19cb49eefe190317Brian Paul _swrast_multitexture_fragments( ctx, span ); 109578940758e90069ceaca2b6cddb6438488fbad5ccBrian Paul 109678940758e90069ceaca2b6cddb6438488fbad5ccBrian Paul /* Do the alpha test */ 1097ceb39f4f8dc4863fde17d668c752533a2184476eBrian Paul if (!_mesa_alpha_test(ctx, span)) { 1098f1e236987829393c81dc86ea19cb49eefe190317Brian Paul span->arrayMask = origArrayMask; 1099ceb39f4f8dc4863fde17d668c752533a2184476eBrian Paul return; 110078940758e90069ceaca2b6cddb6438488fbad5ccBrian Paul } 110178940758e90069ceaca2b6cddb6438488fbad5ccBrian Paul } 110278940758e90069ceaca2b6cddb6438488fbad5ccBrian Paul 1103f1e236987829393c81dc86ea19cb49eefe190317Brian Paul /* Stencil and Z testing */ 1104f1e236987829393c81dc86ea19cb49eefe190317Brian Paul if (ctx->Stencil.Enabled || ctx->Depth.Test) { 1105f1e236987829393c81dc86ea19cb49eefe190317Brian Paul if (span->interpMask & SPAN_Z) 1106f1e236987829393c81dc86ea19cb49eefe190317Brian Paul interpolate_z(ctx, span); 110778940758e90069ceaca2b6cddb6438488fbad5ccBrian Paul 110871340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul if (ctx->Stencil.Enabled) { 1109f1e236987829393c81dc86ea19cb49eefe190317Brian Paul if (!_mesa_stencil_and_ztest_span(ctx, span)) { 1110f1e236987829393c81dc86ea19cb49eefe190317Brian Paul span->arrayMask = origArrayMask; 111110f30eb43835c57c00783390a02d72daf4f78e26Brian Paul return; 1112f1e236987829393c81dc86ea19cb49eefe190317Brian Paul } 111371340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul } 1114f1e236987829393c81dc86ea19cb49eefe190317Brian Paul else { 1115f1e236987829393c81dc86ea19cb49eefe190317Brian Paul ASSERT(ctx->Depth.Test); 1116f1e236987829393c81dc86ea19cb49eefe190317Brian Paul ASSERT(span->arrayMask & SPAN_Z); 111710f30eb43835c57c00783390a02d72daf4f78e26Brian Paul /* regular depth testing */ 1118f1e236987829393c81dc86ea19cb49eefe190317Brian Paul if (!_mesa_depth_test_span(ctx, span)) { 1119f1e236987829393c81dc86ea19cb49eefe190317Brian Paul span->arrayMask = origArrayMask; 112010f30eb43835c57c00783390a02d72daf4f78e26Brian Paul return; 1121f1e236987829393c81dc86ea19cb49eefe190317Brian Paul } 112271340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul } 112371340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul } 112471340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul 1125f1e236987829393c81dc86ea19cb49eefe190317Brian Paul /* if we get here, some fragments passed the depth test */ 112671340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul ctx->OcclusionResult = GL_TRUE; 112771340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul 1128f1e236987829393c81dc86ea19cb49eefe190317Brian Paul /* We had to wait until now to check for glColorMask(F,F,F,F) because of 1129f1e236987829393c81dc86ea19cb49eefe190317Brian Paul * the occlusion test. 1130f1e236987829393c81dc86ea19cb49eefe190317Brian Paul */ 1131f1e236987829393c81dc86ea19cb49eefe190317Brian Paul if (colorMask == 0x0) { 1132f1e236987829393c81dc86ea19cb49eefe190317Brian Paul span->arrayMask = origArrayMask; 1133f1e236987829393c81dc86ea19cb49eefe190317Brian Paul return; 113471340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul } 113571340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul 1136f1e236987829393c81dc86ea19cb49eefe190317Brian Paul /* Texture without alpha test */ 1137f1e236987829393c81dc86ea19cb49eefe190317Brian Paul if (!ctx->Color.AlphaEnabled) { 113871340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul 1139f1e236987829393c81dc86ea19cb49eefe190317Brian Paul /* Now we need the rgba array, fill it in if needed */ 1140f1e236987829393c81dc86ea19cb49eefe190317Brian Paul if ((span->interpMask & SPAN_RGBA) && (span->arrayMask & SPAN_RGBA) == 0) 1141f1e236987829393c81dc86ea19cb49eefe190317Brian Paul interpolate_colors(ctx, span); 114271340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul 1143f1e236987829393c81dc86ea19cb49eefe190317Brian Paul _swrast_multitexture_fragments( ctx, span ); 114471340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul } 114571340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul 1146f1e236987829393c81dc86ea19cb49eefe190317Brian Paul ASSERT(span->arrayMask & SPAN_RGBA); 11472ef866d1fc0a5cc5ef8543d65744dfd4da4dbbafBrian Paul 1148f1e236987829393c81dc86ea19cb49eefe190317Brian Paul /* Add base and specular colors */ 1149f1e236987829393c81dc86ea19cb49eefe190317Brian Paul if (ctx->Fog.ColorSumEnabled || 1150f1e236987829393c81dc86ea19cb49eefe190317Brian Paul (ctx->Light.Enabled && 1151f1e236987829393c81dc86ea19cb49eefe190317Brian Paul ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR)) { 1152f1e236987829393c81dc86ea19cb49eefe190317Brian Paul if (span->interpMask & SPAN_SPEC) { 1153f1e236987829393c81dc86ea19cb49eefe190317Brian Paul interpolate_specular(ctx, span); 115471340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul } 1155f1e236987829393c81dc86ea19cb49eefe190317Brian Paul ASSERT(span->arrayMask & SPAN_SPEC); 1156f1e236987829393c81dc86ea19cb49eefe190317Brian Paul add_colors( span->end, span->color.rgba, span->specArray ); 115771340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul } 115871340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul 11596e1666437ea091ecc50ab2b56d87129318f641d2Brian Paul /* Fog */ 11606e1666437ea091ecc50ab2b56d87129318f641d2Brian Paul /* XXX try to simplify the fog code! */ 116171340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul if (ctx->Fog.Enabled) { 1162f1e236987829393c81dc86ea19cb49eefe190317Brian Paul if ((span->arrayMask & SPAN_FOG) && !swrast->_PreferPixelFog) 1163f1e236987829393c81dc86ea19cb49eefe190317Brian Paul _mesa_fog_rgba_pixels_with_array( ctx, span, span->fogArray, 1164f1e236987829393c81dc86ea19cb49eefe190317Brian Paul span->color.rgba); 1165f1e236987829393c81dc86ea19cb49eefe190317Brian Paul else if ((span->interpMask & SPAN_FOG) && !swrast->_PreferPixelFog) 1166f1e236987829393c81dc86ea19cb49eefe190317Brian Paul _mesa_fog_rgba_pixels( ctx, span, span->color.rgba ); 1167f1e236987829393c81dc86ea19cb49eefe190317Brian Paul else { 1168f1e236987829393c81dc86ea19cb49eefe190317Brian Paul if ((span->interpMask & SPAN_Z) && (span->arrayMask & SPAN_Z) == 0) 1169f1e236987829393c81dc86ea19cb49eefe190317Brian Paul interpolate_z(ctx, span); 1170f1e236987829393c81dc86ea19cb49eefe190317Brian Paul _mesa_depth_fog_rgba_pixels(ctx, span, span->color.rgba); 1171f1e236987829393c81dc86ea19cb49eefe190317Brian Paul } 117271340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul } 1173f1e236987829393c81dc86ea19cb49eefe190317Brian Paul 117471340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul /* Antialias coverage application */ 11752a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul if (span->arrayMask & SPAN_COVERAGE) { 1176f1e236987829393c81dc86ea19cb49eefe190317Brian Paul GLchan (*rgba)[4] = span->color.rgba; 117771340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul GLuint i; 117810f30eb43835c57c00783390a02d72daf4f78e26Brian Paul for (i = 0; i < span->end; i++) { 117910f30eb43835c57c00783390a02d72daf4f78e26Brian Paul rgba[i][ACOMP] = (GLchan) (rgba[i][ACOMP] * span->coverage[i]); 118071340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul } 118171340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul } 118271340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul 118371340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul if (swrast->_RasterMask & MULTI_DRAW_BIT) { 1184733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul multi_write_rgba_span(ctx, span); 118571340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul } 118671340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul else { 118771340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul /* normal: write to exactly one buffer */ 118871340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul if (ctx->Color.ColorLogicOpEnabled) { 1189733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul _mesa_logicop_rgba_span(ctx, span, span->color.rgba); 119071340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul } 119171340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul else if (ctx->Color.BlendEnabled) { 1192733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul _mesa_blend_span(ctx, span, span->color.rgba); 119371340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul } 119471340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul 1195f1e236987829393c81dc86ea19cb49eefe190317Brian Paul if (colorMask != 0xffffffff) { 1196733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul _mesa_mask_rgba_span(ctx, span, span->color.rgba); 119771340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul } 119871340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul 1199733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul 1200733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (span->arrayMask & SPAN_XY) { 1201733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* array of pixel coords */ 1202733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul (*swrast->Driver.WriteRGBAPixels)(ctx, span->end, span->xArray, 1203733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->yArray, (const GLchan (*)[4]) span->color.rgba, span->mask); 1204733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (SWRAST_CONTEXT(ctx)->_RasterMask & ALPHABUF_BIT) { 1205733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul _mesa_write_alpha_pixels(ctx, span->end, 1206733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->xArray, span->yArray, 1207733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul (const GLchan (*)[4]) span->color.rgba, 1208733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->mask); 1209733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul } 1210733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul } 1211733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul else { 1212733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* horizontal run of pixels */ 1213733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul (*swrast->Driver.WriteRGBASpan)(ctx, span->end, span->x, span->y, 1214f1e236987829393c81dc86ea19cb49eefe190317Brian Paul (const GLchan (*)[4]) span->color.rgba, 1215733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->writeAll ? NULL : span->mask); 1216733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (swrast->_RasterMask & ALPHABUF_BIT) { 1217733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul _mesa_write_alpha_span(ctx, span->end, span->x, span->y, 1218733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul (const GLchan (*)[4]) span->color.rgba, 1219733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->writeAll ? NULL : span->mask); 1220733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul } 122171340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul } 122271340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul } 122371340e861edf35bfdeb536718cd230fc33c41ee2Brian Paul 1224f1e236987829393c81dc86ea19cb49eefe190317Brian Paul span->arrayMask = origArrayMask; 122510f30eb43835c57c00783390a02d72daf4f78e26Brian Paul} 122610f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 1227e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1228e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 122979c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul/** 1230e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Read RGBA pixels from frame buffer. Clipping will be done to prevent 1231e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * reading ouside the buffer's boundaries. 1232e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 12335071b0812fc73bcba92e2b6fcbad2f53f063fc32Brian Paulvoid 12345071b0812fc73bcba92e2b6fcbad2f53f063fc32Brian Paul_mesa_read_rgba_span( GLcontext *ctx, GLframebuffer *buffer, 12355071b0812fc73bcba92e2b6fcbad2f53f063fc32Brian Paul GLuint n, GLint x, GLint y, GLchan rgba[][4] ) 1236e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 1237709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell SWcontext *swrast = SWRAST_CONTEXT(ctx); 1238e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (y < 0 || y >= buffer->Height 1239e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell || x + (GLint) n < 0 || x >= buffer->Width) { 1240e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* completely above, below, or right */ 1241e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* XXX maybe leave undefined? */ 1242e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell BZERO(rgba, 4 * n * sizeof(GLchan)); 1243e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1244e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 1245e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint skip, length; 1246e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (x < 0) { 1247e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* left edge clippping */ 1248e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell skip = -x; 1249e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell length = (GLint) n - skip; 1250e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (length < 0) { 1251e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* completely left of window */ 1252e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return; 1253e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1254e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (length > buffer->Width) { 1255e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell length = buffer->Width; 1256e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1257e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1258e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else if ((GLint) (x + n) > buffer->Width) { 1259e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* right edge clipping */ 1260e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell skip = 0; 1261e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell length = buffer->Width - x; 1262e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (length < 0) { 1263e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* completely to right of window */ 1264e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return; 1265e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1266e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1267e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 1268e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* no clipping */ 1269e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell skip = 0; 1270e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell length = (GLint) n; 1271e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1272e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1273709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell (*swrast->Driver.ReadRGBASpan)( ctx, length, x + skip, y, rgba + skip ); 1274e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (buffer->UseSoftwareAlphaBuffers) { 1275733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul _mesa_read_alpha_span(ctx, length, x + skip, y, rgba + skip); 1276e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1277e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1278e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 1279e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1280e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 128179c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul/** 1282e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Read CI pixels from frame buffer. Clipping will be done to prevent 1283e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * reading ouside the buffer's boundaries. 1284e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 12855071b0812fc73bcba92e2b6fcbad2f53f063fc32Brian Paulvoid 12865071b0812fc73bcba92e2b6fcbad2f53f063fc32Brian Paul_mesa_read_index_span( GLcontext *ctx, GLframebuffer *buffer, 12875071b0812fc73bcba92e2b6fcbad2f53f063fc32Brian Paul GLuint n, GLint x, GLint y, GLuint indx[] ) 1288e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 1289709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell SWcontext *swrast = SWRAST_CONTEXT(ctx); 1290e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (y < 0 || y >= buffer->Height 1291e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell || x + (GLint) n < 0 || x >= buffer->Width) { 1292e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* completely above, below, or right */ 1293e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell BZERO(indx, n * sizeof(GLuint)); 1294e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1295e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 1296e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint skip, length; 1297e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (x < 0) { 1298e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* left edge clippping */ 1299e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell skip = -x; 1300e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell length = (GLint) n - skip; 1301e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (length < 0) { 1302e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* completely left of window */ 1303e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return; 1304e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1305e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (length > buffer->Width) { 1306e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell length = buffer->Width; 1307e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1308e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1309e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else if ((GLint) (x + n) > buffer->Width) { 1310e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* right edge clipping */ 1311e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell skip = 0; 1312e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell length = buffer->Width - x; 1313e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (length < 0) { 1314e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* completely to right of window */ 1315e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return; 1316e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1317e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1318e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 1319e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* no clipping */ 1320e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell skip = 0; 1321e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell length = (GLint) n; 1322e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1323e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1324709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell (*swrast->Driver.ReadCI32Span)( ctx, length, skip + x, y, indx + skip ); 1325e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1326e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 1327