s_lines.c revision 64b4298181373d64ef2226935f70e9062536de8b
164b4298181373d64ef2226935f70e9062536de8bBrian Paul/* $Id: s_lines.c,v 1.34 2003/01/20 15:21:41 brianp Exp $ */ 2e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 3e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 4e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Mesa 3-D graphics library 522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul * Version: 5.1 622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * 764b4298181373d64ef2226935f70e9062536de8bBrian Paul * Copyright (C) 1999-2003 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 28e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "glheader.h" 2946b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell#include "colormac.h" 30e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "macros.h" 31e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "mmath.h" 320070d398d13759adc519f9bc764ffd39bc88890eBrian Paul#include "s_aaline.h" 33cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#include "s_context.h" 34e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_depth.h" 35cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#include "s_feedback.h" 36b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#include "s_lines.h" 37b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#include "s_span.h" 38e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 39e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 40b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/* 41b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul * Init the mask[] array to implement a line stipple. 42b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul */ 43b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paulstatic void 44b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paulcompute_stipple_mask( GLcontext *ctx, GLuint len, GLubyte mask[] ) 45b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul{ 46b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 47b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul GLuint i; 48e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 49b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul for (i = 0; i < len; i++) { 50b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul GLuint bit = (swrast->StippleCounter / ctx->Line.StippleFactor) & 0xf; 51b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul if ((1 << bit) & ctx->Line.StipplePattern) { 52b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul mask[i] = GL_TRUE; 53b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 54b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul else { 55b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul mask[i] = GL_FALSE; 56b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 57b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul swrast->StippleCounter++; 58b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 59b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul} 60e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 61e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 62e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 63b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul * To draw a wide line we can simply redraw the span N times, side by side. 64e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 65b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paulstatic void 66b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Pauldraw_wide_line( GLcontext *ctx, struct sw_span *span, GLboolean xMajor ) 67e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 68b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul GLint width, start; 69cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 70b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul ASSERT(span->end < MAX_WIDTH); 71e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 72b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul width = (GLint) CLAMP( ctx->Line.Width, MIN_LINE_WIDTH, MAX_LINE_WIDTH ); 73e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 74b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul if (width & 1) 75b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul start = width / 2; 76b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul else 77b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul start = width / 2 - 1; 78b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul 79b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul if (xMajor) { 8077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul GLint *y = span->array->y; 81a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul GLuint i; 82a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul GLint w; 83b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul for (w = 0; w < width; w++) { 84b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul if (w == 0) { 85b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul for (i = 0; i < span->end; i++) 8677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul y[i] -= start; 87b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 88b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul else { 89b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul for (i = 0; i < span->end; i++) 9077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul y[i]++; 91b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 92b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul if ((span->interpMask | span->arrayMask) & SPAN_TEXTURE) 93b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul _mesa_write_texture_span(ctx, span); 94b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul else if ((span->interpMask | span->arrayMask) & SPAN_RGBA) 95b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul _mesa_write_rgba_span(ctx, span); 96b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul else 97b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul _mesa_write_index_span(ctx, span); 98b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 99b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 100b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul else { 10177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul GLint *x = span->array->x; 102a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul GLuint i; 103a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul GLint w; 104b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul for (w = 0; w < width; w++) { 105b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul if (w == 0) { 106b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul for (i = 0; i < span->end; i++) 10777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul x[i] -= start; 108b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 109b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul else { 110b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul for (i = 0; i < span->end; i++) 11177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul x[i]++; 112b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 113b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul if ((span->interpMask | span->arrayMask) & SPAN_TEXTURE) 114b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul _mesa_write_texture_span(ctx, span); 115b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul else if ((span->interpMask | span->arrayMask) & SPAN_RGBA) 116b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul _mesa_write_rgba_span(ctx, span); 117b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul else 118b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul _mesa_write_index_span(ctx, span); 119b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 120b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 121e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 122e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 123e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 124e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 125b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/**********************************************************************/ 126b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/***** Rasterization *****/ 127b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/**********************************************************************/ 128b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul 129b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul 13022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Simple color index line (no stipple, width=1, no Z, no fog, no tex)*/ 13122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME simple_ci_line 13222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_INDEX 13322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define RENDER_SPAN(span) _mesa_write_index_span(ctx, &span) 134e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h" 135e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 136e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 13722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Simple RGBA index line (no stipple, width=1, no Z, no fog, no tex)*/ 13822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME simple_rgba_line 13922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_RGBA 14022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define RENDER_SPAN(span) _mesa_write_rgba_span(ctx, &span); 141e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h" 142e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 143e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 14422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Z, fog, wide, stipple color index line */ 14522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME general_ci_line 14622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_INDEX 14722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_Z 14822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_FOG 14922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define RENDER_SPAN(span) \ 15022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul if (ctx->Line.StippleFlag) { \ 15122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul span.arrayMask |= SPAN_MASK; \ 15222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul compute_stipple_mask(ctx, span.end, span.array->mask); \ 15322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul } \ 15422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul if (ctx->Line.Width > 1.0) { \ 15522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul draw_wide_line(ctx, &span, dx > dy); \ 15622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul } \ 15722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul else { \ 15822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul _mesa_write_index_span(ctx, &span); \ 159b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 160e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h" 161e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 162e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 16322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Z, fog, wide, stipple RGBA line */ 16422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME general_rgba_line 16522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_RGBA 16622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_Z 16722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_FOG 16822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define RENDER_SPAN(span) \ 16922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul if (ctx->Line.StippleFlag) { \ 17022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul span.arrayMask |= SPAN_MASK; \ 17122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul compute_stipple_mask(ctx, span.end, span.array->mask); \ 17222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul } \ 17322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul if (ctx->Line.Width > 1.0) { \ 17422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul draw_wide_line(ctx, &span, dx > dy); \ 17522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul } \ 17622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul else { \ 17722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul _mesa_write_rgba_span(ctx, &span); \ 178e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 179e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h" 180b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul 181e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 18222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Single-texture line, w/ fog, Z, specular, etc. */ 18322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME textured_line 18422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_RGBA 18522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_Z 18622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_FOG 18722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_TEX 18822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define RENDER_SPAN(span) \ 18922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul if (ctx->Line.StippleFlag) { \ 19022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul span.arrayMask |= SPAN_MASK; \ 19122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul compute_stipple_mask(ctx, span.end, span.array->mask); \ 19222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul } \ 19322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul if (ctx->Line.Width > 1.0) { \ 19422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul draw_wide_line(ctx, &span, dx > dy); \ 19522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul } \ 19622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul else { \ 19722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul _mesa_write_texture_span(ctx, &span); \ 198e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 199e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h" 200b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul 201e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 20222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Multi-texture or separate specular line, w/ fog, Z, specular, etc. */ 20322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME multitextured_line 20422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_RGBA 20522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_SPEC 20622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_Z 20722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_FOG 20822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_MULTITEX 20922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define RENDER_SPAN(span) \ 21022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul if (ctx->Line.StippleFlag) { \ 21122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul span.arrayMask |= SPAN_MASK; \ 21222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul compute_stipple_mask(ctx, span.end, span.array->mask); \ 21322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul } \ 21422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul if (ctx->Line.Width > 1.0) { \ 21522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul draw_wide_line(ctx, &span, dx > dy); \ 21622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul } \ 21722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul else { \ 21822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul _mesa_write_texture_span(ctx, &span); \ 219e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 220e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h" 221b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul 222e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 223e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 22422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paulvoid 22522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul_swrast_add_spec_terms_line( GLcontext *ctx, 22622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul const SWvertex *v0, 22722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul const SWvertex *v1 ) 22846b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell{ 22946b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell SWvertex *ncv0 = (SWvertex *)v0; 23046b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell SWvertex *ncv1 = (SWvertex *)v1; 23146b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell GLchan c[2][4]; 23246b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell COPY_CHAN4( c[0], ncv0->color ); 23346b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell COPY_CHAN4( c[1], ncv1->color ); 23446b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell ACC_3V( ncv0->color, ncv0->specular ); 23546b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell ACC_3V( ncv1->color, ncv1->specular ); 23646b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell SWRAST_CONTEXT(ctx)->SpecLine( ctx, ncv0, ncv1 ); 23746b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell COPY_CHAN4( ncv0->color, c[0] ); 23846b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell COPY_CHAN4( ncv1->color, c[1] ); 23946b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell} 24046b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell 241e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 242e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DEBUG 243ba41b8afb1b40b967cf5c0e604bbf09793eb8feeBrian Paulextern void 244ba41b8afb1b40b967cf5c0e604bbf09793eb8feeBrian Paul_mesa_print_line_function(GLcontext *ctx); /* silence compiler warning */ 245e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellvoid 246e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell_mesa_print_line_function(GLcontext *ctx) 247e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 248cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell SWcontext *swrast = SWRAST_CONTEXT(ctx); 249cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 25068a7ee5cbbc93c0e746dc843e0fcc1e65ad1baf6Brian Paul _mesa_printf("Line Func == "); 25122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul if (swrast->Line == simple_ci_line) 25222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul _mesa_printf("simple_ci_line\n"); 25322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul else if (swrast->Line == simple_rgba_line) 25422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul _mesa_printf("simple_rgba_line\n"); 25522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul else if (swrast->Line == general_ci_line) 25622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul _mesa_printf("general_ci_line\n"); 25722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul else if (swrast->Line == general_rgba_line) 25822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul _mesa_printf("general_rgba_line\n"); 25922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul else if (swrast->Line == textured_line) 26022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul _mesa_printf("textured_line\n"); 26122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul else if (swrast->Line == multitextured_line) 26222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul _mesa_printf("multitextured_line\n"); 263e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else 26468a7ee5cbbc93c0e746dc843e0fcc1e65ad1baf6Brian Paul _mesa_printf("Driver func %p\n", (void *) swrast->Line); 265e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 266e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 267e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 268e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 269e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 270233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#ifdef DEBUG 271233aafbb30594d0193b00705d0532be97060ebd1Brian Paul 272233aafbb30594d0193b00705d0532be97060ebd1Brian Paul/* record the current line function name */ 273233aafbb30594d0193b00705d0532be97060ebd1Brian Paulstatic const char *lineFuncName = NULL; 274233aafbb30594d0193b00705d0532be97060ebd1Brian Paul 275233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#define USE(lineFunc) \ 276233aafbb30594d0193b00705d0532be97060ebd1Brian Pauldo { \ 277233aafbb30594d0193b00705d0532be97060ebd1Brian Paul lineFuncName = #lineFunc; \ 27868a7ee5cbbc93c0e746dc843e0fcc1e65ad1baf6Brian Paul /*_mesa_printf("%s\n", lineFuncName);*/ \ 279233aafbb30594d0193b00705d0532be97060ebd1Brian Paul swrast->Line = lineFunc; \ 280233aafbb30594d0193b00705d0532be97060ebd1Brian Paul} while (0) 281233aafbb30594d0193b00705d0532be97060ebd1Brian Paul 282233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#else 283233aafbb30594d0193b00705d0532be97060ebd1Brian Paul 284c123a9b2edc5852cb50485f344219508254081a8Brian Paul#define USE(lineFunc) swrast->Line = lineFunc 285233aafbb30594d0193b00705d0532be97060ebd1Brian Paul 286233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#endif 287233aafbb30594d0193b00705d0532be97060ebd1Brian Paul 288233aafbb30594d0193b00705d0532be97060ebd1Brian Paul 289233aafbb30594d0193b00705d0532be97060ebd1Brian Paul 290e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 291e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Determine which line drawing function to use given the current 292e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * rendering context. 293e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 294e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Please update the summary flag _SWRAST_NEW_LINE if you add or remove 295e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * tests to this code. 296e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 297e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellvoid 298cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell_swrast_choose_line( GLcontext *ctx ) 299e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 300cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell SWcontext *swrast = SWRAST_CONTEXT(ctx); 301b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul const GLboolean rgbmode = ctx->Visual.rgbMode; 302e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 303b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul if (ctx->RenderMode == GL_RENDER) { 304e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Line.SmoothFlag) { 305e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* antialiased lines */ 3060070d398d13759adc519f9bc764ffd39bc88890eBrian Paul _swrast_choose_aa_line_function(ctx); 30764b4298181373d64ef2226935f70e9062536de8bBrian Paul ASSERT(swrast->Line); 308e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 3098afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul else if (ctx->Texture._EnabledUnits) { 31022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul /* textured lines */ 31122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul if (ctx->Texture._EnabledUnits > 0x1 || (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR)) { 312e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* multi-texture and/or separate specular color */ 31322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul USE(multitextured_line); 314e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 315e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 31622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul USE(textured_line); 317e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 318e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 31922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul else if (ctx->Depth.Test || ctx->Fog.Enabled || ctx->Line.Width != 1.0 32022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul || ctx->Line.StippleFlag) { 32122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul /* no texture, but Z, fog, width>1, stipple, etc. */ 32222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul if (rgbmode) 32322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul USE(general_rgba_line); 32422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul else 32522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul USE(general_ci_line); 32622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul } 327e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 32822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul /* simplest lines */ 32922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul if (rgbmode) 33022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul USE(simple_rgba_line); 33122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul else 33222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul USE(simple_ci_line); 333e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 334e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 335b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul else if (ctx->RenderMode == GL_FEEDBACK) { 336233aafbb30594d0193b00705d0532be97060ebd1Brian Paul USE(_mesa_feedback_line); 337e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 338e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 339b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul ASSERT(ctx->RenderMode == GL_SELECT); 340233aafbb30594d0193b00705d0532be97060ebd1Brian Paul USE(_mesa_select_line); 341e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 342e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 343e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /*_mesa_print_line_function(ctx);*/ 344e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 345