1e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 2e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Mesa 3-D graphics library 3efda5cb6263631175aa2efe46df9322b3c5775eeBrian * Version: 7.1 422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * 59ede048127ea71282fd97e01516dedcfb03e2a23Brian * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. 622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * 7e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 8e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * copy of this software and associated documentation files (the "Software"), 9e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * to deal in the Software without restriction, including without limitation 10e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * and/or sell copies of the Software, and to permit persons to whom the 12e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Software is furnished to do so, subject to the following conditions: 1322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * 14e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * The above copyright notice and this permission notice shall be included 15e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * in all copies or substantial portions of the Software. 1622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * 17e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 24e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 25e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 26bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/glheader.h" 27bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/context.h" 28bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/colormac.h" 29bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/macros.h" 300070d398d13759adc519f9bc764ffd39bc88890eBrian Paul#include "s_aaline.h" 31cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#include "s_context.h" 32cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#include "s_feedback.h" 33b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#include "s_lines.h" 34b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#include "s_span.h" 35e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 36e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 37b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/* 38b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul * Init the mask[] array to implement a line stipple. 39b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul */ 40b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paulstatic void 41f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergcompute_stipple_mask( struct gl_context *ctx, GLuint len, GLubyte mask[] ) 42b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul{ 43b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 44b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul GLuint i; 45e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 46b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul for (i = 0; i < len; i++) { 47b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul GLuint bit = (swrast->StippleCounter / ctx->Line.StippleFactor) & 0xf; 48b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul if ((1 << bit) & ctx->Line.StipplePattern) { 49b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul mask[i] = GL_TRUE; 50b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 51b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul else { 52b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul mask[i] = GL_FALSE; 53b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 54b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul swrast->StippleCounter++; 55b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 56b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul} 57e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 58e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 59e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 60b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul * To draw a wide line we can simply redraw the span N times, side by side. 61e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 62b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paulstatic void 63f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergdraw_wide_line( struct gl_context *ctx, SWspan *span, GLboolean xMajor ) 64e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 65af2aa8e9cf88a9ee3ec338eddc9a47bf2f142cb7Brian const GLint width = (GLint) CLAMP(ctx->Line.Width, 66af2aa8e9cf88a9ee3ec338eddc9a47bf2f142cb7Brian ctx->Const.MinLineWidth, 67af2aa8e9cf88a9ee3ec338eddc9a47bf2f142cb7Brian ctx->Const.MaxLineWidth); 68af2aa8e9cf88a9ee3ec338eddc9a47bf2f142cb7Brian GLint start; 69cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 7047d88ef204b42a9220c6be3e98c92df9c9aa0860Brian Paul ASSERT(span->end < SWRAST_MAX_WIDTH); 71e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 72b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul if (width & 1) 73b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul start = width / 2; 74b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul else 75b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul start = width / 2 - 1; 76b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul 77b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul if (xMajor) { 7877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul GLint *y = span->array->y; 79a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul GLuint i; 80a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul GLint w; 81b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul for (w = 0; w < width; w++) { 82b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul if (w == 0) { 83b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul for (i = 0; i < span->end; i++) 8477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul y[i] -= start; 85b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 86b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul else { 87b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul for (i = 0; i < span->end; i++) 8877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul y[i]++; 89b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 90e6df80184b0c7e83eba382b3161ba11db497c55dIan Romanick _swrast_write_rgba_span(ctx, span); 91b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 92b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 93b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul else { 9477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul GLint *x = span->array->x; 95a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul GLuint i; 96a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul GLint w; 97b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul for (w = 0; w < width; w++) { 98b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul if (w == 0) { 99b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul for (i = 0; i < span->end; i++) 10077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul x[i] -= start; 101b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 102b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul else { 103b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul for (i = 0; i < span->end; i++) 10477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul x[i]++; 105b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 106e6df80184b0c7e83eba382b3161ba11db497c55dIan Romanick _swrast_write_rgba_span(ctx, span); 107b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 108b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 109e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 110e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 111e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 112e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 113b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/**********************************************************************/ 114b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/***** Rasterization *****/ 115b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/**********************************************************************/ 116b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul 11722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Simple RGBA index line (no stipple, width=1, no Z, no fog, no tex)*/ 1189e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian#define NAME simple_no_z_rgba_line 11922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_RGBA 12045bc887da226403f2c41077e40ca38b6f60f1359Brian Paul#define RENDER_SPAN(span) _swrast_write_rgba_span(ctx, &span); 121e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h" 122e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 123e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 12422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Z, fog, wide, stipple RGBA line */ 1259e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian#define NAME rgba_line 12622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_RGBA 12722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_Z 12822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define RENDER_SPAN(span) \ 12922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul if (ctx->Line.StippleFlag) { \ 13022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul span.arrayMask |= SPAN_MASK; \ 13122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul compute_stipple_mask(ctx, span.end, span.array->mask); \ 13222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul } \ 133af2aa8e9cf88a9ee3ec338eddc9a47bf2f142cb7Brian if (ctx->Line.Width > 1.0) { \ 134dc24230de7f913969b52dee3579bb8fa3d50a8c0Karl Schultz draw_wide_line(ctx, &span, (GLboolean)(dx > dy)); \ 13522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul } \ 13622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul else { \ 13745bc887da226403f2c41077e40ca38b6f60f1359Brian Paul _swrast_write_rgba_span(ctx, &span); \ 138e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 139e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h" 140b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul 141e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1429e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian/* General-purpose line (any/all features). */ 1439e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian#define NAME general_line 14422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_RGBA 14522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_Z 1469ede048127ea71282fd97e01516dedcfb03e2a23Brian#define INTERP_ATTRIBS 14722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define RENDER_SPAN(span) \ 14822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul if (ctx->Line.StippleFlag) { \ 14922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul span.arrayMask |= SPAN_MASK; \ 15022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul compute_stipple_mask(ctx, span.end, span.array->mask); \ 15122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul } \ 152af2aa8e9cf88a9ee3ec338eddc9a47bf2f142cb7Brian if (ctx->Line.Width > 1.0) { \ 153dc24230de7f913969b52dee3579bb8fa3d50a8c0Karl Schultz draw_wide_line(ctx, &span, (GLboolean)(dx > dy)); \ 15422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul } \ 15522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul else { \ 156a803b0c891404dcd7c376e91f6a033cd4e42abc3Brian Paul _swrast_write_rgba_span(ctx, &span); \ 157e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 158e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h" 159b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul 160e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 161e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 16222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paulvoid 163f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_add_spec_terms_line(struct gl_context *ctx, 1649e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian const SWvertex *v0, const SWvertex *v1) 16546b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell{ 16646b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell SWvertex *ncv0 = (SWvertex *)v0; 16746b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell SWvertex *ncv1 = (SWvertex *)v1; 1689e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian GLfloat rSum, gSum, bSum; 1699e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian GLchan cSave[2][4]; 1709e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian 1719e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian /* save original colors */ 1729e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian COPY_CHAN4(cSave[0], ncv0->color); 1739e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian COPY_CHAN4(cSave[1], ncv1->color); 1749e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian /* sum v0 */ 1759e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian rSum = CHAN_TO_FLOAT(ncv0->color[0]) + ncv0->attrib[FRAG_ATTRIB_COL1][0]; 1769e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian gSum = CHAN_TO_FLOAT(ncv0->color[1]) + ncv0->attrib[FRAG_ATTRIB_COL1][1]; 1779e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian bSum = CHAN_TO_FLOAT(ncv0->color[2]) + ncv0->attrib[FRAG_ATTRIB_COL1][2]; 1789e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian UNCLAMPED_FLOAT_TO_CHAN(ncv0->color[0], rSum); 1799e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian UNCLAMPED_FLOAT_TO_CHAN(ncv0->color[1], gSum); 1809e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian UNCLAMPED_FLOAT_TO_CHAN(ncv0->color[2], bSum); 1819e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian /* sum v1 */ 1829e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian rSum = CHAN_TO_FLOAT(ncv1->color[0]) + ncv1->attrib[FRAG_ATTRIB_COL1][0]; 1839e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian gSum = CHAN_TO_FLOAT(ncv1->color[1]) + ncv1->attrib[FRAG_ATTRIB_COL1][1]; 1849e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian bSum = CHAN_TO_FLOAT(ncv1->color[2]) + ncv1->attrib[FRAG_ATTRIB_COL1][2]; 1859e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian UNCLAMPED_FLOAT_TO_CHAN(ncv1->color[0], rSum); 1869e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian UNCLAMPED_FLOAT_TO_CHAN(ncv1->color[1], gSum); 1879e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian UNCLAMPED_FLOAT_TO_CHAN(ncv1->color[2], bSum); 1889e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian /* draw */ 18946b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell SWRAST_CONTEXT(ctx)->SpecLine( ctx, ncv0, ncv1 ); 1909e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian /* restore original colors */ 191ba6f47132d057937cb55f5aaf9b79bd667b7a48dBrian Paul COPY_CHAN4(ncv0->color, cSave[0]); 192ba6f47132d057937cb55f5aaf9b79bd667b7a48dBrian Paul COPY_CHAN4(ncv1->color, cSave[1]); 19346b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell} 19446b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell 195e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 196e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 197233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#ifdef DEBUG 198233aafbb30594d0193b00705d0532be97060ebd1Brian Paul 199233aafbb30594d0193b00705d0532be97060ebd1Brian Paul/* record the current line function name */ 200233aafbb30594d0193b00705d0532be97060ebd1Brian Paulstatic const char *lineFuncName = NULL; 201233aafbb30594d0193b00705d0532be97060ebd1Brian Paul 202233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#define USE(lineFunc) \ 203233aafbb30594d0193b00705d0532be97060ebd1Brian Pauldo { \ 204233aafbb30594d0193b00705d0532be97060ebd1Brian Paul lineFuncName = #lineFunc; \ 205298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg /*printf("%s\n", lineFuncName);*/ \ 206233aafbb30594d0193b00705d0532be97060ebd1Brian Paul swrast->Line = lineFunc; \ 207233aafbb30594d0193b00705d0532be97060ebd1Brian Paul} while (0) 208233aafbb30594d0193b00705d0532be97060ebd1Brian Paul 209233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#else 210233aafbb30594d0193b00705d0532be97060ebd1Brian Paul 211c123a9b2edc5852cb50485f344219508254081a8Brian Paul#define USE(lineFunc) swrast->Line = lineFunc 212233aafbb30594d0193b00705d0532be97060ebd1Brian Paul 213233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#endif 214233aafbb30594d0193b00705d0532be97060ebd1Brian Paul 215233aafbb30594d0193b00705d0532be97060ebd1Brian Paul 216233aafbb30594d0193b00705d0532be97060ebd1Brian Paul 2179e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian/** 218e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Determine which line drawing function to use given the current 219e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * rendering context. 220e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 221e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Please update the summary flag _SWRAST_NEW_LINE if you add or remove 222e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * tests to this code. 223e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 224e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellvoid 225f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_choose_line( struct gl_context *ctx ) 226e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 227cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell SWcontext *swrast = SWRAST_CONTEXT(ctx); 2289e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian GLboolean specular = (ctx->Fog.ColorSumEnabled || 2299e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian (ctx->Light.Enabled && 2309e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR)); 231e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 232b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul if (ctx->RenderMode == GL_RENDER) { 233e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Line.SmoothFlag) { 234e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* antialiased lines */ 2350070d398d13759adc519f9bc764ffd39bc88890eBrian Paul _swrast_choose_aa_line_function(ctx); 23664b4298181373d64ef2226935f70e9062536de8bBrian Paul ASSERT(swrast->Line); 237e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 238ccea3ff8a9eae16d2ca11b9cedef1318cffe3fb4Brian else if (ctx->Texture._EnabledCoordUnits 2391c0f1dd42a50464eeb81de4aad8eecf24b3d6c89Chad Versace || _swrast_use_fragment_program(ctx) 2409e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian || swrast->_FogEnabled 2419e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian || specular) { 2429e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian USE(general_line); 243e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 2449e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian else if (ctx->Depth.Test 245af2aa8e9cf88a9ee3ec338eddc9a47bf2f142cb7Brian || ctx->Line.Width != 1.0 24622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul || ctx->Line.StippleFlag) { 24722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul /* no texture, but Z, fog, width>1, stipple, etc. */ 248efda5cb6263631175aa2efe46df9322b3c5775eeBrian#if CHAN_BITS == 32 249e6df80184b0c7e83eba382b3161ba11db497c55dIan Romanick USE(general_line); 250efda5cb6263631175aa2efe46df9322b3c5775eeBrian#else 251e6df80184b0c7e83eba382b3161ba11db497c55dIan Romanick USE(rgba_line); 252efda5cb6263631175aa2efe46df9322b3c5775eeBrian#endif 25322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul } 254e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 2559e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian ASSERT(!ctx->Depth.Test); 256af2aa8e9cf88a9ee3ec338eddc9a47bf2f142cb7Brian ASSERT(ctx->Line.Width == 1.0); 2579e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian /* simple lines */ 258e6df80184b0c7e83eba382b3161ba11db497c55dIan Romanick USE(simple_no_z_rgba_line); 259e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 260e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 261b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul else if (ctx->RenderMode == GL_FEEDBACK) { 26245bc887da226403f2c41077e40ca38b6f60f1359Brian Paul USE(_swrast_feedback_line); 263e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 264e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 265b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul ASSERT(ctx->RenderMode == GL_SELECT); 26645bc887da226403f2c41077e40ca38b6f60f1359Brian Paul USE(_swrast_select_line); 267e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 268e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 269