s_lines.c revision a803b0c891404dcd7c376e91f6a033cd4e42abc3
1e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 2e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Mesa 3-D graphics library 3a803b0c891404dcd7c376e91f6a033cd4e42abc3Brian Paul * Version: 6.3 422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * 5a803b0c891404dcd7c376e91f6a033cd4e42abc3Brian Paul * Copyright (C) 1999-2004 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 26e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "glheader.h" 2729b4076f9acff96a867760fc885f5eaeb7586977Brian Paul#include "context.h" 2846b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell#include "colormac.h" 29e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "macros.h" 30853bda3e7c4dfa7d8cc462729f6a3dce89e44963Brian Paul#include "nvfragprog.h" 310070d398d13759adc519f9bc764ffd39bc88890eBrian Paul#include "s_aaline.h" 32cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#include "s_context.h" 33e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_depth.h" 34cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#include "s_feedback.h" 35b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#include "s_lines.h" 36b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#include "s_span.h" 37e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 38e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 39b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/* 40b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul * Init the mask[] array to implement a line stipple. 41b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul */ 42b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paulstatic void 43b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paulcompute_stipple_mask( GLcontext *ctx, GLuint len, GLubyte mask[] ) 44b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul{ 45b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 46b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul GLuint i; 47e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 48b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul for (i = 0; i < len; i++) { 49b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul GLuint bit = (swrast->StippleCounter / ctx->Line.StippleFactor) & 0xf; 50b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul if ((1 << bit) & ctx->Line.StipplePattern) { 51b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul mask[i] = GL_TRUE; 52b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 53b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul else { 54b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul mask[i] = GL_FALSE; 55b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 56b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul swrast->StippleCounter++; 57b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 58b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul} 59e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 60e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 61e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 62b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul * To draw a wide line we can simply redraw the span N times, side by side. 63e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 64b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paulstatic void 65b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Pauldraw_wide_line( GLcontext *ctx, struct sw_span *span, GLboolean xMajor ) 66e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 67b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul GLint width, start; 68cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 69b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul ASSERT(span->end < MAX_WIDTH); 70e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 71b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul width = (GLint) CLAMP( ctx->Line.Width, MIN_LINE_WIDTH, MAX_LINE_WIDTH ); 72e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 73b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul if (width & 1) 74b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul start = width / 2; 75b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul else 76b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul start = width / 2 - 1; 77b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul 78b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul if (xMajor) { 7977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul GLint *y = span->array->y; 80a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul GLuint i; 81a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul GLint w; 82b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul for (w = 0; w < width; w++) { 83b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul if (w == 0) { 84b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul for (i = 0; i < span->end; i++) 8577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul y[i] -= start; 86b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 87b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul else { 88b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul for (i = 0; i < span->end; i++) 8977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul y[i]++; 90b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 91a803b0c891404dcd7c376e91f6a033cd4e42abc3Brian Paul if (ctx->Visual.rgbMode) 9245bc887da226403f2c41077e40ca38b6f60f1359Brian Paul _swrast_write_rgba_span(ctx, span); 93b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul else 9445bc887da226403f2c41077e40ca38b6f60f1359Brian Paul _swrast_write_index_span(ctx, span); 95b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 96b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 97b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul else { 9877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul GLint *x = span->array->x; 99a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul GLuint i; 100a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul GLint w; 101b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul for (w = 0; w < width; w++) { 102b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul if (w == 0) { 103b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul for (i = 0; i < span->end; i++) 10477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul x[i] -= start; 105b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 106b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul else { 107b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul for (i = 0; i < span->end; i++) 10877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul x[i]++; 109b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 110a803b0c891404dcd7c376e91f6a033cd4e42abc3Brian Paul if (ctx->Visual.rgbMode) 11145bc887da226403f2c41077e40ca38b6f60f1359Brian Paul _swrast_write_rgba_span(ctx, span); 112b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul else 11345bc887da226403f2c41077e40ca38b6f60f1359Brian Paul _swrast_write_index_span(ctx, span); 114b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 115b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 116e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 117e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 118e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 119e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 120b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/**********************************************************************/ 121b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/***** Rasterization *****/ 122b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/**********************************************************************/ 123b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul 12422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Simple color index line (no stipple, width=1, no Z, no fog, no tex)*/ 12522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME simple_ci_line 12622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_INDEX 12745bc887da226403f2c41077e40ca38b6f60f1359Brian Paul#define RENDER_SPAN(span) _swrast_write_index_span(ctx, &span) 128e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h" 129e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 13022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Simple RGBA index line (no stipple, width=1, no Z, no fog, no tex)*/ 13122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME simple_rgba_line 13222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_RGBA 13345bc887da226403f2c41077e40ca38b6f60f1359Brian Paul#define RENDER_SPAN(span) _swrast_write_rgba_span(ctx, &span); 134e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h" 135e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 136e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 13722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Z, fog, wide, stipple color index line */ 13822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME general_ci_line 13922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_INDEX 14022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_Z 14122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_FOG 14222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define RENDER_SPAN(span) \ 14322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul if (ctx->Line.StippleFlag) { \ 14422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul span.arrayMask |= SPAN_MASK; \ 145dc24230de7f913969b52dee3579bb8fa3d50a8c0Karl Schultz compute_stipple_mask(ctx, span.end, span.array->mask); \ 14622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul } \ 14722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul if (ctx->Line.Width > 1.0) { \ 148dc24230de7f913969b52dee3579bb8fa3d50a8c0Karl Schultz draw_wide_line(ctx, &span, (GLboolean)(dx > dy)); \ 14922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul } \ 15022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul else { \ 15145bc887da226403f2c41077e40ca38b6f60f1359Brian Paul _swrast_write_index_span(ctx, &span); \ 152b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul } 153e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h" 154e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 155e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 15622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Z, fog, wide, stipple RGBA line */ 15722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME general_rgba_line 15822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_RGBA 15922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_Z 16022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_FOG 16122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define RENDER_SPAN(span) \ 16222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul if (ctx->Line.StippleFlag) { \ 16322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul span.arrayMask |= SPAN_MASK; \ 16422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul compute_stipple_mask(ctx, span.end, span.array->mask); \ 16522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul } \ 16622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul if (ctx->Line.Width > 1.0) { \ 167dc24230de7f913969b52dee3579bb8fa3d50a8c0Karl Schultz draw_wide_line(ctx, &span, (GLboolean)(dx > dy)); \ 16822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul } \ 16922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul else { \ 17045bc887da226403f2c41077e40ca38b6f60f1359Brian Paul _swrast_write_rgba_span(ctx, &span); \ 171e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 172e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h" 173b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul 174e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 17522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Single-texture line, w/ fog, Z, specular, etc. */ 17622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME textured_line 17722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_RGBA 17822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_Z 17922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_FOG 18022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_TEX 18122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define RENDER_SPAN(span) \ 18222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul if (ctx->Line.StippleFlag) { \ 18322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul span.arrayMask |= SPAN_MASK; \ 18422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul compute_stipple_mask(ctx, span.end, span.array->mask); \ 18522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul } \ 18622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul if (ctx->Line.Width > 1.0) { \ 187dc24230de7f913969b52dee3579bb8fa3d50a8c0Karl Schultz draw_wide_line(ctx, &span, (GLboolean)(dx > dy)); \ 18822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul } \ 18922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul else { \ 190a803b0c891404dcd7c376e91f6a033cd4e42abc3Brian Paul _swrast_write_rgba_span(ctx, &span); \ 191e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 192e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h" 193b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul 194e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 19522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Multi-texture or separate specular line, w/ fog, Z, specular, etc. */ 19622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME multitextured_line 19722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_RGBA 19822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_SPEC 19922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_Z 20022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_FOG 20122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_MULTITEX 20222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define RENDER_SPAN(span) \ 20322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul if (ctx->Line.StippleFlag) { \ 20422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul span.arrayMask |= SPAN_MASK; \ 20522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul compute_stipple_mask(ctx, span.end, span.array->mask); \ 20622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul } \ 20722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul if (ctx->Line.Width > 1.0) { \ 208dc24230de7f913969b52dee3579bb8fa3d50a8c0Karl Schultz draw_wide_line(ctx, &span, (GLboolean)(dx > dy)); \ 20922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul } \ 21022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul else { \ 211a803b0c891404dcd7c376e91f6a033cd4e42abc3Brian Paul _swrast_write_rgba_span(ctx, &span); \ 212e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 213e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h" 214b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul 215e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 216e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 21722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paulvoid 21822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul_swrast_add_spec_terms_line( GLcontext *ctx, 21922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul const SWvertex *v0, 22022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul const SWvertex *v1 ) 22146b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell{ 22246b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell SWvertex *ncv0 = (SWvertex *)v0; 22346b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell SWvertex *ncv1 = (SWvertex *)v1; 22446b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell GLchan c[2][4]; 22546b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell COPY_CHAN4( c[0], ncv0->color ); 22646b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell COPY_CHAN4( c[1], ncv1->color ); 22746b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell ACC_3V( ncv0->color, ncv0->specular ); 22846b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell ACC_3V( ncv1->color, ncv1->specular ); 22946b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell SWRAST_CONTEXT(ctx)->SpecLine( ctx, ncv0, ncv1 ); 23046b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell COPY_CHAN4( ncv0->color, c[0] ); 23146b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell COPY_CHAN4( ncv1->color, c[1] ); 23246b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell} 23346b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell 234e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 235e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DEBUG 236ba41b8afb1b40b967cf5c0e604bbf09793eb8feeBrian Paulextern void 237ba41b8afb1b40b967cf5c0e604bbf09793eb8feeBrian Paul_mesa_print_line_function(GLcontext *ctx); /* silence compiler warning */ 238e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellvoid 239e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell_mesa_print_line_function(GLcontext *ctx) 240e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 241cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell SWcontext *swrast = SWRAST_CONTEXT(ctx); 242cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 24368a7ee5cbbc93c0e746dc843e0fcc1e65ad1baf6Brian Paul _mesa_printf("Line Func == "); 24422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul if (swrast->Line == simple_ci_line) 24522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul _mesa_printf("simple_ci_line\n"); 24622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul else if (swrast->Line == simple_rgba_line) 24722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul _mesa_printf("simple_rgba_line\n"); 24822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul else if (swrast->Line == general_ci_line) 24922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul _mesa_printf("general_ci_line\n"); 25022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul else if (swrast->Line == general_rgba_line) 25122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul _mesa_printf("general_rgba_line\n"); 25222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul else if (swrast->Line == textured_line) 25322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul _mesa_printf("textured_line\n"); 25422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul else if (swrast->Line == multitextured_line) 25522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul _mesa_printf("multitextured_line\n"); 256e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else 257b5b8d22c4ee921dff99b898a5907023b20670a27Brian Paul _mesa_printf("Driver func %p\n", (void *(*)()) swrast->Line); 258e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 259e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 260e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 261e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 262e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 263233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#ifdef DEBUG 264233aafbb30594d0193b00705d0532be97060ebd1Brian Paul 265233aafbb30594d0193b00705d0532be97060ebd1Brian Paul/* record the current line function name */ 266233aafbb30594d0193b00705d0532be97060ebd1Brian Paulstatic const char *lineFuncName = NULL; 267233aafbb30594d0193b00705d0532be97060ebd1Brian Paul 268233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#define USE(lineFunc) \ 269233aafbb30594d0193b00705d0532be97060ebd1Brian Pauldo { \ 270233aafbb30594d0193b00705d0532be97060ebd1Brian Paul lineFuncName = #lineFunc; \ 27168a7ee5cbbc93c0e746dc843e0fcc1e65ad1baf6Brian Paul /*_mesa_printf("%s\n", lineFuncName);*/ \ 272233aafbb30594d0193b00705d0532be97060ebd1Brian Paul swrast->Line = lineFunc; \ 273233aafbb30594d0193b00705d0532be97060ebd1Brian Paul} while (0) 274233aafbb30594d0193b00705d0532be97060ebd1Brian Paul 275233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#else 276233aafbb30594d0193b00705d0532be97060ebd1Brian Paul 277c123a9b2edc5852cb50485f344219508254081a8Brian Paul#define USE(lineFunc) swrast->Line = lineFunc 278233aafbb30594d0193b00705d0532be97060ebd1Brian Paul 279233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#endif 280233aafbb30594d0193b00705d0532be97060ebd1Brian Paul 281233aafbb30594d0193b00705d0532be97060ebd1Brian Paul 282233aafbb30594d0193b00705d0532be97060ebd1Brian Paul 283e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 284e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Determine which line drawing function to use given the current 285e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * rendering context. 286e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * 287e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Please update the summary flag _SWRAST_NEW_LINE if you add or remove 288e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * tests to this code. 289e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 290e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellvoid 291cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell_swrast_choose_line( GLcontext *ctx ) 292e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 293cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell SWcontext *swrast = SWRAST_CONTEXT(ctx); 294b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul const GLboolean rgbmode = ctx->Visual.rgbMode; 295e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 296b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul if (ctx->RenderMode == GL_RENDER) { 297e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Line.SmoothFlag) { 298e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* antialiased lines */ 2990070d398d13759adc519f9bc764ffd39bc88890eBrian Paul _swrast_choose_aa_line_function(ctx); 30064b4298181373d64ef2226935f70e9062536de8bBrian Paul ASSERT(swrast->Line); 301e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 30236a0a3252e1e20df69b53f70ba93bc74c4a4bf0eBrian Paul else if (ctx->Texture._EnabledCoordUnits) { 30322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul /* textured lines */ 30436a0a3252e1e20df69b53f70ba93bc74c4a4bf0eBrian Paul if (ctx->Texture._EnabledCoordUnits > 0x1 30529b4076f9acff96a867760fc885f5eaeb7586977Brian Paul || NEED_SECONDARY_COLOR(ctx)) { 306e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* multi-texture and/or separate specular color */ 30722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul USE(multitextured_line); 308e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 309e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 31022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul USE(textured_line); 311e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 312e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 31322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul else if (ctx->Depth.Test || ctx->Fog.Enabled || ctx->Line.Width != 1.0 31422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul || ctx->Line.StippleFlag) { 31522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul /* no texture, but Z, fog, width>1, stipple, etc. */ 31622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul if (rgbmode) 31722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul USE(general_rgba_line); 31822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul else 31922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul USE(general_ci_line); 32022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul } 321e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 32222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul /* simplest lines */ 32322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul if (rgbmode) 32422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul USE(simple_rgba_line); 32522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul else 32622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul USE(simple_ci_line); 327e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 328e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 329b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul else if (ctx->RenderMode == GL_FEEDBACK) { 33045bc887da226403f2c41077e40ca38b6f60f1359Brian Paul USE(_swrast_feedback_line); 331e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 332e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 333b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul ASSERT(ctx->RenderMode == GL_SELECT); 33445bc887da226403f2c41077e40ca38b6f60f1359Brian Paul USE(_swrast_select_line); 335e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 336e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 337e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /*_mesa_print_line_function(ctx);*/ 338e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 339